home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d101 / psintrp.lha / PsIntrp / control.a < prev    next >
Text File  |  1987-09-05  |  3KB  |  179 lines

  1.  
  2.    xref  ipop
  3.    xref  popnum
  4.    xref  r.ipush
  5.    xref  msg
  6.    xref  reinterp
  7.    xref  type_mismatch
  8.  
  9.    section one
  10.  
  11.    include  "ps.h"
  12.  
  13.    xdef  initloops
  14.  
  15.  
  16.  
  17.   DEF    exec
  18.    bsr      ipop
  19.    cmp.w    #ICode,D2
  20.    bne      r.ipush
  21.    move.l   D0,A0
  22.    jmp      (A0)
  23.  
  24.   DEF    if
  25.   ARG    ICode
  26.    move.l   D0,-(SP)
  27.   ARG    Boolean
  28.    tst.l    D0
  29.    bne      1$
  30.    addq     #4,SP
  31. 1$ rts
  32.  
  33.   DEF    ifelse
  34.   ARG    ICode
  35.    move.l   D0,D1
  36.   ARG    ICode
  37.    move.l   D0,D3
  38.   ARG    Boolean
  39.    tst.l    D0
  40.    bne      1$
  41.    move.l   D1,A0
  42.    jmp      (A0)
  43. 1$ move.l   D3,A0
  44.    jmp      (A0)
  45.  
  46.   DEF    for
  47.   ARG    ICode
  48.    bsr      makeloop
  49.  
  50.    bsr      popnum
  51.    move.l   D0,4(SP)   limit
  52.    bsr      popnum
  53.    move.l   D0,8(SP)   incr
  54.    bsr      popnum
  55.    move.l   D0,12(SP)  init
  56.  
  57. 1$ move.l   12(SP),D0
  58.    move.l   8(SP),D1
  59.    move.l   4(SP),D2
  60.  
  61.    tst.l    D1
  62.    bmi      2$
  63.    cmp.l    D2,D0
  64.    bra      3$
  65. 2$ cmp.l    D0,D2
  66. 3$ bgt      _exit
  67.  
  68.    move.w   #Integer,D2
  69.    bsr      r.ipush
  70.  
  71.    add.l    D1,D0
  72.    move.l   D0,12(SP)
  73.  
  74.    move.l   (SP),A0
  75.    jsr      (A0)
  76.    bra      1$
  77.  
  78.   DEF    repeat
  79.   ARG    ICode
  80.    bsr      makeloop
  81.    bsr      popnum
  82. 1$ subq.l   #1,D0
  83.    bmi      _exit
  84.    move.l   D0,4(SP)
  85.    move.l   (SP),A0
  86.    jsr      (A0)
  87.    move.l   4(SP),D0
  88.    bra      1$
  89.  
  90.   DEF    loop
  91.   ARG    ICode
  92.    bsr      makeloop
  93. 1$ move.l   (SP),A0
  94.    jsr      (A0)
  95.    bra      1$
  96.  
  97. * stack while looping:
  98. *  ret after loop
  99. *  save exitsp           16(SP)
  100. *  init                  12(SP) <- addr for looping proc
  101. *  incr                   8(SP)
  102. *  limit                  4(SP)
  103. *  proc                    (SP)
  104. *  ret for next repeat
  105.  
  106.  
  107.   DEF    exit
  108.    move.w   loops,D0
  109.    beq      1$
  110.    subq.w   #1,D0
  111.    move.w   D0,loops
  112.    move.l   exitsp,D0
  113.    beq      1$               this should be impossible
  114.    move.l   D0,SP
  115.    move.l   (SP)+,exitsp
  116.    rts
  117. 1$ ERR      no_loop
  118.  
  119. makeloop
  120.    move.l   (SP)+,A0         ret address to loop requestor
  121.    move.l   exitsp,-(SP)
  122.    move.l   SP,exitsp        for possible call to _exit
  123.    lea      -12(SP),SP       room for init, incr, limit
  124.    move.l   D0,-(SP)         procedure to loop on
  125.    move.w   loops,D0         note one more nesting level
  126.    addq.w   #1,D0
  127.    move.w   D0,loops
  128.    jmp      (A0)             return
  129.  
  130. initloops
  131.    moveq    #0,D0
  132.    move.w   D0,loops
  133.    move.l   D0,exitsp
  134.    rts
  135.  
  136. loops    dc.w  0
  137. exitsp   dc.l  0
  138.  
  139.  
  140.   DEF    stop
  141.    move.l   stopsave,D0
  142.    beq      type_mismatch     change
  143.    move.l   D0,SP
  144.    rts
  145.  
  146.   DEF    stopped
  147.   ARG    ICode
  148.    pea      ..stop
  149.    move.l   SP,stopsave
  150.    move.l   D0,A0
  151.    jsr      (A0)
  152.    addq.l   #4,SP
  153.    moveq    #0,D0
  154.   RETURN    Boolean
  155.  
  156. stopsave    dc.l  0
  157.  
  158. ..stop
  159.    moveq    #-1,D0
  160.   RETURN    Boolean
  161.  
  162.   DEF    countexecstack
  163.    move.w   #Integer,D2
  164.    moveq    #0,D0
  165.   RETURN    Integer
  166.  
  167.   DEF    execstack
  168.    rts
  169.  
  170.  
  171.   DEF    start
  172.    rts
  173.  
  174.  
  175.    bstr     no_loop,<exit outside loop>
  176.  
  177.    end
  178.  
  179.