ZXS: Add fetcher
authorLucian Mogosanu <lucian.mogosanu@gmail.com>
Sat, 13 Dec 2014 20:45:22 +0000 (22:45 +0200)
committerLucian Mogosanu <lucian.mogosanu@gmail.com>
Sat, 13 Dec 2014 20:45:22 +0000 (22:45 +0200)
src/ZXS/Fetch.hs [new file with mode: 0644]
src/ZXS/Machine.hs

diff --git a/src/ZXS/Fetch.hs b/src/ZXS/Fetch.hs
new file mode 100644 (file)
index 0000000..d1889e0
--- /dev/null
@@ -0,0 +1,22 @@
+module ZXS.Fetch where
+
+-- opcode fetcher, with some side effects in the CPU
+
+import Data.Word
+import Control.Monad.IO.Class (liftIO)
+
+import Z80.CPU
+import Z80.Microcode
+import ZXS.Machine
+import ZXS.RAM
+
+fetch :: ZXS Word8
+fetch = do
+  Spectrum cpu mainMem <- getZXState
+  -- get pc
+  let pc = getPC cpu
+  -- getch byte
+  b <- liftIO $ ramGetByte mainMem pc
+  -- update pc
+  modifyCPU $ flip modifyPC (+ 1)
+  return b
index f43cd26..1130470 100644 (file)
@@ -16,7 +16,16 @@ data Spectrum = Spectrum
 
 -- the ZXS transformer
 newtype ZXST m a = ZXST { unZXST :: StateT Spectrum m a }
-  deriving (Monad, Functor, Applicative, MonadIO)
+  deriving (MonadState Spectrum, Monad, Functor, Applicative, MonadIO)
 
 -- for now we "fall back" to IO as the default inner monad
 type ZXS a = ZXST IO a
+
+modifyCPU :: (CPU -> CPU) -> ZXS ()
+modifyCPU f = modify $ \ spc -> spc { zxCPU = f $ zxCPU spc }
+
+modifyMainMem :: (RAM -> RAM) -> ZXS ()
+modifyMainMem f = modify $ \ spc -> spc { zxMainMem = f $ zxMainMem spc }
+
+getZXState :: ZXS Spectrum
+getZXState = get