forth-riscv

My forth
git clone git://git.electrosoup.com/forth-riscv
Log | Files | Refs

commit 6231546dd400848f912edf00580553396f0a6a98
parent 1ca369a5a72b38003e932a2a6eb31a6f03a5f97f
Author: Christian Ermann <christianermann@gmail.com>
Date:   Thu, 24 Oct 2024 19:54:16 -0700

Add 'word'

Diffstat:
Mforth.s | 39++++++++++++++++++++++++++++++++++++---
Mns16550a.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