about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--mu.arc185
-rw-r--r--mu.arc.t12
2 files changed, 112 insertions, 85 deletions
diff --git a/mu.arc b/mu.arc
index ae59da7c..8264a5cb 100644
--- a/mu.arc
+++ b/mu.arc
@@ -27,18 +27,29 @@
   `(,operand 1))  ; assume type is always first bit of metadata, and it's always present
 
 (mac m (loc)  ; for memory
-  `(memory* (v ,loc)))
+  (w/uniq gloc
+    `(let ,gloc ,loc
+       (if (pos 'deref (metadata ,gloc))
+         (memory* (memory* (v ,gloc)))
+         (memory* (v ,gloc))))))
 
-(mac m2 (loc)  ; for memory
-  `(if (pos 'deref (metadata ,loc))
-     (memory* (memory* (v ,loc)))
-     (memory* (v ,loc))))
+(mac setm (loc val)  ; set memory, respecting addressing-mode tags
+  (w/uniq gloc
+    `(let ,gloc ,loc
+       (if (pos 'deref (metadata ,gloc))
+         (= (memory* (memory* (v ,gloc))) ,val)
+;?          (do (prn "AAA " ,gloc " " (v ,gloc) (memory* (v ,gloc)))
+;?            (prn "BBB " ',val)
+;?            (prn "CCC " ,val)
+         (=          (memory* (v ,gloc))  ,val)))))
+;?   )
 
 (def run (instrs (o fn-args) (o fn-oargs))
   (ret result nil
-    (let fn-arg-idx 0
+    (with (ninstrs 0  fn-arg-idx 0)
 ;?     (prn instrs)
-    (for pc 0 (< pc len.instrs) (++ pc)
+    (for pc 0 (< pc len.instrs) (do ++.ninstrs ++.pc)
+;?       (if (> ninstrs 10) (break))
       (let instr instrs.pc
 ;?         (prn memory*)
 ;?         (prn pc ": " instr)
@@ -48,86 +59,90 @@
                  op  (instr (+ delim 1))
                  arg  (cut instr (+ delim 2)))
 ;?             (prn op " " oarg)
-            (case op
-              literal
-                (= (m oarg.0) arg.0)
-              add
-;?               (do (prn "add " (m arg.0) (m arg.1))
-                (= (m oarg.0)
-                   (+ (m arg.0) (m arg.1)))
-;?                 (prn "add2"))
-              sub
-                (= (m oarg.0)
-                   (- (m arg.0) (m arg.1)))
-              mul
-                (= (m oarg.0)
-                   (* (m arg.0) (m arg.1)))
-              div
-                (= (m oarg.0)
-                   (/ (real (m arg.0)) (m arg.1)))
-              idiv
-                (= (m oarg.0)
-                   (trunc:/ (m arg.0) (m arg.1))
-                   (m oarg.1)
-                   (mod (m arg.0) (m arg.1)))
-              and
-                (= (m oarg.0)
-                   (and (m arg.0) (m arg.1)))
-              or
-                (= (m oarg.0)
-                   (and (m arg.0) (m arg.1)))
-              not
-                (= (m oarg.0)
-                   (not (m arg.0)))
-              eq
-                (= (m oarg.0)
-                   (is (m arg.0) (m arg.1)))
-              neq
-                (= (m oarg.0)
-                   (~is (m arg.0) (m arg.1)))
-              lt
-                (= (m oarg.0)
-                   (< (m arg.0) (m arg.1)))
-              gt
-                (= (m oarg.0)
-                   (> (m arg.0) (m arg.1)))
-              le
-                (= (m oarg.0)
-                   (<= (m arg.0) (m arg.1)))
-              ge
-                (= (m oarg.0)
-                   (>= (m arg.0) (m arg.1)))
-              arg
-                (let idx (if arg
-                           arg.0
-                           (do1 fn-arg-idx
-                              ++.fn-arg-idx))
-                  (= (m oarg.0)
-                     (m fn-args.idx)))
-              otype
-                (= (m oarg.0)
-                   (ty (fn-oargs arg.0)))
-              jmp
-                (do (= pc (+ pc (v arg.0)))  ; relies on continue still incrementing (bug)
+            (let tmp
+              (case op
+                literal
+                  arg.0
+                add
+;?                 (do (prn "add " (m arg.0) (m arg.1))
+                  (+ (m arg.0) (m arg.1))
+;?                   (prn "add2"))
+                sub
+                  (- (m arg.0) (m arg.1))
+                mul
+                  (* (m arg.0) (m arg.1))
+                div
+                  (/ (real (m arg.0)) (m arg.1))
+                idiv
+                  (list
+                     (trunc:/ (m arg.0) (m arg.1))
+                     (mod (m arg.0) (m arg.1)))
+                and
+                  (and (m arg.0) (m arg.1))
+                or
+                  (or (m arg.0) (m arg.1))
+                not
+                  (not (m arg.0))
+                eq
+                  (is (m arg.0) (m arg.1))
+                neq
+                  (~is (m arg.0) (m arg.1))
+                lt
+                  (< (m arg.0) (m arg.1))
+                gt
+                  (> (m arg.0) (m arg.1))
+                le
+                  (<= (m arg.0) (m arg.1))
+                ge
+                  (>= (m arg.0) (m arg.1))
+                arg
+                  (let idx (if arg
+                             arg.0
+                             (do1 fn-arg-idx
+                                ++.fn-arg-idx))
+                    (m fn-args.idx))
+                otype
+                  (ty (fn-oargs arg.0))
+                jmp
+                  (do (= pc (+ pc (v arg.0)))  ; relies on continue still incrementing (bug)
+;?                       (prn "jumping to " pc)
+                      (continue))
+                jif
+                  (when (is t (m arg.0))
+                    (= pc (+ pc (v arg.1)))  ; relies on continue still incrementing (bug)
 ;?                     (prn "jumping to " pc)
                     (continue))
-              jif
-                (when (is t (m arg.0))
-                  (= pc (+ pc (v arg.1)))  ; relies on continue still incrementing (bug)
-;?                   (prn "jumping to " pc)
-                  (continue))
-              copy
-                (= (m oarg.0) (m2 arg.0))
-              reply
-                (do (= result arg)
-                    (break))
-              ; else user-defined function
-                (let-or new-body function*.op (prn "no definition for " op)
-;?                   (prn "== " memory*)
-                  (let results (run new-body arg oarg)
-                    (each o oarg
-;?                       (prn o)
-                      (= (m o) (m pop.results)))))
+                copy
+                  (m arg.0)
+                reply
+                  (do (= result arg)
+                      (break))
+                ; else user-defined function
+                  (let-or new-body function*.op (prn "no definition for " op)
+;?                     (prn "== " memory*)
+                    (let results (run new-body arg oarg)
+;?                       (prn "=> " oarg)
+                      (each o oarg
+;?                         (prn o)
+;?                         (prn memory*)
+;?                         (prn "000 " results)
+;?                         (prn "111 " pop.results)
+;?                         (prn "222 " (macex '(m pop.results)))
+;?                         (quit)
+                        (setm o (m pop.results))))
+                    (continue))
+                )
+;?               (prn "AAA " tmp " " oarg)
+              ; opcode that generated at least some result
+              (if (acons tmp)
+                (for i 0 (< i (min len.tmp len.oarg)) ++.i
+                  (setm oarg.i tmp.i))
+;?                 (do (prn "bbb")
+;?                 (prn:macex1:quote (setm oarg.0 tmp))
+                (when oarg  ; must be a list
+;?                   (prn oarg.0)
+                  (setm oarg.0 tmp)))
+;?               (prn "ccc"))
               )))))
 ;?     (prn "return " result)
     )))
diff --git a/mu.arc.t b/mu.arc.t
index 9883e874..e98fcc8e 100644
--- a/mu.arc.t
+++ b/mu.arc.t
@@ -318,6 +318,18 @@
 
 (clear)
 (add-fns
+  '((main
+      ((1 integer-address) <- literal 2)
+      ((2 integer) <- literal 34)
+      ((3 integer) <- literal 2)
+      ((1 integer-address deref) <- add (2 integer) (3 integer)))))
+(run function*!main)
+;? (prn memory*)
+(if (~iso memory* (obj 1 2  2 36  3 2))
+  (prn "F - instructions can performs indirect addressing on output arg"))
+
+(clear)
+(add-fns
   '((test1
       ((4 type) <- otype 0)
       ((5 type) <- literal integer)