Begin rewrite
... by deleting most files. By the theory of evolution, the remaining ones will get stronger over the next commits. That's how it works, isn't it?
This commit is contained in:
parent
3e0f4e22b1
commit
b1274d5d2c
37 changed files with 218 additions and 2424 deletions
47
src/Mima/Vm/Memory.hs
Normal file
47
src/Mima/Vm/Memory.hs
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
module Mima.Vm.Memory
|
||||
( MimaMemory
|
||||
, mapToMemory
|
||||
, wordsToMemory
|
||||
, memoryToWords
|
||||
, maxAddress
|
||||
, usedAddresses
|
||||
, continuousUsedAddresses
|
||||
, readAt
|
||||
, writeAt
|
||||
) where
|
||||
|
||||
import Data.Bits
|
||||
import qualified Data.Map.Strict as Map
|
||||
|
||||
import Mima.Vm.Word
|
||||
|
||||
newtype MimaMemory = MimaMemory (Map.Map MimaAddress MimaWord)
|
||||
deriving (Show)
|
||||
|
||||
mapToMemory :: Map.Map MimaAddress MimaWord -> MimaMemory
|
||||
mapToMemory = MimaMemory . Map.filter (/= zeroBits)
|
||||
|
||||
wordsToMemory :: [MimaWord] -> MimaMemory
|
||||
wordsToMemory = mapToMemory
|
||||
. Map.fromAscList
|
||||
. zip [minBound..]
|
||||
|
||||
memoryToWords :: MimaMemory -> [MimaWord]
|
||||
memoryToWords mem = map (`readAt` mem) $ continuousUsedAddresses mem
|
||||
|
||||
maxAddress :: MimaMemory -> MimaAddress
|
||||
maxAddress (MimaMemory m) = maybe minBound fst $ Map.lookupMax m
|
||||
|
||||
usedAddresses :: MimaMemory -> [MimaAddress]
|
||||
usedAddresses (MimaMemory m) = Map.keys m
|
||||
|
||||
continuousUsedAddresses :: MimaMemory -> [MimaAddress]
|
||||
continuousUsedAddresses mem = [minBound..maxAddress mem]
|
||||
|
||||
readAt :: MimaAddress -> MimaMemory -> MimaWord
|
||||
readAt addr (MimaMemory m) = Map.findWithDefault zeroBits addr m
|
||||
|
||||
writeAt :: MimaAddress -> MimaWord -> MimaMemory -> MimaMemory
|
||||
writeAt addr word (MimaMemory m)
|
||||
| word == zeroBits = MimaMemory $ Map.delete addr m
|
||||
| otherwise = MimaMemory $ Map.insert addr word m
|
||||
Loading…
Add table
Add a link
Reference in a new issue