ZXS: Add basic Memory operations
authorLucian Mogosanu <lucian.mogosanu@gmail.com>
Sat, 13 Dec 2014 16:39:42 +0000 (18:39 +0200)
committerLucian Mogosanu <lucian.mogosanu@gmail.com>
Sat, 13 Dec 2014 16:39:42 +0000 (18:39 +0200)
src/ZXS/Memory.hs

index 640e155..f64ecd1 100644 (file)
@@ -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