diff options
author | Aleksey Veresov <aleksey@veresov.pro> | 2021-02-14 21:01:33 +0300 |
---|---|---|
committer | Aleksey Veresov <aleksey@veresov.pro> | 2021-02-14 21:01:33 +0300 |
commit | 0cdd25d921202030745069dbccd16ef856e16750 (patch) | |
tree | e67d27b96bda96d118e61547f23a0a44e567a594 /src/Commands.hs | |
parent | 1ad10fab38c4be9dac68fba9c8249591d883d699 (diff) | |
download | suem-0cdd25d921202030745069dbccd16ef856e16750.tar suem-0cdd25d921202030745069dbccd16ef856e16750.tar.xz suem-0cdd25d921202030745069dbccd16ef856e16750.zip |
Example commands added.
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) |