commit 26459f69ca2732a62504a5ab655469f8af721ca6
parent 51ea8748a32244c57113c6bedef511397cfe76dd
Author: Christian Ermann <christianermann@gmail.com>
Date: Fri, 29 Nov 2024 15:04:49 -0800
Remove interpretation, only compile
Diffstat:
| M | src/forth.s | | | 107 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------- |
1 file changed, 80 insertions(+), 27 deletions(-)
diff --git a/src/forth.s b/src/forth.s
@@ -182,22 +182,22 @@ defcode "bye", bye, 0x71F39F63
defvar "#", prefix_decimal, 0x260C9112
.int 0x23
.int 0
- .int string_to_decimal
+ .int string_to_decimal_comma
defvar "$", prefix_hex, 0x210C8933
.int 0x24
.int _prefix_decimal
- .int string_to_hex
+ .int string_to_hex_comma
defvar "%", prefix_binary, 0x200C87A0
.int 0x25
.int _prefix_hex
- .int string_to_binary
+ .int string_to_binary_comma
defvar "'", prefix_address, 0x220C8AC6
.int 0x27
.int _prefix_binary
- .int string_to_address
+ .int string_to_address_comma
defvar "*", prefix_execute, 0x2F0C9F3D
.int 0x2A
@@ -514,8 +514,6 @@ defword "string>#", string_to_decimal, 0x75831783
li y, 10
sw y, 0(x)
jal to_number
- bnez w, _string_to_number_fail
- not w, w
exit
defword "string>$", string_to_hex, 0x7A831F62
@@ -523,8 +521,6 @@ defword "string>$", string_to_hex, 0x7A831F62
li y, 16
sw y, 0(x)
jal to_number
- bnez w, _string_to_number_fail
- not w, w
exit
defword "string>%", string_to_binary, 0x7B8320F5
@@ -532,21 +528,86 @@ defword "string>%", string_to_binary, 0x7B8320F5
li y, 2
sw y, 0(x)
jal to_number
- bnez w, _string_to_number_fail
- not w, w
exit
-_string_to_number_fail:
+defword "number,", number_comma, 0x5E932C64
+ bnez w, _number_comma_error
+ not w, w
+ jal swap
+ jal literal
+ exit
+_number_comma_error:
mv w, zero
exit
+defword "string>#,", string_to_decimal_comma, 0xAC5E487D
+ jal string_to_decimal
+ jal number_comma
+ exit
+
+defword "string>$,", string_to_hex_comma, 0x2A6A47CA
+ jal string_to_hex
+ jal number_comma
+ exit
+
+defword "string>%,", string_to_binary_comma, 0x486CB59B
+ jal string_to_binary
+ jal number_comma
+ exit
+
defword "string>address", string_to_address, 0xFDC3CE9A
jal find
addi x, w, code_offset
push x
exit
-defword "string>execute" string_to_execute, 0xC1A5C011
+defword "string>address,", string_to_address_comma, 0x313E6882
+ jal string_to_address
+ beqz w, _string_to_address_comma_fail
+ jal swap
+ jal literal
+ exit
+_string_to_address_comma_fail:
+ exit
+
+defword "literal", literal, 0xECB9D8E4, flags=flag_immediate
+ push w
+ li w, 0xFFC10113 # addi psp, psp, -4
+ push w
+ li w, 0xFEA12E23 # sw w, -4(psp)
+ jal comma
+ jal comma
+ mv x, w
+_literal_small_1:
+ # emit `addi w, zero, immed`
+ andi w, x, -1 # 0xFFF
+ slli w, w, 20
+ addi w, w, 0x513
+ li y, 0xFFF
+ bltu x, y, _literal_small_2
+_literal_large_1:
+ # change to `addi w, w, immed`
+ li y, 0xA
+ slli y, y, 15
+ add w, w, y
+ push w
+ # encode upper immediate
+ li w, 0xFFFFF000
+ and w, x, w
+ srli y, x, 11
+ andi y, y, 1
+ beqz y, _literal_large_2
+ li y, 0x00001000
+ add w, w, y
+_literal_large_2:
+ # emit `lui w, immed`
+ addi w, w, 0x537
+ jal comma
+_literal_small_2:
+ jal comma
+ exit
+
+defword "string>execute", string_to_execute, 0xC1A5C011
jal string_to_address
beqz w, _string_to_execute_done
pop w
@@ -631,6 +692,10 @@ _match_prefix_done:
next
defword "interpret", interpret, 0x1F98C57A
+ la x, _dp
+ load_cell x, 0(x)
+ push_ret x
+ jal docol_comma
_interpret_start:
jal parse_word
beqz w, _interpret_parse_area_empty
@@ -642,25 +707,10 @@ _interpret_find_word:
beqz w, _interpret_retry
_interpret_word_found:
addi w, w, code_offset
- # compiling?
- la x, _state
- load_cell x, 0(x)
- beqz x, _interpret_execute_word
- # immediate?
- addi x, w, flag_offset - code_offset
- lb x, 0(x)
- andi x, x, flag_immediate
- bnez x, _interpret_execute_word
-_interpret_compile_word:
load_cell w, 0(w)
jal jal_to
jal comma
j _interpret_start
-_interpret_execute_word:
- load_cell x, 0(w)
- pop w
- jalr x
- j _interpret_start
_interpret_execute_prefix:
load_cell x, 0(w)
pop w
@@ -675,6 +725,9 @@ _interpret_retry:
_interpret_parse_area_empty:
addi psp, psp, cell
pop w
+ jal exit_comma
+ pop_ret x
+ jalr x
exit
defword "bootstrap", bootstrap, 0x15C160D9