Store MimaState
This commit is contained in:
parent
38ba94f675
commit
abdb8c0a0d
1 changed files with 41 additions and 1 deletions
|
|
@ -1,18 +1,26 @@
|
||||||
|
{-# LANGUAGE RecordWildCards #-}
|
||||||
|
|
||||||
module Mima.Vm.Storage
|
module Mima.Vm.Storage
|
||||||
(
|
(
|
||||||
-- * Methods for loading/storing 'Metadata'
|
-- * Methods for loading/storing 'Metadata'
|
||||||
loadMetadata
|
loadMetadata
|
||||||
, saveMetadata
|
, saveMetadata
|
||||||
|
, saveMimaState
|
||||||
-- * Test methods
|
-- * Test methods
|
||||||
, roundTripFile
|
, roundTripFile
|
||||||
|
, saveInterestingState
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Aeson.Encode.Pretty
|
import Data.Aeson.Encode.Pretty
|
||||||
import qualified Data.ByteString.Lazy as BSL
|
import qualified Data.ByteString.Lazy as BSL
|
||||||
|
import qualified Data.Map.Strict as Map
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import Mima.Run
|
import Mima.Run
|
||||||
|
import Mima.Vm.Memory
|
||||||
import Mima.Vm.Metadata
|
import Mima.Vm.Metadata
|
||||||
|
import Mima.Vm.State
|
||||||
|
import Mima.Vm.Word
|
||||||
|
|
||||||
-- | Loads 'Metadata' from a given file path.
|
-- | Loads 'Metadata' from a given file path.
|
||||||
loadMetadata :: FilePath -> Run Metadata
|
loadMetadata :: FilePath -> Run Metadata
|
||||||
|
|
@ -26,7 +34,33 @@ loadMetadata path = do
|
||||||
saveMetadata :: FilePath -> Metadata -> Run ()
|
saveMetadata :: FilePath -> Metadata -> Run ()
|
||||||
saveMetadata path metadata = writeFileBS path (BSL.toStrict (encodePretty metadata))
|
saveMetadata path metadata = writeFileBS path (BSL.toStrict (encodePretty metadata))
|
||||||
|
|
||||||
-- | A garbage test method that reads the input file, parses it and writes the
|
saveMimaState :: FilePath -> MimaState -> Run ()
|
||||||
|
saveMimaState path state = do
|
||||||
|
let stateBS = saveMimaSateBS state
|
||||||
|
writeFileBS path (BSL.toStrict stateBS)
|
||||||
|
|
||||||
|
saveMimaSateBS :: MimaState -> BSL.ByteString
|
||||||
|
saveMimaSateBS state = mimaRegistersToBS state <> mimaMemoryToBS (msMemory state)
|
||||||
|
|
||||||
|
mimaRegistersToBS :: MimaState -> BSL.ByteString
|
||||||
|
mimaRegistersToBS MimaState{..}
|
||||||
|
= mimaWordToBS (largeValueToWord msIar)
|
||||||
|
<> mimaWordToBS msAcc
|
||||||
|
<> mimaWordToBS (largeValueToWord msRa)
|
||||||
|
<> mimaWordToBS (largeValueToWord msSp)
|
||||||
|
<> mimaWordToBS (largeValueToWord msFp)
|
||||||
|
|
||||||
|
mimaMemoryToBS :: MimaMemory -> BSL.ByteString
|
||||||
|
mimaMemoryToBS memory = foldl appendWord mempty (memoryToWords memory)
|
||||||
|
where
|
||||||
|
appendWord string word = string <> mimaWordToBS word
|
||||||
|
|
||||||
|
mimaWordToBS :: MimaWord -> BSL.ByteString
|
||||||
|
mimaWordToBS = BSL.pack . tripleToList . wordToBytes
|
||||||
|
where
|
||||||
|
tripleToList (a, b, c) = [a, b, c]
|
||||||
|
|
||||||
|
-- | A garbage test method that resds the input file, parses it and writes the
|
||||||
-- prettified result back in the output file.
|
-- prettified result back in the output file.
|
||||||
--
|
--
|
||||||
-- Can be used with the example file:
|
-- Can be used with the example file:
|
||||||
|
|
@ -36,3 +70,9 @@ roundTripFile :: FilePath -- ^ The input file
|
||||||
-> FilePath -- ^ The output file
|
-> FilePath -- ^ The output file
|
||||||
-> Run ()
|
-> Run ()
|
||||||
roundTripFile input output = loadMetadata input >>= saveMetadata output
|
roundTripFile input output = loadMetadata input >>= saveMetadata output
|
||||||
|
|
||||||
|
saveInterestingState :: FilePath -> Run ()
|
||||||
|
saveInterestingState path = saveMimaState path withRegisters
|
||||||
|
where
|
||||||
|
state = basicState $ mapToMemory $ Map.fromList $ zip [1..100] [1..100]
|
||||||
|
withRegisters = state{msIar = 5, msAcc = -2, msRa = 46565, msSp = 20}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue