home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / asmutil / xlt86.zip / XLT86.ASM next >
Assembly Source File  |  1985-08-15  |  49KB  |  3,181 lines

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