commit 6231546dd400848f912edf00580553396f0a6a98
parent 1ca369a5a72b38003e932a2a6eb31a6f03a5f97f
Author: Christian Ermann <christianermann@gmail.com>
Date: Thu, 24 Oct 2024 19:54:16 -0700
Add 'word'
Diffstat:
| M | forth.s | | | 39 | ++++++++++++++++++++++++++++++++++++--- |
| M | ns16550a.s | | | 18 | +++++++++--------- |
2 files changed, 45 insertions(+), 12 deletions(-)
diff --git a/forth.s b/forth.s
@@ -4,7 +4,7 @@
.extern __stack_top
#define w a0
-#define x t0
+#define x a1
#define ip s1
#define psp sp
#define rsp s2
@@ -107,16 +107,49 @@ defcode "key", 3, 0, key, emit
push a0
next
+defcode "word", 4, 0, word, key
+ jal word_impl
+ push w
+ push x
+ next
+
+word_impl:
+ li s3, 0x20 # space
+ li s4, 0x0A # new line
+ li s5, 0x0D # carriage return
+ addi s6, ra, 0
+_skip_whitespace:
+ jal uart_get_char
+ beq w, s3, _skip_whitespace
+ beq w, s4, _skip_whitespace
+ beq w, s5, _skip_whitespace
+ la x, word_buffer
+_store_char:
+ sb w, 0(x)
+ addi x, x, 1
+_next_char:
+ jal uart_get_char
+ beq w, s3, _word_end
+ beq w, s4, _word_end
+ bne w, s5, _store_char
+_word_end:
+ la w, word_buffer
+ sub x, x, w
+ addi ra, s6, 0
+ ret
+
.section ".rodata"
program:
.int type
- .int key
- .int emit
+ .int word
+ .int type
version_string:
.ascii "soup forth rv32\n"
version_string_len = (. - version_string)
+word_buffer: .space 255
+
.section ".text.boot"
start:
la psp, __stacktop
diff --git a/ns16550a.s b/ns16550a.s
@@ -49,17 +49,17 @@ _put_char:
ret
uart_put_string:
- addi s2, a0, 0
- addi s3, a1, 0
- addi s4, ra, 0
- blez s3, _out_of_chars
+ addi s3, a0, 0
+ addi s4, a1, 0
+ addi s5, ra, 0
+ blez s4, _out_of_chars
_next_char:
- lb a0, 0(s2)
- addi s2, s2, 1
- addi s3, s3, -1
+ lb a0, 0(s3)
+ addi s3, s3, 1
+ addi s4, s4, -1
jal uart_put_char
- bgtz s3, _next_char
+ bgtz s4, _next_char
_out_of_chars:
- addi ra, s4, 0
+ addi ra, s5, 0
ret