diff options
| author | LLLL Colonq <llll@colonq> | 2024-04-09 22:35:42 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2024-04-09 22:35:42 -0400 |
| commit | 3a0a7b0a89fd841edd5f25f79cdb877051d0e948 (patch) | |
| tree | f314021ddd72c3b528c42c154f8aee002a5c0e02 /fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs | |
| parent | 70d50561b19b4161b85ec1b00c31e5678502688b (diff) | |
End-of-stream emulator WIP
Diffstat (limited to 'fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs')
| -rw-r--r-- | fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs b/fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs new file mode 100644 index 0000000..694f2ea --- /dev/null +++ b/fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs @@ -0,0 +1,66 @@ +module Fig.Emulator.GB.Utils where + +import Fig.Prelude + +import Prelude (fromIntegral) + +import Data.Word (Word8, Word16) +import Data.Int (Int8) +import Data.Bits + +w8w8 :: Word8 -> Word8 -> Word16 +w8w8 high low = shiftL (fromIntegral high) 8 .|. fromIntegral low + +w16hi :: Word16 -> Word8 +w16hi v = fromIntegral $ shiftR v 8 + +w16lo :: Word16 -> Word8 +w16lo v = fromIntegral $ v .&. 0xff + +w8bit :: Int -> Word8 -> Bool +w8bit i v = shiftR v i .&. 0b1 == 1 + +w8bits2 :: Int -> Word8 -> Word8 +w8bits2 i v = shiftR v (i - 1) .&. 0b11 + +w8bits3 :: Int -> Word8 -> Word8 +w8bits3 i v = shiftR v (i - 2) .&. 0b111 + +w8bits4 :: Int -> Word8 -> Word8 +w8bits4 i v = shiftR v (i - 3) .&. 0b1111 + +flagsw8 :: Bool -> Bool -> Bool -> Bool -> Word8 +flagsw8 z n h c = + shiftL (if z then 1 else 0) 7 + .|. shiftL (if n then 1 else 0) 6 + .|. shiftL (if h then 1 else 0) 5 + .|. shiftL (if c then 1 else 0) 4 + +zext :: Word8 -> Word16 +zext = fromIntegral + +sext :: Word8 -> Word16 +sext x = fromIntegral y + where + y :: Int8 + y = fromIntegral x + +trunc :: Word16 -> Word8 +trunc = fromIntegral + +addC :: Bool -> Word8 -> Word8 -> (Word8, Bool) +addC c x y = (trunc res, shiftR res 8 .&. 1 == 1) + where + res :: Word16 + res = sext x + sext y + if c then 1 else 0 + +addH :: Bool -> Word8 -> Word8 -> Bool +addH c x y = shiftR res 4 .&. 1 == 1 + where + xlo = x .&. 0xf + ylo = y .&. 0xf + res :: Word8 + res = xlo + ylo + if c then 1 else 0 + +subH :: Word8 -> Word8 -> Bool +subH x y = w8bits4 3 x < w8bits4 3 y |
