diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2014-07-11 21:29:43 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2014-07-11 21:29:43 -0700 |
commit | b83c85c8a41dd0e6042e2e3a07e8550cd2eca59b (patch) | |
tree | 5bb55779e5c24e1d704fbf80ed6e03035ae6b974 | |
parent | 77f8e6cd2534fb7c63b0021b7adcd1a2b8348402 (diff) | |
download | mu-b83c85c8a41dd0e6042e2e3a07e8550cd2eca59b.tar.gz |
16 - conditional and unconditional jumps
-rw-r--r-- | mu.arc | 11 | ||||
-rw-r--r-- | mu.arc.t | 36 |
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")) |