diff options
| author | LLLL Colonq <llll@colonq> | 2024-05-07 20:00:17 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2024-05-07 20:00:17 -0400 |
| commit | 9167b9ca9e5de8fddda016fb99a7d926625233bb (patch) | |
| tree | 0346c104c11bf84bacdf83aaacd772f918013f6c /fig-emulator-gb/src/Fig/Emulator/GB/Bus.hs | |
| parent | a81c92dc2cdff02c55fdc197d943bc7a35c64be5 (diff) | |
fb-emulator-gb: It's not as slow
Diffstat (limited to 'fig-emulator-gb/src/Fig/Emulator/GB/Bus.hs')
| -rw-r--r-- | fig-emulator-gb/src/Fig/Emulator/GB/Bus.hs | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/fig-emulator-gb/src/Fig/Emulator/GB/Bus.hs b/fig-emulator-gb/src/Fig/Emulator/GB/Bus.hs index 6550d2d..1c64dfd 100644 --- a/fig-emulator-gb/src/Fig/Emulator/GB/Bus.hs +++ b/fig-emulator-gb/src/Fig/Emulator/GB/Bus.hs @@ -19,22 +19,22 @@ newtype Addr = Addr { unAddr :: Word16 } instance Pretty Addr where pretty (Addr w) = "$" <> pack (showHex w "") -data Component m = forall (s :: Type). Component +data Component = forall (s :: Type). Component { compState :: s , compMatches :: Addr -> Bool - , compUpdate :: s -> Int -> m s - , compWrite :: s -> Addr -> Word8 -> m s - , compRead :: s -> Addr -> m Word8 + , compUpdate :: s -> Int -> IO s + , compWrite :: s -> Addr -> Word8 -> IO s + , compRead :: s -> Addr -> IO Word8 } -newtype Bus m = Bus { busComponents :: [Component m] } +newtype Bus = Bus { busComponents :: [Component] } -update :: forall m. MonadIO m => Int -> Bus m -> m (Bus m) +update :: Int -> Bus -> IO Bus update t b = Bus <$> forM (busComponents b) \Component{..} -> do s <- compUpdate compState t pure Component { compState = s, ..} -write :: forall m. MonadIO m => Bus m -> Addr -> Word8 -> m (Bus m) +write :: Bus -> Addr -> Word8 -> IO Bus write b a v = Bus <$> forM (busComponents b) \c@Component{..} -> if compMatches a then do @@ -42,7 +42,7 @@ write b a v = Bus <$> forM (busComponents b) \c@Component{..} -> pure Component { compState = s, ..} else pure c -read :: forall m. (MonadIO m, MonadThrow m) => Bus m -> Addr -> m (Maybe Word8) +read :: Bus -> Addr -> IO (Maybe Word8) read b a = case List.find (`compMatches` a) $ busComponents b of Nothing -> pure Nothing Just Component{..} -> Just <$> compRead compState a |
