about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--317abort.subx154
1 files changed, 140 insertions, 14 deletions
diff --git a/317abort.subx b/317abort.subx
index 3a2aad43..45b58976 100644
--- a/317abort.subx
+++ b/317abort.subx
@@ -15,7 +15,9 @@ abort:  # e: (addr array byte)
       eb/jump loop/disp8
     }
 
-# destroys the heap
+# Helpers below this point are not intended to be reused; they assume the
+# program will soon crash. In particular, they destroy the heap.
+
 dump-call-stack:
     # . prologue
     55/push-ebp
@@ -25,7 +27,7 @@ dump-call-stack:
     51/push-ecx
     52/push-edx
     53/push-ebx
-    # var labels/edx: (stream {label-name, address} 0x1000)
+    # var labels/edx: (addr stream {start-address, label-slice} 0x1000)
     81 5/subop/subtract %esp 0xc000/imm32
     68/push  0xc000/imm32
     68/push  0/imm32/read
@@ -60,7 +62,7 @@ $dump-call-stack:end:
     5d/pop-to-ebp
     c3/return
 
-load-debug-symbols:  # labels/edx: (stream {label-name, address})
+load-debug-symbols:  # labels: (addr stream {start-address, label-slice})
     # . prologue
     55/push-ebp
     89/<- %ebp 4/r32/esp
@@ -70,25 +72,34 @@ load-debug-symbols:  # labels/edx: (stream {label-name, address})
     52/push-edx
     53/push-ebx
     # create space for a stream on the heap, clobbering any existing data
-    # var ecx: (addr stream byte)
+    # var s/ecx: (addr stream byte)
     b9/copy-to-ecx 0x03000000/imm32
     c7 0/subop/copy *ecx 0/imm32  # write index
     c7 0/subop/copy *(ecx+4) 0/imm32  # read index
     c7 0/subop/copy *(ecx+8) 0x01000000/imm32  # stream capacity = 16MB
     # load 0x100 sectors starting from sector 10080 = 0x2760
     (load-sectors Primary-bus-primary-drive 0x2760 0x100 %ecx)
-    b8/copy-to-eax 0x0300000c/imm32
-    b9/copy-to-ecx 0/imm32
+    # - parse pointers to portions of this stream into labels
+    # var curr/ecx: (addr byte) = s->data
+    81 0/subop/add %ecx 0xc/imm32
     {
-      3d/compare-eax-and 0x030000ff/imm32
-      74/jump-if-= break/disp8
-      #
-      8a/byte-> *eax 1/r32/CL
-      (draw-grapheme-at-cursor 0 %ecx 7 0)
-      (move-cursor-rightward-and-downward 0)
+#?       (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "." 7 0)
+      # loop termination check
+      b8/copy-to-eax 0/imm32
+      8a/byte-> *ecx 0/r32/eax
+      3d/compare-eax-and 0/imm32
+      0f 84/jump-if-= break/disp32
+      # loop body
+      (skip-to-next-space %ecx)  # => edx
+      42/increment-edx
+      (skip-to-next-newline %edx)  # => ebx
+      (parse-hex-int-helper %edx %ebx)  # => eax
+      43/increment-ebx
+      (label-append *(ebp+8) %eax %ecx %edx)
+      # loop update
+      89/<- %ecx 3/r32/ebx
       #
-      40/increment-eax
-      eb/jump loop/disp8
+      e9/jump loop/disp32
     }
 $load-debug-symbols:end:
     # . reclaim locals
@@ -102,3 +113,118 @@ $load-debug-symbols:end:
     89/<- %esp 5/r32/ebp
     5d/pop-to-ebp
     c3/return
+
+skip-to-next-space:  # curr: (addr byte) -> _/edx: (addr byte)
+    # . prologue
+    55/push-ebp
+    89/<- %ebp 4/r32/esp
+    # . save registers
+    50/push-eax
+    # eax = 0
+    b8/copy-to-eax 0/imm32
+    #
+    8b/-> *(ebp+8) 2/r32/edx
+    {
+      8a/byte-> *edx 0/r32/eax
+      3d/compare-eax-and 0x20/imm32/space
+      0f 84/jump-if-= break/disp32
+      3d/compare-eax-and 0/imm32
+      {
+        75/jump-if-!= break/disp8
+        (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "done loading" 7 0)
+        {
+          eb/jump loop/disp8
+        }
+      }
+      3d/compare-eax-and 0xa/imm32/newline
+      {
+        75/jump-if-!= break/disp8
+        (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "unexpected newline" 7 0)
+        {
+          eb/jump loop/disp8
+        }
+      }
+      42/increment-edx
+      e9/jump loop/disp32
+    }
+$skip-to-next-space:end:
+    # . restore registers
+    58/pop-to-eax
+    # . epilogue
+    89/<- %esp 5/r32/ebp
+    5d/pop-to-ebp
+    c3/return
+
+skip-to-next-newline:  # curr: (addr byte) -> _/ebx: (addr byte)
+    # . prologue
+    55/push-ebp
+    89/<- %ebp 4/r32/esp
+    # . save registers
+    50/push-eax
+    # eax = 0
+    b8/copy-to-eax 0/imm32
+    #
+    8b/-> *(ebp+8) 3/r32/ebx
+    {
+      8a/byte-> *ebx 0/r32/eax
+      3d/compare-eax-and 0xa/imm32/newline
+      0f 84/jump-if-= break/disp32
+      3d/compare-eax-and 0/imm32
+      {
+        75/jump-if-!= break/disp8
+        (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "done loading" 7 0)
+        {
+          eb/jump loop/disp8
+        }
+      }
+      3d/compare-eax-and 0x20/imm32/space
+      {
+        75/jump-if-!= break/disp8
+        (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "unexpected space" 7 0)
+        {
+          eb/jump loop/disp8
+        }
+      }
+      43/increment-ebx
+      e9/jump loop/disp32
+    }
+$skip-to-next-newline:end:
+    # . restore registers
+    58/pop-to-eax
+    # . epilogue
+    89/<- %esp 5/r32/ebp
+    5d/pop-to-ebp
+    c3/return
+
+label-append:  # labels: (addr stream {start-address, label-slice}), address: int, start: int, end: int
+    # . prologue
+    55/push-ebp
+    89/<- %ebp 4/r32/esp
+    # . save registers
+    50/push-eax
+    51/push-ecx
+    56/push-esi
+    # esi = labels
+    8b/-> *(ebp+8) 6/r32/esi
+    # ecx = labels->write
+    8b/-> *esi 1/r32/ecx
+    # labels->data[labels->write] = address
+    8b/-> *(ebp+0xc) 0/r32/eax
+    89/<- *(esi+ecx+0xc) 0/r32/eax
+    # labels->data[labels->write+4] = start
+    8b/-> *(ebp+0x10) 0/r32/eax
+    89/<- *(esi+ecx+0x10) 0/r32/eax
+    # labels->data[labels->write+8] = end
+    8b/-> *(ebp+0x14) 0/r32/eax
+    89/<- *(esi+ecx+0x14) 0/r32/eax
+    # labels->write += 12
+    81 0/subop/add *esi 0xc/imm32
+$label-append:end:
+    # . restore registers
+    5e/pop-to-esi
+    59/pop-to-ecx
+    58/pop-to-eax
+    # . epilogue
+    89/<- %esp 5/r32/ebp
+    5d/pop-to-ebp
+    c3/return