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