words/find.asm

Jump to Vocabulary

; ( addr --  -- [ addr 0 ] | [ xt [-1|1]] ) Tools
; R( -- )
; search dictionary
VE_FIND:
    .db $04, "find", 0
    .dw VE_HEAD
    .set VE_HEAD = VE_FIND
XT_FIND:
    .dw DO_COLON
PFA_FIND:
    .dw XT_DUP
    .dw XT_TO_R
    .dw XT_HEAD
    .dw XT_EFETCH
PFA_FIND1:
    ; ( addr )
    .dw XT_DUP
    .dw XT_NOTEQUALZERO
    .dw XT_DOCONDBRANCH
    .dw PFA_FIND2
    .dw XT_ICOMPARE
    ; (addr-ram addr-flash -- addr-flash' 0|1
    .dw XT_QDUP
    .dw XT_NOTEQUALZERO
    .dw XT_DOCONDBRANCH
    .dw PFA_FIND3
    ; we found the word
    .dw XT_SWAP
    .dw XT_1PLUS ; make XT
    .dw XT_SWAP
    .dw XT_R_FROM
    .dw XT_DROP

    .dw XT_EXIT

PFA_FIND3:
    .dw XT_R_FROM
    .dw XT_DUP
    .dw XT_TO_R
    .dw XT_SWAP
    .dw XT_IFETCH
    .dw XT_DOBRANCH
    .dw PFA_FIND1

PFA_FIND2:
    .dw XT_DROP
    .dw XT_DROP
    .dw XT_R_FROM
    .dw XT_ZERO
    .dw XT_EXIT

; private headerless routine
; compares counted string in RAM with counted string in flash
;
; ( addr --  -- [ addr 0 ] | [ xt [-1|1]] )
; R( -- )
; search dictionary
;VE_ICOMPARE:
;    .db $04, "icompare"
;    .dw VE_HEAD
;    .set VE_HEAD = VE_ICOMPARE
XT_ICOMPARE:
    .dw DO_COLON
PFA_ICOMPARE:
    ; ( addr-ram addr-flash -- 0| +/-1
    .dw XT_DUP
    .dw XT_IFETCH
    .dw XT_DUP
    .dw XT_DOLITERAL
    .dw $0080
    .dw XT_AND
    .dw XT_TO_R           ; send immediate flag to r-stack
    .dw XT_ZERO
    .dw XT_TO_R
    .dw XT_DOLITERAL
    .dw $001f
    .dw XT_AND
    .dw XT_2SLASH
    .dw XT_1PLUS
    .dw XT_TO_R
PFA_ICOMPARE1:
    .dw XT_OVER
    .dw XT_OVER
    .dw XT_IFETCH
    .dw XT_DOLITERAL
    .dw $ff7f
    .dw XT_AND
    .dw XT_SWAP
    .dw XT_FETCH
    .dw XT_EQUAL
    .dw XT_DOCONDBRANCH
    .dw PFA_ICOMPARE3
    ; increment pointers, 1 CELL for FLASH, 2 bytes for RAM
    .dw XT_1PLUS
    .dw XT_SWAP
    .dw XT_1PLUS
    .dw XT_1PLUS
    .dw XT_SWAP
    ; decrement cell counter, leave loop for zero
    .dw XT_R_FROM
    .dw XT_1MINUS
    .dw XT_DUP
    .dw XT_TO_R
    .dw XT_EQUALZERO
    .dw XT_DOCONDBRANCH
    .dw PFA_ICOMPARE2
    ; we found matching strings
    .dw XT_R_FROM
    .dw XT_R_FROM
    .dw XT_DROP
    .dw XT_DOLITERAL
    .dw 1
    .dw XT_TO_R
    .dw XT_TO_R
    .dw XT_DOBRANCH
    .dw PFA_ICOMPARE3
PFA_ICOMPARE2:
    .dw XT_DOBRANCH
    .dw PFA_ICOMPARE1

PFA_ICOMPARE3:
    .dw XT_SWAP
    .dw XT_DROP
    .dw XT_R_FROM
    .dw XT_PLUS
    .dw XT_R_FROM
    .dw XT_R_FROM
    .dw XT_EQUALZERO
    .dw XT_DOCONDBRANCH
    .dw PFA_ICOMPARE4
    .dw XT_NEGATE
PFA_ICOMPARE4:
    .dw XT_EXIT

Jump to Vocabulary