diff --git a/src/GB/CPU.hs b/src/GB/CPU.hs index fdbf17e..9d5b4ba 100644 --- a/src/GB/CPU.hs +++ b/src/GB/CPU.hs @@ -128,13 +128,13 @@ execute cpu = \case IncHL -> let target = getHL $ cpu ^. registers value = fetch cpu target (newValue, newFlags) = add value 1 False in - cpu & bus %~ (flip V.update $ V.singleton (fromIntegral target, newValue)) & registers . flags .~ newFlags + write cpu target newValue & registers . flags .~ newFlags DecR t -> let (value, newFlags) = sub (cpu ^. registers . t) 1 False in cpu & registers . t .~ value & registers . flags .~ newFlags DecHL -> let target = getHL $ cpu ^. registers value = fetch cpu target (newValue, newFlags) = sub value 1 False in - cpu & bus %~ (flip V.update $ V.singleton (fromIntegral target, newValue)) & registers . flags .~ newFlags + write cpu target newValue & registers . flags .~ newFlags where add :: Word8 -> Word8 -> Bool -> (Word8, FlagRegister) add o n _c = let new = o + n + if _c then 1 else 0 @@ -143,8 +143,6 @@ execute cpu = \case _carry = o > new _halfCarry = o .&. 16 + n .&. 16 > 16 in (new, FlagRegister {..}) - fetch :: CPU -> Word16 -> Word8 - fetch _cpu addr = flip V.index (fromIntegral addr) $ _cpu ^. bus sub :: Word8 -> Word8 -> Bool -> (Word8, FlagRegister) sub o n _c = let new = o - n - if _c then 1 else 0 @@ -153,3 +151,9 @@ execute cpu = \case _carry = o > new _halfCarry = o .&. 16 + n .&. 16 > 16 in (new, FlagRegister {..}) + + fetch :: CPU -> Word16 -> Word8 + fetch _cpu addr = flip V.index (fromIntegral addr) $ _cpu ^. bus + + write :: CPU -> Word16 -> Word8 -> CPU + write _cpu target value = _cpu & bus %~ (flip V.update $ V.singleton (fromIntegral target, value))