X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=compile.asm;h=3d5433ef5ff133ae51dfd033492fbe7336ce4f17;hb=5b7f593fcea545619f8afcc01099e433c84250a7;hp=be4f6526e9db02d510326ed9faa941592acf4329;hpb=02ef6e814ef0e6c61348c70bd310ba1f0df2506b;p=rrq%2Frrqforth.git diff --git a/compile.asm b/compile.asm index be4f652..3d5433e 100644 --- a/compile.asm +++ b/compile.asm @@ -119,44 +119,100 @@ 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 +p_number_LOOP: + dec rcx + jl 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' +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* ) 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_LOOP: + dq p_Rget ; ( -- stream* 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 ; branch if 0 on TOP + dq p_2dup ; ( -- chars* n chars* n ) + dq p_this_word ; ( -- chars* n chars* n p ) + dq p_2put ; ( -- chars* n ) + dq p_find ; ( -- [ chars* n 0 ]/[ tfa ] ) + dq p_dup ; ( -- [ chars* n 0 0 ]/[ tfa tfa ] ) + BRANCH 0,p_evaluate_stream_NOTWORD ; branch if 0 on TOP + dq p_execute ; consumes tfa + BRANCH ,p_evaluate_stream_LOOP 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 ; ( -- chars* n ) + dq p_number ; ( -- [ 0 ]/[ v 1 ] ) + dq p_dup + BRANCH 0,p_evaluate_stream_BAD ; branch if 0 on TOP + dq p_drop + BRANCH ,p_evaluate_stream_LOOP p_evaluate_stream_END: + dq p_2drop + dq p_literal dq 1 +p_evaluate_stream_BAD: + dq p_Rgt ; Discard the stream from the return stack + dq p_drop dq p_exit