--- /dev/null
+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
-- 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