home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / asmutl / xlt86.lbr / XLT86.AQM / XLT86.ASM
Assembly Source File  |  1985-09-16  |  42KB  |  2,822 lines

  1. ;*******************************************************
  2. ;
  3. ;            XLT86
  4. ;
  5. ; Translates Intel 8080 assembly language source code
  6. ;  to Intel 8086 assembly language source code.
  7. ;
  8. ; 11/11/84 Frank J. Zerilli
  9. ;
  10. VERS    EQU    105
  11. ;
  12. ;*******************************************************
  13. ;
  14. ;      XLT86 processes lines with the exclamation point
  15. ; statement separator correctly.  It strips trailing
  16. ; blanks or tabs from lines.  It replaces initial
  17. ; asterisks in lines with semicolons.  It provides
  18. ; several options to format the output file for best
  19. ; appearance.
  20. ;
  21. ;      This program gives the choice of converting the
  22. ; case of instructions to upper or lower case or of
  23. ; trying to preserve the case of instructions.
  24. ;
  25. ;      An activity dot is printed on the console for
  26. ; every 100 lines of input processed.
  27. ;
  28. ;
  29. ;
  30. ; Command line:
  31. ;
  32. ;     XLT86 [d:]srcfile[.typ] [d:destfile.typ]
  33. ;
  34. ;      All parameters in brackets are optional, and, if
  35. ; omitted, the default values are:
  36. ;
  37. ;  Source file-type     -- ASM
  38. ;  Destination file-type -- A86
  39. ;  Destination file-name -- same as the source file-name
  40. ;  Drive         -- current drive
  41. ;
  42. ; FLAG LOCATIONS:
  43. ;
  44. ; 103H -- Change to non-zero value to suppress
  45. ;      translation of several non-standard opcodes:
  46. ;      REQ, RNE, RLT, RGE, CEQ, CNE, CLT, CGE
  47. ;      JEQ, JNE, JLT, JGE,
  48. ;      ENT, NAM, RAM, ROG, IFC, ICL, LST, MAC
  49. ;
  50. ; 104H -- If non-zero (default) XLT86 converts lines
  51. ;      with multiple statements separated by DR's EP
  52. ;      separator into separate lines.
  53. ;      Change to zero for output on a single line
  54. ;      with the translated statements separated by
  55. ;      EP.
  56. ;
  57. ; 107H--  If zero (default) XLT86 translates
  58. ;
  59. ;        PUSH PSW    POP PSW
  60. ;
  61. ;      to
  62. ;
  63. ;        LAHF        POP AX
  64. ;        PUSH AX     SAHF
  65. ;
  66. ;      Otherwise, the translation is
  67. ;
  68. ;        LAHF        POP AX
  69. ;        XCHG AH,AL    XCHG AH,AL
  70. ;        PUSH AX     SAHF
  71. ;        XCHG AH,AL
  72. ;
  73. ; 108H-- If zero (default) XLT86 translates
  74. ;
  75. ;        INX rp        DCX rp
  76. ;
  77. ;     to
  78. ;
  79. ;        INC rp'     DEC rp'
  80. ;
  81. ;     Otherwise, the translation is
  82. ;
  83. ;        PUSHF        PUSHF
  84. ;        INC rp'     DEC rp'
  85. ;        POPF        POPF
  86. ;
  87. ; 109H-- If zero (default) XLT86 translates
  88. ;
  89. ;        DAD rp
  90. ;
  91. ;     to
  92. ;
  93. ;        ADD BX,rp'
  94. ;
  95. ;     Otherwise, the translation is
  96. ;
  97. ;        PUSHF
  98. ;        ADD BX,rp'
  99. ;        POPF
  100. ;
  101.  
  102. N00    EQU    0
  103. N01    EQU    1
  104. ;
  105. N07    EQU    7
  106. N09    EQU    9        ; Tab every 8th col.
  107. NF8    EQU    0F8H        ; Mod 8
  108. ;
  109. LBUFLN    EQU    80        ; Line buffer length
  110. OPBFLN    EQU    5        ; Opcode buffer length
  111. MEMSIZ    EQU    4        ; Memory available in Kb
  112. IBNUM    EQU    4*MEMSIZ
  113. OBNUM    EQU    4*MEMSIZ
  114. RECLEN    EQU    128        ;
  115. STCKLN    EQU    128        ; Stack size
  116. IBFLEN    EQU    IBNUM*RECLEN
  117. OBFLEN    EQU    OBNUM*RECLEN
  118. ;
  119. CTRLC    EQU    3
  120. EOT    EQU    4
  121. BEL    EQU    7
  122. HT    EQU    9
  123. LF    EQU    0AH
  124. CR    EQU    0DH
  125. ESC    EQU    1BH
  126. QUOTE    EQU    27H
  127. ;
  128. ABORT    EQU    0000
  129. BDOS    EQU    0005
  130. DFCB1    EQU    005CH
  131. DFCB2    EQU    006CH
  132. ;
  133. FNLEN    EQU    8
  134. EOS    EQU    EOT        ; Replacement for exclamation pt
  135. EOF    EQU    1AH
  136. NFF    EQU    0FFH        ; Disk error return
  137. ;
  138. ;
  139. ; BDOS functions
  140. ;
  141. NCIN    EQU    1
  142. NCOUT    EQU    2
  143. NCDAV    EQU    0BH
  144. NOPEN    EQU    0FH
  145. NCLOSE    EQU    10H
  146. NDEL    EQU    13H
  147. NRDNR    EQU    14H
  148. NWRNR    EQU    15H
  149. NCREAT    EQU    16H
  150. NCDISK    EQU    19H
  151. NDMA    EQU    1AH
  152. ;
  153. ;
  154.     ORG    100H
  155. ;
  156. ;
  157.     JMP    START
  158. ;
  159. ;
  160. ; Options flags
  161. ;
  162. PSEFLG:    DB    0        ; (103H) 0 to translate non-
  163.                 ; Standard opcodes
  164. MLTLFL:    DB    0FFH        ; (104H) 0 to put input line with
  165.                 ; Exc. pt. to output on one line
  166. TCASFL:    DB    0        ; (105H) 0 to preserve case
  167.                 ;
  168. LCASFL:    DB    0        ; (106H) 0 for upper case if
  169.                 ; TCASFL not zero
  170. PSWFL:    DB    0        ; (107H) non-zero to preserve 8080
  171.                 ; Order of PSW registers on stack
  172. INXFL:    DB    0        ; (108H) non-zero to preserve flags
  173.                 ; With INX and DCX translations
  174. DADFL:    DB    0        ; (109H) non-zero to preserve flags
  175.                 ; With DAD translation
  176. ;
  177. ;
  178. ; Help message
  179. ;
  180. HMSG1:    DB    CR,LF
  181.     DB    LF
  182.     DB    'XLT86 translates Intel 8080 assembly language source',CR,LF
  183.     DB    'code into Intel 8086 assembly language source code.',CR,LF
  184.     DB    LF
  185.     DB    'It is invoked by a command of the form:',CR,LF
  186.     DB    LF
  187.     DB    '    XLT86 [d:]srcfile[.typ] [d:destfile.typ]',CR,LF
  188.     DB    LF
  189.     DB    'The brackets denote optional parameters and the ',CR,LF
  190.     DB    'default values are:',CR,LF
  191.     DB    LF
  192.     DB    '    Source file-type      --  ASM',CR,LF
  193.     DB    '    Destination file-type --  A86',CR,LF
  194.     DB    '    Destination file-name --  same as source file-name',CR,LF
  195.     DB    '    Drive                 --  current drive',CR,LF
  196.     DB    CR,LF
  197.     DB    'Press any key to continue - ',0
  198. ;
  199. HMSG2:    DB    CR,LF
  200.     DB    LF
  201.     DB    'Examples:',CR,LF
  202.     DB    LF
  203.     DB    'XLT86 PRGM1               --translates PRGM1.ASM to PRGM1.A86',CR,LF
  204.     DB    'XLT86 PRGM1 PRGM2         --translates PRGM1.ASM to PRGM2.A86',CR,LF
  205.     DB    'XLT86 PRGM1.TXT PRGM2.MAC --translates PRGM1.TXT to PRGM2.MAC',CR,LF
  206.     DB    LF
  207.     DB    'XLT86 also has the following features:',CR,LF
  208.     DB    LF
  209.     DB    'Case will be preserved as well as possible -- if an opcode has',CR,LF
  210.     DB    'a lower case character, the translated opcode will be in lower',CR,LF
  211.     DB    'case.',CR,LF
  212.     DB    LF
  213.     DB    'All asterisks at the beginning of lines will be replaced with',CR,LF
  214.     DB    'semicolons.',CR,LF
  215.     DB    LF
  216.     DB    'A dot is printed on the console for every 100 lines of input ',CR,LF
  217.     DB    'processed.',CR,LF
  218.     DB    LF
  219.     DB    0
  220. ;.....
  221. ;
  222. ;
  223. ;=======================================================================
  224. ;
  225. ; Program begins here
  226. ;
  227. START:    LXI    H,0
  228.     DAD    SP
  229.     SHLD    SPBDOS
  230.     LXI    SP,STACK
  231.     LDA    DFCB1+1        ; Check for a file name
  232.     CPI    ' '        ; Print help if no name
  233.     JNZ    BEGIN        ; No help requested
  234.     LXI    D,SIGNON
  235.     CALL    PRTLIN
  236.     LXI    D,HMSG1        ; Print help message
  237.     CALL    PRTLIN
  238.     MVI    C,NCIN        ; Wait for any character
  239.     CALL    BDOS
  240.     LXI    D,HMSG2        ; Print rest of help
  241.     CALL    PRTLIN
  242.     LHLD    SPBDOS        ; Retrieve system stack
  243.     SPHL            ; Pointer and pop
  244.     RET            ; To PC
  245. ;.....
  246. ;
  247. ;
  248. BEGIN:    CALL    HELLO        ; Signon, open in & out files
  249. ;
  250. NXTLIN:    CALL    GETLIN        ; Get line from input file to buf
  251.     CALL    PROCLIN        ; Process line
  252.     JMP    NXTLIN
  253. ;.....
  254. ;
  255. ;
  256. ;***********************************************************************
  257. ;
  258. ; Print signon, open input and output files.
  259. ;
  260. HELLO:    LXI    D,SIGNON
  261.     CALL    PRTLIN
  262. ;
  263. HELLO0:    MVI    A,'D'        ; Translate DB & EQU (for
  264.     STA    OPTBDB        ; Uniform formatting)
  265.     MVI    A,HT        ; Default is tab after opcode
  266.     STA    MLTSPC        ; For stmts on separate lines
  267.     MVI    A,HT        ; HT after opcode
  268.     STA    PUTHT+1
  269.     MVI    A,41        ; Tab comments to col 33
  270.     STA    PUTND5+1
  271.     MVI    A,0FEH        ; CP instruction
  272.     STA    EXCLAM
  273.     XRA    A
  274.     STA    TCASFL        ; Don't convert case
  275.     STA    LCASFL        ; Lower case flag
  276.     LXI    H,NEWLSP
  277.     SHLD    SEPMSG
  278.     LDA    PSEFLG        ; Translate non-standard
  279.     ORA    A        ; Opcodes ?
  280.     CNZ    NXPSD
  281.     LXI    D,DBMSG
  282.     CALL    PRTLIN        ;
  283.     CALL    CHKYES        ; Xlat DB & EQU ?
  284.     CPI    ESC
  285.     JZ    HELLO0
  286.     CPI    CTRLC
  287.     JZ    ABORT
  288.     CPI    'Y'
  289.     CNZ    NXDBEQ
  290.     LDA    MLTLFL        ; Force space after opcode
  291.     ORA    A        ; If MLTLFL not set
  292.     JZ    HELLO2
  293.     LXI    D,SPCMSG
  294.     CALL    PRTLIN        ; Use space after
  295.     CALL    CHKYES        ; Opcode ?
  296.     CPI    ESC
  297.     JZ    HELLO0
  298.     CPI    CTRLC
  299.     JZ    ABORT
  300.     CPI    'Y'
  301. ;
  302. HELLO2:    CZ    SETSPC
  303.     LXI    D,COLMSG
  304.     CALL    PRTLIN        ;
  305.     CALL    CHKYES        ; Start comment
  306.     CPI    ESC
  307.     JZ    HELLO0
  308.     CPI    CTRLC
  309.     JZ    ABORT
  310.     CPI    'Y'
  311.     CZ    SETCOL        ; In column 25 ?
  312.     LXI    D,EXCMSG
  313.     CALL    PRTLIN        ; Ignore exclamation point
  314.     CALL    CHKYES        ; Separator ?
  315.     CPI    ESC
  316.     JZ    HELLO0
  317.     CPI    CTRLC
  318.     JZ    ABORT
  319.     CPI    'Y'
  320.     CZ    SETNEX
  321.     LXI    D,MLTMSG
  322.     CALL    PRTLIN        ; Multiple statements
  323.     CALL    CHKYES        ; On one line ?
  324.     CPI    ESC
  325.     JZ    HELLO0
  326.     CPI    CTRLC
  327.     JZ    ABORT
  328.     CPI    'Y'
  329.     CZ    SETMLT
  330.     LXI    D,TRNMSG    ; Convert case ?
  331.     CALL    PRTLIN
  332.     CALL    CHKYES
  333.     CPI    ESC
  334.     JZ    HELLO0
  335.     CPI    CTRLC
  336.     JZ    ABORT
  337.     CPI    'L'
  338.     CZ    SETLC
  339.     CPI    'U'
  340.     CZ    SETUC
  341.     MVI    A,N01
  342.     STA    COLNUM
  343.     MVI    C,NCDISK
  344.     CALL    BDOS
  345.     INR    A
  346.     STA    XCDISK
  347.     CALL    MAKFNS
  348.     CALL    OPENIN
  349.     CALL    CREATO
  350.     RET
  351. ;.....
  352. ;
  353. ;
  354. SIGNON:    DB    '8080-to-8086 Translator version '
  355.     DB    VERS/100+'0','.',(VERS MOD 100)/10+'0'
  356.     DB    (VERS MOD 10)+'0'
  357.     DB    CR,LF,0
  358. ;.....
  359. ;
  360. ;
  361. ; Don't translate non-standard opcodes
  362. ;
  363. NXPSD:    XRA    A
  364.     STA    OPTTDL
  365.     STA    OPTENT
  366.     STA    OPTIFC
  367.     RET
  368. ;.....
  369. ;
  370. ;
  371. DBMSG:    DB    'Translate DB & EQU ? '
  372.     DB    '[Y/ret=N/esc/^C] ',0
  373. ;
  374. NXDBEQ:    XRA    A
  375.     STA    OPTBDB
  376.     RET
  377. ;.....
  378. ;
  379. ;
  380. SPCMSG:    DB    'Use space (default TAB) after opcode ? '
  381.     DB    '[Y/ret=N/esc/^C] ',0
  382. ;
  383. SETSPC:    LXI    H,PUTHT+1
  384.     MVI    A,' '
  385.     MOV    M,A
  386.     STA    MLTSPC
  387.     RET
  388. ;.....
  389. ;
  390. ;
  391. COLMSG:    DB    'Start comment in column 25 (default 33) ? '
  392.     DB    '[Y/ret=N/esc/^C] ',0
  393. ;
  394. SETCOL:    LXI    H,PUTND5+1
  395.     MVI    A,33
  396.     MOV    M,A
  397.     RET
  398. ;.....
  399. ;
  400. ;
  401. EXCMSG:    DB    'Ignore ! statement separator ? '
  402.     DB    '[Y/ret=N/esc/^C] ',0
  403. ;
  404. SETNEX:    MVI    A,0C9H        ; RET instruction
  405.     STA    EXCLAM
  406.     RET
  407. ;.....
  408. ;
  409. ;
  410. MLTMSG:    DB    'Put opcodes converted to multiple'
  411.     DB    ' statements on one line ? '
  412.     DB    '[Y/ret=N/esc/^C] ',0
  413. ;
  414. SETMLT:    LXI    H,EXCLSP
  415.     SHLD    SEPMSG
  416.     MVI    A,' '
  417.     STA    MLTSPC
  418.     RET
  419. ;.....
  420. ;
  421. ;
  422. TRNMSG:    DB    'Translate instructions to Upper/Lower'
  423.     DB    ' or preserve case ? [U/L/ret/esc/^C] ',0
  424. ;
  425. SETLC:    STA    TCASFL
  426.     STA    LCASFL
  427.     RET
  428. ;.....
  429. ;
  430. ;
  431. SETUC:    STA    TCASFL
  432.     RET
  433. .....:
  434. ;
  435. ;
  436. ;***********************************************************************
  437. ;
  438. ; Gets line from input file to line buffer until CR.  Filters out con-
  439. ; trol characters except for horizontal tab.  Truncates lines after
  440. ; LBUFLN characters.  Terminates line with CR,LF,0.
  441. ;
  442. GETLIN:    CALL    PDOT        ; Print activity dot
  443.     CALL    CHKIN
  444.     CPI    CTRLC
  445.     JZ    JABORT
  446.     XRA    A
  447.     STA    QUOTFL        ; Not in quote
  448.     STA    CMNTFL        ; Not in comment
  449.     LXI    H,LBUFF        ; Line buffer
  450.     MVI    B,LBUFLN    ; Max # of char
  451. ;
  452. GETLN1:    XCHG
  453.     LHLD    XIBUFF
  454.     XCHG
  455.     MOV    A,D
  456.     CPI    (IBUFF+IBFLEN)/256
  457.     JNZ    GETLN4
  458.     MOV    A,E
  459.     CPI    (IBUFF+IBFLEN) MOD 256
  460.     JNZ    GETLN4
  461.     PUSH    B
  462.     PUSH    H
  463.     LXI    D,IBUFF
  464. ;
  465. GETLN2:    MVI    C,NDMA
  466.     PUSH    D
  467.     CALL    BDOS
  468.     POP    D
  469.     XCHG
  470.     LXI    D,INFCB
  471.     MVI    C,NRDNR
  472.     PUSH    H
  473.     CALL    BDOS
  474.     POP    H
  475.     DCR    A
  476.     JNZ    GETLN3
  477.     MVI    A,EOF
  478.     MOV    M,A
  479. ;
  480. GETLN3:    LXI    D,RECLEN
  481.     DAD    D
  482.     XCHG
  483.     MOV    A,D
  484.     CPI    (IBUFF+IBFLEN)/256
  485.     JNZ    GETLN2
  486.     MOV    A,E
  487.     CPI    (IBUFF+IBFLEN) MOD 256
  488.     JNZ    GETLN2
  489.     POP    H
  490.     POP    B
  491.     LXI    D,IBUFF
  492. ;
  493. GETLN4:    LDAX    D
  494.     INX    D
  495.     XCHG
  496.     SHLD    XIBUFF
  497.     XCHG
  498.     MOV    M,A
  499.     CPI    QUOTE        ; Set or reset
  500.     JNZ    GTLN41        ; QUOTFL
  501.     LDA    QUOTFL
  502.     CMA
  503.     STA    QUOTFL
  504. ;
  505. GTLN41:    MOV    A,M        ; Translate exclam.  pt.
  506.     CALL    EXCLAM        ; Which is not in quote
  507.     MOV    M,A        ; To EOS
  508.     LDA    TCASFL        ; Translate to upper
  509.     ORA    A        ; Or lower case ?
  510.     JZ    GTLN46        ; NO
  511.     LDA    QUOTFL        ; If in quote, do
  512.     ORA    A        ; Nothing
  513.     JNZ    GTLN43
  514.     MOV    A,M        ; Otherwise, ';' sets
  515.     CPI    ';'        ; CMNTFL and EOS resets
  516.     JZ    GTLN42        ; It
  517.     CPI    EOS
  518.     JNZ    GTLN43
  519.     XRA    A
  520. ;
  521. GTLN42:    STA    CMNTFL
  522. ;
  523. GTLN43:    LDA    QUOTFL        ; If in quote,
  524.     ORA    A        ; Do nothing
  525.     JNZ    GTLN46
  526.     LDA    CMNTFL        ; If in comment,
  527.     ORA    A        ; Do nothing
  528.     JNZ    GTLN46
  529.     LDA    LCASFL        ; Otherwise,
  530.     ORA    A        ; If LCASFL set
  531.     MOV    A,M
  532.     JZ    GTLN44
  533.     CALL    LCASE        ; Trns to lwr case
  534.     JMP    GTLN45
  535. ;
  536. GTLN44:    CALL    UCASE        ; Else trns to upr case
  537. ;
  538. GTLN45:    MOV    M,A
  539. ;
  540. GTLN46:    MOV    A,M
  541.     CPI    CR
  542.     JZ    GETLN6
  543.     CPI    HT        ; Filters out all ctrl
  544.     JZ    GETLN5        ; Chars except tab
  545.     CPI    EOF
  546.     JZ    GETLN7
  547.     CPI    EOS
  548.     JZ    GETLN5
  549.     CPI    ' '
  550.     JC    GETLN1
  551. ;
  552. GETLN5:    DCR    B
  553.     INX    H
  554.     JNZ    GETLN1
  555.     INR    B
  556.     DCX    H
  557.     JMP    GETLN1
  558. ;
  559. GETLN6:    INX    H
  560.     MVI    M,LF
  561.     INX    H
  562.     MVI    M,N00
  563.     XCHG
  564.     SHLD    XIBUFF
  565.     XCHG
  566.     RET
  567. ;.....
  568. ;
  569. ;
  570. ; Change exclamation point to EOS in A
  571. ;
  572. EXCLAM:    CPI    '!'
  573.     RNZ
  574.     LDA    QUOTFL
  575.     ORA    A
  576.     MVI    A,'!'
  577.     RNZ
  578.     MVI    A,EOS
  579.     RET
  580. ;.....
  581. ;
  582. ;
  583. QUOTFL:    DB    0
  584. CMNTFL:    DB    0
  585. ;
  586. ;
  587. ; Exit
  588. ;
  589. GETLN7:    CALL    CLOSEO
  590.     LXI    D,UPSMSG
  591.     CALL    PRTLIN
  592.     LXI    D,ENDIFL
  593.     CALL    PRTLIN
  594.     LXI    D,ICLFLG
  595.     CALL    PRTLIN
  596.     LXI    D,LSTFLG
  597.     CALL    PRTLIN
  598.     LXI    D,MACFLG
  599.     CALL    PRTLIN
  600.     LXI    D,EOJMSG
  601. ;
  602. ;
  603. ; Print message at DE and abort
  604. ;
  605. EREXIT:    PUSH    D
  606.     LXI    D,CRLFMG
  607.     CALL    PRTLIN
  608.     POP    D
  609.     CALL    PRTLIN
  610.     JMP    ABORT
  611. ;.....
  612. ;
  613. ;
  614. JABORT:    LXI    D,JABTMG
  615.     CALL    PRTLIN
  616.     JMP    GETLN7
  617. ;.....
  618. ;
  619. ;
  620. JABTMG:    DB    CR,LF,'*** Job Cancelled ***',CR,LF,0
  621. ;
  622. ;
  623. UPSMSG:    DB    0,LF,'The following operands'
  624.     DB    ' have been used in your '
  625.     DB    'source and have not'
  626.     DB    CR,LF
  627.     DB    'been fully translated.  You must '
  628.     DB    'complete the translation using an editor.'
  629.     DB    CR,LF,HT
  630.     DB    'original:',HT,HT
  631.     DB    'must be translated to:'
  632.     DB    CR,LF,0
  633. ;
  634. ENDIFL:    DB    0,'IF or IFC',HT,HT,'%IF(exp)THEN(txt1)',CR,LF
  635.     DB    HT,'ELSE',HT,HT,HT,'ELSE(txt2)',CR,LF
  636.     DB    HT,'ENDIF or #ENDIF',HT,HT,'FI'
  637.     DB    CR,LF,0
  638. ;
  639. ICLFLG:    DB    0,'ICL'
  640.     DB    CR,LF,0
  641. ;
  642. LSTFLG:    DB    0,'LST or LIST'
  643.     DB    CR,LF,0
  644. ;
  645. MACFLG:    DB    0,'MACRO or MAC',HT,HT,'%DEFINE(mname[(plist)])'
  646.     DB    CR,LF
  647.     DB    HT,'#macro-call',HT,HT,'%macro-call'
  648.     DB    CR,LF,0
  649. ;
  650. EOJMSG:    DB    '*** End of Job ***',CR,LF,0
  651. ;.....
  652. ;
  653. ;
  654. ;***********************************************************************
  655. ;
  656. ; Process line
  657. ;
  658. PROCLIN:LXI    H,LBUFF
  659. ;
  660. PROCLN0:CALL    FNDOPC
  661.     JNZ    PRCLN00
  662.     CALL    PTCOLN        ; Put out pending colon
  663.     JMP    PUTND6
  664. ;...
  665. ;
  666. ;
  667. PRCLN00:LDA    COLNFL        ; Is there a colon
  668.     ORA    A        ; To print ?
  669.     JZ    PRCLN01        ; No, put white space
  670.     LXI    H,OPTPSD    ; See if opcode
  671.     LXI    B,OPBFLN    ; Is DB, DW, DS, or EQU
  672.     CALL    SCANOP
  673.     JZ    PRCLN01        ; If so, don't put colon
  674.     MVI    A,':'
  675.     CALL    PUTCHR
  676. ;
  677. PRCLN01:LHLD    XWHITE
  678.     CALL    PUTSPT
  679. ;
  680. PROCLN1:LXI    H,OPTIMM    ; Imm or one byte
  681.     LXI    B,2*OPBFLN
  682.     CALL    SCANOP
  683.     JZ    DOIMM
  684.     LXI    H,OPTONE    ; One byte opcodes
  685.     LXI    B,2*OPBFLN
  686.     CALL    SCANOP
  687.     JZ    DO$ONE
  688.     LXI    H,OPTREG    ; Register
  689.     LXI    B,2*OPBFLN
  690.     CALL    SCANOP
  691.     JZ    DOREG
  692.     LXI    H,OPTBDB    ; Db and equ
  693.     LXI    B,2*OPBFLN
  694.     CALL    SCANOP
  695.     JZ    DOSIMP
  696.     LXI    H,OPTSMP    ; Simple
  697.     LXI    B,2*OPBFLN
  698.     CALL    SCANOP
  699.     JZ    DOSIMP
  700.     LXI    H,OPTROT    ; Rotates
  701.     LXI    B,2*OPBFLN
  702.     CALL    SCANOP
  703.     JZ    DOROT
  704.     LXI    H,OPTDCR    ; Dcr, inr
  705.     LXI    B,2*OPBFLN
  706.     CALL    SCANOP
  707.     JZ    DODCR
  708.     LXI    H,OPTDCX    ; 16 bit dcx, inx
  709.     LXI    B,2*OPBFLN
  710.     CALL    SCANOP
  711.     JZ    DODCX
  712.     LXI    H,OPTTDL    ; Tdl
  713.     LXI    B,OPBFLN
  714.     CALL    SCANOP
  715.     CZ    DOTDL
  716.     LXI    H,OPTRCC    ; Ret cond
  717.     LXI    B,2*OPBFLN
  718.     CALL    SCANOP
  719.     JZ    DORET
  720.     LXI    H,OPTCCC    ; Call cond
  721.     LXI    B,2*OPBFLN
  722.     CALL    SCANOP
  723.     JZ    DOCALL
  724.     LXI    H,OPTJCC    ; Jump cond
  725.     LXI    B,2*OPBFLN
  726.     CALL    SCANOP
  727.     JZ    DOJMP
  728.     LXI    H,OPTMSC    ; Index & misc
  729.     LXI    B,2*OPBFLN+2
  730.     CALL    SCANOP
  731.     JZ    EXEC
  732. ;
  733. PUTCOD:    LHLD    XOPCOD        ; This fix prevents macro
  734.     JMP    PUTEND        ; Names from being split
  735. ;
  736. PUTOPR:    LHLD    XOPRND
  737. ;
  738. PUTEND:    XRA    A
  739.     STA    LCFLAG
  740.     STA    LCDFLG
  741.     MVI    C,N00        ; Putout w/o
  742. ;
  743. PUTND1:    MOV    A,M        ; Change
  744.     CPI    ' '
  745.     JZ    PUTND3
  746.     CPI    HT
  747.     JZ    PUTND3
  748.     CPI    CR
  749.     JZ    PUTLNC
  750.     CPI    ';'
  751.     JZ    PUTND4
  752.     CPI    EOS        ; Process exclamation pt.
  753.     JZ    PTND21        ; Statement separator
  754.     CPI    QUOTE
  755.     JNZ    PUTND2
  756.     DCR    C
  757.     JZ    PUTND2
  758.     MVI    C,N01
  759. ;
  760. PUTND2:    CALL    PUTCHR
  761.     INX    H
  762.     JMP    PUTND1
  763. ;
  764. PTND21:    CALL    SKSPHT
  765.     INX    H        ; Inc past excl. pt.
  766. ;
  767. PTND22:    MOV    A,M
  768.     CPI    ';'
  769.     JZ    PUTND5
  770.     LDA    MLTLFL        ; Put out as separate
  771.     ORA    A        ; Lines
  772.     JZ    PTND24        ; NO
  773.     MOV    A,M
  774.     CPI    ' '        ; Change space to HT
  775.     JNZ    PTND23
  776.     MVI    M,HT
  777. ;
  778. PTND23:    CALL    PCRLF
  779.     JMP    PROCLN0
  780. ;
  781. PTND24:    LDA    TEMP        ; Was last character put
  782.     CPI    ' '        ; Out a space ?
  783.     JZ    PTND25
  784.     CPI    HT        ; Or a TAB ?
  785.     JZ    PTND25
  786.     MVI    A,' '        ; NO, put out a space
  787.     CALL    PUTCHR
  788. PTND25:    MVI    A,'!'
  789.     CALL    PUTCHR
  790.     JMP    PROCLN0
  791. ;.....
  792. ;
  793. ;
  794. PUTND3:    PUSH    H        ; Space or Tab come here
  795.     CALL    SKSPHT
  796.     CPI    CR        ; This fix filters out
  797.     JZ    PUTLNB        ; Trailing spaces or tabs
  798.     POP    H
  799.     CPI    EOS        ; Fix to process excl. pt.
  800.     JZ    PTND21
  801.     CPI    ';'
  802.     MOV    A,M        ; Prevent blank being replaced
  803.     JZ    PUTND4
  804.     CALL    PUTSPT
  805.     JMP    PUTND1
  806. ;
  807. PUTND4:    DCR    C        ; ';' come here
  808.     INR    C
  809.     JNZ    PUTND2
  810.     CALL    SKSPHT
  811. ;
  812. ;
  813. ; Tab comments to proper column
  814. ;
  815. PUTND5:    MVI    B,41
  816. ;
  817. PTND51:    LDA    COLNUM
  818.     CMP    B        ; Colnum>=41?
  819.     JNC    PTND54
  820.     DCR    A        ; No, insert
  821.     ANI    NF8        ; Tabs to
  822.     ADI    N09        ; Start output
  823.     CMP    B        ; At col. 33
  824.     JZ    PTND54
  825.     JC    PTND52
  826.     MVI    A,' '
  827.     JMP    PTND53
  828. ;
  829. PTND52:    MVI    A,HT
  830. ;
  831. PTND53:    CALL    PUTCHR
  832.     JMP    PTND51
  833. ;
  834. PTND54:    LDA    TEMP        ; Insure
  835.     CPI    ' '        ; Space
  836.     JZ    PUTND6        ; Before
  837.     CPI    HT        ; Semi-colon
  838.     JZ    PUTND6
  839.     MVI    A,' '
  840.     CALL    PUTCHR
  841. ;
  842. PUTND6:    MOV    A,M
  843.     INX    H
  844.     CPI    EOS
  845.     JZ    PTND22
  846.     ORA    A
  847.     RZ
  848.     CALL    PUTCHR
  849.     JMP    PUTND6
  850. ;.....
  851. ;
  852. ;
  853. ; Put line at HL to output file until 0 and reset colnum to 1.
  854. ;
  855. PUTLNB:    XTHL            ; Filter trailing
  856.     POP    H        ; Blanks or tabs
  857. ;
  858. PUTLNC:    JMP    PUTLIN
  859. ;.....
  860. ;
  861. ;
  862. ;***********************************************************************
  863. ;
  864. ; Process labels, find potential opcode.
  865. ;
  866. FNDOPC:    XRA    A
  867.     STA    COLNFL        ; Reset colon flag
  868.     MOV    A,M
  869.     CPI    ' '
  870.     JZ    FNDOP3
  871.     CPI    HT
  872.     JZ    FNDOP3
  873.     CPI    CR        ; Pass blank
  874.     RZ            ; Lines
  875.     CPI    EOS        ; Excl. pt. separator
  876.     RZ
  877.     CPI    ';'
  878.     RZ
  879.     CPI    '*'        ; Asterisk in first column
  880.     JNZ    FNDOP1        ; Is a comment line
  881.     MVI    M,';'
  882.     RET
  883. ;.....
  884. ;
  885. ;
  886. ; Only comes here if this is a label
  887. ;
  888. FNDOP1:    MVI    C,N00
  889.     MVI    A,':'        ; Set colon flag
  890.     STA    COLNFL        ; To insure colon after label
  891. ;
  892. FNDOP2:    MOV    A,M
  893.     CPI    ':'
  894.     JZ    FNDOP4
  895.     CPI    HT
  896.     JZ    FNDOP6
  897.     CPI    ' '
  898.     JZ    FNDOP6
  899.     CPI    CR
  900.     RZ
  901.     CPI    EOS
  902.     RZ
  903.     CPI    ';'
  904.     JZ    FNDOP7
  905.     CALL    PUTCHR
  906.     INX    H
  907.     INR    C
  908.     JMP    FNDOP2
  909. ;.....
  910. ;
  911. ;
  912. ; Comes here only if space or tab at beginning of line.
  913.  
  914. FNDOP3:    PUSH    H
  915.     CALL    SKSPHT        ; Find first non-sp or tab
  916.     CPI    CR
  917.     JZ    FNDOP9
  918.     CPI    EOS
  919.     JZ    FNDOP9
  920.     POP    H
  921.     CALL    PUTSPT        ; Print until non-sp or ht
  922.     PUSH    H
  923.     CALL    FINDLM        ; Find ,:+-/*); CR HT or SP at HL
  924.     CPI    ':'
  925.     POP    H
  926.     JZ    FNDOP1
  927.     JMP    FNDOP7
  928. ;
  929. ;
  930. ; Colon terminating label comes here
  931. ;
  932. FNDOP4:    INX    H
  933.     MOV    A,M
  934.     CPI    ':'
  935.     JNZ    FNDOP5
  936.     CALL    PUTCHR
  937.     INX    H
  938. ;
  939. FNDOP5:    MVI    A,':'
  940.     STA    COLNFL        ; Set colon flag
  941. ;
  942. ;
  943. ; HT or SP comes here
  944. ;
  945. ; See if there is an opcode field
  946. ;
  947. FNDOP6:
  948. FNDOP7:    PUSH    H
  949.     CALL    SKSPHT
  950.     MOV    A,M
  951.     CPI    CR
  952.     JZ    FNDOP9        ; Filter trailing SP or TAB
  953.     CPI    EOS
  954.     JZ    FNDOP9        ; Excl. pt. separator
  955.     CPI    ';'
  956.     JNZ    FNDOP8
  957.     CALL    PTCOLN        ; Put colon out if flag set
  958.     XTHL
  959.     POP    H
  960.     POP    B        ; Clear return
  961.     JMP    PUTND5        ; Tab to proper column
  962. ;.....
  963. ;
  964. ;
  965. ; Have located opcode field
  966. ;
  967. FNDOP8:    POP    H
  968.     SHLD    XWHITE
  969.     CALL    SKSPHT
  970. ;
  971. ;
  972. ; Move potential opcode to OPCBUF
  973. ;
  974. MOVOPC:    SHLD    XOPCOD
  975.     MVI    B,OPBFLN
  976.     LXI    D,OPCBUF
  977.     CALL    MOVBDH        ; Move up to B char from HL to
  978.     CALL    SKSPHT        ; DE until ,:+-/*); CR HT SP
  979.     SHLD    XOPRND
  980.     SUB    A
  981.     INR    A
  982.     RET
  983. ;.....
  984. ;
  985. ;
  986. ; Come here on CR to filter trailing SP or TAB
  987. ;
  988. FNDOP9:    CALL    PTCOLN        ; Put out colon if flag set
  989.     XTHL
  990.     POP    H
  991.     XRA    A
  992.     RET
  993. ;.....
  994. ;
  995. ;
  996. ; Put colon to output file if colon flag is set.
  997. ;
  998. PTCOLN:    LDA    COLNFL
  999.     ORA    A
  1000.     RZ
  1001.     CALL    PUTCHR
  1002.     XRA    A
  1003.     STA    COLNFL
  1004.     RET
  1005. ;.....
  1006. ;
  1007. ;
  1008. COLNFL:    DB    0
  1009. XWHITE:    DW    0        ; Pointer to white space after
  1010. ;                ; Label and before opcode
  1011. ;
  1012. ;***********************************************************************
  1013. ;
  1014. ; Opcode tables
  1015. ;
  1016. OPTIMM:    DB    'ACI  ADC  '
  1017.     DB    'ADI  ADD  '
  1018.     DB    'ANI  AND  '
  1019.     DB    'CPI  CMP  '
  1020.     DB    'ORI  OR   '
  1021.     DB    'SBI  SBB  '
  1022.     DB    'SUI  SUB  '
  1023.     DB    'XRI  XOR  '
  1024.     DB    0
  1025. ;
  1026. OPTONE:    DB    'RET  RET  '
  1027.     DB    'CMC  CMC  '
  1028.     DB    'HLT  HLT  '
  1029.     DB    'STC  STC  '
  1030.     DB    'DAA  DAA  '
  1031.     DB    'DI   CLI  '
  1032.     DB    'EI   STI  '
  1033.     DB    'NOP  NOP  '
  1034.     DB    0
  1035. ;
  1036. OPTREG:    DB    'ADC  ADC  '
  1037.     DB    'ADD  ADD  '
  1038.     DB    'ANA  AND  '
  1039.     DB    'CMP  CMP  '
  1040.     DB    'ORA  OR   '
  1041.     DB    'SBB  SBB  '
  1042.     DB    'SUB  SUB  '
  1043.     DB    'XRA  XOR  '
  1044.     DB    0
  1045. ;
  1046. OPTPSD:    DB    'DB   '
  1047.     DB    'EQU  '
  1048.     DB    'DW   '
  1049.     DB    'DS   '
  1050.     DB    0
  1051. ;
  1052. OPTBDB:    DB    'DB   DB   '
  1053.     DB    'EQU  EQU  '
  1054.     DB    0
  1055. ;
  1056. OPTSMP:    DB    'JMP  JMP  '
  1057.     DB    'CALL CALL '
  1058.     DB    'DS   RS   '
  1059.     DB    'DW   DW   '
  1060.     DB    'SET  EQU  '
  1061. ;
  1062. OPTENT:    DB    'ENT  ENTRY'
  1063.     DB    'NAM  NAME '
  1064.     DB    'RAM  DATA '
  1065.     DB    'ROG  REL  '
  1066.     DB    0
  1067. ;
  1068. OPTDCR:    DB    'DCR  DEC  '
  1069.     DB    'INR  INC  '
  1070.     DB    0
  1071. ;
  1072. OPTROT:    DB    'RAL  RCL  '
  1073.     DB    'RAR  RCR  '
  1074.     DB    'RLC  ROL  '
  1075.     DB    'RRC  ROR  '
  1076.     DB    0
  1077. ;
  1078. OPTDCX:    DB    'DCX  DEC  '
  1079.     DB    'INX  INC  '
  1080.     DB    0
  1081. ;
  1082. OPTTDL:    DB    'REQ  '
  1083.     DB    'RNE  '
  1084.     DB    'RLT  '
  1085.     DB    'RGE  '
  1086.     DB    'CEQ  '
  1087.     DB    'CNE  '
  1088.     DB    'CLT  '
  1089.     DB    'CGE  '
  1090.     DB    'JEQ  '
  1091.     DB    'JNE  '
  1092.     DB    'JLT  '
  1093.     DB    'JGE  '
  1094.     DB    0
  1095. ;
  1096. OPTRCC:    DB    'RC   JNC  '
  1097.     DB    'RNC  JC   '
  1098.     DB    'RZ   JNZ  '
  1099.     DB    'RNZ  JZ   '
  1100.     DB    'RP   JS   '
  1101.     DB    'RM   JNS  '
  1102.     DB    'RPE  JPO  '
  1103.     DB    'RPO  JPE  '
  1104.     DB    0
  1105. ;
  1106. OPTCCC:    DB    'CC   JNC  '
  1107.     DB    'CNC  JC   '
  1108.     DB    'CZ   JNZ  '
  1109.     DB    'CNZ  JZ   '
  1110.     DB    'CP   JS   '
  1111.     DB    'CM   JNS  '
  1112.     DB    'CPE  JPO  '
  1113.     DB    'CPO  JPE  '
  1114.     DB    0
  1115. ;
  1116. OPTJCC:    DB    'JC   JNC  '
  1117.     DB    'JNC  JC   '
  1118.     DB    'JZ   JNZ  '
  1119.     DB    'JNZ  JZ   '
  1120.     DB    'JP   JS   '
  1121.     DB    'JM   JNS  '
  1122.     DB    'JPE  JPO  '
  1123.     DB    'JPO  JPE  '
  1124.     DB    0
  1125. ;
  1126. OPTMSC:    DB    'LXI  MOV  '
  1127.     DW    DOLXI
  1128.     DB    'POP  POP  '
  1129.     DW    DOPOP
  1130.     DB    'PUSH PUSH '
  1131.     DW    DOPSH
  1132.     DB    'DAD  ADD  '
  1133.     DW    DODAD
  1134.     DB    'LDA  MOV  '
  1135.     DW    DOLDA
  1136.     DB    'LDAX MOV  '
  1137.     DW    DOLDAX
  1138.     DB    'LHLD MOV  '
  1139.     DW    DOLHLD
  1140.     DB    'MOV  MOV  '
  1141.     DW    DOMOV
  1142.     DB    'MVI  MOV  '
  1143.     DW    DOMVI
  1144.     DB    'IN   IN   '
  1145.     DW    DOIN
  1146.     DB    'OUT  OUT  '
  1147.     DW    DOOUT
  1148.     DB    'PCHL JMP  '
  1149.     DW    DOPCHL
  1150.     DB    'RST  CALL '
  1151.     DW    DORST
  1152.     DB    'SHLD MOV  '
  1153.     DW    DOSHLD
  1154.     DB    'SPHL MOV  '
  1155.     DW    DOSPHL
  1156.     DB    'STA  MOV  '
  1157.     DW    DOSTA
  1158.     DB    'STAX MOV  '
  1159.     DW    DOSTAX
  1160.     DB    'XCHG XCHG '
  1161.     DW    DOXCHG
  1162.     DB    'XTHL XCHG '
  1163.     DW    DOXTHL
  1164.     DB    'CMA  NOT  '
  1165.     DW    DOCMA
  1166.     DB    'IF   IF   '
  1167.     DW    DOIFC
  1168.     DB    'LIST LIST '
  1169.     DW    DOLST
  1170.     DB    'MACROMACRO'
  1171.     DW    DOMAC
  1172. ;
  1173. OPTIFC:    DB    'IFC  IF   '
  1174.     DW    DOIFC
  1175.     DB    'ICL  *INCL'
  1176.     DW    DOICL
  1177.     DB    'LST  LIST '
  1178.     DW    DOLST
  1179.     DB    'MAC  MACRO'
  1180.     DW    DOMAC
  1181.     DB    0
  1182. ;.....
  1183. ;
  1184. ;
  1185. ;***********************************************************************
  1186. ;
  1187. ; Scan table at HL for match to OPBFLN character string at OPCBUF.  Ret
  1188. ; Z and HL-> entry if match.
  1189. ;
  1190. SCANOP:    MOV    A,M
  1191.     ANA    A
  1192.     JZ    SCNOP1
  1193.     PUSH    B
  1194.     MVI    B,OPBFLN
  1195.     LXI    D,OPCBUF
  1196.     CALL    CBDEHL        ; Comp B bytes (DE)-(HL)
  1197.     POP    B
  1198.     RZ
  1199.     DAD    B
  1200.     JMP    SCANOP
  1201. ;
  1202. SCNOP1:    INR    A
  1203.     RET
  1204. ;.....
  1205. ;
  1206. ;
  1207. ; Gets routine address from HL+2*OPBFLN and jumps to routine.
  1208. ;
  1209. EXEC:    PUSH    H
  1210.     LXI    B,2*OPBFLN
  1211.     DAD    B
  1212.     MOV    C,M
  1213.     INX    H
  1214.     MOV    B,M
  1215.     POP    H
  1216.     PUSH    B        ; Address on stack
  1217.     RET            ; Go to it
  1218. ;.....
  1219. ;
  1220. ;
  1221. ; Put up to OPBFLN character at HL+OPBFLN to output file.  Stop at space
  1222. ; and put tab to output file.
  1223. ;
  1224. PUTOPHT:CALL    PUTOPC
  1225. ;
  1226. PUTHT:    MVI    A,HT
  1227.     JMP    PUTCHR
  1228. ;.....
  1229. ;
  1230. ;
  1231. ; Put space or tab (contents of MLTSPC) to output file as separator
  1232. ; after opcode in multi-statement output line.
  1233. ;
  1234. PUTHTS:    LDA    MLTSPC
  1235.     JMP    PUTCHR
  1236. ;.....
  1237. ;
  1238. ;
  1239. MLTSPC:    DB    HT
  1240. ;
  1241. ;
  1242. PUTOPC:    LXI    B,OPBFLN
  1243.     DAD    B        ; HL -> new opcode
  1244.     MOV    B,C
  1245. ;
  1246. PUTOP1:    MOV    A,M
  1247.     CPI    ' '
  1248.     RZ
  1249.     CPI    HT
  1250.     RZ
  1251.     LDA    LCFLAG
  1252.     ORA    A
  1253.     MOV    A,M
  1254.     JZ    PUTOP2
  1255.     ORI    20H
  1256. ;
  1257. PUTOP2:    CALL    PUTCHR
  1258.     INX    H
  1259.     DCR    B
  1260.     JNZ    PUTOP1
  1261.     RET
  1262. ;.....
  1263. ;
  1264. ;
  1265. ; Put string at HL to output file until 0.  If (LCFLAG) set, convert to
  1266. ; lower case.
  1267. ;
  1268. PUTOPS:    MOV    A,M
  1269.     ORA    A
  1270.     RZ
  1271.     LDA    LCFLAG
  1272.     ORA    A
  1273.     MOV    A,M
  1274.     JZ    PUTOS0
  1275.     CALL    LCASE
  1276. ;
  1277. PUTOS0:    CALL    PUTCHR
  1278.     INX    H
  1279.     JMP    PUTOPS
  1280. ;.....
  1281. ;
  1282. ;
  1283. ; Put string at HL to output file until 0.  If (LCDFLG) set, convert to
  1284. ; lower case.
  1285. ;
  1286. PUTRND:    MOV    A,M
  1287.     ORA    A
  1288.     RZ
  1289.     LDA    LCDFLG
  1290.     ORA    A
  1291.     MOV    A,M
  1292.     JZ    PUTRN0
  1293.     CALL    LCASE
  1294. ;
  1295. PUTRN0:    CALL    PUTCHR
  1296.     INX    H
  1297.     JMP    PUTRND
  1298. ;.....
  1299. ;
  1300. ;
  1301. LCDFLG:    DB    0
  1302. ;
  1303. ;
  1304. ; Find first  ,:+-/*); CR HT or SP at HL, return A = (HL).
  1305. ;
  1306. FINDLM:    PUSH    B
  1307.     CALL    CHKDLM
  1308.     POP    B
  1309.     RZ
  1310.     INX    H
  1311.     JMP    FINDLM
  1312. ;.....
  1313. ;
  1314. ;
  1315. ; Fill B locations at DE with spaces.  Move up to B character from HL to
  1316. ; DE until  ,:+-/*); CR HT or SP encountered.  Return Z and HL->special
  1317. ; character if found.  (Search B+1 loc for special char.)
  1318. ;
  1319. MOVBDH:    MOV    C,B
  1320.     MVI    B,N00
  1321.     PUSH    B
  1322.     PUSH    D
  1323.     PUSH    H        ; Fill BC locations
  1324.     CALL    FILLBD        ; At DE with spaces
  1325.     POP    H
  1326.     POP    D
  1327.     POP    B
  1328. ;
  1329. MOVBD1:    PUSH    B        ; Ret Z, A=(HL)
  1330.     CALL    CHKDLM        ; If (HL) is
  1331.     POP    B        ; ,:+-/*); CR HT or SP
  1332.     RZ
  1333.     MOV    A,M
  1334.     STAX    D
  1335.     INX    D
  1336.     INX    H
  1337.     DCX    B
  1338.     MOV    A,B
  1339.     ORA    C
  1340.     JZ    CHKDLM
  1341.     JMP    MOVBD1
  1342. ;.....
  1343. ;
  1344. ;
  1345. ; Skip spaces and tabs.  Return HL -> non-space or non-tab
  1346. ;
  1347. SKSPHT:    MOV    A,M
  1348.     CPI    ' '
  1349.     JZ    SKSPT1
  1350.     CPI    HT
  1351.     RNZ
  1352. ;
  1353. SKSPT1:    INX    H
  1354.     JMP    SKSPHT
  1355.  
  1356. ;.....
  1357. ;
  1358. ;
  1359. ; Ret Z, A=(HL) if HL is  ,:+-/*); CR HT SP or EOS
  1360. ;
  1361. CHKDLM:    MOV    A,M
  1362.     CPI    HT
  1363.     RZ
  1364.     CPI    ' '
  1365.     RZ
  1366.     CPI    ','
  1367.     RZ
  1368.     CPI    ';'
  1369.     RZ
  1370.     CPI    CR
  1371.     RZ
  1372.     CPI    ':'
  1373.     RZ
  1374.     CPI    '+'
  1375.     RZ
  1376.     CPI    '-'
  1377.     RZ
  1378.     CPI    '/'
  1379.     RZ
  1380.     CPI    '*'
  1381.     RZ
  1382.     CPI    ')'
  1383.     RZ
  1384.     CPI    EOS
  1385.     RET
  1386. ;.....
  1387. ;
  1388. ;
  1389. ; Compares B characters at DE with characters at HL.  Ret Z if match.
  1390. ; Preserve HL, DE, BC
  1391. ;
  1392. CBDEHL:    PUSH    H
  1393.     PUSH    D
  1394.     PUSH    B
  1395. ;
  1396. CBDH1:    LDAX    D
  1397.     CPI    'a'
  1398.     JC    CBDH2
  1399.     STA    LCFLAG
  1400.     ANI    05FH
  1401. ;
  1402. CBDH2:    CMP    M
  1403.     JNZ    CBDH3
  1404.     INX    H
  1405.     INX    D
  1406.     DCR    B
  1407.     JNZ    CBDH1
  1408. ;
  1409. CBDH3:    POP    B
  1410.     POP    D
  1411.     POP    H
  1412.     RET
  1413. ;.....
  1414. ;
  1415. ;
  1416. LCFLAG:    DB    0
  1417. ;
  1418. ;
  1419. ; Fill BC locations starting at DE with spaces.  Returns A = space,
  1420. ; DE -> next free location, HL = DE - 1, BC = 0.
  1421. ;
  1422. FILLBD:    MVI    A,' '
  1423.     STAX    D
  1424.     MOV    H,D
  1425.     MOV    L,E
  1426.     INX    D
  1427.     DCX    B
  1428.     CALL    MOVIR
  1429.     RET
  1430. ;.....
  1431. ;
  1432. ;
  1433. ; Subtract DE from HL, result in HL.
  1434. ;
  1435. SBCHLDE:MOV    A,L
  1436.     SUB    E
  1437.     MOV    L,A
  1438.     MOV    A,H
  1439.     SBB    D
  1440.     MOV    H,A
  1441.     RET
  1442. ;.....
  1443. ;
  1444. ;
  1445. ; (DE)=(HL), INC HL, INC DE, DEC BC - repeat until BC = 0.
  1446. ;
  1447. MOVIR:    MOV    A,M
  1448.     STAX    D
  1449.     INX    H
  1450.     INX    D
  1451.     DCX    B
  1452.     MOV    A,B
  1453.     ORA    C
  1454.     JNZ    MOVIR
  1455.     RET
  1456. ;.....
  1457. ;
  1458. ;
  1459. ;***********************************************************************
  1460. ;
  1461. ;    Translation Routines
  1462. ;
  1463. ;***********************************************************************
  1464. ;
  1465. ; Immediate i.e., CPI n -> CMP AL,n
  1466. ;
  1467. DOIMM:    CALL    PUTOPHT
  1468.     LXI    H,OPALC
  1469.     CALL    PUTOPS
  1470.     JMP    PUTOPR
  1471. ;.....
  1472. ;
  1473. ;
  1474. OPALC:    DB    'AL,',0
  1475. ;
  1476. ;
  1477. ; One byte (implied) i.e., DI -> CLI
  1478. ;
  1479. DO$ONE:    CALL    PUTOPC
  1480.     JMP    PUTOPR
  1481. ;.....
  1482. ;
  1483. ;
  1484. ; Simple translation i.e., DS n -> RS n
  1485. ;
  1486. DOSIMP:    CALL    PUTOPHT
  1487.     JMP    PUTOPR
  1488. ;.....
  1489. ;
  1490. ;
  1491. ; Register instructions i.e., XRA r -> XOR AL,r'
  1492. ;
  1493. DOREG:    CALL    PUTOPHT        ; Put out opcode+tab
  1494.     LXI    H,OPALC        ; Put out 'AL,'
  1495.     CALL    PUTOPS
  1496.     LHLD    XOPRND
  1497.     CALL    TRNRG        ; Translate register
  1498.     JNZ    PUTEND
  1499.     XCHG            ; Get HL -> r'
  1500.     CALL    PUTRND
  1501.     XCHG
  1502.     JMP    PUTEND
  1503. ;.....
  1504. ;
  1505. ;
  1506. ; MOV r,s -> MOV r',s'
  1507. ;
  1508. DOMOV:    CALL    PUTOPHT
  1509.     LHLD    XOPRND
  1510.     CALL    TRNRG
  1511.     JNZ    PUTOPR
  1512.     XCHG
  1513.     CALL    PUTRND
  1514.     XCHG
  1515.     XRA    A
  1516.     STA    LCDFLG        ; Clear lower case flag
  1517.     MOV    A,M        ; Get comma
  1518.     INX    H        ; Inc past ','
  1519.     CALL    PUTCHR
  1520.     CALL    TRNRG
  1521.     JNZ    PUTEND
  1522.     XCHG
  1523.     CALL    PUTRND
  1524.     XCHG
  1525.     JMP    PUTEND
  1526. ;.....
  1527. ;
  1528. ;
  1529. ; Decrement and increment byte register
  1530. ;
  1531. ; DCR r -> DEC r'
  1532. ;
  1533. ; MVI r,n -> MOV r',n
  1534. ;
  1535. DODCR:
  1536. DOMVI:    CALL    PUTOPHT
  1537.     LHLD    XOPRND
  1538.     CALL    TRNRG
  1539.     JNZ    PUTEND
  1540.     LDAX    D
  1541.     CPI    '['
  1542.     JNZ    DOMVI1
  1543.     PUSH    H
  1544.     LXI    H,OPBYTP
  1545.     CALL    PUTLIN
  1546.     POP    H
  1547. ;
  1548. DOMVI1:    XCHG
  1549.     CALL    PUTRND
  1550.     XCHG
  1551.     JMP    PUTEND
  1552. ;.....
  1553. ;
  1554. ;
  1555. OPBYTP:    DB    'BYTE PTR ',0
  1556. ;
  1557. ;
  1558. ; Translate 8080 byte registers to 8086 byte registers.  Enter with
  1559. ; HL -> to 8080 register.  If match, return Z set, HL -> next, DE ->
  1560. ; translation, otherwise, return NZ, HL, DE unchanged.
  1561. ;
  1562. TRNRG:    MOV    A,M
  1563.     CPI    'a'
  1564.     JC    TRNRG2
  1565.     STA    LCDFLG
  1566. ;
  1567. TRNRG2:    ANI    5FH
  1568.     PUSH    H
  1569.     LXI    H,RTBL
  1570.     MVI    B,RTBLE-RTBL
  1571. ;
  1572. TRNRG3:    CMP    M
  1573.     JZ    TRNRG4
  1574.     INX    H
  1575.     DCR    B
  1576.     JNZ    TRNRG3
  1577.     POP    H        ; HL -> r
  1578.     MVI    A,0FFH        ; Return NZ
  1579.     ORA    A        ; If no match
  1580.     RET
  1581. ;...
  1582. ;
  1583. ;
  1584. TRNRG4:    LXI    D,RTBL
  1585.     CALL    SBCHLDE
  1586.     DAD    H
  1587.     LXI    D,RPTBL
  1588.     DAD    D
  1589.     MOV    E,M
  1590.     INX    H
  1591.     MOV    D,M
  1592.     POP    H
  1593.     INX    H        ; Point to next
  1594.     XRA    A        ; Return Z
  1595.     RET
  1596. ;.....
  1597. ;
  1598. ;
  1599. RTBL:    DB    'ABCDEHLM'
  1600. ;
  1601. RTBLE:
  1602. RPTBL:    DW    ALREG
  1603.     DW    CHREG
  1604.     DW    CLREG
  1605.     DW    DHREG
  1606.     DW    DLREG
  1607.     DW    BHREG
  1608.     DW    BLREG
  1609.     DW    PBX
  1610. ;.....
  1611. ;
  1612. ;
  1613. ALREG:    DB    'AL',0
  1614. CHREG:    DB    'CH',0
  1615. CLREG:    DB    'CL',0
  1616. DHREG:    DB    'DH',0
  1617. DLREG:    DB    'DL',0
  1618. BHREG:    DB    'BH',0
  1619. BLREG:    DB    'BL',0
  1620. PBX:    DB    '[BX]',0
  1621. ;.....
  1622. ;
  1623. ;
  1624. ; Rotates
  1625. ;
  1626. DOROT:    CALL    PUTOPHT
  1627.     LXI    H,OPALC        ; 'AL,'
  1628.     CALL    PUTOPS
  1629.     MVI    A,'1'
  1630.     CALL    PUTCHR
  1631.     JMP    PUTOPR
  1632. ;.....
  1633. ;
  1634. ;
  1635. ; DAD rp -> ADD BX,rp'
  1636. ;
  1637. DODAD:    LDA    DADFL
  1638.     ORA    A
  1639.     JZ    DODAD1
  1640.     PUSH    H
  1641.     LXI    H,OPPSHF    ; 'PUSHF'
  1642.     CALL    PUTOPS
  1643.     CALL    SEP        ; Separator
  1644.     POP    H
  1645.     CALL    PUTOPC
  1646.     CALL    PUTHTS        ; Put out space or tab
  1647.     JMP    DODAD2
  1648. ;
  1649. DODAD1:    CALL    PUTOPHT
  1650. ;
  1651. DODAD2:    LXI    H,OPBXC        ; 'BX,'
  1652.     CALL    PUTOPS
  1653.     LHLD    XOPRND
  1654.     CALL    TRNRP        ; DE -> translated rp
  1655.     JNZ    PUTOPR
  1656.     LDAX    D
  1657.     CPI    'A'
  1658.     JZ    PUTOPR
  1659.     XCHG            ; HL -> translated rp
  1660.     CALL    PUTRND
  1661.     XCHG            ; HL -> next
  1662.     LDA    DADFL
  1663.     ORA    A
  1664.     JZ    PUTEND
  1665.     PUSH    H
  1666.     CALL    SEP        ; Separator
  1667.     LXI    H,OPPOPF    ; 'POPF'
  1668.     CALL    PUTOPS
  1669.     POP    H
  1670.     JMP    PUTEND
  1671. ;.....
  1672. ;
  1673. ;
  1674. OPBXC:    DB    'BX,',0
  1675. ;
  1676. ;
  1677. ; DCX or INX rp -> DEC or INC rp'
  1678. ;
  1679. DODCX:    LDA    INXFL        ; If set, output
  1680.     ORA    A        ; PUSHF to preserve
  1681.     JZ    DODCX1        ; Flags
  1682.     PUSH    H
  1683.     LXI    H,OPPSHF    ; 'PUSHF'
  1684.     CALL    PUTOPS
  1685.     CALL    SEP        ; Separator
  1686.     POP    H
  1687.     CALL    PUTOPC
  1688.     CALL    PUTHTS        ; Put out space or tab
  1689.     JMP    DODCX2
  1690. ;
  1691. DODCX1:    CALL    PUTOPHT
  1692. ;
  1693. DODCX2:    LHLD    XOPRND
  1694.     CALL    TRNRP        ; DE -> translated rp
  1695.     JNZ    PUTOPR
  1696.     LDAX    D
  1697.     CPI    'A'
  1698.     JZ    PUTOPR
  1699.     XCHG            ; HL -> translated rp
  1700.     CALL    PUTRND
  1701.     XCHG            ; HL -> next
  1702.     LDA    INXFL        ; If set, output
  1703.     ORA    A        ; POPF to preserve
  1704.     JZ    PUTEND        ; Flags
  1705.     PUSH    H
  1706.     CALL    SEP        ; Separator
  1707.     LXI    H,OPPOPF    ; 'POPF'
  1708.     CALL    PUTOPS
  1709.     POP    H
  1710.     JMP    PUTEND
  1711. ;.....
  1712. ;
  1713. ;
  1714. OPPSHF:    DB    'PUSHF',0
  1715. OPPOPF:    DB    'POPF',0
  1716. ;
  1717. ;
  1718. ; PUSH rp -> PUSH rp'
  1719. ;
  1720. DOPSH:    XCHG
  1721.     LHLD    XOPRND
  1722.     MOV    A,M
  1723.     ANI    5FH
  1724.     CPI    'P'
  1725.     XCHG
  1726.     JNZ    DOPSH1
  1727.     XCHG
  1728.     CALL    TRNRP        ; DE -> trans, HL -> next
  1729.     JNZ    PUTCOD
  1730.     PUSH    H
  1731.     LXI    H,OPLAHF
  1732.     CALL    PUTRND
  1733.     LDA    PSWFL        ; Preserve order of
  1734.     ORA    A        ; Registers on stack ?
  1735.     CNZ    XAHAL        ; Yes,    XCHG AH,AL
  1736.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  1737.     LXI    H,OPPUSH
  1738.     CALL    PUTOPS
  1739.     CALL    PUTHTS
  1740.     POP    H
  1741.     XCHG            ; HL -> translated rp
  1742.     CALL    PUTRND
  1743.     XCHG            ; HL -> next
  1744.     LDA    PSWFL
  1745.     ORA    A
  1746.     CNZ    XAHAL
  1747.     JMP    PUTEND
  1748. ;.....
  1749. ;
  1750. ;
  1751. DOPSH1:    CALL    PUTOPHT
  1752. ;
  1753. DOPSH2:    LHLD    XOPRND
  1754.     CALL    TRNRP        ; DE -> translated rp
  1755.     JNZ    PUTOPR
  1756. ;
  1757. DOPSH3:    XCHG            ; HL -> translated rp
  1758.     CALL    PUTRND
  1759.     XCHG            ; HL -> next
  1760.     JMP    PUTEND
  1761. ;.....
  1762. ;
  1763. ;
  1764. OPLAHF:    DB    'LAHF',0
  1765. OPPUSH:    DB    'PUSH',0
  1766. ;
  1767. XAHAL:    PUSH    H
  1768.     CALL    SEP
  1769.     LXI    H,OPXCHG
  1770.     CALL    PUTRND
  1771.     CALL    PUTHTS
  1772.     LXI    H,OPAHAL
  1773.     CALL    PUTRND
  1774.     POP    H
  1775.     RET
  1776. ;.....
  1777. ;
  1778. ;
  1779. OPXCHG:    DB    'XCHG',0
  1780. OPAHAL:    DB    'AH,AL',0
  1781. ;
  1782. ;
  1783. ; POP rp -> POP rp'
  1784. ;
  1785. DOPOP:    XCHG
  1786.     LHLD    XOPRND
  1787.     MOV    A,M
  1788.     ANI    5FH
  1789.     CPI    'P'
  1790.     XCHG
  1791.     JNZ    DOPSH1
  1792.     CALL    PUTOPC
  1793.     CALL    PUTHT        ; Put out space or tab
  1794.     LHLD    XOPRND
  1795.     CALL    TRNRP        ; DE -> trans, HL -> next
  1796.     JNZ    PUTOPR
  1797.     XCHG
  1798.     CALL    PUTRND
  1799.     LDA    PSWFL
  1800.     ORA    A
  1801.     CNZ    XAHAL
  1802.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  1803.     LXI    H,OPSAHF
  1804.     CALL    PUTRND
  1805.     XCHG
  1806.     JMP    PUTEND
  1807. ;.....
  1808. ;
  1809. ;
  1810. OPSAHF:    DB    'SAHF',0
  1811. ;
  1812. ;
  1813. ; LXI rp,nn -> MOV rp',OFFSET nn
  1814. ;
  1815. DOLXI:    CALL    PUTOPHT
  1816.     LHLD    XOPRND
  1817.     CALL    TRNRP
  1818.     JNZ    PUTOPR
  1819.     LDAX    D
  1820.     CPI    'A'
  1821.     JZ    PUTOPR
  1822.     XCHG
  1823.     CALL    PUTRND
  1824.     LXI    H,OFFATR
  1825.     CALL    PUTLIN
  1826.     XCHG            ; HL -> next
  1827.     INX    H        ; Skip comma
  1828.     JMP    PUTEND
  1829. ;.....
  1830. ;
  1831. ;
  1832. OFFATR:    DB    ',OFFSET ',0
  1833. ;
  1834. ;
  1835. ; Translate 16 bit registers.  Enter with HL -> rp.  Returns HL -> next
  1836. ; character, DE -> translation, Z set if match, otherwise, HL unchanged,
  1837. ; NZ.
  1838. ;
  1839. TRNRP:    XRA    A
  1840.     STA    LCDFLG
  1841.     MOV    A,M
  1842.     CPI    'a'
  1843.     JC    TRNRP1
  1844.     STA    LCDFLG
  1845. ;
  1846. TRNRP1:    ANI    5FH
  1847.     CPI    'B'
  1848.     JZ    TRNRPB
  1849.     CPI    'D'
  1850.     JZ    TRNRPD
  1851.     CPI    'H'
  1852.     JZ    TRNRPH
  1853.     CPI    'P'
  1854.     JZ    TRNRPP
  1855.     CPI    'S'
  1856.     JZ    TRNRPS
  1857. ;
  1858. TRNRP2:    MVI    A,0
  1859.     STA    LCDFLG
  1860.     RET
  1861. ;...
  1862. ;
  1863. ;
  1864. TRNRPB:    LXI    D,OPRCX        ; 'CX'
  1865.     INX    H
  1866.     RET
  1867. ;...
  1868. ;
  1869. ;
  1870. TRNRPD:    LXI    D,OPRDX        ; 'DX'
  1871.     INX    H
  1872.     RET
  1873. ;...
  1874. ;
  1875. ;
  1876. TRNRPH:    LXI    D,OPRBX        ; 'BX'
  1877.     INX    H
  1878.     RET
  1879. ;...
  1880. ;
  1881. ;
  1882. TRNRPP:    INX    H
  1883.     MOV    A,M
  1884.     ANI    5FH
  1885.     CPI    'S'
  1886.     JNZ    TRNRP4
  1887.     INX    H
  1888.     MOV    A,M
  1889.     ANI    5FH
  1890.     CPI    'W'
  1891.     JNZ    TRNRP3
  1892.     LXI    D,OPRAX        ; 'AX'
  1893.     INX    H
  1894.     RET
  1895. ;...
  1896. ;
  1897. ;
  1898. TRNRP3:    DCX    H
  1899. ;
  1900. TRNRP4:    DCX    H
  1901.     JMP    TRNRP2
  1902. ;...
  1903. ;
  1904. ;
  1905. TRNRPS:    INX    H
  1906.     MOV    A,M
  1907.     ANI    5FH
  1908.     CPI    'P'
  1909.     JNZ    TRNRP4
  1910.     LXI    D,OPRSP
  1911.     INX    H
  1912.     RET
  1913. ;.....
  1914. ;
  1915. ;
  1916. OPRAX:    DB    'AX',0
  1917. OPRCX:    DB    'CX',0
  1918. OPRDX:    DB    'DX',0
  1919. OPRBX:    DB    'BX',0
  1920. OPRSP:    DB    'SP',0
  1921. ;.....
  1922. ;
  1923. ;
  1924. ;Strange opcodes
  1925. ;
  1926. DOTDL:    LDA    OPCBUF+1
  1927.     LXI    H,CCZ        ; 'Z '
  1928.     CPI    'E'
  1929.     JZ    DOTDL1
  1930.     LXI    H,CCNZ        ; 'NZ'
  1931.     CPI    'N'
  1932.     JZ    DOTDL1
  1933.     LXI    H,CCC        ; 'C '
  1934.     CPI    'L'
  1935.     JZ    DOTDL1
  1936.     LXI    H,CCNC        ; 'NC'
  1937.     CPI    'G'
  1938.     JZ    DOTDL1
  1939.     LXI    H,CCZL
  1940.     CPI    'e'
  1941.     JZ    DOTDL1
  1942.     LXI    H,CCNZL
  1943.     CPI    'n'
  1944.     JZ    DOTDL1
  1945.     LXI    H,CCCL
  1946.     CPI    'l'
  1947.     JZ    DOTDL1
  1948.     LXI    H,CCNCL
  1949. ;
  1950. DOTDL1:    MOV    A,M
  1951.     STA    OPCBUF+1
  1952.     INX    H
  1953.     MOV    A,M
  1954.     STA    OPCBUF+2
  1955.     RET
  1956. ;.....
  1957. ;
  1958. ;
  1959. CCZ:    DB    'Z '
  1960. CCNZ:    DB    'NZ'
  1961. CCC:    DB    'C '
  1962. CCNC:    DB    'NC'
  1963. CCZL:    DB    'z '
  1964. CCNZL:    DB    'nz'
  1965. CCCL:    DB    'c '
  1966. CCNCL:    DB    'nc'
  1967. ;.....
  1968. ;
  1969. ;
  1970. ; Return conditional RC -> JNC $+3, RET
  1971. ;
  1972. DORET:    CALL    PUTOPC
  1973.     CALL    PUTHT        ; Could be PUTHTS
  1974.     LXI    H,REL3
  1975.     CALL    PUTLIN
  1976.     CALL    SEP
  1977.     LXI    H,OPRET
  1978.     CALL    PUTOPS
  1979.     JMP    PUTOPR
  1980. ;.....
  1981. ;
  1982. ;
  1983. REL3:    DB    '$+3',0
  1984. OPRET:    DB    'RET',0
  1985. ;
  1986. ;
  1987. ; Call conditional CC label -> JNC $+5, CALL label
  1988. ;
  1989. DOCALL:    CALL    PUTOPC
  1990.     CALL    PUTHT        ; Could be PUTHTS
  1991.     LXI    H,REL5
  1992.     CALL    PUTLIN
  1993.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  1994.     LXI    H,OPCALL
  1995.     CALL    PUTOPS
  1996.     CALL    PUTHTS
  1997.     JMP    PUTOPR
  1998. ;.....
  1999. ;
  2000. ;
  2001. REL5:    DB    '$+5',0
  2002. OPCALL:    DB    'CALL',0
  2003. ;
  2004. ;
  2005. ; Jump conditional JC label -> JNC $+5, JMP label
  2006. ;
  2007. DOJMP:    CALL    PUTOPC
  2008.     CALL    PUTHT        ; Could be PUTHTS
  2009.     LXI    H,REL5
  2010.     CALL    PUTLIN
  2011.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  2012.     LXI    H,OPJMP
  2013.     CALL    PUTOPS
  2014.     CALL    PUTHTS
  2015.     JMP    PUTOPR
  2016. ;.....
  2017. ;
  2018. ;
  2019. OPJMP:    DB    'JMP',0
  2020. ;
  2021. ;
  2022. ; IN n -> IN AL,n
  2023. ;
  2024. DOIN:    JMP    DOIMM
  2025. ;
  2026. ;
  2027. ; LDA addr -> MOV AL,addr
  2028. ;
  2029. DOLDA:    JMP    DOIMM
  2030. ;
  2031. ;           XCHG BX,rp'
  2032. ; LDAX rp -> MOV AL,[BX]
  2033. ;           XCHG BX,rp'
  2034. ;
  2035. DOLDAX:    LHLD    XOPRND
  2036.     CALL    TRNRP        ; DE -> trans, HL -> next
  2037.     JNZ    PUTCOD
  2038.     PUSH    H
  2039.     LXI    H,OPXCHG
  2040.     CALL    PUTOPS
  2041.     CALL    PUTHTS
  2042.     LXI    H,OPBXC
  2043.     CALL    PUTOPS
  2044.     XCHG
  2045.     PUSH    H
  2046.     CALL    PUTRND
  2047.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  2048.     LXI    H,OPMOV
  2049.     CALL    PUTOPS
  2050.     CALL    PUTHTS
  2051.     LXI    H,OPLDAX
  2052.     CALL    PUTOPS
  2053.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  2054.     LXI    H,OPXCHG
  2055.     CALL    PUTOPS
  2056.     CALL    PUTHTS
  2057.     LXI    H,OPBXC
  2058.     CALL    PUTOPS
  2059.     POP    H        ; HL -> rp'
  2060.     CALL    PUTRND
  2061.     POP    H
  2062.     JMP    PUTEND
  2063. ;.....
  2064. ;
  2065. ;
  2066. OPMOV:    DB    'MOV',0
  2067. OPLDAX:    DB    'AL,[BX]',0
  2068. ;
  2069. ;
  2070. ; LHLD addr -> MOV BX,addr
  2071. ;
  2072. DOLHLD:    CALL    PUTOPHT
  2073.     LXI    H,OPBXC        ; 'BX,'
  2074.     CALL    PUTOPS
  2075.     JMP    PUTOPR
  2076. ;.....
  2077. ;
  2078. ;
  2079. ;OUT n -> OUT n,AL
  2080. ;
  2081. DOOUT:    CALL    PUTOPHT
  2082.     CALL    PUTEXP
  2083.     PUSH    H
  2084.     LXI    H,OPCAL        ; ',AL'
  2085.     JMP    DOSTA1
  2086. ;.....
  2087. ;
  2088. ;
  2089. ; PCHL -> JMP BX
  2090. ;
  2091. DOPCHL:    CALL    PUTOPHT
  2092.     LXI    H,OPRBX        ; 'BX'
  2093.     CALL    PUTOPS
  2094.     JMP    PUTOPR
  2095. ;.....
  2096. ;
  2097. ;
  2098. ; RST -> CALL 8*
  2099. ;
  2100. DORST:    CALL    PUTOPHT
  2101.     LXI    H,OPR8M        ; '8*'
  2102.     CALL    PUTOPS
  2103.     JMP    PUTOPR
  2104. ;.....
  2105. ;
  2106. ;
  2107. OPR8M:    DB    '8*',0
  2108. ;
  2109. ;
  2110. ; SHLD addr -> MOV addr,BX
  2111. ;
  2112. DOSHLD:    CALL    PUTOPHT
  2113.     CALL    PUTEXP
  2114.     PUSH    H
  2115.     LXI    H,OPCBX        ; ',BX'
  2116.     JMP    DOSTA1
  2117. ;.....
  2118. ;
  2119. ;
  2120. OPCBX:    DB    ',BX',0
  2121. ;
  2122. ;
  2123. ; SPHL -> MOV SP,BX
  2124. ;
  2125. DOSPHL:    CALL    PUTOPHT
  2126.     LXI    H,OPSPBX    ; 'SP,BX'
  2127.     CALL    PUTOPS
  2128.     JMP    PUTOPR
  2129. ;.....
  2130. ;
  2131. ;
  2132. OPSPBX:    DB    'SP,BX',0
  2133. ;
  2134. ;
  2135. ; STA addr -> MOV addr,AL
  2136. ;
  2137. DOSTA:    CALL    PUTOPHT
  2138.     CALL    PUTEXP
  2139.     PUSH    H
  2140.     LXI    H,OPCAL        ; ',AL'
  2141. ;
  2142. DOSTA1:    CALL    PUTOPS
  2143.     POP    H
  2144.     JMP    PUTEND
  2145. ;.....
  2146. ;
  2147. ;
  2148. OPCAL:    DB    ',AL',0
  2149. ;
  2150. ;           XCHG BX,rp'
  2151. ; STAX rp -> MOV [BX],AL
  2152. ;           XCHG BX,rp'
  2153. ;
  2154. DOSTAX:    LHLD    XOPRND
  2155.     CALL    TRNRP        ; DE -> trans, HL -> next
  2156.     JNZ    PUTCOD
  2157.     PUSH    H
  2158.     LXI    H,OPXCHG
  2159.     CALL    PUTOPS
  2160.     CALL    PUTHTS
  2161.     LXI    H,OPBXC
  2162.     CALL    PUTOPS
  2163.     XCHG
  2164.     PUSH    H
  2165.     CALL    PUTRND
  2166.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  2167.     LXI    H,OPMOV
  2168.     CALL    PUTOPS
  2169.     CALL    PUTHTS
  2170.     LXI    H,OPSTAX
  2171.     CALL    PUTOPS
  2172.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  2173.     LXI    H,OPXCHG
  2174.     CALL    PUTOPS
  2175.     CALL    PUTHTS
  2176.     LXI    H,OPBXC
  2177.     CALL    PUTOPS
  2178.     POP    H        ; HL -> rp'
  2179.     CALL    PUTRND
  2180.     POP    H
  2181.     JMP    PUTEND
  2182. ;.....
  2183. ;
  2184. ;
  2185. OPSTAX:    DB    '[BX],AL',0
  2186. ;
  2187. ;
  2188. ; XCHG -> XCHG BX,DX
  2189. ;
  2190. DOXCHG:    CALL    PUTOPHT
  2191.     LXI    H,OPBXDX    ; 'BX,DX'
  2192.     CALL    PUTOPS
  2193.     JMP    PUTOPR
  2194. ;.....
  2195. ;
  2196. ;
  2197. OPBXDX:    DB    'BX,DX',0
  2198. ;
  2199. ;        XCHG SP,BP
  2200. ; XTHL -> XCHG [BP],BX
  2201. ;        XCHG SP,BP
  2202. ;
  2203. DOXTHL:    LXI    H,OPXCHG
  2204.     CALL    PUTOPS
  2205.     CALL    PUTHTS
  2206.     LXI    H,OPSPBP    ; 'SP,BP'
  2207.     CALL    PUTOPS
  2208.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  2209.     LXI    H,OPXCHG
  2210.     CALL    PUTOPS
  2211.     CALL    PUTHTS
  2212.     LXI    H,OPXTHL
  2213.     CALL    PUTOPS
  2214.     CALL    SEP        ; SP,EP,SP or CR, LF, HT
  2215.     LXI    H,OPXCHG
  2216.     CALL    PUTOPS
  2217.     CALL    PUTHTS
  2218.     LXI    H,OPSPBP
  2219.     CALL    PUTOPS
  2220.     JMP    PUTOPR
  2221. ;.....
  2222. ;
  2223. ;
  2224. OPSPBP:    DB    'SP,BP',0
  2225. OPXTHL:    DB    '[BP],BX',0
  2226. ;
  2227. ;
  2228. ; CMA -> NOT AL
  2229. ;
  2230. DOCMA:    CALL    PUTOPHT
  2231.     LXI    H,ALREG
  2232.     CALL    PUTOPS
  2233.     JMP    PUTOPR
  2234. ;.....
  2235. ;
  2236. ;
  2237. ; Put 'expression' to output file.  'expression' is everything between
  2238. ; (xOPRND) up to the tab or spaces before a ';' or CR.
  2239. ;
  2240. PUTEXP:    LHLD    XOPRND
  2241. ;
  2242. PUTEX1:    MOV    A,M
  2243.     CPI    ';'
  2244.     JZ    PUTEX4
  2245.     CPI    CR
  2246.     JZ    PUTEX4
  2247.     CPI    '!'
  2248.     JZ    PUTEX3
  2249. ;
  2250. PUTEX2:    INX    H
  2251.     JMP    PUTEX1
  2252. ;
  2253. PUTEX3:    DCX    H
  2254.     MOV    A,M
  2255.     INX    H
  2256.     CPI    ' '
  2257.     JZ    PUTEX4
  2258.     CPI    HT
  2259.     JZ    PUTEX4
  2260.     JMP    PUTEX2
  2261. ;
  2262. PUTEX4:    DCX    H
  2263.     MOV    A,M
  2264.     CPI    ' '
  2265.     JZ    PUTEX4
  2266.     CPI    HT
  2267.     JZ    PUTEX4
  2268.     INX    H
  2269.     XCHG
  2270.     LHLD    XOPRND
  2271. ;
  2272. PUTEX5:    MOV    A,D
  2273.     CMP    H
  2274.     JNZ    PUTEX6
  2275.     MOV    A,E
  2276.     CMP    L
  2277.     RZ
  2278. ;
  2279. PUTEX6:    MOV    A,M
  2280.     CALL    PUTCHR
  2281.     INX    H
  2282.     JMP    PUTEX5
  2283. ;.....
  2284. ;
  2285. ;
  2286. ; IFC -> IF
  2287. ;
  2288. DOIFC:    MVI    A,HT
  2289.     STA    ENDIFL
  2290.     JMP    DOUPS
  2291. ;.....
  2292. ;
  2293. ;
  2294. ; ICL -> *INCL
  2295. ;
  2296. DOICL:    MVI    A,HT
  2297.     STA    ICLFLG
  2298.     JMP    DOUPS
  2299. ;.....
  2300. ;
  2301. ;
  2302. ; LST -> LIST
  2303. ;
  2304. DOLST:    MVI    A,HT
  2305.     STA    LSTFLG
  2306.     JMP    DOUPS
  2307. ;.....
  2308. ;
  2309. ;
  2310. ; MAC -> MACRO
  2311. ;
  2312. DOMAC:    MVI    A,HT
  2313.     STA    MACFLG
  2314. ;
  2315. DOUPS:    CALL    PUTOPHT
  2316.     MVI    A,CR
  2317.     STA    UPSMSG
  2318.     JMP    PUTOPR
  2319. ;.....
  2320. ;
  2321. ;
  2322. ;***********************************************************************
  2323. ;
  2324. ;    File operations
  2325. ;
  2326. ;***********************************************************************
  2327. ;
  2328. ; Set up input and output FCB's from DFCB
  2329. ;
  2330. MAKFNS:    LXI    H,DFCB1
  2331.     LXI    D,INFCB
  2332.     LXI    B,FNLEN+1
  2333.     CALL    MOVIR
  2334.     MOV    A,M        ; Typ specified ?
  2335.     CPI    ' '
  2336.     JZ    MKFNS1
  2337.     CPI    '?'
  2338.     JZ    MKFNS1
  2339.     LXI    B,3
  2340.     CALL    MOVIR
  2341. ;
  2342. MKFNS1:    LXI    H,DFCB1
  2343.     LXI    D,OUTFCB
  2344.     LXI    B,FNLEN+1
  2345.     CALL    MOVIR
  2346.     LDA    DFCB2
  2347.     ORA    A        ; Allows output to
  2348.     JZ    MKFNS2        ; Different drive
  2349.     STA    OUTFCB        ; Than input
  2350. ;
  2351. MKFNS2:    LDA    DFCB2+1
  2352.     CPI    ' '
  2353.     JZ    MKFNS3        ; Allows output
  2354.     LXI    B,8        ; File to have
  2355.     LXI    D,OUTFCB+1    ; Different name
  2356.     LXI    H,DFCB2+1    ; From input file
  2357.     CALL    MOVIR
  2358. ;
  2359. MKFNS3:    LDA    DFCB2+9
  2360.     CPI    ' '
  2361.     JZ    MKFNS4
  2362.     LXI    B,3
  2363.     LXI    D,OUTFCB+9
  2364.     LXI    H,DFCB2+9
  2365.     CALL    MOVIR
  2366. ;
  2367. MKFNS4:    LXI    D,PRFNM1
  2368.     CALL    PRTLIN
  2369.     LXI    H,INFCB
  2370.     CALL    PRFNAM
  2371.     LXI    D,PRFNM2
  2372.     CALL    PRTLIN
  2373.     LXI    H,OUTFCB
  2374.     CALL    PRFNAM
  2375.     LXI    D,CRLFMG
  2376.     CALL    PRTLIN
  2377.     RET
  2378. ;.....
  2379. ;
  2380. ;
  2381. ; Print Filenames
  2382. ;
  2383. PRFNAM:    MOV    A,M        ; Disk number
  2384.     ORA    A
  2385.     JNZ    PRFN1
  2386.     LDA    XCDISK
  2387. ;
  2388. PRFN1:    ADI    '@'
  2389.     CALL    CONOUT
  2390.     MVI    A,':'
  2391.     CALL    CONOUT
  2392.     INX    H
  2393.     MVI    B,8
  2394.     CALL    PRFN
  2395.     MVI    A,'.'
  2396.     CALL    CONOUT
  2397.     MVI    B,3
  2398. ;
  2399. PRFN:    MOV    A,M
  2400.     INX    H
  2401.     CPI    ' '
  2402.     CNZ    CONOUT
  2403.     DCR    B
  2404.     JNZ    PRFN
  2405.     RET
  2406. ;.....
  2407. ;
  2408. ;
  2409. PRFNM1:    DB    'Source File: ',0
  2410. PRFNM2:    DB    ',  Destination File: ',0
  2411. ;
  2412. ;
  2413. ; Open source file with ext ASM
  2414. ;
  2415. OPENIN:    LXI    D,INFCB
  2416.     MVI    C,NOPEN
  2417.     CALL    BDOS
  2418.     CPI    NFF
  2419.     JZ    NSFERR
  2420.     MVI    A,RECLEN
  2421.     LXI    H,IBUFF+IBFLEN
  2422.     SHLD    XIBUFF
  2423.     RET
  2424. ;.....
  2425. ;
  2426. ;
  2427. NSFERR:    LXI    D,NSFMSG    ; 'No Source File'
  2428.     JMP    EREXIT
  2429. ;.....
  2430. ;
  2431. ;
  2432. NSFMSG:    DB    'No Source File Found'
  2433.     DB    CR,LF,BEL,0
  2434. ;
  2435. INFCB:    DB    0,0,0,0,0,0,0,0
  2436.     DB    0,'ASM',0,0,0,0
  2437.     DB    0,0,0,0,0,0,0,0
  2438.     DB    0,0,0,0,0,0,0,0
  2439.     DB    0
  2440. ;.....
  2441. ;
  2442. ;
  2443. ; Create output file with ext Z80
  2444. ;
  2445. CREATO:    LXI    D,OUTFCB
  2446.     MVI    C,NOPEN
  2447.     CALL    BDOS
  2448.     CPI    NFF
  2449.     JNZ    OFEERR
  2450. ;
  2451. CREAT4:    LXI    D,OUTFCB
  2452.     MVI    C,NCREAT
  2453.     CALL    BDOS
  2454.     CPI    NFF
  2455.     JZ    NDSERR
  2456.     LXI    D,OUTFCB
  2457.     MVI    C,NOPEN
  2458.     CALL    BDOS
  2459.     MVI    A,RECLEN
  2460.     STA    OBUFCT
  2461.     LXI    H,OBUFF
  2462.     SHLD    XOBUFF
  2463.     RET
  2464. ;.....
  2465. ;
  2466. ;
  2467. NDSERR:    LXI    D,NDSMSG    ; 'No directory space'
  2468.     JMP    EREXIT
  2469. ;.....
  2470. ;
  2471. ;
  2472. NDSMSG:    DB    'No Directory Space'
  2473.     DB    CR,LF,BEL,0
  2474. ;
  2475. OUTFCB:    DB    0,0,0,0,0,0,0,0
  2476.     DB    0,'A86',0,0,0,0
  2477.     DB    0,0,0,0,0,0,0,0
  2478.     DB    0,0,0,0,0,0,0,0
  2479.     DB    0
  2480. ;.....
  2481. ;
  2482. ;
  2483. OFEERR:    LXI    D,OFEMSG    ; 'Output file exists'
  2484.     CALL    PRTLIN
  2485.     CALL    CHKYES
  2486.     JNZ    ABORT
  2487.     LXI    D,OUTFCB
  2488.     MVI    C,NDEL
  2489.     CALL    BDOS
  2490.     JMP    CREAT4
  2491. ;.....
  2492. ;
  2493. ;
  2494. OFEMSG:    DB    'Output File Already Exists'
  2495.     DB    ' -- Delete it and Continue ? (Y/N) '
  2496.     DB    BEL,0
  2497. ;.....
  2498. ;
  2499. ;
  2500. ;***********************************************************************
  2501. ;
  2502. ; Put line at HL to output file until 0.
  2503. ;
  2504. PUTLIN:    MOV    A,M
  2505.     ANA    A
  2506.     RZ
  2507.     CALL    PUTCHR
  2508.     INX    H
  2509.     JMP    PUTLIN
  2510. ;.....
  2511. ;
  2512. ;
  2513. ; Put spaces or tabs at HL to output file until non-(space or tab)
  2514. ;
  2515. PUTSPT:    MOV    A,M
  2516.     CPI    ' '
  2517.     JZ    PUTSP1
  2518.     CPI    HT
  2519.     RNZ
  2520. ;
  2521. PUTSP1:    CALL    PUTCHR
  2522.     INX    H
  2523.     JMP    PUTSPT
  2524. ;.....
  2525. ;
  2526. ;
  2527. ; Put statement separator to output file.
  2528. ;
  2529. SEP:    LHLD    SEPMSG
  2530.     JMP    PUTLIN
  2531. ;.....
  2532. ;
  2533. SEPMSG:    DW    NEWLSP
  2534. EXCLSP:    DB    ' ! ',0
  2535. NEWLSP:    DB    CR,LF,HT,0
  2536. ;
  2537. ;
  2538. ; Put CR, LF to output file.
  2539. ;
  2540. PCRLF:    MVI    A,CR
  2541.     CALL    PUTCHR
  2542.     MVI    A,LF
  2543. ;
  2544. ;
  2545. ; Put character in A to output file, update column number.
  2546. ;
  2547. PUTCHR:    PUSH    H
  2548.     PUSH    D
  2549.     PUSH    B
  2550.     PUSH    PSW
  2551.     STA    TEMP
  2552.     LHLD    XOBUFF
  2553.     CPI    EOT
  2554.     JNZ    PCHR0
  2555.     MVI    A,'!'
  2556. ;
  2557. PCHR0:    MOV    M,A
  2558.     CPI    CR
  2559.     JZ    PUTCH0
  2560.     CPI    LF
  2561.     JZ    PUTCH0
  2562.     CPI    HT
  2563.     JNZ    PUTCH1
  2564.     LDA    COLNUM
  2565.     DCR    A
  2566.     ANI    NF8
  2567.     ADI    N09
  2568.     JMP    PUTCH2
  2569. ;
  2570. PUTCH0:    MVI    A,1
  2571.     JMP    PUTCH2
  2572. ;
  2573. PUTCH1:    LDA    COLNUM
  2574.     INR    A
  2575. ;
  2576. PUTCH2:    STA    COLNUM
  2577.     INX    H        ; Inc obuff ptr
  2578.     LDA    OBUFCT
  2579.     DCR    A        ; Dec obuff count
  2580.     JNZ    PTCH21
  2581.     MVI    A,RECLEN
  2582. ;
  2583. PTCH21:    STA    OBUFCT
  2584.     MOV    A,H
  2585.     CPI    (OBUFF+OBFLEN)/256
  2586.     JNZ    PUTCH4
  2587.     MOV    A,L
  2588.     CPI    (OBUFF+OBFLEN) MOD 256
  2589.     JNZ    PUTCH4
  2590.     LXI    D,OBUFF
  2591. ;
  2592. PUTCH3:    MVI    C,NDMA
  2593.     PUSH    D
  2594.     CALL    BDOS
  2595.     POP    D
  2596.     XCHG
  2597.     LXI    D,OUTFCB
  2598.     CALL    WRTREC        ; Write record
  2599.     LXI    D,RECLEN
  2600.     DAD    D
  2601.     XCHG
  2602.     MOV    A,D
  2603.     CPI    (OBUFF+OBFLEN)/256
  2604.     JNZ    PUTCH3
  2605.     MOV    A,E
  2606.     CPI    (OBUFF+OBFLEN) MOD 256
  2607.     JNZ    PUTCH3
  2608.     LXI    H,OBUFF
  2609. ;
  2610. PUTCH4:    SHLD    XOBUFF
  2611.     POP    PSW
  2612.     POP    B
  2613.     POP    D
  2614.     POP    H
  2615.     RET
  2616. ;.....
  2617. ;
  2618. ;
  2619. TEMP:    DB    0
  2620. ;
  2621. ;
  2622. ; Write record
  2623. ;
  2624. WRTREC:    MVI    C,NWRNR
  2625.     PUSH    H
  2626.     CALL    BDOS
  2627.     POP    H
  2628.     ANA    A
  2629.     RZ
  2630.     LXI    D,OFWMSG    ; 'output file write error'
  2631.     JMP    EREXIT
  2632. ;.....
  2633. ;
  2634. ;
  2635. OFWMSG:    DB    'Output File Write Error'
  2636.     DB    CR,LF,BEL,0
  2637. ;
  2638. ;
  2639. ; Fill rest of obuff with EOF,    rite record, and close file.
  2640. ;
  2641. CLOSEO:    MVI    A,EOF
  2642.     CALL    PUTCHR
  2643.     LDA    OBUFCT
  2644.     CPI    RECLEN
  2645.     JNZ    CLOSEO
  2646. ;
  2647. CLOSE1:    LXI    D,OBUFF
  2648.     LHLD    XOBUFF
  2649.     MOV    A,H
  2650.     CMP    D
  2651.     JNZ    CLOSE3
  2652.     MOV    A,L
  2653.     CMP    E
  2654.     JNZ    CLOSE3
  2655. ;
  2656. CLOSE2:    LXI    D,OUTFCB
  2657.     MVI    C,NCLOSE
  2658.     JMP    BDOS
  2659. ;.....
  2660. ;
  2661. ;
  2662. CLOSE3:    MVI    C,NDMA
  2663.     PUSH    D
  2664.     CALL    BDOS
  2665.     POP    D
  2666.     XCHG
  2667.     LXI    D,OUTFCB
  2668.     CALL    WRTREC
  2669.     LXI    D,RECLEN
  2670.     DAD    D
  2671.     XCHG
  2672.     LDA    XOBUFF+1
  2673.     CMP    D
  2674.     JNZ    CLOSE3
  2675.     LDA    XOBUFF
  2676.     CMP    E
  2677.     JNZ    CLOSE3
  2678.     JMP    CLOSE2
  2679. ;.....
  2680. ;
  2681. ;
  2682. ; Print line at DE until 0 on console.
  2683. ;
  2684. PRTLIN:    LDAX    D
  2685.     ANA    A
  2686.     RZ
  2687.     CALL    CONOUT
  2688.     INX    D
  2689.     JMP    PRTLIN
  2690. ;.....
  2691. ;
  2692. ;
  2693. ; Console Output character in A.
  2694. ;
  2695. CONOUT:    PUSH    PSW
  2696.     PUSH    B
  2697.     PUSH    D
  2698.     PUSH    H
  2699.     MOV    E,A
  2700.     MVI    D,N00
  2701.     MVI    C,NCOUT
  2702.     CALL    BDOS
  2703.     POP    H
  2704.     POP    D
  2705.     POP    B
  2706.     POP    PSW
  2707.     RET
  2708. ;.....
  2709. ;
  2710. ;
  2711. ; Get character from CONSOLE and return Z set if char.AND.5FH = 'Y'
  2712. ;
  2713. CHKYES:    MVI    C,NCIN
  2714.     CALL    BDOS
  2715.     PUSH    PSW
  2716.     CALL    CRLF
  2717.     POP    PSW
  2718.     ANI    5FH
  2719.     CPI    'Y'
  2720.     RET
  2721. ;.....
  2722. ;
  2723. ;
  2724. ; Return Z if no character available, otherwise, get character in A.
  2725. ;
  2726. CHKIN:    MVI    C,NCDAV
  2727.     CALL    BDOS
  2728.     ORA    A
  2729.     RZ
  2730.     MVI    C,NCIN
  2731.     CALL    BDOS
  2732.     RET
  2733. ;.....
  2734. ;
  2735. ;
  2736. ;
  2737. CRLF:    LXI    D,CRLFMG
  2738.     JMP    PRTLIN
  2739. ;.....
  2740. ;
  2741. ;
  2742. CRLFMG:    DB    CR,LF,0
  2743. ;
  2744. ;
  2745. ; Convert upper to lower case in A.
  2746. ;
  2747. LCASE:    CPI    'A'
  2748.     RC
  2749.     CPI    'Z'+1
  2750.     RNC
  2751.     ORI    20H
  2752.     RET
  2753. ;.....
  2754. ;
  2755. ;
  2756. ; Convert lower case to upper case in A.
  2757. ;
  2758. UCASE:    CPI    'a'
  2759.     RC
  2760.     CPI    'z'+1
  2761.     RNC
  2762.     ANI    5FH
  2763.     RET
  2764. ;.....
  2765. ;
  2766. ;
  2767. ; Print activity dot every 100 lines.
  2768. ;
  2769. PDOT:    LDA    LNCNT
  2770.     DCR    A
  2771.     STA    LNCNT
  2772.     RNZ
  2773.     MVI    A,'.'
  2774.     CALL    CONOUT
  2775.     MVI    A,100        ; Dot every 100 lines
  2776.     STA    LNCNT
  2777.     LDA    DOTCNT
  2778.     DCR    A
  2779.     STA    DOTCNT
  2780.     JNZ    PDOT1
  2781.     MVI    A,' '
  2782.     CALL    CONOUT
  2783.     MVI    A,10        ; Space every 10 dots
  2784.     STA    DOTCNT
  2785. ;
  2786. PDOT1:    LDA    NLCNT
  2787.     DCR    A
  2788.     STA    NLCNT
  2789.     RNZ
  2790.     CALL    CRLF
  2791.     MVI    A,50        ; 50 dots per line
  2792.     STA    NLCNT
  2793.     RET
  2794. ;.....
  2795. ;
  2796. ;
  2797. LNCNT:    DB    100        ; Dot every 100 lines
  2798. DOTCNT:    DB    10        ; Space every 10 dots
  2799. NLCNT:    DB    50        ; 50 dots per line
  2800. ;
  2801. ;
  2802. ; Uninitialized storage
  2803. ;
  2804. XCDISK:    DS    1
  2805. SPBDOS:    DS    2
  2806.     DS    STCKLN
  2807. STACK    EQU    $
  2808. COLNUM:    DS    1
  2809. XOPCOD:    DS    2
  2810. OPCBUF:    DS    OPBFLN
  2811. XOPRND:    DS    2
  2812. XOBUFF:    DS    2
  2813. OBUFCT:    DS    1
  2814. OBUFF:    DS    OBFLEN
  2815. LBUFF:    DS    LBUFLN+3
  2816. XIBUFF:    DS    2
  2817. IBUFF:    DS    IBFLEN
  2818. ;.....
  2819. ;
  2820. ;
  2821.     END    START
  2822.