X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=compile.asm;h=2b57cf16cef2a6835af4b47bf086e5126426fbf1;hb=005c34fcfa86b514b8feb2224949538abbd473ca;hp=be4f6526e9db02d510326ed9faa941592acf4329;hpb=02ef6e814ef0e6c61348c70bd310ba1f0df2506b;p=rrq%2Frrqforth.git diff --git a/compile.asm b/compile.asm index be4f652..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 @@ -119,44 +144,113 @@ p_create_COPY: mov qword[p_state_DFA],1 next - WORD p_number,'NUMBER' + WORD p_base,'BASE',dovariable + dq 10 + + WORD p_decimal,'DECIMAL',fasm + ;; ( -- ) + ;; Set BASE to 10 + mov qword [p_base_DFA],10 + next + + WORD p_hex,'HEX',fasm + ;; ( -- ) + ;; Set BASE to 16 + mov qword [p_base_DFA],16 + next + + WORD p_number,'NUMBER',fasm ;; ( chars* n -- [ 0 ]/[ v 1 ] ) + pushr rsi + pop rcx ; ( -- chars* ) + pop rsi ; ( -- ) + xor rdi,rdi ; value + mov rbx,1 ; sign (byte 0=0 means negative) + cmp qword [p_base_DFA],10 + jne p_number_LOOP + cmp byte [rsi],'-' + jne p_number_LOOP + mov rbx,0 + inc rsi + dec rcx + jle p_number_BAD +p_number_LOOP: + dec rcx + jl p_number_DONE + xor rax,rax ; clearing + lodsb + cmp al,'0' + jl p_number_BAD + cmp al,'9' + jg p_number_ALPHA + sub al,'0' +p_number_CONSUME: + mov r8,rax + mov rax,rdi + mul qword [p_base_DFA] ; uses rdx:rax + add rax,r8 + mov rdi,rax + jmp p_number_LOOP +p_number_ALPHA: + cmp al,'A' + jl p_number_BAD + cmp al,'Z' + jg p_number_alpha + sub al,'A'-10 + jmp p_number_CONSUME +p_number_alpha: + cmp al,'a' + jl p_number_BAD + cmp al,'z' + jg p_number_BAD + sub al,'a'-10 + jmp p_number_CONSUME +p_number_BAD: + push qword 0 + popr rsi + next +p_number_DONE: + cmp rbx,0 + jne p_numper_POSITIVE + neg rdi +p_numper_POSITIVE: + push rdi + push qword 1 + popr rsi + next WORD p_this_word,'THIS-WORD',dovariable dq 0,0 ; ( n chars* ) WORD p_evaluate_stream,'EVALUATE-STREAM' - ;; ( stream -- *?* flag ) + ;; ( 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. +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_read_word ; ( -- chars* n ) - dq p_zero_branch - dq p_evaluate_stream_END - $ - 8 - - dq p_2dup - dq p_this_word - dq p_2put - dq p_find - dq p_dup - dq p_zero_branch - dq p_evaluate_stream_NOTWORD - $ - 8 + dq p_Rget, p_read_word, 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 + BRANCH 0,p_evaluate_stream_NOTWORD ; branch if 0 on TOP + 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 - dq p_branch - dq p_evaluate_stream_LOOP - $ - 8 - + BRANCH ,p_evaluate_stream_AFTER p_evaluate_stream_NOTWORD: - dq p_this_word - dq p_2get - dq p_number - dq p_not - dq p_zero_branch - dq p_evaluate_stream_LOOP - $ - 8 - - dq 0 - dq p_exit - + dq p_drop, p_number + BRANCH 0,p_evaluate_stream_BAD ; branch if 0 +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 1 - dq p_exit + dq p_2drop, p_literal, 1 +p_evaluate_stream_BAD: + dq p_Rgt, p_drop, p_exit