-- Copyright 2006 mutantlemon.com module Memory where import Data.Array.IArray import Data.Word import RomImage class MemoryModel a where readMem :: a -> Word16 -> Word8 writeMem :: a -> Word16 -> Word8 -> a data Memory = Memory { memRomImage :: RomImage, memRam :: Array Word16 Word8 } initMemory :: RomImage -> Memory initMemory ri = Memory { memRomImage = ri, memRam = listArray (0x8000, 0xFFFF) (replicate 0x8000 0x00) } instance MemoryModel Memory where readMem m a = if a < 0x8000 then readRomImageByte (memRomImage m) (fromIntegral a) else (memRam m) ! a writeMem m a v = if a < 0x8000 then m else m { memRam = (memRam m)//[(a, v)] }