newtype ZXST m a = ZXST { unZXST :: StateT Spectrum m a }
deriving (MonadState Spectrum, Monad, Functor, Applicative, MonadIO)
+runZXST :: ZXST m a -> Spectrum -> m (a, Spectrum)
+runZXST zxst state = runStateT (unZXST zxst) state
+
+evalZXST :: Monad m => ZXST m a -> Spectrum -> m a
+evalZXST zxst state = runZXST zxst state >>= return . fst
+
+execZXST :: Monad m => ZXST m a -> Spectrum -> m Spectrum
+execZXST zxst state = runZXST zxst state >>= return . snd
+
-- for now we "fall back" to IO as the default inner monad
type ZXS a = ZXST IO a
mainMem :: IO RAM
mainMem = newListArray (0x5ccb, 0xff57) $ repeat 0
+
+newRAM :: (Word16, Word16) -> IO RAM
+newRAM (start, end) = newListArray (start, end) $ repeat 0