forth-riscv

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

commit e96b14c147c6749d0be977ace11d395bfdf4c50f
parent 8499cfc19bb5b2dab4715ca6493089429db35b31
Author: Christian Ermann <christianermann@gmail.com>
Date:   Thu,  7 Nov 2024 14:46:24 -0800

Factor 'parse-string' into smaller words

Diffstat:
Mforth.f | 56++++++++++++++++++++++++++++++++++++++++++++------------
Mforth.s | 40+++++++++++++++++++---------------------
2 files changed, 63 insertions(+), 33 deletions(-)

diff --git a/forth.f b/forth.f @@ -25,23 +25,55 @@ : 'r' [ parse-char r ] literal ; : 'z' [ parse-char z ] literal ; -: parse-string - here +: parse-until + delimiter ! + source source-offset @ apply-offset + over >r + skip-until + 2dup parse-offset source-offset ! + drop r> tuck - ; + +: cmove + ( addr1 addr2 u -- ) + swap >r begin - parse-key dup dup '"' <> and + dup while + over c@ + r> tuck c! 1 + >r + 1 apply-offset + repeat + 2drop r> drop ; + +: translate-escape-code + ( char -- char ) + dup 'n' = if drop 10 else + dup 'r' = if drop 13 else + dup 'z' = if drop 0 else + dup '"' = if else + dup '\' = if else + then then then then then ; + +: translate-escape-string + ( addr len -- len-diff ) + over >r + begin + dup + while + over c@ dup '\' = if - drop parse-key - dup 'n' = if drop 10 else - dup 'r' = if drop 13 else - dup 'z' = if drop 0 else - dup '"' = if else - dup '\' = if else - then then then then then + drop 1 apply-offset over c@ + translate-escape-code then - over c! 1 + + r> tuck c! 1 + >r + 1 apply-offset repeat - drop here - here swap ; + drop r> - ; + +: parse-string + '"' parse-until + here swap 2dup 2>r cmove 2r> + 2dup translate-escape-string - ; : " compiling? if diff --git a/forth.s b/forth.s @@ -326,26 +326,6 @@ defword "parse", parse, 0x423B42EC defword "parse-word", parse_word, 0xB218226F .int bl, parse, exit -defcode "parse-key", parse_key, 0xB78FDA4A - la w, _tick_source - load_cell x, 0(w) - load_cell w, cell(w) - la y, _source_offset - load_cell y, 0(y) - add w, w, y - sub x, x, y - beqz x, 2f -1: - lb t0, 0(w) - addi y, y, 1 - la t1, _source_offset - store_cell y, 0(t1) - push t0 - next -2: - mv t0, zero - j 1b - defcode "parse-char", parse_char, 0xDF4F729B la w, _tick_source load_cell x, 0(w) @@ -690,6 +670,20 @@ defcode "r>", from_ret, 0x135408B1 push w next +defcode "2>r" two_to_ret, 0x69F5D439 + pop w + pop x + push_ret x + push_ret w + next + +defcode "2r>", two_from_ret, 0xB54DEDC1 + pop_ret w + pop_ret x + push x + push w + next + defcode "dup", dup, 0xD330F226 load_cell w, 0(psp) push w @@ -710,7 +704,7 @@ defcode "swap", swap, 0x64ED874E next defcode "drop", drop, 0xA9A58D8C - pop zero + addi psp, psp, cell next defcode "over", over, 0x31F6520F @@ -738,6 +732,10 @@ defcode "2dup", two_dup, 0x5E46F4D6 push w next +defcode "2drop", two_drop, 0xECFD129C + addi psp, psp, 2 * cell + next + # ----------------------------------------------------------------------------- # math and logic # -----------------------------------------------------------------------------