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* )
;; ( 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