X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=compile.asm;h=71393bb31596e6d0e64c22be8316d192da238260;hb=1e20129cc5801258ef162be39d764693511ff6fb;hp=83343845d727e108ece6026c29a662655dd27221;hpb=43ce8fb4d65924e1bcf21cac510f8e48fc1d451d;p=rrq%2Frrqforth.git diff --git a/compile.asm b/compile.asm index 8334384..71393bb 100644 --- a/compile.asm +++ b/compile.asm @@ -137,46 +137,58 @@ p_create_COPY: WORD p_number,'NUMBER',fasm ;; ( chars* n -- [ 0 ]/[ v 1 ] ) pushr rsi - pop rcx - pop rsi - xor rdi,rdi + 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 rbx - je p_number_DONE + dec rcx + jl p_number_DONE + xor rax,rax ; clearing lodsb - mov bl,al ; into bl - cmp bl,'0' + cmp al,'0' jl p_number_BAD - cmp bl,'9' + cmp al,'9' jg p_number_ALPHA - sub bl,'0' - cmp bl,bl - jge p_number_BAD + sub al,'0' p_number_CONSUME: + mov r8,rax mov rax,rdi - mul qword [p_base_DFA] - add rax,rbx + mul qword [p_base_DFA] ; uses rdx:rax + add rax,r8 mov rdi,rax jmp p_number_LOOP p_number_ALPHA: - cmp bl,'A' + cmp al,'A' jl p_number_BAD - cmp bl,'Z' + cmp al,'Z' jg p_number_alpha - sub bl,'A'-10 + sub al,'A'-10 jmp p_number_CONSUME p_number_alpha: - cmp bl,'a' + cmp al,'a' jl p_number_BAD - cmp bl,'z' + cmp al,'z' jg p_number_BAD - sub bl,'a'-10 + 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 @@ -186,32 +198,35 @@ p_number_DONE: 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_dup - BRANCH 0,p_evaluate_stream_END + 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_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 ) + 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 ; ( -- chars* n tfa/0 ) - dq p_2get - dq p_number - dq p_not - BRANCH 0,p_evaluate_stream_LOOP - dq p_literal - 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 + 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