From: Lucian Mogosanu Date: Sat, 13 Dec 2014 16:39:42 +0000 (+0200) Subject: ZXS: Add basic Memory operations X-Git-Url: https://git.mogosanu.ro/?a=commitdiff_plain;h=687b964ea5136de50b4af67926a0ac8a53447d9d;p=z80.git ZXS: Add basic Memory operations --- diff --git a/src/ZXS/Memory.hs b/src/ZXS/Memory.hs index 640e155..f64ecd1 100644 --- a/src/ZXS/Memory.hs +++ b/src/ZXS/Memory.hs @@ -1,9 +1,41 @@ module ZXS.Memory where -import Data.Array +import Data.Array.MArray +import Data.Array.IO import Data.Word +import Data.Bits -type Memory = Array Int Word16 +type Memory = IOArray Word16 Word8 -romMem :: Memory -romMem = listArray (0x0000, 0x3fff) $ repeat 0 +memGetByte :: Memory -> Word16 -> IO Word8 +memGetByte = readArray + +memGetWord :: Memory -> Word16 -> IO Word16 +memGetWord mem addr = do + lb <- memGetByte mem addr + hb <- memGetByte mem (addr + 1) + let low = fromIntegral lb + high = fromIntegral hb `shiftL` 8 + return $ high .|. low + +memSetByte :: Memory -> Word16 -> Word8 -> IO () +memSetByte = writeArray + +memSetWord :: Memory -> Word16 -> Word16 -> IO () +memSetWord mem addr w = memSetByte mem addr lb >> memSetByte mem (addr + 1) hb + where + lb = fromIntegral w + hb = fromIntegral $ w `shiftR` 8 + +memModifyByte :: Memory -> Word16 -> (Word8 -> Word8) -> IO () +memModifyByte mem addr f = do + b <- memGetByte mem addr + memSetByte mem addr $ f b + +memModifyWord :: Memory -> Word16 -> (Word16 -> Word16) -> IO () +memModifyWord mem addr f = do + w <- memGetWord mem addr + memSetWord mem addr $ f w + +romMem :: IO Memory +romMem = newListArray (0x0000, 0x3fff) $ repeat 0