about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--mu.arc11
-rw-r--r--mu.arc.t36
2 files changed, 47 insertions, 0 deletions
diff --git a/mu.arc b/mu.arc
index 78d2f654..a4bf4e2d 100644
--- a/mu.arc
+++ b/mu.arc
@@ -3,6 +3,7 @@
 (def clear ()
   (= types* (obj
               integer (obj size 1)
+              location (obj size 1)
               address (obj size 1)))
   (= memory* (table))
   (= function* (table)))
@@ -19,7 +20,9 @@
 
 (def run (instrs (o fn-args))
   (ret result nil
+;?     (prn instrs)
     (for pc 0 (< pc len.instrs) (++ pc)
+;?       (prn pc)
       (let instr instrs.pc
 ;?         (prn instr)
 ;?         (prn memory*)
@@ -53,6 +56,14 @@
                 (= (memory* oarg.0.1)
                    ; hardcoded channel for now
                    (memory* pop.fn-args.1))
+              jmp
+                (do (= pc arg.0.1)
+;?                     (prn "jumping to " pc)
+                    (continue))
+              jifz
+                (when (is 0 (memory* arg.0.1))
+                  (= pc arg.1.1)
+                  (continue))
               reply
                 (do (= result arg)
                     (break))
diff --git a/mu.arc.t b/mu.arc.t
index f657bf6b..3825c4b9 100644
--- a/mu.arc.t
+++ b/mu.arc.t
@@ -151,3 +151,39 @@
 ;? (prn memory*)
 (if (~iso memory* (obj 1 8))
   (prn "F - jmp works"))
+
+(clear)
+(add-fns
+  '((main
+      ((integer 1) <- loadi 8)
+      (jmp (location 3))
+      ((integer 2) <- loadi 3)
+      (reply))))
+(run function*!main)
+;? (prn memory*)
+(if (~iso memory* (obj 1 8))
+  (prn "F - jmp works"))
+
+(clear)
+(add-fns
+  '((main
+      ((integer 1) <- loadi 0)
+      (jifz (integer 1) (location 3))
+      ((integer 2) <- loadi 3)
+      (reply))))
+(run function*!main)
+;? (prn memory*)
+(if (~iso memory* (obj 1 0))
+  (prn "F - jifz works"))
+
+(clear)
+(add-fns
+  '((main
+      ((integer 1) <- loadi 1)
+      (jifz (integer 1) (location 3))
+      ((integer 2) <- loadi 3)
+      (reply))))
+(run function*!main)
+;? (prn memory*)
+(if (~iso memory* (obj 1 1  2 3))
+  (prn "F - jifz works - 2"))