about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-02-10 21:39:36 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-02-10 21:39:36 -0800
commit0ad92f3b6ea199e9e0468144bf94023d130b3f5b (patch)
treeb30360d32cce93fe1ed800c80b9c570e2587e41e
parent070823c2f624f68cbc6147d269430fbf4dfa3ff2 (diff)
downloadmu-0ad92f3b6ea199e9e0468144bf94023d130b3f5b.tar.gz
737
-rw-r--r--trace.mu80
1 files changed, 49 insertions, 31 deletions
diff --git a/trace.mu b/trace.mu
index 44e2a51b..ca827564 100644
--- a/trace.mu
+++ b/trace.mu
@@ -266,6 +266,54 @@
   (cursor-to-next-line screen:terminal-address)
 ])
 
+(function process-key [
+  (default-space:space-address <- new space:literal 30:literal/capacity)
+  (0:space-address/names:screen-state <- next-input)
+  (k:keyboard-address <- next-input)
+  (screen:terminal-address <- next-input)
+  (traces:instruction-trace-address-array-address <- next-input)
+  (c:character <- read-key k:keyboard-address silent:literal/terminal)
+  { begin
+    ; no key yet
+    (break-if c:character)
+    (reply nil:literal)
+  }
+  { begin
+    ; user quit
+    (q-pressed?:boolean <- equal c:character ((#\q literal)))
+    (end-of-fake-keyboard-input?:boolean <- equal c:character ((#\null literal)))
+    (quit?:boolean <- or q-pressed?:boolean end-of-fake-keyboard-input?:boolean)
+    (break-unless quit?:boolean)
+    (reply t:literal)
+  }
+  ; up/down navigation
+  { begin
+    (up?:boolean <- equal c:character ((up literal)))
+    (k?:boolean <- equal c:character ((#\k literal)))
+    (up?:boolean <- or up?:boolean k?:boolean)
+    (break-unless up?:boolean)
+    (up 0:space-address/screen-state screen:terminal-address)
+    (reply nil:literal)
+  }
+  { begin
+    (down?:boolean <- equal c:character ((down literal)))
+    (j?:boolean <- equal c:character ((#\j literal)))
+    (down?:boolean <- or down?:boolean j?:boolean)
+    (break-unless down?:boolean)
+    (down 0:space-address/screen-state screen:terminal-address)
+    (reply nil:literal)
+  }
+  ; enter: expand current row
+  { begin
+    (toggle?:boolean <- equal c:character ((#\newline literal)))
+    (break-unless toggle?:boolean)
+    (tr:instruction-trace-address <- index traces:instruction-trace-address-array-address/deref cursor-row:integer/space:1)
+    (print-instruction-trace screen:terminal-address tr:instruction-trace-address 0:space-address/screen-state)
+    (reply nil:literal)
+  }
+  (reply nil:literal)
+])
+
 (function main [
   (default-space:space-address <- new space:literal 30:literal/capacity)
   (0:space-address/names:screen-state <- screen-state)
@@ -302,38 +350,8 @@ schedule:  done with routine")
   }
   ; handle key presses
   { begin
-    next-key
-    (c:character <- read-key nil:literal/keyboard silent:literal/terminal)
-    (loop-unless c:character)
-    (quit?:boolean <- equal c:character ((#\q literal)))
-    (break-if quit?:boolean)
-    (quit?:boolean <- equal c:character ((#\null literal)))
+    (quit?:boolean <- process-key 0:space-address/screen-state nil:literal/keyboard nil:literal/terminal traces:instruction-trace-address-array-address)
     (break-if quit?:boolean)
-    ; up/down navigation
-    { begin
-      (up?:boolean <- equal c:character ((up literal)))
-      (k?:boolean <- equal c:character ((#\k literal)))
-      (up?:boolean <- or up?:boolean k?:boolean)
-      (break-unless up?:boolean)
-      (up 0:space-address/screen-state nil:literal/terminal)
-      (jump next-key:offset)  ; loop
-    }
-    { begin
-      (down?:boolean <- equal c:character ((down literal)))
-      (j?:boolean <- equal c:character ((#\j literal)))
-      (down?:boolean <- or down?:boolean j?:boolean)
-      (break-unless down?:boolean)
-      (down 0:space-address/screen-state nil:literal/terminal)
-      (jump next-key:offset)  ; loop
-    }
-    ; enter: expand current row
-    { begin
-      (toggle?:boolean <- equal c:character ((#\newline literal)))
-      (break-unless toggle?:boolean)
-      (tr:instruction-trace-address <- index traces:instruction-trace-address-array-address/deref cursor-row:integer/space:1)
-      (print-instruction-trace nil:literal/terminal tr:instruction-trace-address 0:space-address/screen-state)
-      (jump next-key:offset)  ; loop
-    }
     (loop)
   }
   ; move cursor to bottom before exiting