summaryrefslogtreecommitdiff
path: root/fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2024-05-02 18:13:19 -0400
committerLLLL Colonq <llll@colonq>2024-05-02 18:13:19 -0400
commitd71a77ab7227937ae8190d0b745b94056330af29 (patch)
tree7ed2d7bae9b1b2d39b5158b579661b789e1b04f3 /fig-emulator-gb/src/Fig/Emulator/GB/Utils.hs
parent64624b52279bd76d473aa92b072a0e5ebd516530 (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.hs14
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)