draft EVALUATE-STREAM
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Wed, 19 May 2021 07:50:38 +0000 (17:50 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Wed, 19 May 2021 07:50:38 +0000 (17:50 +1000)
compile.asm

index be4f6526e9db02d510326ed9faa941592acf4329..83343845d727e108ece6026c29a662655dd27221 100644 (file)
@@ -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