From 947f1fca89da7296d0e91353a8304e01d45654d1 Mon Sep 17 00:00:00 2001
From: Wesley Moore <wes@wezm.net>
Date: Mon, 10 Feb 2025 14:00:44 +1000
Subject: [PATCH] Attempt to print register values in regdump

---
 calc.s | 63 ++++++++++++++++++++++++++++++++++++++++++----------------
 hex.s  |  8 ++++++--
 2 files changed, 52 insertions(+), 19 deletions(-)

diff --git a/calc.s b/calc.s
index d1be333..22b58df 100644
--- a/calc.s
+++ b/calc.s
@@ -4,6 +4,8 @@
 # Provide program starting address to linker
 .global _start
 
+.extern tohex
+
 /* newlib system calls */
 .set SYSEXIT,  93
 .set SYSWRITE, 64
@@ -54,7 +56,7 @@ end:
     li a1, 1            # 1
     li a2, 0x80000000   # 0.5
     li a3, 1            # 1
-    jal add64
+    # jal add64
     #add t1, a0, 0       # copy a0 to t0 as end with overwrite it
     jal regdump
 
@@ -83,11 +85,25 @@ add64:
 # Print values of all registers (in hex)
 # write syscall uses t0, a0, a1, a2
 regdump:
-    addi sp, sp, -16 # allocate stack space
-    sw a0, 12(sp)    # save contents of a0
-    sw a1, 8(sp)     # save contents of a0
-    sw a2, 4(sp)     # save contents of a0
-    sw t0, 0(sp)     # save contents of a0
+    # save all registers to preserve their state when entering the function
+    # except sp, which will be offset by -64
+    addi sp, sp, -64 # allocate stack space to stash all registers
+    sw x0, 0(sp)
+    sw x1, 4(sp)
+    sw x2, 8(sp)
+    sw x3, 12(sp)
+    sw x4, 16(sp)
+    sw x5, 20(sp)
+    sw x6, 24(sp)
+    sw x7, 28(sp)
+    sw x8, 32(sp)
+    sw x9, 36(sp)
+    sw x10, 40(sp)
+    sw x11, 44(sp)
+    sw x12, 48(sp)
+    sw x13, 52(sp)
+    sw x14, 56(sp)
+    sw x15, 60(sp)
 
     li t0, SYSWRITE     # "write" syscall
     li a0, 1            # 1 = standard output (stdout)
@@ -107,32 +123,45 @@ regdump_loop:
     # copy regname to buf
     la a0, buf          # load address of buf into a0 as dest
     li a2, 2            # copy 2 bytes
-
-    addi sp, sp, -4  # allocate stack space
-    sw ra, 0(sp)     # save contents of ra
+    addi sp, sp, -4     # allocate stack space
+    sw ra, 0(sp)        # save contents of ra
     jal memcpy
-    lw ra, 0(sp)     # save contents of ra
-    addi sp, sp, 4   # deallocate stack space
-    # append ': \n'
+    lw ra, 0(sp)        # restore contents of ra
+    addi sp, sp, 4      # deallocate stack space
+    # append ': '
     li t0, ':
     sb t0, 0(a0)
     li t0, 0x20
     sb t0, 1(a0)
-    li t0, '\n
-    sb t0, 2(a0)
+    addi a0, a0, 2      # bump a0 address over ': ' text
+    mv a1, a0           # load address of output buffer to a1
+    slli a2, s0, 2      # calculate the offset of the register value relative to sp
+    add a2, a2, sp      # a2 = sp + (s0 * 4)
+    lw a0, 0(a2)        # load register value to format into a0
+    addi sp, sp, -8     # allocate stack space
+    sw a1, 4(sp)        # save contents of a1
+    sw ra, 0(sp)        # save contents of ra
+    jal tohex
+    lw ra, 0(sp)        # restore contents of ra
+    lw a1, 4(sp)        # restore contents of a1 (buffer)
+    addi sp, sp, 8      # deallocate stack space
+    li t0, '\n          # append newline
+    sb t0, 8(a1)
 
-    # print the register name
+    # print the register name and value
     li t0, SYSWRITE     # "write" syscall
     li a0, 1            # 1 = standard output (stdout)
     la a1, buf
-    li a2, 5            # length of register name string
+    li a2, 4+8+1        # length of register name string:
+                        # rr: 12345678\n
     ecall               # invoke syscall to print the string
 
     addi s0, s0, 1
     j regdump_loop
 
 regdump_done:
-    addi sp, sp, 16   # deallocate stack space
+    # TODO: Restore s0 & s1
+    addi sp, sp, 64   # deallocate stack space
     ret
 
 
diff --git a/hex.s b/hex.s
index 034f72e..dc9c696 100644
--- a/hex.s
+++ b/hex.s
@@ -16,10 +16,12 @@ hexchars:
 #    return:
 #       none
 tohex:
+    addi sp, sp, -20  # allocate stack space
+    sw s0, 12(sp)     # save contents of s0
+    sw s1, 8(sp)      # save contents of s1
     li s0, 0          # set up loop variables
     li s1, 4
     addi a1, a1, 6    # offset output address to end chars
-    addi sp, sp, -12  # allocate stack space
 tohex_loop:
     sw ra, 8(sp)      # save contents of ra
     sw a0, 4(sp)      # save contents of ra
@@ -33,7 +35,9 @@ tohex_loop:
     addi a1, a1, -2   # decrement output buffer address
     addi s0, s0, 1    # increment loop counter
     blt s0, s1, tohex_loop # TODO: we don't need the loop counter and output addr
-    addi sp, sp, 12   # deallocate stack space
+    lw s0, 12(sp)     # restore s0 & s1
+    lw s1, 8(sp)
+    addi sp, sp, 20   # deallocate stack space
     ret
 
 # Convert byte to ASCII hex