X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=compile.asm;h=fa850d404f16c15b96aa2b6b7df3c1f450c51143;hb=b2fd831eae011ac8353e283820e47c8840a1099c;hp=8102cbc813452b24d7ad20f11b64b06c249bbac3;hpb=a3427c86d68cc40ac6f9ed1bd153bb45f0456b55;p=rrq%2Frrqforth.git diff --git a/compile.asm b/compile.asm index 8102cbc..fa850d4 100644 --- a/compile.asm +++ b/compile.asm @@ -30,7 +30,6 @@ p_create_COPY: mov qword [rdi],0 ; OFF add rdi,8 mov qword [rbx+8],rdi ; pCFA - add rdi,8 mov qword [rdi],dovariable ; CFA add rdi,8 mov qword [p_here_DFA],rdi ; allocate the space @@ -225,7 +224,7 @@ p_numper_POSITIVE: ;; ( stream* -- *?* flag ) ;; 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. + dq p_gtR ; Keep the stream on the return stack. p_evaluate_stream_PROMPT: dq p_depth dq p_dot @@ -249,20 +248,26 @@ p_evaluate_stream_LOOP: dq p_get BRANCH 0,p_evaluate_stream_INTERPRET dq p_dup - dq p_cfa2flags_get - dq p_literal, 1 + dq p_tfa2flags_get + dq p_literal, 1 ; the immediate bit dq p_and - dq p_not - BRANCH 0,p_evaluate_stream_INTERPRET - dq p_comma - BRANCH ,p_evaluate_stream_AFTER + BRANCH 0,p_evaluate_stream_COMPILE p_evaluate_stream_INTERPRET: + dq p_tfa2cfa dq p_execute BRANCH ,p_evaluate_stream_AFTER +p_evaluate_stream_COMPILE: + dq p_comma + BRANCH ,p_evaluate_stream_AFTER p_evaluate_stream_NOTWORD: dq p_drop dq p_number BRANCH 0,p_evaluate_stream_BAD ; branch if 0 + dq p_state + dq p_get + BRANCH 0,p_evaluate_stream_AFTER ; branch if 0 + dq p_literal, p_literal + dq p_comma, p_comma p_evaluate_stream_AFTER: dq p_Rget dq p_stream_nchars @@ -289,9 +294,19 @@ p_evaluate_stream_BAD: dq p_right_bracket dq p_exit - WORD p_semicolon,';' + WORD p_semicolon,';',,IMMEDIATE ;; ( -- ) ;; Lay out p_exit, and set interpreting mode dq p_left_bracket dq p_literal, p_exit dq p_comma + dq p_left_bracket + dq p_exit + + WORD p_immediate,'IMMEDIATE',fasm,IMMEDIATE + ;; ( -- ) + ;; Set "immediate flag" of the word being defined + mov rax,qword [p_wordlist_DFA] + mov rax,qword [rax] ; tfa of most recent word + mov qword [rax+16],1 ; set the flags field to 1 + next