about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--trace.arc.t21
-rw-r--r--trace.mu21
2 files changed, 42 insertions, 0 deletions
diff --git a/trace.arc.t b/trace.arc.t
index bf81f3f9..a4389e04 100644
--- a/trace.arc.t
+++ b/trace.arc.t
@@ -325,5 +325,26 @@ schedule:  done with routine")
             "   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 (~memory-contains-array memory*.4
+         (+ "                                                                      "
+            "                                                                      "
+            "+ 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 : ((1 integer)): 1 <= 1                                        "
+            "   mem : ((2 integer)): 2 <= 3                                        "
+            "   mem : ((1 integer)) => 1                                           "
+            "   mem : ((2 integer)) => 3                                           "
+            "   mem : ((3 integer)): 3 <= 4                                        "
+            "   schedule :  done with routine                                      "))
+  (prn "F - process-key positions cursor on top of trace after expanding"))
 
 (reset)
diff --git a/trace.mu b/trace.mu
index 7bce1e8d..295d0f24 100644
--- a/trace.mu
+++ b/trace.mu
@@ -253,6 +253,25 @@
   }
 ])
 
+(function back-to [
+  (default-space:space-address <- new space:literal 30:literal/capacity)
+  (0:space-address/names:screen-state <- next-input)
+  (screen:terminal-address <- next-input)
+  (target-row:integer <- next-input)
+  { begin
+    (below-target?:boolean <- greater-than cursor-row:integer/space:1 target-row:integer)
+    (break-unless below-target?:boolean)
+    (up 0:space-address screen:terminal-address)
+    (loop)
+  }
+  { begin
+    (above-target?:boolean <- less-than cursor-row:integer/space:1 target-row:integer)
+    (break-unless above-target?:boolean)
+    (down 0:space-address screen:terminal-address)
+    (loop)
+  }
+])
+
 (function add-line [  ; move down, adding line if necessary
   (default-space:space-address <- new space:literal 30:literal/capacity)
   (0:space-address/names:screen-state <- next-input)
@@ -326,8 +345,10 @@
   { begin
     (toggle?:boolean <- equal c:character ((#\newline literal)))
     (break-unless toggle?:boolean)
+    (target-row:integer <- copy cursor-row:integer/space:1)
     (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)
+    (back-to 0:space-address/screen-state screen:terminal-address target-row:integer)
     (reply nil:literal)
   }
   (reply nil:literal)