about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-05-29 17:23:04 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-05-29 17:23:04 -0700
commit9516dfa0b04bcdcd1c9c38aa6278549ccdb5528c (patch)
treea701a0435d01d0a24a258c8ed06a7d9c836b2890
parentd85529f3fac9044cfc52d395b1b64de4f4901cb9 (diff)
downloadmu-9516dfa0b04bcdcd1c9c38aa6278549ccdb5528c.tar.gz
shell: skeleton for scrolling
-rw-r--r--boot.subx14
-rw-r--r--shell/trace.mu30
-rwxr-xr-xtranslate_subx2
-rwxr-xr-xtranslate_subx_emulated2
4 files changed, 44 insertions, 4 deletions
diff --git a/boot.subx b/boot.subx
index 8ad3f2a8..7baf88e8 100644
--- a/boot.subx
+++ b/boot.subx
@@ -122,6 +122,20 @@
   cd/syscall 0x13/imm8/bios-disk-services
   0f 82/jump-if-carry disk_error/disp16
 
+  # load two more tracks of disk into addresses [0x46c00, 0x56800)
+  b4/copy-to-ah 2/imm8/read-drive
+  # dl comes conveniently initialized at boot time with the index of the device being booted
+  b5/copy-to-ch 0/imm8/cylinder
+  b6/copy-to-dh 6/imm8/head
+  b1/copy-to-cl 1/imm8/sector  # 1-based
+  b0/copy-to-al 0x7e/imm8/num-sectors  # 2*63 = 126
+  # address to write sectors to = es:bx = 0x46c00, contiguous with boot segment
+  bb/copy-to-bx 0x46c0/imm16
+  8e/->seg 3/mod/direct 3/rm32/bx 0/r32/es
+  bb/copy-to-bx 0/imm16
+  cd/syscall 0x13/imm8/bios-disk-services
+  0f 82/jump-if-carry disk_error/disp16
+
   # reset es
   bb/copy-to-bx 0/imm16
   8e/->seg 3/mod/direct 3/rm32/bx 0/r32/es
diff --git a/shell/trace.mu b/shell/trace.mu
index 4203944b..20de38c2 100644
--- a/shell/trace.mu
+++ b/shell/trace.mu
@@ -23,15 +23,18 @@ type trace {
   #     render loop:
   #       rendering displays trace lines that match visible lines
   #         (caching in each line)
+  #         (caching top-line)
   #       rendering computes cursor-line based on the cursor-y coordinate
   #       edit-trace updates cursor-y coordinate
   #       edit-trace might add/remove lines to visible
+  #       edit-trace might update top-line
   visible: (handle array trace-line)
   recreate-caches?: boolean
   cursor-line-index: int  # index into data
   cursor-y: int  # row index on screen
   unclip-cursor-line?: boolean  # extremely short-lived; reset any time cursor moves
-  top-line-index: int  # index into data
+  top-line-index: int  # start rendering trace past this index into data (updated on re-evaluation)
+  top-line-y: int  # trace starts rendering at this row index on screen (updated on re-evaluation)
 }
 
 type trace-line {
@@ -434,6 +437,8 @@ fn render-trace screen: (addr screen), _self: (addr trace), xmin: int, ymin: int
   compare *recreate-caches?, 0/false
   {
     break-if-=
+    var dest/eax: (addr int) <- get self, top-line-y
+    copy-to *dest, y
     recompute-all-visible-lines self
     mark-lines-clean self
   }
@@ -441,7 +446,6 @@ fn render-trace screen: (addr screen), _self: (addr trace), xmin: int, ymin: int
   var trace-ah/eax: (addr handle array trace-line) <- get self, data
   var _trace/eax: (addr array trace-line) <- lookup *trace-ah
   var trace/edi: (addr array trace-line) <- copy _trace
-  var i/edx: int <- copy 0
   var max-addr/ebx: (addr int) <- get self, first-free
   var max/ebx: int <- copy *max-addr
   # display trace depth (not in tests)
@@ -460,6 +464,8 @@ fn render-trace screen: (addr screen), _self: (addr trace), xmin: int, ymin: int
     draw-text-rightward-from-cursor-over-full-screen screen, "trace depth: ", 0x17/fg, 0xc5/bg=blue-bg
     draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen screen, *max-depth, 0x7/fg, 0xc5/bg=blue-bg
   }
+  var top-line-addr/edx: (addr int) <- get self, top-line-index
+  var i/edx: int <- copy *top-line-addr
   $render-trace:loop: {
     compare i, max
     break-if->=
@@ -924,6 +930,20 @@ fn edit-trace _self: (addr trace), key: grapheme {
     copy-to *unclip-cursor-line?, 1/true
     return
   }
+  # ctrl-f: scroll down
+  {
+    compare key, 6/ctrl-f
+    break-if-!=
+    scroll-down self
+    return
+  }
+  # ctrl-b: scroll up
+  {
+    compare key, 2/ctrl-b
+    break-if-!=
+    scroll-up self
+    return
+  }
 }
 
 fn expand _self: (addr trace) {
@@ -1789,3 +1809,9 @@ fn test-trace-collapse-nested-level {
   check-screen-row screen,                                  3/y, "...        ", "F - test-trace-collapse-nested-level/post-3"
   check-background-color-in-screen-row screen, 7/bg=cursor, 3/y, "           ", "F - test-trace-collapse-nested-level/post-3/cursor"
 }
+
+fn scroll-down _self: (addr trace) {
+}
+
+fn scroll-up _self: (addr trace) {
+}
diff --git a/translate_subx b/translate_subx
index 7b16425c..30729a06 100755
--- a/translate_subx
+++ b/translate_subx
@@ -35,7 +35,7 @@ cat a.survey    |linux/hex                                      > a.bin
 dd if=/dev/zero of=code.img count=20160  # 20*16*63 512-byte sectors = almost 10MB
 dd if=a.bin of=code.img conv=notrunc
 
-if [ `stat --printf="%s" a.bin` -ge 258048 ]  # 8 tracks * 63 sectors per track * 512 bytes per sector (keep this sync'd with boot.subx)
+if [ `stat --printf="%s" a.bin` -ge 322560 ]  # 10 tracks * 63 sectors per track * 512 bytes per sector (keep this sync'd with boot.subx)
 then
   echo "a.bin won't all be loaded on boot"
   exit 1
diff --git a/translate_subx_emulated b/translate_subx_emulated
index fb89bfaf..43c7d954 100755
--- a/translate_subx_emulated
+++ b/translate_subx_emulated
@@ -39,7 +39,7 @@ cat a.survey      |linux/bootstrap/bootstrap run linux/hex
 dd if=/dev/zero of=code.img count=20160  # 20*16*63 512-byte sectors = almost 10MB
 dd if=a.bin of=code.img conv=notrunc
 
-if [ `stat --printf="%s" a.bin` -ge 258048 ]  # 8 tracks * 63 sectors per track * 512 bytes per sector (keep this sync'd with boot.subx)
+if [ `stat --printf="%s" a.bin` -ge 322560 ]  # 10 tracks * 63 sectors per track * 512 bytes per sector (keep this sync'd with boot.subx)
 then
   echo "a.bin won't all be loaded on boot"
   exit 1