aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/words/search-wordlist.asm
blob: 3d82de44e0bbb47cc47e9550c5e8f8f9cfffb019 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
; ( c-addr len wid -- [ 0 ] | [ xt [-1|1]] ) 
; Search Order
; searches the word list wid for the word at c-addr/len

.if cpu_msp430==1
    HEADER(XT_SEARCH_WORDLIST,15,"search-wordlist",DOCOLON)
.endif

.if cpu_avr8==1
VE_SEARCH_WORDLIST:
    .dw $ff0f
    .db "search-wordlist",0
    .dw VE_HEAD
    .set VE_HEAD = VE_SEARCH_WORDLIST
XT_SEARCH_WORDLIST:
    .dw DO_COLON
PFA_SEARCH_WORDLIST:
.endif
    .dw XT_TO_R
    .dw XT_ZERO
    .dw XT_DOLITERAL
    .dw XT_ISWORD
    .dw XT_R_FROM
    .dw XT_TRAVERSEWORDLIST
    .dw XT_DUP
    .dw XT_ZEROEQUAL
    .dw XT_DOCONDBRANCH
    DEST(PFA_SEARCH_WORDLIST1)
       .dw XT_2DROP
       .dw XT_DROP
       .dw XT_ZERO
       .dw XT_EXIT
PFA_SEARCH_WORDLIST1:
      ; ... get the XT ...
      .dw XT_DUP
      .dw XT_NFA2CFA
      ; .. and get the header flag
      .dw XT_SWAP
      .dw XT_NAME2FLAGS
      .dw XT_IMMEDIATEQ
    .dw XT_EXIT

.if cpu_msp430==1
    HEADLESS(XT_ISWORD,DOCOLON)
.endif

.if cpu_avr8==1
XT_ISWORD:
    .dw DO_COLON
PFA_ISWORD:
.endif
    ; ( c-addr len 0 nt -- c-addr len 0 true| nt false )
    .dw XT_TO_R
    .dw XT_DROP
    .dw XT_2DUP
    .dw XT_R_FETCH  ; -- addr len addr len nt
    .dw XT_NAME2STRING
    .dw XT_ICOMPARE      ; (-- addr len f )
    .dw XT_DOCONDBRANCH
    DEST(PFA_ISWORD3)
      ; not now
      .dw XT_R_FROM
      .dw XT_DROP
      .dw XT_ZERO
      .dw XT_TRUE         ; maybe next word
      .dw XT_EXIT
PFA_ISWORD3:
      ; we found the word, now clean up iteration data ...
      .dw XT_2DROP
      .dw XT_R_FROM
      .dw XT_ZERO       ; finish traverse-wordlist
      .dw XT_EXIT