X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=compile.asm;h=8e87bf87012e2403217c7aa8e29963c79a41f70f;hb=f38c72b71edee9d23d958a1af73f843b5d44ccbe;hp=8a86f06c58a8356cabc1ab15bd036b669174f0fc;hpb=03f8e1c9c78e7247de10de9d5f12cbd5631e939c;p=rrq%2Frrqforth.git diff --git a/compile.asm b/compile.asm index 8a86f06..8e87bf8 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 @@ -116,10 +115,34 @@ p_quote_end: add rsi,8 next - WORD p_literal_string,'S"',fasm ;; " (fool emacs) + WORD p_literal_string,'S"',fasm,IMMEDIATE ;; " (fool emacs) ;; ( -- char* n ) ;; Save string on heap to make available at interpretation ;; not for interactive use!! + cmp qword [p_state_DFA],0 + je p_literal_string_executing + pushr rsi + mov rdi,qword [p_here_DFA] + mov qword [rdi],p_literal_string + add rdi,8 + mov qword [p_here_DFA],rdi + DOFORTH p_double_quote + pop rcx + pop rsi + mov rdi,qword [p_here_DFA] + mov qword [rdi],rcx + add rdi,8 +p_literal_string_copy: + dec rcx + jl p_literal_string_copied + movsb + jmp p_literal_string_copy +p_literal_string_copied: + mov qword [p_here_DFA],rdi + popr rsi + next + +p_literal_string_executing: mov rax,qword [rsi] add rsi,8 push rsi @@ -249,16 +272,18 @@ 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_tfa2cfa + dq p_comma + BRANCH ,p_evaluate_stream_AFTER p_evaluate_stream_NOTWORD: dq p_drop dq p_number @@ -294,12 +319,14 @@ 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 ;; ( -- )