From: Ralph Ronnquist Date: Mon, 24 May 2021 11:24:02 +0000 (+1000) Subject: compiling fixes X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=66382e2941c3b774bb04cd27954258a50b1c402a;p=rrq%2Frrqforth.git compiling fixes --- diff --git a/compile.asm b/compile.asm index 2b57cf1..6ddf3a3 100644 --- a/compile.asm +++ b/compile.asm @@ -8,10 +8,10 @@ ;; CREATE ( chars* n -- tfa ) ;; Add the pstring as a new word in the current wordlist. pushr rsi - mov rax,qword [p_wordlist_DFA] ; Current word list - mov rax,[rax] ; last word of current wordlist + mov rdx,qword [p_wordlist_DFA] ; Current word list mov rbx,qword [p_here_DFA] - mov [rbx],rax ; TFA of new word + mov rax,qword [rdx] ; set up tfa linking to previous word + mov qword [rbx],rax ; mov qword [rbx+16],0 ; flags field ;; copy pname pop rcx ; n @@ -22,19 +22,19 @@ p_create_COPY: movsb dec rcx - jge p_create_COPY + jg p_create_COPY mov byte [rdi],0 ; extra NUL inc rdi mov qword [rdi],rbx ; pTFA add rdi,8 - mov qword [rdi],rbx ; OFF + mov qword [rdi],0 ; OFF add rdi,8 mov qword [rbx+8],rdi ; pCFA add rdi,8 - mov qword [rdi],dovalue ;CFA + mov qword [rdi],dovariable ; CFA add rdi,8 - mov qword [rax],rbx ; Install new word mov qword [p_here_DFA],rdi ; allocate the space + mov qword [rdx],rbx ; Install new word (rdx still wordlist ptr) push rbx popr rsi next @@ -43,10 +43,37 @@ p_create_COPY: ;; ( n -- ) ;; Allocate n bytes on the heap pop rax - add rax,qword [p_here_DFA] - mov qword [p_here_DFA],rax + add qword [p_here_DFA],rax next + WORD p_quote,"'",fasm,IMMEDIATE + ;; ( "word" -- cfa ) + ;; Find the following word and push its cfa, or 0 + pushr rsi + DOFORTH p_stdin, p_read_word, p_find + cmp qword[rsp],0 + jne p_quote_tfa + add rsp,16 + mov qword[rsp],0 + jmp p_quote_end +p_quote_tfa: + mov rax,qword [rsp] + tfa2cfa rax + mov qword [rsp],rax +p_quote_end: + popr rsi + next + + WORD p_bracketed_quote,"[']",doforth,IMMEDIATE + ;; Compilation ( "word" -- cfa ) + ;; Find the following word and push its cfa, or 0 + dq p_literal + dq p_literal + dq p_comma + dq p_quote + dq p_comma + dq p_exit + WORD p_comma,',',fasm ;; ( v -- ) ;; Put cell value onto the heap and advance "HERE" @@ -67,57 +94,32 @@ p_create_COPY: mov qword [p_here_DFA],rax next - WORD p_does,'DOES>',fasm,IMMEDIATE + WORD p_does,"DOES>",fasm,IMMEDIATE ;; ( -- ) - ;; Change the "DOES offset" of latest compilation and assign - ;; it the "dodoes" execution semantics, - mov rax,qword [p_wordlist_DFA] - mov rax,[rax] ; last word of current wordlist + ;; Change the "DOES offset" of most recent word and assign it + ;; the "dodoes" execution semantics that follows. + mov rax,qword [rsp] + mov rbx,rax tfa2does rax ; *rax is the DOES offset field - ;; offset = qword [p_here_DFA]) - (rax+2*8) - mov rbx,qword [p_here_DFA] - sub rbx,rax - sub rbx,16 - mov qword [rax],rbx + tfa2dfa rbx + mov rcx,qword [p_here_DFA] + sub rcx,rbx + mov qword [rax],rcx ; save offset from DFA to HERE mov qword [rax+8],dodoes next - WORD p_literal,'LIT',fasm + WORD p_literal,'LIT',fasm,IMMEDIATE ;; ( -- v ) - ;; Push the value of successor cell onto stack, and skip it + ;; Push the value of successor cell onto stack, and skip it. + ;; not for interactive use!! push qword [rsi] add rsi,8 next WORD p_literal_string,'S"',fasm ;; " (fool emacs) - ;; Compilation: ( "..." -- ) - ;; Interpretation: ( -- char* n ) + ;; ( -- 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: + ;; not for interactive use!! mov rax,qword [rsi] add rsi,8 push rsi @@ -125,16 +127,13 @@ p_literal_string_interpret: add rsi,rax next -;;; ======================================== -;;; The text interpreter - WORD p_state,'STATE',dovariable ;; Interpretation state (0=interpreting, 1=compiling) dq 0 WORD p_left_bracket,'[',fasm,IMMEDIATE ;; ( -- ) - ;; Change state to interpretation state. + ;; Change state to interpreting state. mov qword[p_state_DFA],0 next @@ -228,15 +227,32 @@ p_numper_POSITIVE: ;; 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 + dq p_depth + dq p_dot + dq p_literal_string + STRING '> ' + dq p_tell + dq p_Rget + dq p_clear_stream p_evaluate_stream_LOOP: - dq p_Rget, p_read_word, p_dup + dq p_Rget + dq p_read_word + dq p_dup BRANCH 0,p_evaluate_stream_END ; branch if 0 on TOP - dq p_2dup, p_this_word, p_2put, p_find, p_dup + dq p_2dup + dq p_this_word + dq p_2put + dq p_find + dq p_dup BRANCH 0,p_evaluate_stream_NOTWORD ; branch if 0 on TOP - dq p_state, p_get + dq p_state + dq p_get + BRANCH 0,p_evaluate_stream_INTERPRET + dq p_dup + dq p_cfa2flags_get + dq p_literal, 1 + dq p_and + dq p_not BRANCH 0,p_evaluate_stream_INTERPRET dq p_comma BRANCH ,p_evaluate_stream_AFTER @@ -244,13 +260,38 @@ p_evaluate_stream_INTERPRET: dq p_execute BRANCH ,p_evaluate_stream_AFTER p_evaluate_stream_NOTWORD: - dq p_drop, p_number + dq p_drop + dq p_number BRANCH 0,p_evaluate_stream_BAD ; branch if 0 p_evaluate_stream_AFTER: - dq p_Rget,p_stream_nchars + dq p_Rget + dq p_stream_nchars BRANCH 0,p_evaluate_stream_PROMPT BRANCH ,p_evaluate_stream_LOOP p_evaluate_stream_END: - dq p_2drop, p_literal, 1 + dq p_2drop + dq p_literal, 1 p_evaluate_stream_BAD: - dq p_Rgt, p_drop, p_exit + dq p_Rgt + dq p_drop + dq p_exit + + WORD p_colon,':' + ;; ( -- ) + ;; Read next word as a new word into current wordlist, set it + ;; to be a doforth word, and set compiling mode. + dq p_literal, doforth + dq p_stdin + dq p_read_word + dq p_create + dq p_tfa2cfa + dq p_put + dq p_right_bracket + dq p_exit + + WORD p_semicolon,';' + ;; ( -- ) + ;; Lay out p_exit, and set interpreting mode + dq p_left_bracket + dq p_literal, p_exit + dq p_comma