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