commit deeb1b70ee97718303cf23f56947f8c5a7acda12
parent dd575ad8780f3f389dd9b9392045fa1c6c1d76b2
Author: Christian Ermann <christianermann@gmail.com>
Date: Tue, 3 Dec 2024 20:35:35 -0800
Fix 'create', 'variable', and 'constant' to work with new data layout
Diffstat:
| M | src/forth.s | | | 80 | +++++++++++++++++++++++++++++++++++++++++++++++-------------------------------- |
1 file changed, 48 insertions(+), 32 deletions(-)
diff --git a/src/forth.s b/src/forth.s
@@ -123,8 +123,7 @@ meta_\label:
.macro defvar name, label, hash, flags=0, initial=0
defmeta "\name", \label
defhead "\name", \label, \hash, dovar, flags=\flags
- push_ret ra
- jal dovar
+ dovar _\label
.globl _\label
_\label:
.endm
@@ -132,8 +131,15 @@ _\label:
.macro defconst name, label, hash, flags=0, value=0
defmeta "\name", \label
defhead "\name", \label, \hash, docon, flags=\flags
- push_ret ra
- jal docon
+ docon \value
+ .globl _\label
+_\label:
+.endm
+
+.macro defconst_addr name, label, hash, flags=0, value=0
+ defmeta "\name", \label
+ defhead "\name", \label, \hash, docon, flags=\flags
+ docon_addr \value
.globl _\label
_\label:
.endm
@@ -147,17 +153,23 @@ _\label:
ret
.endm
-dovar:
+.macro dovar address
push w
- mv w, ra
- pop_ret ra
+ la w, \address
ret
+.endm
-docon:
+.macro docon value
push w
- load_cell w, 0(ra)
- pop_ret ra
+ li w, \value
ret
+.endm
+
+.macro docon_addr value
+ push w
+ la w, \value
+ ret
+.endm
dodoes:
push_ret ip # save old ip
@@ -221,14 +233,9 @@ defvar "latest-prefix", latest_prefix, 0x86C823C5
# constants and variables
# -----------------------------------------------------------------------------
-defconst "sp0", sp_top, 0x0C41B8B2
- .int __stacktop
-
-defconst "rp0", rp_top, 0x8AD91EDD
- .int __stacktop_ret
-
-defconst "bl", bl, 0x412BAEAB
- .int 0x20
+defconst_addr "sp0", sp_top, 0x0C41B8B2, value=__stacktop
+defconst_addr "rp0", rp_top, 0x8AD91EDD, value=__stacktop_ret
+defconst "bl", bl, 0x412BAEAB, value=0x20
defvar "state", state, 0x783132F6
.int state_executing
@@ -1328,18 +1335,23 @@ defword "jal-to", jal_to, 0xC38EF054
exit
defword "dovar,", dovar_comma, 0x1F514E5B
- # 'jal ra, dovar'
+ # push w
+ # la w, <address>
+ jal here
+ jal literal
+ # ret
push w
- la w, dovar
- jal jal_to
+ li w, 0x00008067
jal compile_comma
exit
defword "docon,", docon_comma, 0x76DCA1A4
- # 'jal ra, docon'
+ # push w
+ # li w, <value>
+ jal literal
+ # ret
push w
- la w, docon
- jal jal_to
+ li w, 0x00008067
jal compile_comma
exit
@@ -1425,9 +1437,12 @@ defword "string>define", string_to_define, 0x888D086D
li w, -1
exit
-defword "create", create, 0x26BB595D
+defword "create", create, 0x26BB595D, flags=flag_immediate
jal parse_word
jal string_to_header
+ jal r_bracket
+ jal dovar_comma
+ jal l_bracket
exit
defcode "hash", hash, 0xEDBF0FE3
@@ -1534,19 +1549,20 @@ defword ";macro", semicolon_macro, 0x599E1C06, flags=flag_immediate
jal macro
exit
-defword "variable", variable, 0x19385305
+defword "variable", variable, 0x19385305, flags=flag_immediate
jal create
+ # initialize to zero
push w
mv w, zero
jal comma
exit
-defword "constant", constant, 0x0691EA25
- jal create
- push_imm -cell
- jal allot
- jal docon_comma # append 'docon'
- jal comma
+defword "constant", constant, 0x0691EA25, flags=flag_immediate
+ jal parse_word
+ jal string_to_header
+ jal r_bracket
+ jal docon_comma
+ jal l_bracket
exit
# TODO: ';does' and related words still need updated to work with subroutine