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.arc104
1 files changed, 64 insertions, 40 deletions
diff --git a/mu.arc b/mu.arc
index 31bba88d..09d9ad9a 100644
--- a/mu.arc
+++ b/mu.arc
@@ -196,6 +196,8 @@
               line-address-address (obj size 1  address t  elem '(line-address))
               screen (obj array t  elem '(line-address))
               screen-address (obj size 1  address t  elem '(screen))
+              terminal (obj size 3  and-record t  elems '((integer) (integer) (string-address))  fields '(rows cols data))
+              terminal-address (obj size 1  address t  elem '(terminal))
               )))
 
 ;; managing concurrent routines
@@ -1522,7 +1524,7 @@
 ;?     (reply 0:literal)
 ;?   }
 ;?   ; else return 1+length(curr.cdr)
-;?   (print-primitive (("recurse\n" literal)))
+;?   (print-primitive nil:literal/terminal (("recurse\n" literal)))
 ;?   (next:list-address <- list-next curr:list-address)
 ;?   (sub:integer <- list-length next:list-address)
 ;?   (result:integer <- add sub:integer 1:literal)
@@ -1536,8 +1538,8 @@
     (break-if empty?:boolean)
     ; ++result
     (result:integer <- add result:integer 1:literal)
-;?     (print-primitive result:integer)
-;?     (print-primitive (("\n" literal)))
+;?     (print-primitive nil:literal/terminal result:integer)
+;?     (print-primitive nil:literal/terminal (("\n" literal)))
     ; curr = curr.cdr
     (curr:list-address <- list-next curr:list-address)
     (loop)
@@ -1705,19 +1707,19 @@
     ; while arg received
     (a:string-address arg-received?:boolean <- next-input)
     (break-unless arg-received?:boolean)
-;?     (print-primitive ("arg now: " literal))
-;?     (print-primitive a:string-address)
-;?     (print-primitive "@":literal)
-;?     (print-primitive a:string-address/deref)  ; todo: test (m on scoped array)
-;?     (print-primitive "\n":literal)
+;?     (print-primitive nil:literal/terminal ("arg now: " literal))
+;?     (print-primitive nil:literal/terminal a:string-address)
+;?     (print-primitive nil:literal/terminal "@":literal)
+;?     (print-primitive nil:literal/terminal a:string-address/deref)  ; todo: test (m on scoped array)
+;?     (print-primitive nil:literal/terminal "\n":literal)
 ;? ;?     (assert nil:literal)
     ; result-len = result-len + arg.length - 1 (for the 'underscore' being replaced)
     (a-len:integer <- length a:string-address/deref)
     (result-len:integer <- add result-len:integer a-len:integer)
     (result-len:integer <- subtract result-len:integer 1:literal)
-;?     (print-primitive ("result-len now: " literal))
-;?     (print-primitive result-len:integer)
-;?     (print-primitive "\n":literal)
+;?     (print-primitive nil:literal/terminal ("result-len now: " literal))
+;?     (print-primitive nil:literal/terminal result-len:integer)
+;?     (print-primitive nil:literal/terminal "\n":literal)
     (loop)
   }
   ; rewind to start of non-template args
@@ -1749,9 +1751,9 @@
       (result-idx:integer <- add result-idx:integer 1:literal)
       (loop)
     }
-;?     (print-primitive ("i now: " literal))
-;?     (print-primitive i:integer)
-;?     (print-primitive "\n":literal)
+;?     (print-primitive nil:literal/terminal ("i now: " literal))
+;?     (print-primitive nil:literal/terminal i:integer)
+;?     (print-primitive nil:literal/terminal "\n":literal)
     ; copy 'a' into result
     (j:integer <- copy 0:literal)
     { begin
@@ -1760,11 +1762,11 @@
       (break-unless arg-done?:boolean)
       ; result[result-idx] = a[j]
       (in:byte <- index a:string-address/deref j:integer)
-;?       (print-primitive ("copying: " literal))
-;?       (print-primitive in:byte)
-;?       (print-primitive (" at: " literal))
-;?       (print-primitive result-idx:integer)
-;?       (print-primitive "\n":literal)
+;?       (print-primitive nil:literal/terminal ("copying: " literal))
+;?       (print-primitive nil:literal/terminal in:byte)
+;?       (print-primitive nil:literal/terminal (" at: " literal))
+;?       (print-primitive nil:literal/terminal result-idx:integer)
+;?       (print-primitive nil:literal/terminal "\n":literal)
       (out:byte-address <- index-address result:string-address/deref result-idx:integer)
       (out:byte-address/deref <- copy in:byte)
       ; ++j
@@ -1775,9 +1777,9 @@
     }
     ; skip '_' in template
     (i:integer <- add i:integer 1:literal)
