aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/words/map-stack.asm
blob: 48995a1b0fd101a9a2b407f9ad9b65eb7a6ea7e0 (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
; ( i*x XT e-addr -- j*y true | i*x false ) 
; Tools
; Iterate over a stack

.if cpu_msp430==1
    HEADER(XT_MAPSTACK,9,"map-stack",DOCOLON)
.endif

.if cpu_avr8==1
VE_MAPSTACK:
    .dw $ff09
    .db "map-stack",0
    .dw VE_HEAD
    .set VE_HEAD = VE_MAPSTACK
XT_MAPSTACK:
    .dw DO_COLON
PFA_MAPSTACK:
.endif
    .dw XT_DUP
    .dw XT_CELLPLUS
    .dw XT_SWAP
    .dw XT_FETCHE
    .dw XT_CELLS
    .dw XT_BOUNDS
    .dw XT_QDOCHECK
    .dw XT_DOCONDBRANCH
    DEST(PFA_MAPSTACK3)
    .dw XT_DODO
PFA_MAPSTACK1:
      .dw XT_I
      .dw XT_FETCHE   ; -- i*x XT id
      .dw XT_SWAP
      .dw XT_TO_R
      .dw XT_R_FETCH
      .dw XT_EXECUTE  ; i*x id -- j*y true | i*x false
      .dw XT_QDUP
      .dw XT_DOCONDBRANCH
      DEST(PFA_MAPSTACK2)
         .dw XT_R_FROM
         .dw XT_DROP
         .dw XT_UNLOOP
         .dw XT_EXIT
PFA_MAPSTACK2:
      .dw XT_R_FROM
      .dw XT_TWO
      .dw XT_DOPLUSLOOP
      DEST(PFA_MAPSTACK1)
PFA_MAPSTACK3:
    .dw XT_DROP
    .dw XT_ZERO
    .dw XT_EXIT

;
; : map-stack ( i*x XT e-addr -- j*y )
;     dup cell+ swap @e cells bounds ?do 
;       ( -- i*x XT )
;       i @e swap >r r@ execute
;       ?dup if r> drop unloop exit then
;       r>
;     2 +loop drop 0
; ;