forth-riscv

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

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:
Msrc/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