-;?     (print-primitive ("i now: " literal))
-;?     (print-primitive i:integer)
-;?     (print-primitive "\n":literal)
+;?     (print-primitive nil:literal/terminal ("i now: " literal))
+;?     (print-primitive nil:literal/terminal i:integer)
+;?     (print-primitive nil:literal/terminal "\n":literal)
     (loop)  ; interpolate next arg
   }
   ; done with holes; copy rest of template directly into result
@@ -1787,11 +1789,11 @@
     (break-unless tem-done?:boolean)
     ; result[result-idx] = template[i]
     (in:byte <- index template:string-address/deref i:integer)
-;?     (print-primitive ("copying: " literal))
-;?     (print-primitive in:byte)
-;?     (print-primitive (" at: " literal))
-;?     (print-primitive result-idx:integer)
-;?     (print-primitive "\n":literal)
+;?     (print-primitive nil:literal/terminal ("copying: " literal))
+;?     (print-primitive nil:literal/terminal in:byte)
+;?     (print-primitive nil:literal/terminal (" at: " literal))
+;?     (print-primitive nil:literal/terminal result-idx:integer)
+;?     (print-primitive nil:literal/terminal "\n":literal)
     (out:byte-address <- index-address result:string-address/deref result-idx:integer)
     (out:byte-address/deref <- copy in:byte)
     ; ++i
@@ -1842,9 +1844,9 @@
     (loop)
   }
   ; allocate space
-;?   (print-primitive (("alloc: " literal)))
-;?   (print-primitive count:integer)
-;?   (print-primitive (("\n" literal)))
+;?   (print-primitive nil:literal/terminal (("alloc: " literal)))
+;?   (print-primitive nil:literal/terminal count:integer)
+;?   (print-primitive nil:literal/terminal (("\n" literal)))
   (result:string-address-array-address <- new string-address-array:literal count:integer)
   ; repeatedly copy slices (start..end) until delimiter into result[curr-result]
   (curr-result:integer <- copy 0:literal)
@@ -1854,13 +1856,13 @@
     (done?:boolean <- greater-or-equal start:integer len:integer)
     (break-if done?:boolean)
     (end:integer <- find-next s:string-address delim:character start:integer)
-;?     (print-primitive (("i: " literal)))
-;?     (print-primitive start:integer)
-;?     (print-primitive (("-" literal)))
-;?     (print-primitive end:integer)
-;?     (print-primitive ((" => " literal)))
-;?     (print-primitive curr-result:integer)
-;?     (print-primitive (("\n" literal)))
+;?     (print-primitive nil:literal/terminal (("i: " literal)))
+;?     (print-primitive nil:literal/terminal start:integer)
+;?     (print-primitive nil:literal/terminal (("-" literal)))
+;?     (print-primitive nil:literal/terminal end:integer)
+;?     (print-primitive nil:literal/terminal ((" => " literal)))
+;?     (print-primitive nil:literal/terminal curr-result:integer)
+;?     (print-primitive nil:literal/terminal (("\n" literal)))
     ; compute length of slice
     (slice-len:integer <- subtract end:integer start:integer)
     ; allocate result[curr-result]
@@ -1902,24 +1904,46 @@
 )
 
 (init-fn clear-screen
+  (default-space:space-address <- new space:literal 30:literal)
+  (x:terminal-address <- next-input)
+  { begin
+    (break-unless x:terminal-address)
+    (reply)
+  }
   (clear-host-screen)
 )
 
 (init-fn cursor
   (default-space:space-address <- new space:literal 30:literal)
+  (x:terminal-address <- next-input)
   (row:integer <- next-input)
   (col:integer <- next-input)
+  { begin
+    (break-unless x:terminal-address)
+    (reply)
+  }
   (cursor-on-host row:integer col:integer)
 )
 
 (init-fn cursor-to-next-line
+  (default-space:space-address <- new space:literal 30:literal)
+  (x:terminal-address <- next-input)
+  { begin
+    (break-unless x:terminal-address)
+    (reply)
+  }
   (cursor-on-host-to-next-line)
 )
 
 (init-fn print-primitive
   (default-space:space-address <- new space:literal 30:literal)
-  (x:location <- next-input)
-  (print-primitive-to-host x:location)
+  (x:terminal-address <- next-input)
+  { begin
+    (break-unless x:terminal-address)
+    (reply)
+  }
+  (c:location <- next-input)
+  (print-primitive-to-host c:location)
 )
 
 (init-fn send-prints-to-stdout
@@ -1928,7 +1952,7 @@
   { begin
     (x:tagged-value stdout:channel-address/deref <- read stdout:channel-address)
     (c:character <- maybe-coerce x:tagged-value character:literal)
-    (print-primitive c:character)
+    (print-primitive nil:literal/terminal c:character)
     (loop)
   }
 )