home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / zsys / simtel20 / zcpr3 / goto.mac < prev    next >
Encoding:
Text File  |  1994-07-13  |  3.4 KB  |  204 lines

  1. ;
  2. ; Program: GOTO  
  3. ; Author:  Richard Conn
  4. ; Version: 1.0
  5. ; Date: 8 Mar 84
  6. ; Previous Versions:  None
  7. ;
  8. version    equ    10
  9.  
  10. ;
  11. ;    GOTO is a program designed to be run under ZEX which permits
  12. ; branching within a ZEX file.  It accepts only one argument, a label,
  13. ; which is defined within the ZEX file as a special comment of the
  14. ; form:
  15. ;    ;=label anytext
  16. ; The syntax of GOTO is:
  17. ;    GOTO label
  18. ;
  19.  
  20. ;
  21. ; Basic Equates
  22. ;
  23. z3env    SET    0f400h    ;Environment Descriptor
  24. fcb    equ    5ch
  25. cr    equ    0dh
  26. lf    equ    0ah
  27. lflag    equ    '='    ;label flag in comment
  28.  
  29. ;
  30. ; Externals
  31. ;
  32.     ext    z3init,getzrun,getzfc,putznc,putzrun
  33.     ext    print,cout,caps
  34.  
  35. ;
  36. ; Environment Definition
  37. ;
  38.     if    z3env ne 0
  39. ;
  40. ; External ZCPR3 Environment Descriptor
  41. ;
  42.     jmp    start
  43.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  44.     db    1    ;External Environment Descriptor
  45. z3eadr:
  46.     dw    z3env
  47. start:
  48.     lhld    z3eadr    ;pt to ZCPR3 environment
  49. ;
  50.     else
  51. ;
  52. ; Internal ZCPR3 Environment Descriptor
  53. ;
  54.     MACLIB    Z3BASE.LIB
  55.     MACLIB    SYSENV.LIB
  56. z3eadr:
  57.     jmp    start
  58.     SYSENV
  59. start:
  60.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  61.     endif
  62.  
  63. ;
  64. ; Start of Program -- Initialize ZCPR3 Environment
  65. ;
  66.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  67. ;
  68. ; Check for Valid Label
  69. ;
  70.     lda    fcb+1    ;get first char of FCB
  71.     cpi    ' '    ;no label?
  72.     jz    help
  73.     cpi    '/'
  74.     jnz    start1
  75. ;
  76. ; Print GOTO Help
  77. ;
  78. help:
  79.     call    print
  80.     db    'GOTO, Version '
  81.     db    (version/10)+'0','.',(version mod 10)+'0'
  82.     db    cr,lf,'GOTO -- Branch Within a ZEX File'
  83.     db    cr,lf,'Syntax:'
  84.     db    cr,lf,'    GOTO label'
  85.     db    cr,lf,'where "label" is defined by a special comment of'
  86.     db    cr,lf,'the form ";',lflag,'label".',0
  87.     ret
  88. ;
  89. ; Check for Running ZEX
  90. ;
  91. start1:
  92.     call    getzrun    ;get ZEX run flag
  93.     jnz    start2
  94.     call    print
  95.     db    ' ZEX Not Running',0
  96.     ret
  97. ;
  98. ; Begin Scan of ZEX Message Buffer
  99. ;
  100. start2:
  101.     call    getzfc    ;get ptr to first ZEX char
  102.     lxi    d,fcb+1    ;pt to GOTO label
  103. ;
  104. ; Scan for Label Comment
  105. ;
  106. scanc:
  107.     mov    a,m    ;get char
  108.     cpi    ';'    ;comment?
  109.     jnz    flush    ;advance to next line
  110.     dcx    h    ;pt to next
  111.     mov    a,m
  112.     cpi    lflag    ;label?
  113.     jnz    flush    ;advance to next line if not label
  114. ;
  115. ; We have a label - check it
  116. ;
  117.     push    h    ;save ptrs
  118.     push    d
  119.     dcx    h    ;pt to first char
  120.     mvi    b,8    ;at most 8 chars
  121. label:
  122.     ldax    d    ;get GOTO char
  123.     cpi    ' '    ;done?
  124.     jz    label1
  125.     mov    c,a
  126.     mov    a,m
  127.     call    caps    ;capitalize label in ZEX file
  128.     cmp    c    ;compare
  129.     jnz    label2
  130.     dcx    h    ;advance
  131.     inx    d
  132.     dcr    b
  133.     jnz    label
  134. ;
  135. ; Label Matches
  136. ;
  137. label1:
  138.     mov    a,m    ;must be space or less for match
  139.     cpi    ' '+1
  140.     jnc    label2
  141.     pop    d    ;restore ptrs
  142.     pop    h
  143. ;
  144. ; Advance to Beginning of Next Line
  145. ;
  146. nxtline:
  147.     mov    a,m    ;get char
  148.     dcx    h    ;pt to next
  149.     cpi    cr    ;end of line?
  150.     jz    nxtl1
  151.     cpi    0ffh    ;end of processing?
  152.     jnz    nxtline
  153. nxtl1:
  154.     call    putznc    ;store ptr to next char
  155.     call    print
  156.     db    ' GOTO Label ',0
  157.     jmp    prlabel
  158. ;
  159. ; No Match on Label
  160. ;
  161. label2:
  162.     pop    d    ;restore regs
  163.     pop    h
  164. ;
  165. ; Flush to Next Line or EOB
  166. ;
  167. flush:
  168.     mov    a,m    ;get next char
  169.     cpi    0ffh    ;end of buffer?
  170.     jz    notfnd
  171.     dcx    h    ;pt to next
  172.     cpi    cr    ;end of line?
  173.     jnz    flush
  174.     jmp    scanc    ;resume search
  175. ;
  176. ; Label Not Found
  177. ;
  178. notfnd:
  179.     call    print
  180.     db    ' Label ',0
  181.     call    prlabel    ;print label
  182.     call    print
  183.     db    ' Not Found -- Aborting ZEX',0
  184.     xra    a    ;turn off ZEX
  185.     jmp    putzrun
  186.  
  187. ;
  188. ; Print Label Name
  189. ;
  190. prlabel:
  191.     mvi    b,8
  192.     lxi    h,fcb+1
  193. prl1:
  194.     mov    a,m    ;get next char
  195.     cpi    ' '    ;done?
  196.     rz
  197.     call    cout    ;print char
  198.     inx    h
  199.     dcr    b    ;count down
  200.     jnz    prl1
  201.     ret
  202.  
  203.     end
  204.