From: Ralph Ronnquist Date: Sun, 23 May 2021 14:50:00 +0000 (+1000) Subject: fix S" to handle both compilation and interpretation. X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=005c34fcfa86b514b8feb2224949538abbd473ca;p=rrq%2Frrqforth.git fix S" to handle both compilation and interpretation. fix EVALUATE-STREAM to prompt anew for each new line. --- diff --git a/compile.asm b/compile.asm index 71393bb..2b57cf1 100644 --- a/compile.asm +++ b/compile.asm @@ -89,10 +89,35 @@ p_create_COPY: add rsi,8 next - WORD p_literal_string,'S"',fasm - ;; " (fool emacs) - ;; ( -- chars* n ) - ;; Push the value of successor cell onto stack, and skip it + WORD p_literal_string,'S"',fasm ;; " (fool emacs) + ;; Compilation: ( "..." -- ) + ;; Interpretation: ( -- char* n ) + ;; Save string on heap to make available at interpretation + cmp qword [p_state_DFA],0 + je p_literal_string_interpret + ;; compilation mode: read stream until \" onto the heap + pushr rsi + mov rdi,[p_here_DFA] + lea rbx,[p_literal_string_CFA] + mov qword [rdi],rbx + add rdi,8 + pop rbx + mov qword [rdi],rbx + add rdi,8 + cmp rbx,0 + je p_literal_string_end + lea rsi,[p_pad_DFA] +p_literal_string_copy: + lodsb + stosb + dec rbx + jg p_literal_string_copy +p_literal_string_end: + mov qword [p_here_DFA],rdi + popr rsi + next + +p_literal_string_interpret: mov rax,qword [rsi] add rsi,8 push rsi @@ -202,31 +227,30 @@ p_numper_POSITIVE: ;; Execute the words from the given stream ;; returns 1 if stream ends and 0 if an unknown word is found dq p_ltR ; Keep the stream on the return stack. +p_evaluate_stream_PROMPT: + dq p_depth, p_dot, p_literal_string + STRING ' > ' + dq p_tell, p_Rget, p_clear_stream p_evaluate_stream_LOOP: - dq p_Rget ; ( -- stream* - dq p_read_word ; ( -- chars* n ) - dq p_dup + dq p_Rget, p_read_word, p_dup BRANCH 0,p_evaluate_stream_END ; branch if 0 on TOP - dq p_2dup ; ( -- chars* n chars* n ) - dq p_this_word ; ( -- chars* n chars* n p ) - dq p_2put ; ( -- chars* n ) - dq p_find ; ( -- [ chars* n 0 ]/[ tfa ] ) - dq p_dup ; ( -- [ chars* n 0 0 ]/[ tfa tfa ] ) + dq p_2dup, p_this_word, p_2put, p_find, p_dup BRANCH 0,p_evaluate_stream_NOTWORD ; branch if 0 on TOP - dq p_execute ; consumes tfa - BRANCH ,p_evaluate_stream_LOOP + dq p_state, p_get + BRANCH 0,p_evaluate_stream_INTERPRET + dq p_comma + BRANCH ,p_evaluate_stream_AFTER +p_evaluate_stream_INTERPRET: + dq p_execute + BRANCH ,p_evaluate_stream_AFTER p_evaluate_stream_NOTWORD: - dq p_drop ; ( -- chars* n ) - dq p_number ; ( -- [ 0 ]/[ v 1 ] ) - dq p_dup + dq p_drop, p_number BRANCH 0,p_evaluate_stream_BAD ; branch if 0 - dq p_drop +p_evaluate_stream_AFTER: + dq p_Rget,p_stream_nchars + BRANCH 0,p_evaluate_stream_PROMPT BRANCH ,p_evaluate_stream_LOOP p_evaluate_stream_END: - dq p_2drop - dq p_literal - dq 1 + dq p_2drop, p_literal, 1 p_evaluate_stream_BAD: - dq p_Rgt ; Discard the stream from the return stack - dq p_drop - dq p_exit + dq p_Rgt, p_drop, p_exit