NUMBER parses negative decimal numbers
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Sat, 22 May 2021 11:33:17 +0000 (21:33 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Sat, 22 May 2021 11:33:17 +0000 (21:33 +1000)
compile.asm

index 3d5433ef5ff133ae51dfd033492fbe7336ce4f17..71393bb31596e6d0e64c22be8316d192da238260 100644 (file)
@@ -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: