about summary refs log tree commit diff stats
path: root/mu.arc
diff options
context:
space:
mode:
Diffstat (limited to 'mu.arc')
-rw-r--r--mu.arc65
1 files changed, 61 insertions, 4 deletions
diff --git a/mu.arc b/mu.arc
index c5a14eca..2182daf5 100644
--- a/mu.arc
+++ b/mu.arc
@@ -321,6 +321,7 @@
 
 (def run fn-names
   (freeze function*)
+;?   (prn function*!main) ;? 1
   (load-system-functions)
   (apply run-more fn-names))
 
@@ -1651,18 +1652,30 @@
           (recur (+ addr 1) (+ idx 1)))))
 
 (def memory-contains-array (addr value)
-;?   (prn "Looking for @value starting at @addr, size @memory*.addr vs @len.value")
+  (or
+    (and (>= memory*.addr len.value)
+         (loop (addr (+ addr 1)
+                idx  0)
+           (if (>= idx len.value)
+                 t
+               (~is memory*.addr value.idx)
+                 nil
+               :else
+                 (recur (+ addr 1) (+ idx 1)))))
+    (memory-contains-array-verbose addr value)))
+
+(def memory-contains-array-verbose (addr value)
+  (prn "Mismatch when looking at @addr, size @memory*.addr vs @len.value")
   (and (>= memory*.addr len.value)
        (loop (addr (+ addr 1)
               idx  0)
-;?          (and (< idx len.value) (prn "comparing @idx: @memory*.addr and @value.idx")) ;? 2
+         (and (< idx len.value) (prn "comparing @idx: @memory*.addr and @value.idx"))
          (if (>= idx len.value)
                t
              (~is memory*.addr value.idx)
                (do1 nil
                     (prn "@addr should contain @(repr value.idx) but contains @(repr memory*.addr)")
-;?                     (recur (+ addr 1) (+ idx 1)) ;? 5
-                    )
+                    (recur (+ addr 1) (+ idx 1)))
              :else
                (recur (+ addr 1) (+ idx 1))))))
 
@@ -1670,6 +1683,9 @@
 (mac run-code (name . body)
   ; careful to avoid re-processing functions and adding noise to traces
   `(do
+     (when (function* ',name)
+       (prn "run-code: redefining " ',name))
+     (wipe (function* ',name))
      (add-code '((function ,name [ ,@body ])))
      (freeze-another ',name)
      (run-more ',name)))
@@ -2629,6 +2645,47 @@
   (cursor-up-on-host)
 )
 
+(init-fn cursor-left
+  (default-space:space-address <- new space:literal 30:literal)
+  (x:terminal-address <- next-input)
+  { begin
+    (break-unless x:terminal-address)
+    (col:integer-address <- get-address x:terminal-address/deref cursor-col:offset)
+    { begin
+      (edge?:boolean <- lesser-or-equal col:integer-address/deref 0:literal)
+      (break-if edge?:boolean)
+      (col:integer-address/deref <- subtract col:integer-address/deref 1:literal)
+    }
+    (reply)
+  }
+  (cursor-left-on-host)
+)
+
+(init-fn cursor-right
+  (default-space:space-address <- new space:literal 30:literal)
+  (x:terminal-address <- next-input)
+  (width:integer-address <- get-address x:terminal-address/deref num-cols:offset)
+  { begin
+    (break-unless x:terminal-address)
+    (col:integer-address <- get-address x:terminal-address/deref cursor-col:offset)
+    { begin
+      (edge?:boolean <- lesser-or-equal col:integer-address/deref width:integer-address/deref)
+      (break-if edge?:boolean)
+      (col:integer-address/deref <- add col:integer-address/deref 1:literal)
+    }
+    (reply)
+  }
+  (cursor-right-on-host)
+)
+
+(init-fn replace-character
+  (default-space:space-address <- new space:literal 30:literal)
+  (x:terminal-address <- next-input)
+  (c:character <- next-input)
+  (print-character x:terminal-address c:character)
+  (cursor-left x:terminal-address)
+)
+
 (init-fn print-character
   (default-space:space-address <- new space:literal 30:literal)
   (x:terminal-address <- next-input)