diff options
| author | LLLL Colonq <llll@colonq> | 2024-05-02 18:13:19 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2024-05-02 18:13:19 -0400 |
| commit | d71a77ab7227937ae8190d0b745b94056330af29 (patch) | |
| tree | 7ed2d7bae9b1b2d39b5158b579661b789e1b04f3 /fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs | |
| parent | 64624b52279bd76d473aa92b072a0e5ebd516530 (diff) | |
fig-emulator-gb: CPU passes all tests!
Diffstat (limited to 'fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs')
| -rw-r--r-- | fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs b/fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs index b250068..4ad6f24 100644 --- a/fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs +++ b/fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs @@ -68,7 +68,7 @@ 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 + res = zext x + zext y + if c then 1 else 0 addH :: Bool -> Word8 -> Word8 -> Bool addH c x y = shiftR res 4 .&. 1 == 1 @@ -78,5 +78,13 @@ addH c x y = shiftR res 4 .&. 1 == 1 res :: Word8 res = xlo + ylo + if c then 1 else 0 -subH :: Word8 -> Word8 -> Bool -subH x y = w8bits4 3 x < w8bits4 3 y +subC :: Bool -> Word8 -> Word8 -> (Word8, Bool) +subC c x y = (trunc $ xs - ys, yz > xz) + where + xs = sext x + ys = sext y + if c then 1 else 0 + xz = zext x + yz = zext y + if c then 1 else 0 + +subH :: Bool -> Word8 -> Word8 -> Bool +subH c x y = zext (w8bits4 3 x) < (zext (w8bits4 3 y) + if c then 1 else 0) |
