From: Ralph Ronnquist Date: Wed, 19 May 2021 07:50:38 +0000 (+1000) Subject: draft EVALUATE-STREAM X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=43ce8fb4d65924e1bcf21cac510f8e48fc1d451d;p=rrq%2Frrqforth.git draft EVALUATE-STREAM --- diff --git a/compile.asm b/compile.asm index be4f652..8334384 100644 --- a/compile.asm +++ b/compile.asm @@ -119,8 +119,68 @@ 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 + pop rsi + xor rdi,rdi +p_number_LOOP: + dec rbx + je p_number_DONE + lodsb + mov bl,al ; into bl + cmp bl,'0' + jl p_number_BAD + cmp bl,'9' + jg p_number_ALPHA + sub bl,'0' + cmp bl,bl + jge p_number_BAD +p_number_CONSUME: + mov rax,rdi + mul qword [p_base_DFA] + add rax,rbx + mov rdi,rax + jmp p_number_LOOP +p_number_ALPHA: + cmp bl,'A' + jl p_number_BAD + cmp bl,'Z' + jg p_number_alpha + sub bl,'A'-10 + jmp p_number_CONSUME +p_number_alpha: + cmp bl,'a' + jl p_number_BAD + cmp bl,'z' + jg p_number_BAD + sub bl,'a'-10 + jmp p_number_CONSUME +p_number_BAD: + push qword 0 + popr rsi + next +p_number_DONE: + push rdi + push qword 1 + popr rsi + next WORD p_this_word,'THIS-WORD',dovariable dq 0,0 ; ( n chars* ) @@ -129,34 +189,29 @@ p_create_COPY: ;; ( stream -- *?* flag ) ;; Execute the words from the given stream ;; returns 1 if stream ends and 0 if an unknown word is found - 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_execute - dq p_branch - dq p_evaluate_stream_LOOP - $ - 8 - + BRANCH 0,p_evaluate_stream_END + dq p_2dup ; ( -- chars* n chars* n ) + dq p_this_word ; ( -- chars* n chars* n p ) + dq p_2put ; ( -- chars* n ) + dq p_2dup ; ( -- chars* n chars* n ) + dq p_find ; ( -- chars* n tfa/0 ) + dq p_dup ; ( -- chars* n tfa/0 tfa/0 ) + BRANCH 0,p_evaluate_stream_NOTWORD ; ( -- chars* n tfa/0 ) + dq p_execute ; ( -- chars* n tfa/0 ) + BRANCH ,p_evaluate_stream_LOOP p_evaluate_stream_NOTWORD: - dq p_this_word + dq p_this_word ; ( -- chars* n tfa/0 ) dq p_2get dq p_number dq p_not - dq p_zero_branch - dq p_evaluate_stream_LOOP - $ - 8 - + BRANCH 0,p_evaluate_stream_LOOP + dq p_literal dq 0 dq p_exit - p_evaluate_stream_END: + dq p_literal dq 1 dq p_exit