Load and save memory maps

This commit is contained in:
Joscha 2019-11-06 13:35:15 +00:00
parent a355095ea7
commit b6420a34ca
4 changed files with 72 additions and 10 deletions

View file

@ -1,6 +1,7 @@
module Mima.State
( MimaMemory
, wordsToMemory
, memoryToWords
, readAt
, writeAt
, MimaState(..)
@ -12,6 +13,7 @@ module Mima.State
import Data.Bits
import qualified Data.Map as Map
import Data.Maybe
import qualified Data.Text as T
import Mima.Instruction
@ -23,6 +25,11 @@ newtype MimaMemory = MimaMemory (Map.Map MimaAddress MimaWord)
wordsToMemory :: [MimaWord] -> MimaMemory
wordsToMemory = MimaMemory . Map.fromAscList . zip [minBound..]
memoryToWords :: MimaMemory -> [MimaWord]
memoryToWords mem@(MimaMemory m) =
let maxAddr = fromMaybe minBound $ fst <$> Map.lookupMax m
in map (\addr -> readAt addr mem) [minBound..maxAddr]
readAt :: MimaAddress -> MimaMemory -> MimaWord
readAt addr (MimaMemory m) = Map.findWithDefault zeroBits addr m
@ -80,7 +87,7 @@ executeSmallOpcode ADD addr ms = incrementIp ms{msAcc = addWords (msAcc ms) (rea
executeSmallOpcode AND addr ms = incrementIp ms{msAcc = msAcc ms .&. readAt addr (msMemory ms)}
executeSmallOpcode OR addr ms = incrementIp ms{msAcc = msAcc ms .|. readAt addr (msMemory ms)}
executeSmallOpcode XOR addr ms = incrementIp ms{msAcc = msAcc ms `xor` readAt addr (msMemory ms)}
executeSmallOpcode EQL addr ms = incrementIp ms{msAcc = wordFromBool $ msAcc ms == readAt addr (msMemory ms)}
executeSmallOpcode EQL addr ms = incrementIp ms{msAcc = boolToWord $ msAcc ms == readAt addr (msMemory ms)}
executeSmallOpcode JMP addr ms = pure ms{msIp = addr}
executeSmallOpcode JMN addr ms = if topBit (msAcc ms) then pure ms{msIp = addr} else incrementIp ms