diff options
Diffstat (limited to 'src/Commands.hs')
-rw-r--r-- | src/Commands.hs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/Commands.hs b/src/Commands.hs new file mode 100644 index 0000000..1413c87 --- /dev/null +++ b/src/Commands.hs @@ -0,0 +1,30 @@ +module Commands where + +import Control.Lens +import Machine + +doNothing :: Machine -> Machine +doNothing m = Machine (Registers (pc r + 2) (sr r) (drs r) + (ars r) (usp r) (ssp r)) + (ram m) (rom m) + where r = regs m + +doUnlink :: Int -> Machine -> Machine +doUnlink 7 m = let r = regs m in if isSupervisor m + then Machine (Registers (pc r + 2) (sr r) (drs r) (ars r) + (usp r) (getLong m (fromIntegral $ ssp r) + 4)) + (ram m) (rom m) + else Machine (Registers (pc r + 2) (sr r) (drs r) (ars r) + (getLong m (fromIntegral $ usp r) + 4) (ssp r)) + (ram m) (rom m) +doUnlink a m = let + r = regs m + av = getLong m (fromIntegral (ars r !! a)) + newars = ars r & element (fromIntegral a) .~ av + in if isSupervisor m + then Machine (Registers (pc r + 2) (sr r) (drs r) + newars (usp r) (av + 4)) + (ram m) (rom m) + else Machine (Registers (pc r + 2) (sr r) (drs r) + newars (av + 4) (ssp r)) + (ram m) (rom m) |