From: Ralph Ronnquist Date: Sat, 22 May 2021 11:33:17 +0000 (+1000) Subject: NUMBER parses negative decimal numbers X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=07e36b49ade19fcf84414fa904542e8fb6b1adc1;p=rrq%2Frrqforth.git NUMBER parses negative decimal numbers --- diff --git a/compile.asm b/compile.asm index 3d5433e..71393bb 100644 --- a/compile.asm +++ b/compile.asm @@ -139,42 +139,56 @@ p_create_COPY: pushr rsi pop rcx ; ( -- chars* ) pop rsi ; ( -- ) - xor rdi,rdi + 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 - 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' + 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 @@ -205,7 +219,7 @@ p_evaluate_stream_NOTWORD: 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 + BRANCH 0,p_evaluate_stream_BAD ; branch if 0 dq p_drop BRANCH ,p_evaluate_stream_LOOP p_evaluate_stream_END: