X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=compile.asm;h=f723487f10e21d2db2aade7576dec84e4f65d392;hb=39427aee877cab09feea798b146e06dc7bfc25cc;hp=defb1acaa5dcfc25e59eac9acbe315c216b5c450;hpb=dca1b940cf2dbf0abca42ed9782013e5b3689ee1;p=rrq%2Frrqforth.git diff --git a/compile.asm b/compile.asm index defb1ac..f723487 100644 --- a/compile.asm +++ b/compile.asm @@ -41,7 +41,7 @@ p_create_COPY: WORD p_allot,'ALLOT' ;; ( n -- ) ;; Allocate n bytes on the heap - dq p_here, p_put_plus, p_exit + dq p_here, p_swap, p_put_plus, p_return WORD p_quote,"'" ;; ( "word" -- cfa ) @@ -50,22 +50,48 @@ p_create_COPY: BRANCH 0,p_quote_end dq p_tfa2cfa p_quote_end: - dq p_exit + dq p_return WORD p_bracketed_quote,"[']",doforth,IMMEDIATE ;; Compilation ( "word" -- cfa ) ;; Compile down " LIT value " - dq p_literal, p_literal, p_comma,p_quote, p_comma, p_exit + dq p_literal, p_literal, p_comma,p_quote, p_comma, p_return - WORD p_comma,',' - ;; ( v -- ) - ;; Put cell value onto the heap and advance "HERE" - dq p_here, p_literal, 8, p_get_n_increment, p_put, p_exit + WORD p_Ccomma,'C,',fasm + ;; ( c -- ) + ;; Put byte value onto the heap and advance "HERE" + mov rax,qword [p_here_DFA] + pop rbx + mov byte [rax],bl + inc qword [p_here_DFA] + next - WORD p_Ccomma,'C,' + WORD p_Wcomma,'W,',fasm ;; ( c -- ) ;; Put byte value onto the heap and advance "HERE" - dq p_here, p_Cput, p_literal, 1, p_here, p_put_plus, p_exit + mov rax,qword [p_here_DFA] + pop rbx + mov word [rax],bx + add qword [p_here_DFA],2 + next + + WORD p_Dcomma,'D,',fasm + ;; ( d -- ) + ;; Put byte value onto the heap and advance "HERE" + mov rax,qword [p_here_DFA] + pop rbx + mov dword [rax],ebx + add qword [p_here_DFA],4 + next + + WORD p_comma,',',fasm + ;; ( v -- ) + ;; Put byte value onto the heap and advance "HERE" + mov rax,qword [p_here_DFA] + pop rbx + mov qword [rax],rbx + add qword [p_here_DFA],8 + next WORD p_does,"DOES>",fasm,IMMEDIATE ;; ( -- ) @@ -89,12 +115,22 @@ p_quote_end: add rsi,8 next - WORD p_literal_string,'S"',fasm,IMMEDIATE ;; " (fool emacs) + WORD p_literal_string,'LIT-STRING',fasm ;; ( -- 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 + ;; Save NUL string length and pointer on heap to make + ;; available at interpretation. Not for interactive use!! + mov rax,qword [rsi] + add rsi,8 + push rsi + add rsi,rax + dec rax + push rax + next + + + WORD p_literal_string_compile,'S"',fasm,IMMEDIATE ;; " (fool emacs) + ;; ( "..." -- ) + ;; Lay out a LIT-STRING and a NUL string with length pushr rsi mov rdi,qword [p_here_DFA] mov qword [rdi],p_literal_string @@ -103,9 +139,11 @@ p_quote_end: DOFORTH p_double_quote pop rcx pop rsi + inc rcx ; include the terminating NUL in count mov rdi,qword [p_here_DFA] mov qword [rdi],rcx add rdi,8 + cld p_literal_string_copy: dec rcx jl p_literal_string_copied @@ -116,14 +154,6 @@ p_literal_string_copied: popr rsi next -p_literal_string_executing: - mov rax,qword [rsi] - add rsi,8 - push rsi - push rax - add rsi,rax - next - WORD p_state,'STATE',dovariable ;; Interpretation state (0=interpreting, 1=compiling) dq 0 @@ -286,7 +316,8 @@ p_evaluate_stream_END: dq p_literal, 1 p_evaluate_stream_BAD: dq p_Rgt, p_input, p_put ; restore previous stream - dq p_exit + dq p_literal,0, p_state, p_put ; set interactive mode + dq p_return WORD p_colon,':' ;; ( -- ) @@ -299,12 +330,12 @@ p_evaluate_stream_BAD: dq p_tfa2cfa dq p_put dq p_right_bracket - dq p_exit + dq p_return WORD p_semicolon,';',,IMMEDIATE ;; ( -- ) - ;; Lay out p_exit, and set interpreting mode - dq p_literal, p_exit, p_comma, p_left_bracket, p_exit + ;; Lay out p_return, and set interpreting mode + dq p_literal, p_return, p_comma, p_left_bracket, p_return WORD p_immediate,'IMMEDIATE',fasm,IMMEDIATE ;; ( -- ) @@ -346,4 +377,4 @@ p_load_file_badfile: dq p_tell, p_dot, p_nl, p_emit dq p_literal,1 p_load_file_exit: - dq p_exit + dq p_return