aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/words/traverse-wordlist.asm
blob: b6c00e0390e8f463f18e35d06672d062cfefab97 (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
; ( i*x xt wid -- j*x ) 
; Tools Ext (2012)
; call the xt for every member of the wordlist wid until xt returns false

.if cpu_msp430==1
    HEADER(XT_TRAVERSEWORDLIST,17,"traverse-wordlist",DOCOLON)
.endif

.if cpu_avr8==1
VE_TRAVERSEWORDLIST:
    .dw $ff11
    .db "traverse-wordlist",0
    .dw VE_HEAD
    .set VE_HEAD = VE_TRAVERSEWORDLIST
XT_TRAVERSEWORDLIST:
    .dw DO_COLON
PFA_TRAVERSEWORDLIST:

.endif
    .dw XT_FETCHE
PFA_TRAVERSEWORDLIST1:
    .dw XT_DUP           ; ( -- xt nt nt )
    .dw XT_DOCONDBRANCH  ; ( -- nt ) is nfa = counted string
    DEST(PFA_TRAVERSEWORDLIST2)
    .dw XT_2DUP
    .dw XT_2TO_R
    .dw XT_SWAP
    .dw XT_EXECUTE
    .dw XT_2R_FROM
    .dw XT_ROT
    .dw XT_DOCONDBRANCH
    DEST(PFA_TRAVERSEWORDLIST2)
    .dw XT_NFA2LFA
    .dw XT_FETCHI
    .dw XT_DOBRANCH      ; ( -- addr )
    DEST(PFA_TRAVERSEWORDLIST1)       ; ( -- addr )
PFA_TRAVERSEWORDLIST2:
    .dw XT_2DROP
    .dw XT_EXIT

; : traverse-wordlist ( i*x xt wid -- i*x' )
;        begin @ dup
;        while
;          2dup 2>r
;          swap execute ( i*x nt -- i*x' f )
;          2r> rot
;        while
;          nfa>lfa @i
;        repeat then 2drop ;