words/number.asm

Jump to Vocabulary

; (addr -- n ) Numeric IO
; R( -- )
; convert a word to a number, throw exception -1 on error
VE_NUMBER:
    .db $06, "number",0
    .dw VE_HEAD
    .set VE_HEAD = VE_NUMBER
XT_NUMBER:
    .dw DO_COLON
PFA_NUMBER:
    ; sign flag
    .dw XT_DOLITERAL
    .dw 1             ; ( -- addr 1)
    .dw XT_ZERO       ; ( -- addr 1 0)
    .dw XT_ROT        ; ( -- 1 0 addr)
    .dw XT_COUNT      ; ( -- 1 0 addr' len)
    .dw XT_ZERO
    .dw XT_DODO
    .dw PFA_NUMBER6
PFA_NUMBER1: ; ( n addr -- )
    .dw XT_DUP
    .dw XT_I
    .dw XT_PLUS
    .dw XT_CFETCH
    ; now check for +/- signs
    .dw XT_DUP
    .dw XT_DOLITERAL
    .dw $2d ; '-'
    .dw XT_EQUAL
    .dw XT_DOCONDBRANCH
    .dw PFA_NUMBER2
    .dw XT_DROP
    ; replace the sign flag
    .dw XT_ROT
    .dw XT_DROP
    .dw XT_DOLITERAL
    .dw -1
    .dw XT_ROT
    .dw XT_ROT
    .dw XT_DOBRANCH
    .dw PFA_NUMBER4
PFA_NUMBER2:
    .dw XT_BASE
    .dw XT_FETCH
    .dw XT_DIGIT
    .dw XT_EQUALZERO
    ; check for non number characters and stop converting if found
    .dw XT_DOCONDBRANCH
    .dw PFA_NUMBER3
    .dw XT_DOLITERAL
    .dw -13
    .dw XT_THROW
PFA_NUMBER3:
    .dw XT_ROT
    .dw XT_BASE
    .dw XT_FETCH
    .dw XT_MUL
    .dw XT_PLUS
    .dw XT_SWAP
PFA_NUMBER4:
    .dw XT_DOLOOP
    .dw PFA_NUMBER1
PFA_NUMBER6:
    .dw XT_DROP
    ; incorporate sign into number
    .dw XT_SWAP
    .dw XT_LESSZERO
    .dw XT_DOCONDBRANCH
    .dw PFA_NUMBER5
    .dw XT_NEGATE
PFA_NUMBER5:
    .dw XT_EXIT

Jump to Vocabulary