aboutsummaryrefslogtreecommitdiff
path: root/src/Commands.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Commands.hs')
-rw-r--r--src/Commands.hs30
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)