diff --git a/src/GB/CPU.hs b/src/GB/CPU.hs index 1205a8c..eada713 100644 --- a/src/GB/CPU.hs +++ b/src/GB/CPU.hs @@ -61,17 +61,13 @@ data Registers = Registers { _a :: Word8 makeLenses ''Registers -getBC :: Registers -> Word16 -getBC r = (( .<<. 8) . fromIntegral $ r ^. b) + (fromIntegral $ r ^. c) +bc :: Lens' Registers Word16 +bc = lens (\r -> (( .<<. 8) . fromIntegral $ r ^. b) + (fromIntegral $ r ^. c)) + (\r w -> r & b %~ (const $ fromIntegral $ w .>>. 8) & c %~ (const $ fromIntegral $ w .&. 255)) -setBC :: Registers -> Word16 -> Registers -setBC r w = r & b %~ (const $ fromIntegral $ w .>>. 8) & c %~ (const $ fromIntegral $ w .&. 255) - -getHL :: Registers -> Word16 -getHL r = ((.<<. 8) . fromIntegral $ r ^. h) + (fromIntegral $ r ^. l) - -setHL :: Registers -> Word16 -> Registers -setHL r w = r & h %~ (const $ fromIntegral $ w .>>. 8) & l %~ (const $ fromIntegral $ w .&. 255) +hl :: Lens' Registers Word16 +hl = lens (\r -> ((.<<. 8) . fromIntegral $ r ^. h) + (fromIntegral $ r ^. l)) + (\r w -> r & h %~ (const $ fromIntegral $ w .>>. 8) & l %~ (const $ fromIntegral $ w .&. 255)) data CPU = CPU { _registers :: Registers , _pc :: Word16 @@ -108,7 +104,7 @@ execute cpu = \case AddR t _c -> let value = cpu ^. registers . t (newValue, newFlags) = add (cpu ^. registers . a) value $ _c && cpu ^. registers . flags . carry in cpu & registers . a .~ newValue & registers . flags .~ newFlags - AddHL _c -> let value = fetch cpu . getHL $ cpu ^. registers + AddHL _c -> let value = fetch cpu $ cpu ^. registers . hl (newValue, newFlags) = add (cpu ^. registers . a) value $ _c && cpu ^. registers . flags . carry in cpu & registers . a .~ newValue & registers . flags .~ newFlags AddN value _c -> let (newValue, newFlags) = add (cpu ^. registers . a) value $ _c && cpu ^. registers .flags . carry in @@ -116,7 +112,7 @@ execute cpu = \case SubR t _c -> let value = cpu ^. registers . t (newValue, newFlags) = sub (cpu ^. registers . a) value $ _c && cpu ^. registers . flags . carry in cpu & registers . a .~ newValue & registers . flags .~ newFlags - SubHL _c -> let value = fetch cpu . getHL $ cpu ^. registers + SubHL _c -> let value = fetch cpu $ cpu ^. registers . hl (newValue, newFlags) = sub (cpu ^. registers . a) value $ _c && cpu ^. registers . flags . carry in cpu & registers . a .~ newValue & registers . flags .~ newFlags SubN value _c -> let (newValue, newFlags) = sub (cpu ^. registers . a) value $ _c && cpu ^. registers .flags . carry in @@ -124,27 +120,27 @@ execute cpu = \case CpR t _c -> let value = cpu ^. registers . t (_, newFlags) = sub (cpu ^. registers . a) value $ _c && cpu ^. registers . flags . carry in cpu & registers . flags .~ newFlags - CpHL _c -> let value = fetch cpu . getHL $ cpu ^. registers + CpHL _c -> let value = fetch cpu $ cpu ^. registers . hl (_, newFlags) = sub (cpu ^. registers . a) value $ _c && cpu ^. registers . flags . carry in cpu & registers . flags .~ newFlags CpN value _c -> let (_, newFlags) = sub (cpu ^. registers . a) value $ _c && cpu ^. registers .flags . carry in cpu & registers . flags .~ newFlags IncR t -> let (value, newFlags) = add (cpu ^. registers . t) 1 False in cpu & registers . t .~ value & registers . flags .~ newFlags - IncHL -> let target = getHL $ cpu ^. registers + IncHL -> let target = cpu ^. registers . hl value = fetch cpu target (newValue, newFlags) = add value 1 False in 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 + DecHL -> let target = cpu ^. registers . hl value = fetch cpu target (newValue, newFlags) = sub value 1 False in write cpu target newValue & registers . flags .~ newFlags BOR t op _f -> let newValue = (cpu ^. registers . a) `op` (cpu ^. registers . t) newFlags = _f {_zero = newValue == 0} in cpu & registers . a .~ newValue & registers . flags .~ newFlags - BOHL op _f -> let target = getHL $ cpu ^. registers + BOHL op _f -> let target = cpu ^. registers . hl value = fetch cpu target newValue = (cpu ^. registers . a) `op` value newFlags = _f {_zero = value == 0} in