about summary refs log tree commit diff stats
path: root/trace.arc.t
diff options
context:
space:
mode:
Diffstat (limited to 'trace.arc.t')
-rw-r--r--trace.arc.t977
1 files changed, 490 insertions, 487 deletions
diff --git a/trace.arc.t b/trace.arc.t
index e8844ff1..2056824d 100644
--- a/trace.arc.t
+++ b/trace.arc.t
@@ -1,398 +1,400 @@
 (selective-load "mu.arc" section-level)
 (set allow-raw-addresses*)
+;? (load "profiler.arc")
+;? (profiling-just (reset new-trace trace tr2 check-trace-contents trace-contents-match print-trace-contents-mismatch check-trace-doesnt-contain make-routine stack push-stack pop-stack top label label2 body waiting-for-exact-cycle? ready-to-wake-up run run-more update-scheduler-state detect-deadlock die parse-instr metadata ty literal? typeinfo nondummy not-raw-string address? run-for-time-slice prepare-reply m setm typeof addr addrs canonize array-len sizeof absolutize lookup-space space deref drop-one alloc new-scalar new-array new-string to-arc-string convert-braces close-offset open-offset convert-labels add-next-space-generator convert-names assign-names-to-location replace-names-with-location check-default-space maybe-add convert-name space-to-name convert-quotes insert-code add-code freeze freeze-another tokenize-arg tokenize-args prn2 canon int-canon routine-canon repr memory-contains memory-contains-array memory-contains-array-verbose screen-contains routine-that-ran routine-running ran-to-completion restart dump load-system-functions run-interactive)
 
-(reset)
-(new-trace "print-trace")
-(add-code:readfile "trace.mu")
-(add-code
-  '((function! main [
-      (default-space:space-address <- new space:literal 30:literal/capacity)
-      (x:string-address <- new
-"schedule: main
-run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
-run: main 0: 1 => ((1 integer))
-mem: ((1 integer)): 1 <= 1
-run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
-run: main 1: 3 => ((2 integer))
-mem: ((2 integer)): 2 <= 3
-run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
-mem: ((1 integer)) => 1
-mem: ((2 integer)) => 3
-run: main 2: 4 => ((3 integer))
-mem: ((3 integer)): 3 <= 4
-schedule:  done with routine")
-      (s:stream-address <- init-stream x:string-address)
-      (traces:instruction-trace-address-array-address <- parse-traces s:stream-address)
-      (len:integer <- length traces:instruction-trace-address-array-address/deref)
-      (screen:terminal-address <- init-fake-terminal 70:literal 15:literal)
-      (screen-state:space-address <- screen-state traces:instruction-trace-address-array-address 30:literal/screen-height)
-      (print-traces-collapsed screen-state:space-address screen:terminal-address)
-      (1:string-address/raw <- get screen:terminal-address/deref data:offset)
-    ])))
-;? (set dump-trace*)
-;? (= dump-trace* (obj whitelist '("run")))
-(run 'main)
-(each routine completed-routines*
-  (awhen rep.routine!error
-    (prn "error - " it)))
-;? (prn memory*.1)
-(when (~screen-contains memory*.1 70
-         (+ "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "+ main/ 2 : 4 => ((3 integer))                                        "))
-  (prn "F - print-traces-collapsed works"))
-;? (quit) ;? 1
-
-(reset)
-(new-trace "print-trace-from-middle-of-screen")
-(add-code:readfile "trace.mu")
-(add-code
-  '((function! main [
-      (default-space:space-address <- new space:literal 30:literal/capacity)
-      (x:string-address <- new
-"schedule: main
-run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
-run: main 0: 1 => ((1 integer))
-mem: ((1 integer)): 1 <= 1
-run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
-run: main 1: 3 => ((2 integer))
-mem: ((2 integer)): 2 <= 3
-run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
-mem: ((1 integer)) => 1
-mem: ((2 integer)) => 3
-run: main 2: 4 => ((3 integer))
-mem: ((3 integer)): 3 <= 4
-schedule:  done with routine")
-      (s:stream-address <- init-stream x:string-address)
-      (traces:instruction-trace-address-array-address <- parse-traces s:stream-address)
-      (len:integer <- length traces:instruction-trace-address-array-address/deref)
-      (1:terminal-address/raw <- init-fake-terminal 70:literal 15:literal)
-      ; position the cursor away from top of screen
-      (cursor-down 1:terminal-address/raw)
-      (cursor-down 1:terminal-address/raw)
-      (screen-state:space-address <- screen-state traces:instruction-trace-address-array-address 30:literal/screen-height)
-      (print-traces-collapsed screen-state:space-address 1:terminal-address/raw traces:instruction-trace-address-array-address)
-      (2:string-address/raw <- get 1:terminal-address/raw/deref data:offset)
-    ])))
-(run 'main)
-(each routine completed-routines*
-  (awhen rep.routine!error
-    (prn "error - " it)))
-(when (~screen-contains memory*.2 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "+ main/ 2 : 4 => ((3 integer))                                        "))
-  (prn "F - print-traces-collapsed works"))
-(run-code main2
-  (print-character 1:terminal-address/raw ((#\* literal))))
-(when (~screen-contains memory*.2 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "+ main/ 2 : 4 => ((3 integer))                                        "
-            "*                                                                     "))
-  (prn "F - print-traces-collapsed leaves cursor at next line"))
-
-(reset)
-(new-trace "process-key-move-up-down")
-(add-code:readfile "trace.mu")
-(add-code
-  '((function! main [
-      (default-space:space-address <- new space:literal 30:literal/capacity)
-      (x:string-address <- new
-"schedule: main
-run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
-run: main 0: 1 => ((1 integer))
-mem: ((1 integer)): 1 <= 1
-run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
-run: main 1: 3 => ((2 integer))
-mem: ((2 integer)): 2 <= 3
-run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
-mem: ((1 integer)) => 1
-mem: ((2 integer)) => 3
-run: main 2: 4 => ((3 integer))
-mem: ((3 integer)): 3 <= 4
-schedule:  done with routine")
-      (s:stream-address <- init-stream x:string-address)
-      (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address)
-      (len:integer <- length 1:instruction-trace-address-array-address/raw/deref)
-      (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal)
-      ; position the cursor away from top of screen
-      (cursor-down 2:terminal-address/raw)
-      (cursor-down 2:terminal-address/raw)
-      (3:space-address/raw <- screen-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height)
-      ; draw trace
-      (print-traces-collapsed 3:space-address/raw/screen-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw)
-      ; move cursor up
-      ; we have no way yet to test special keys like up-arrow
-      (s:string-address <- new "k")
-      (k:keyboard-address <- init-keyboard s:string-address)
-      (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-      ; draw cursor
-      (replace-character 2:terminal-address/raw ((#\* literal)))
-      (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset)
-    ])))
-(run 'main)
-(each routine completed-routines*
-  (awhen rep.routine!error
-    (prn "error - " it)))
-(when (~screen-contains memory*.4 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "* main/ 2 : 4 => ((3 integer))                                        "))
-            ;^cursor
-  (prn "F - process-key can move up"))
-(run-code main2
-  (default-space:space-address <- new space:literal 30:literal/capacity)
-  ; reset previous cursor
-  (replace-character 2:terminal-address/raw ((#\+ literal)))
-  ; move cursor up 3 more lines
-  (s:string-address <- new "kkk")
-  (k:keyboard-address <- init-keyboard s:string-address)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (replace-character 2:terminal-address/raw ((#\* literal)))
-  )
-; cursor is now at line 3
-(when (~screen-contains memory*.4 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "* main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            ;^cursor
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "+ main/ 2 : 4 => ((3 integer))                                        "))
-  (prn "F - process-key can move up multiple times"))
-; try to move cursor up thrice more
-(run-code main3
-  (default-space:space-address <- new space:literal 30:literal/capacity)
-  (replace-character 2:terminal-address/raw ((#\+ literal)))
-  (s:string-address <- new "kkk")
-  (k:keyboard-address <- init-keyboard s:string-address)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (replace-character 2:terminal-address/raw ((#\* literal)))
-  )
-; cursor doesn't go beyond the first line printed
-; stuff on screen before screen-state was initialized is inviolate
-(when (~screen-contains memory*.4 70
-         (+ "                                                                      "
-            "                                                                      "
-            "* main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            ;^cursor
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "+ main/ 2 : 4 => ((3 integer))                                        "))
-  (prn "F - process-key doesn't move above bounds"))
-; now move cursor down 4 times
-(run-code main4
-  (default-space:space-address <- new space:literal 30:literal/capacity)
-  (replace-character 2:terminal-address/raw ((#\+ literal)))
-  (s:string-address <- new "jjjj")
-  (k:keyboard-address <- init-keyboard s:string-address)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (replace-character 2:terminal-address/raw ((#\* literal)))
-  )
-(when (~screen-contains memory*.4 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "* main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            ;^cursor
-            "+ main/ 2 : 4 => ((3 integer))                                        "))
-  (prn "F - process-key can move down multiple times"))
-; try to move cursor down 4 more times
-(run-code main5
-  (default-space:space-address <- new space:literal 30:literal/capacity)
-  (replace-character 2:terminal-address/raw ((#\+ literal)))
-  (s:string-address <- new "jjjj")
-  (k:keyboard-address <- init-keyboard s:string-address)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (replace-character 2:terminal-address/raw ((#\* literal)))
-  )
-(when (~screen-contains memory*.4 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "+ main/ 2 : 4 => ((3 integer))                                        "
-            "*                                                                     "))
-  (prn "F - process-key doesn't move below bounds"))
-
-(reset)
-(new-trace "process-key-expand")
-(add-code:readfile "trace.mu")
-(add-code
-  '((function! main [
-      (default-space:space-address <- new space:literal 30:literal/capacity)
-      (x:string-address <- new
-"schedule: main
-run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
-run: main 0: 1 => ((1 integer))
-mem: ((1 integer)): 1 <= 1
-run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
-run: main 1: 3 => ((2 integer))
-mem: ((2 integer)): 2 <= 3
-run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
-mem: ((1 integer)) => 1
-mem: ((2 integer)) => 3
-run: main 2: 4 => ((3 integer))
-mem: ((3 integer)): 3 <= 4
-schedule:  done with routine")
-      (s:stream-address <- init-stream x:string-address)
-      (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address)
-      (len:integer <- length 1:instruction-trace-address-array-address/raw/deref)
-      (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal)
-      ; position the cursor away from top of screen
-      (cursor-down 2:terminal-address/raw)
-      (cursor-down 2:terminal-address/raw)
-      (3:space-address/raw <- screen-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height)
-      ; draw trace
-      (print-traces-collapsed 3:space-address/raw/screen-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw)
-      (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset)
-    ])))
-(run 'main)
-(each routine completed-routines*
-  (awhen rep.routine!error
-    (prn "error - " it)))
-(when (~screen-contains memory*.4 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "+ main/ 2 : 4 => ((3 integer))                                        "))
-  (prn "F - process-key: before expand"))
-(run-code main2
-  (default-space:space-address <- new space:literal 30:literal/capacity)
-  ; move cursor to final line and expand
-  (s:string-address <- new "k\n")
-  (k:keyboard-address <- init-keyboard s:string-address)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  )
-; final line is expanded
-(when (~screen-contains memory*.4 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "- main/ 2 : 4 => ((3 integer))                                        "
-            "   mem : ((3 integer)): 3 <= 4                                        "
-            "   schedule :  done with routine                                      "))
-  (prn "F - process-key expands current trace segment on <enter>"))
-; and cursor should remain on the top-level line
-(run-code main3
-  (replace-character 2:terminal-address/raw ((#\* literal)))
-  )
-(when (~screen-contains memory*.4 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "* main/ 2 : 4 => ((3 integer))                                        "
-            ;^cursor
-            "   mem : ((3 integer)): 3 <= 4                                        "
-            "   schedule :  done with routine                                      "))
-  (prn "F - process-key positions cursor on top of trace after expanding"))
-
-(reset)
-(new-trace "process-key-expand-nonlast")
-(add-code:readfile "trace.mu")
-(add-code
-  '((function! main [
-      (default-space:space-address <- new space:literal 30:literal/capacity)
-      (x:string-address <- new
-"schedule: main
-run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
-run: main 0: 1 => ((1 integer))
-mem: ((1 integer)): 1 <= 1
-run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
-run: main 1: 3 => ((2 integer))
-mem: ((2 integer)): 2 <= 3
-run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
-mem: ((1 integer)) => 1
-mem: ((2 integer)) => 3
-run: main 2: 4 => ((3 integer))
-mem: ((3 integer)): 3 <= 4
-schedule:  done with routine")
-      (s:stream-address <- init-stream x:string-address)
-      (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address)
-      (len:integer <- length 1:instruction-trace-address-array-address/raw/deref)
-      (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal)
-      ; position the cursor away from top of screen
-      (cursor-down 2:terminal-address/raw)
-      (cursor-down 2:terminal-address/raw)
-      (3:space-address/raw <- screen-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height)
-      ; draw trace
-      (print-traces-collapsed 3:space-address/raw/screen-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw)
-      ; expand penultimate line
-      (s:string-address <- new "kk\n")
-      (k:keyboard-address <- init-keyboard s:string-address)
-      (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-      (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-      (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-      (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset)
-    ])))
-(run 'main)
-(each routine completed-routines*
-  (awhen rep.routine!error
-    (prn "error - " it)))
-(when (~screen-contains memory*.4 70
-         (+ "                                                                      "
-            "                                                                      "
-            "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
-            "+ main/ 0 : 1 => ((1 integer))                                        "
-            "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
-            "+ main/ 1 : 3 => ((2 integer))                                        "
-            "- main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
-            "   mem : ((1 integer)) => 1                                           "
-            "   mem : ((2 integer)) => 3                                           "
-            "+ main/ 2 : 4 => ((3 integer))                                        "))
-  (prn "F - process-key: expanding a line continues to print lines after it"))
+;? (reset)
+;? (new-trace "print-trace")
+;? (add-code:readfile "trace.mu")
+;? (add-code
+;?   '((function! main [
+;?       (default-space:space-address <- new space:literal 30:literal/capacity)
+;?       (x:string-address <- new
+;? "schedule: main
+;? run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
+;? run: main 0: 1 => ((1 integer))
+;? mem: ((1 integer)): 1 <= 1
+;? run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
+;? run: main 1: 3 => ((2 integer))
+;? mem: ((2 integer)): 2 <= 3
+;? run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
+;? mem: ((1 integer)) => 1
+;? mem: ((2 integer)) => 3
+;? run: main 2: 4 => ((3 integer))
+;? mem: ((3 integer)): 3 <= 4
+;? schedule:  done with routine")
+;?       (s:stream-address <- init-stream x:string-address)
+;?       (traces:instruction-trace-address-array-address <- parse-traces s:stream-address)
+;?       (len:integer <- length traces:instruction-trace-address-array-address/deref)
+;?       (screen:terminal-address <- init-fake-terminal 70:literal 15:literal)
+;?       (screen-state:space-address <- screen-state traces:instruction-trace-address-array-address 30:literal/screen-height)
+;?       (print-traces-collapsed screen-state:space-address screen:terminal-address)
+;?       (1:string-address/raw <- get screen:terminal-address/deref data:offset)
+;?     ])))
+;? ;? (set dump-trace*)
+;? ;? (= dump-trace* (obj whitelist '("run")))
+;? (run 'main)
+;? (each routine completed-routines*
+;?   (awhen rep.routine!error
+;?     (prn "error - " it)))
+;? ;? (prn memory*.1)
+;? (when (~screen-contains memory*.1 70
+;?          (+ "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "+ main/ 2 : 4 => ((3 integer))                                        "))
+;?   (prn "F - print-traces-collapsed works"))
+;? ;? (quit) ;? 1
+;? 
+;? (reset)
+;? (new-trace "print-trace-from-middle-of-screen")
+;? (add-code:readfile "trace.mu")
+;? (add-code
+;?   '((function! main [
+;?       (default-space:space-address <- new space:literal 30:literal/capacity)
+;?       (x:string-address <- new
+;? "schedule: main
+;? run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
+;? run: main 0: 1 => ((1 integer))
+;? mem: ((1 integer)): 1 <= 1
+;? run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
+;? run: main 1: 3 => ((2 integer))
+;? mem: ((2 integer)): 2 <= 3
+;? run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
+;? mem: ((1 integer)) => 1
+;? mem: ((2 integer)) => 3
+;? run: main 2: 4 => ((3 integer))
+;? mem: ((3 integer)): 3 <= 4
+;? schedule:  done with routine")
+;?       (s:stream-address <- init-stream x:string-address)
+;?       (traces:instruction-trace-address-array-address <- parse-traces s:stream-address)
+;?       (len:integer <- length traces:instruction-trace-address-array-address/deref)
+;?       (1:terminal-address/raw <- init-fake-terminal 70:literal 15:literal)
+;?       ; position the cursor away from top of screen
+;?       (cursor-down 1:terminal-address/raw)
+;?       (cursor-down 1:terminal-address/raw)
+;?       (screen-state:space-address <- screen-state traces:instruction-trace-address-array-address 30:literal/screen-height)
+;?       (print-traces-collapsed screen-state:space-address 1:terminal-address/raw traces:instruction-trace-address-array-address)
+;?       (2:string-address/raw <- get 1:terminal-address/raw/deref data:offset)
+;?     ])))
+;? (run 'main)
+;? (each routine completed-routines*
+;?   (awhen rep.routine!error
+;?     (prn "error - " it)))
+;? (when (~screen-contains memory*.2 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "+ main/ 2 : 4 => ((3 integer))                                        "))
+;?   (prn "F - print-traces-collapsed works"))
+;? (run-code main2
+;?   (print-character 1:terminal-address/raw ((#\* literal))))
+;? (when (~screen-contains memory*.2 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "+ main/ 2 : 4 => ((3 integer))                                        "
+;?             "*                                                                     "))
+;?   (prn "F - print-traces-collapsed leaves cursor at next line"))
+;? 
+;? (reset)
+;? (new-trace "process-key-move-up-down")
+;? (add-code:readfile "trace.mu")
+;? (add-code
+;?   '((function! main [
+;?       (default-space:space-address <- new space:literal 30:literal/capacity)
+;?       (x:string-address <- new
+;? "schedule: main
+;? run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
+;? run: main 0: 1 => ((1 integer))
+;? mem: ((1 integer)): 1 <= 1
+;? run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
+;? run: main 1: 3 => ((2 integer))
+;? mem: ((2 integer)): 2 <= 3
+;? run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
+;? mem: ((1 integer)) => 1
+;? mem: ((2 integer)) => 3
+;? run: main 2: 4 => ((3 integer))
+;? mem: ((3 integer)): 3 <= 4
+;? schedule:  done with routine")
+;?       (s:stream-address <- init-stream x:string-address)
+;?       (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address)
+;?       (len:integer <- length 1:instruction-trace-address-array-address/raw/deref)
+;?       (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal)
+;?       ; position the cursor away from top of screen
+;?       (cursor-down 2:terminal-address/raw)
+;?       (cursor-down 2:terminal-address/raw)
+;?       (3:space-address/raw <- screen-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height)
+;?       ; draw trace
+;?       (print-traces-collapsed 3:space-address/raw/screen-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw)
+;?       ; move cursor up
+;?       ; we have no way yet to test special keys like up-arrow
+;?       (s:string-address <- new "k")
+;?       (k:keyboard-address <- init-keyboard s:string-address)
+;?       (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?       ; draw cursor
+;?       (replace-character 2:terminal-address/raw ((#\* literal)))
+;?       (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset)
+;?     ])))
+;? (run 'main)
+;? (each routine completed-routines*
+;?   (awhen rep.routine!error
+;?     (prn "error - " it)))
+;? (when (~screen-contains memory*.4 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "* main/ 2 : 4 => ((3 integer))                                        "))
+;?             ;^cursor
+;?   (prn "F - process-key can move up"))
+;? (run-code main2
+;?   (default-space:space-address <- new space:literal 30:literal/capacity)
+;?   ; reset previous cursor
+;?   (replace-character 2:terminal-address/raw ((#\+ literal)))
+;?   ; move cursor up 3 more lines
+;?   (s:string-address <- new "kkk")
+;?   (k:keyboard-address <- init-keyboard s:string-address)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (replace-character 2:terminal-address/raw ((#\* literal)))
+;?   )
+;? ; cursor is now at line 3
+;? (when (~screen-contains memory*.4 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "* main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             ;^cursor
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "+ main/ 2 : 4 => ((3 integer))                                        "))
+;?   (prn "F - process-key can move up multiple times"))
+;? ; try to move cursor up thrice more
+;? (run-code main3
+;?   (default-space:space-address <- new space:literal 30:literal/capacity)
+;?   (replace-character 2:terminal-address/raw ((#\+ literal)))
+;?   (s:string-address <- new "kkk")
+;?   (k:keyboard-address <- init-keyboard s:string-address)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (replace-character 2:terminal-address/raw ((#\* literal)))
+;?   )
+;? ; cursor doesn't go beyond the first line printed
+;? ; stuff on screen before screen-state was initialized is inviolate
+;? (when (~screen-contains memory*.4 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "* main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             ;^cursor
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "+ main/ 2 : 4 => ((3 integer))                                        "))
+;?   (prn "F - process-key doesn't move above bounds"))
+;? ; now move cursor down 4 times
+;? (run-code main4
+;?   (default-space:space-address <- new space:literal 30:literal/capacity)
+;?   (replace-character 2:terminal-address/raw ((#\+ literal)))
+;?   (s:string-address <- new "jjjj")
+;?   (k:keyboard-address <- init-keyboard s:string-address)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (replace-character 2:terminal-address/raw ((#\* literal)))
+;?   )
+;? (when (~screen-contains memory*.4 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "* main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             ;^cursor
+;?             "+ main/ 2 : 4 => ((3 integer))                                        "))
+;?   (prn "F - process-key can move down multiple times"))
+;? ; try to move cursor down 4 more times
+;? (run-code main5
+;?   (default-space:space-address <- new space:literal 30:literal/capacity)
+;?   (replace-character 2:terminal-address/raw ((#\+ literal)))
+;?   (s:string-address <- new "jjjj")
+;?   (k:keyboard-address <- init-keyboard s:string-address)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (replace-character 2:terminal-address/raw ((#\* literal)))
+;?   )
+;? (when (~screen-contains memory*.4 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "+ main/ 2 : 4 => ((3 integer))                                        "
+;?             "*                                                                     "))
+;?   (prn "F - process-key doesn't move below bounds"))
+;? 
+;? (reset)
+;? (new-trace "process-key-expand")
+;? (add-code:readfile "trace.mu")
+;? (add-code
+;?   '((function! main [
+;?       (default-space:space-address <- new space:literal 30:literal/capacity)
+;?       (x:string-address <- new
+;? "schedule: main
+;? run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
+;? run: main 0: 1 => ((1 integer))
+;? mem: ((1 integer)): 1 <= 1
+;? run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
+;? run: main 1: 3 => ((2 integer))
+;? mem: ((2 integer)): 2 <= 3
+;? run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
+;? mem: ((1 integer)) => 1
+;? mem: ((2 integer)) => 3
+;? run: main 2: 4 => ((3 integer))
+;? mem: ((3 integer)): 3 <= 4
+;? schedule:  done with routine")
+;?       (s:stream-address <- init-stream x:string-address)
+;?       (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address)
+;?       (len:integer <- length 1:instruction-trace-address-array-address/raw/deref)
+;?       (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal)
+;?       ; position the cursor away from top of screen
+;?       (cursor-down 2:terminal-address/raw)
+;?       (cursor-down 2:terminal-address/raw)
+;?       (3:space-address/raw <- screen-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height)
+;?       ; draw trace
+;?       (print-traces-collapsed 3:space-address/raw/screen-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw)
+;?       (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset)
+;?     ])))
+;? (run 'main)
+;? (each routine completed-routines*
+;?   (awhen rep.routine!error
+;?     (prn "error - " it)))
+;? (when (~screen-contains memory*.4 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "+ main/ 2 : 4 => ((3 integer))                                        "))
+;?   (prn "F - process-key: before expand"))
+;? (run-code main2
+;?   (default-space:space-address <- new space:literal 30:literal/capacity)
+;?   ; move cursor to final line and expand
+;?   (s:string-address <- new "k\n")
+;?   (k:keyboard-address <- init-keyboard s:string-address)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   )
+;? ; final line is expanded
+;? (when (~screen-contains memory*.4 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "- main/ 2 : 4 => ((3 integer))                                        "
+;?             "   mem : ((3 integer)): 3 <= 4                                        "
+;?             "   schedule :  done with routine                                      "))
+;?   (prn "F - process-key expands current trace segment on <enter>"))
+;? ; and cursor should remain on the top-level line
+;? (run-code main3
+;?   (replace-character 2:terminal-address/raw ((#\* literal)))
+;?   )
+;? (when (~screen-contains memory*.4 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "* main/ 2 : 4 => ((3 integer))                                        "
+;?             ;^cursor
+;?             "   mem : ((3 integer)): 3 <= 4                                        "
+;?             "   schedule :  done with routine                                      "))
+;?   (prn "F - process-key positions cursor on top of trace after expanding"))
+;? 
+;? (reset)
+;? (new-trace "process-key-expand-nonlast")
+;? (add-code:readfile "trace.mu")
+;? (add-code
+;?   '((function! main [
+;?       (default-space:space-address <- new space:literal 30:literal/capacity)
+;?       (x:string-address <- new
+;? "schedule: main
+;? run: main 0: (((1 integer)) <- ((copy)) ((1 literal)))
+;? run: main 0: 1 => ((1 integer))
+;? mem: ((1 integer)): 1 <= 1
+;? run: main 1: (((2 integer)) <- ((copy)) ((3 literal)))
+;? run: main 1: 3 => ((2 integer))
+;? mem: ((2 integer)): 2 <= 3
+;? run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))
+;? mem: ((1 integer)) => 1
+;? mem: ((2 integer)) => 3
+;? run: main 2: 4 => ((3 integer))
+;? mem: ((3 integer)): 3 <= 4
+;? schedule:  done with routine")
+;?       (s:stream-address <- init-stream x:string-address)
+;?       (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address)
+;?       (len:integer <- length 1:instruction-trace-address-array-address/raw/deref)
+;?       (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal)
+;?       ; position the cursor away from top of screen
+;?       (cursor-down 2:terminal-address/raw)
+;?       (cursor-down 2:terminal-address/raw)
+;?       (3:space-address/raw <- screen-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height)
+;?       ; draw trace
+;?       (print-traces-collapsed 3:space-address/raw/screen-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw)
+;?       ; expand penultimate line
+;?       (s:string-address <- new "kk\n")
+;?       (k:keyboard-address <- init-keyboard s:string-address)
+;?       (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?       (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?       (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?       (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset)
+;?     ])))
+;? (run 'main)
+;? (each routine completed-routines*
+;?   (awhen rep.routine!error
+;?     (prn "error - " it)))
+;? (when (~screen-contains memory*.4 70
+;?          (+ "                                                                      "
+;?             "                                                                      "
+;?             "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal)))                 "
+;?             "+ main/ 0 : 1 => ((1 integer))                                        "
+;?             "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal)))                 "
+;?             "+ main/ 1 : 3 => ((2 integer))                                        "
+;?             "- main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer)))    "
+;?             "   mem : ((1 integer)) => 1                                           "
+;?             "   mem : ((2 integer)) => 3                                           "
+;?             "+ main/ 2 : 4 => ((3 integer))                                        "))
+;?   (prn "F - process-key: expanding a line continues to print lines after it"))
 
 (reset)
 (new-trace "process-key-expanded")
@@ -537,100 +539,101 @@ schedule:  done with routine")
             "+ main/ 2 : 4 => ((3 integer))                                        "))
   (prn "F - process-key: navigation moves between top-level lines only"))
 
-;; manage screen height
-
-(reset)
-(new-trace "trace-paginate")
-(add-code:readfile "trace.mu")
-(add-code
-  '((function! main [
-      (default-space:space-address <- new space:literal 30:literal/capacity)
-      (x:string-address <- new
-"run: main 0: a b c
-mem: 0 a
-run: main 1: d e f
-mem: 1 a
-mem: 1 b
-mem: 1 c
-run: main 2: g hi
-run: main 3: j
-mem: 3 a
-run: main 4: k
-run: main 5: l
-run: main 6: m
-run: main 7: n
-run: main 8: o")
-      (s:stream-address <- init-stream x:string-address)
-      (traces:instruction-trace-address-array-address <- parse-traces s:stream-address)
-      (len:integer <- length traces:instruction-trace-address-array-address/deref)
-      (2:terminal-address/raw <- init-fake-terminal 17:literal 15:literal)
-      (3:space-address/raw/screen-state <- screen-state traces:instruction-trace-address-array-address 3:literal/screen-height)
-      (print-traces-collapsed 3:space-address/raw/screen-state 2:terminal-address/raw)
-      (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset)
-    ])))
-(run 'main)
-(each routine completed-routines*
-  (awhen rep.routine!error
-    (prn "error - " it)))
-; screen shows a subset of collapsed trace lines
-(when (~screen-contains memory*.4 17
-         (+ "+ main/ 0 : a b c"
-            "+ main/ 1 : d e f"
-            "+ main/ 2 : g hi "))
-  (prn "F - print-traces-collapsed can show just one 'page' of a larger trace"))
-; expand top line
-(run-code main2
-  (default-space:space-address <- new space:literal 30:literal/capacity)
-  (s:string-address <- new "kkk\n")
-  (k:keyboard-address <- init-keyboard s:string-address)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  )
-; screen shows just first trace line fully expanded
-(when (~screen-contains memory*.4 17
-         (+ "- main/ 0 : a b c"
-            "   mem : 0 a     "
-            "+ main/ 1 : d e f"
-            "                 "))
-  (prn "F - expanding doesn't print past end of page"))
-; expand line below without first collapsing previously expanded line
-(run-code main3
-  (default-space:space-address <- new space:literal 30:literal/capacity)
-  (s:string-address <- new "j\n")
-  (k:keyboard-address <- init-keyboard s:string-address)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  )
-; screen shows part of the second trace line expanded
-(when (~screen-contains memory*.4 17
-         (+ "+ main/ 0 : a b c"
-            "- main/ 1 : d e f"
-            "   mem : 1 a     "
-            "                 "
-            "                 "))
-  (prn "F - expanding below expanded line respects screen/page height"))
-; expand line *above* without first collapsing previously expanded line
-(run-code main4
-  (default-space:space-address <- new space:literal 30:literal/capacity)
-  (s:string-address <- new "k\n")
-  (k:keyboard-address <- init-keyboard s:string-address)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
-  )
-; screen again shows first trace line expanded
-(when (~screen-contains memory*.4 17
-         (+ "- main/ 0 : a b c"
-            "   mem : 0 a     "
-            "+ main/ 1 : d e f"
-            "                 "))
-  (prn "F - expanding above expanded line respects screen/page height"))
-
-; todo
-;   pgup/pgdn to navigate pages (minimize up/down responsibilities for performance)
-;   expanded trace straddles page boundary
-;   what if entire page is within an expanded trace?
+;? ;; manage screen height
+;? 
+;? (reset)
+;? (new-trace "trace-paginate")
+;? (add-code:readfile "trace.mu")
+;? (add-code
+;?   '((function! main [
+;?       (default-space:space-address <- new space:literal 30:literal/capacity)
+;?       (x:string-address <- new
+;? "run: main 0: a b c
+;? mem: 0 a
+;? run: main 1: d e f
+;? mem: 1 a
+;? mem: 1 b
+;? mem: 1 c
+;? run: main 2: g hi
+;? run: main 3: j
+;? mem: 3 a
+;? run: main 4: k
+;? run: main 5: l
+;? run: main 6: m
+;? run: main 7: n
+;? run: main 8: o")
+;?       (s:stream-address <- init-stream x:string-address)
+;?       (traces:instruction-trace-address-array-address <- parse-traces s:stream-address)
+;?       (len:integer <- length traces:instruction-trace-address-array-address/deref)
+;?       (2:terminal-address/raw <- init-fake-terminal 17:literal 15:literal)
+;?       (3:space-address/raw/screen-state <- screen-state traces:instruction-trace-address-array-address 3:literal/screen-height)
+;?       (print-traces-collapsed 3:space-address/raw/screen-state 2:terminal-address/raw)
+;?       (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset)
+;?     ])))
+;? (run 'main)
+;? (each routine completed-routines*
+;?   (awhen rep.routine!error
+;?     (prn "error - " it)))
+;? ; screen shows a subset of collapsed trace lines
+;? (when (~screen-contains memory*.4 17
+;?          (+ "+ main/ 0 : a b c"
+;?             "+ main/ 1 : d e f"
+;?             "+ main/ 2 : g hi "))
+;?   (prn "F - print-traces-collapsed can show just one 'page' of a larger trace"))
+;? ; expand top line
+;? (run-code main2
+;?   (default-space:space-address <- new space:literal 30:literal/capacity)
+;?   (s:string-address <- new "kkk\n")
+;?   (k:keyboard-address <- init-keyboard s:string-address)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   )
+;? ; screen shows just first trace line fully expanded
+;? (when (~screen-contains memory*.4 17
+;?          (+ "- main/ 0 : a b c"
+;?             "   mem : 0 a     "
+;?             "+ main/ 1 : d e f"
+;?             "                 "))
+;?   (prn "F - expanding doesn't print past end of page"))
+;? ; expand line below without first collapsing previously expanded line
+;? (run-code main3
+;?   (default-space:space-address <- new space:literal 30:literal/capacity)
+;?   (s:string-address <- new "j\n")
+;?   (k:keyboard-address <- init-keyboard s:string-address)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   )
+;? ; screen shows part of the second trace line expanded
+;? (when (~screen-contains memory*.4 17
+;?          (+ "+ main/ 0 : a b c"
+;?             "- main/ 1 : d e f"
+;?             "   mem : 1 a     "
+;?             "                 "
+;?             "                 "))
+;?   (prn "F - expanding below expanded line respects screen/page height"))
+;? ; expand line *above* without first collapsing previously expanded line
+;? (run-code main4
+;?   (default-space:space-address <- new space:literal 30:literal/capacity)
+;?   (s:string-address <- new "k\n")
+;?   (k:keyboard-address <- init-keyboard s:string-address)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   (process-key 3:space-address/raw/screen-state k:keyboard-address 2:terminal-address/raw)
+;?   )
+;? ; screen again shows first trace line expanded
+;? (when (~screen-contains memory*.4 17
+;?          (+ "- main/ 0 : a b c"
+;?             "   mem : 0 a     "
+;?             "+ main/ 1 : d e f"
+;?             "                 "))
+;?   (prn "F - expanding above expanded line respects screen/page height"))
+;? 
+;? ; todo
+;? ;   pgup/pgdn to navigate pages (minimize up/down responsibilities for performance)
+;? ;   expanded trace straddles page boundary
+;? ;   what if entire page is within an expanded trace?
 
+;? )  ; profiling-just ;? 1
 (reset)
-;? (print-times) ;? 2
+(print-times) ;? 2