diff options
| author | LLLL Colonq <llll@colonq> | 2024-04-09 22:35:42 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2024-04-09 22:35:42 -0400 |
| commit | 3a0a7b0a89fd841edd5f25f79cdb877051d0e948 (patch) | |
| tree | f314021ddd72c3b528c42c154f8aee002a5c0e02 /fig-emulator-gb/src/Fig/Emulator/GB/Component/ROM.hs | |
| parent | 70d50561b19b4161b85ec1b00c31e5678502688b (diff) | |
End-of-stream emulator WIP
Diffstat (limited to 'fig-emulator-gb/src/Fig/Emulator/GB/Component/ROM.hs')
| -rw-r--r-- | fig-emulator-gb/src/Fig/Emulator/GB/Component/ROM.hs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/fig-emulator-gb/src/Fig/Emulator/GB/Component/ROM.hs b/fig-emulator-gb/src/Fig/Emulator/GB/Component/ROM.hs new file mode 100644 index 0000000..b5ea24f --- /dev/null +++ b/fig-emulator-gb/src/Fig/Emulator/GB/Component/ROM.hs @@ -0,0 +1,45 @@ +module Fig.Emulator.GB.Component.ROM + ( compROM + ) where + +import Fig.Prelude +import Prelude (fromIntegral) + +import qualified Data.Vector as V +import qualified Data.ByteString as BS + +import Fig.Emulator.GB.Bus + +newtype ROMError = ROMError Text + deriving Show +instance Exception ROMError +instance Pretty ROMError where + pretty (ROMError b) = mconcat + [ "internal ROM error: " + , b + ] + +-- | Initialize base ROM (no mapper) from a ByteString +compROM :: (MonadIO m, MonadThrow m) => ByteString -> Component m +compROM bs = Component + { compState = V.fromList $ BS.unpack bs + , compMatches = \a -> + a >= start && a < end + , compUpdate = pure + , compWrite = \s _ad _v -> + pure s + -- throwM . ROMError $ mconcat + -- [ "tried to write to ROM at ", pretty ad + -- ] + , compRead = \s ad -> do + let offset = fromIntegral . unAddr $ ad - start + case s V.!? offset of + Nothing -> throwM . ROMError $ mconcat + [ "address ", pretty ad, " out of bounds" + ] + Just v -> pure v + } + where + start = 0x0000 + -- end = 0x4000 + end = 0x8000 |
