home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / XLATE5.LBR / XLATE5.AZM / XLATE5.ASM
Assembly Source File  |  1992-01-27  |  45KB  |  1,969 lines

  1.  
  2. ; XLATE5  -  converts 8080 source code to Z80 source code  -  10/27/84
  3. ;
  4. ;
  5. ;    XLATE translates a normal 8080 source code file (.ASM type)
  6. ;    into a Z80 source code with Zilog mnemonics.  Regardless if
  7. ;    the original file had colons behind labels or not, XLATE
  8. ;    puts colons after all labels except those having EQU, MACRO
  9. ;    or SET directives.  It also writes '.Z80' and 'ASEG' lines
  10. ;    at the very beginning of the new program - thus it is ready
  11. ;    to immediately assemble for absolute addresses using the
  12. ;    Microsoft M80 assembler with L80 linking loader.
  13. ;
  14. ;
  15. ;    NOTE2:    SINCE THIS PROGRAM ONLY READS, TRANSLATES AND
  16. ;        WRITES ONE RECORD AT A TIME, THE LENGTH OF TIME
  17. ;        IT WILL TAKE TO TRANSLATE A PROGRAM MAY VARY
  18. ;        CONSIDERABLY FROM WHAT MAY BE EXPECTED, DEPENDING
  19. ;        WHERE ON THE DISK THE INPUT AND OUTPUT FILES ARE
  20. ;        LOCATED PHYSICALLY.  A 'DOT' IS PRINTED ON THE
  21. ;        CRT FOR EACH 10 LINES WITH 50 DOTS PER LINE.
  22. ;        TWO LINES OF DOTS ARE THUS 1,000 LINES OF PGM.
  23. ;        (A 1900 LINE 8080 PROGRAM TOOK EXACTLY 3 MINUTES
  24. ;        ON A FRESH DISK AND OVER 6 MINUTES ON A NEARLY
  25. ;        FULL DISK.)
  26. ;                    - notes by Irv Hoff
  27. ;-----------------------------------------------------------------------
  28. ;
  29. ; 10/27/84  Rewrote the program with Intel 8080 source code rather than
  30. ;    v5     Zilog Z80 source code.  It will now assemble with ASM.COM or
  31. ;        other 8080 assemblers (and will also run on a 8080 or 8085
  32. ;        processor now - previously it was limited to Z80 computers.)
  33. ;                    - Irv Hoff
  34. ;
  35. ; 10/17/84  Program did not remove colons from 'SET' or 'MACRO' for M80
  36. ;    v4     use.  Fixed so if label is 7 characters, does not insert an
  37. ;        extra space.  This helps keep the output file similar to the
  38. ;        input file.  Displays 50 dots per line; two lines represent
  39. ;        1000 lines of program.  Wrote a new help guide.  Fixed the
  40. ;        bug which caused all comment lines starting with an asterisk
  41. ;        to be capitalized even though the asterisk was changed to a
  42. ;        semicolon.    Other incidental changes.
  43. ;                    - Irv Hoff
  44. ;
  45. ; 02/18/84  Made program orientated to M80, (Conditionally), for people
  46. ;    v3     like myself that use nothing but M80 for Z80 programming.
  47. ;        If M80 EQU is set NO, the program is essentially unchanged
  48. ;        from v2.1.1.  If M80 EQU is set YES then the following
  49. ;        changes take place during assembly:
  50. ;
  51. ;        A.    Colons are NOT inserted in front of Equates as they were
  52. ;        in v2.1.1.
  53. ;        B.    A <CR> & <LF> are NOT inserted after a Label if longer
  54. ;        than 6 characters long, instead a space is inserted.
  55. ;        M80 doesn't allow a <CR> in front of an Equate.
  56. ;        C.    Removes ':' after labels that precede EQU if present.
  57. ;        M80 will not allow them.
  58. ;        D.    Added a few more comments.  Changed the help request to
  59. ;        a '?'.    The help instruction info appears if no source
  60. ;        file is given.
  61. ;                    - Bill Albright KB9BP
  62. ;-----------------------------------------------------------------------
  63. ;
  64. ; 07/21/83  Some modest corrections    - Richard Conn
  65. ;  v2.1.1
  66. ;
  67. ; 05/03/82  Disassembled Cromenco's CDOS XLATE.COM v 2.40 and modified
  68. ;  v2.1.0   into XLATE2.        - Richard Conn
  69. ;
  70. ;-----------------------------------------------------------------------
  71. ;
  72. ;
  73. VERS    EQU    5        ;version number
  74. MONTH    EQU    10        ;date as printed on CRT
  75. DAY    EQU    27
  76. YEAR    EQU    84
  77. ;
  78. ;
  79. YES    EQU    0FFH
  80. NO    EQU    0
  81. ;
  82. ;
  83. M80    EQU    YES        ;yes=source code useable by the M80 assm.
  84. ;
  85. ;
  86. WBOOT    EQU    0
  87. BDOS    EQU    5
  88. DEFFCB    EQU    5CH
  89. FCB2    EQU    6CH
  90. LF    EQU    0AH
  91. TAB    EQU    09
  92. CR    EQU    0DH
  93. BELL    EQU    07
  94. ;
  95. ;
  96.     ORG    100H
  97. ;
  98. ;
  99. ; Start of program
  100. ;
  101.     CALL    HCHECK        ;check for help request
  102.     LXI    SP,OBUFLPOS    ;initialize stack pointer
  103.     CALL    INIT        ;initialize the program
  104. ;
  105. LOOP    CALL    BUILDLINE    ;build the next input line
  106.     CALL    PROCESSOPS    ;convert the op codes
  107.     JMP    LOOP
  108. ;
  109. ;
  110. ; Main processing module
  111. ;
  112. PROCESSOPS
  113.     CALL    GETOP        ;extract the next op code
  114.     JZ    FLUSHLINE    ;if none, flush
  115. ;
  116.     LXI    H,OCS1        ;process op code set 1
  117.     LXI    B,10        ;10 characters/dual entry
  118.                 ;  (old op = 5, new op = 5)
  119.     CALL    CMPOP        ;scan for match in INLN buffer
  120.     JZ    DOOCS1        ;process if found
  121. ;
  122.     LXI    H,OCS2        ;process op code set 2
  123.     LXI    B,10        ;10 characters/dual entry
  124.     CALL    CMPOP        ;scan for match
  125.     JZ    DOOCS2        ;process
  126. ;
  127.     LXI    H,OCS3        ;process op code set 3
  128.     LXI    B,10        ;10 characters/dual entry
  129.     CALL    CMPOP        ;scan for match
  130.     JZ    DOOCS3        ;process
  131. ;
  132.     LXI    H,OCS4        ;process (extended ret) op code set 4
  133.     LXI    B,5        ;5 characters/single entry
  134.     CALL    CMPOP        ;scan for match
  135.     CZ    DOOCS4        ;convert into standard return forms if match
  136. ;
  137.     LXI    H,RETS        ;process (normal ret) op code set 5
  138.     LXI    B,5        ;5 characters/single entry
  139.     CALL    CMPOP        ;scan for match
  140.     JZ    DORETS        ;process
  141. ;
  142.     LXI    H,CALLS        ;process (call) op code set 6
  143.     LXI    B,5        ;5 characters/single entry
  144.     CALL    CMPOP        ;scan for match
  145.     JZ    DOCALLS        ;process
  146. ;
  147.     LXI    H,JMPS        ;process (jmp) op code set 7
  148.     LXI    B,5        ;5 characters/single entry
  149.     CALL    CMPOP        ;scan for match
  150.     JZ    DOJMPS        ;process
  151. ;
  152.     LXI    H,OCS8        ;process op code set 8
  153.     LXI    B,12        ;12 characters/dual entry
  154.     CALL    CMPOP        ;scan for match
  155.     JZ    DOOCS8        ;process
  156. ;
  157. ; No match in op code sets -- pass target op code as is
  158. ;
  159.     MVI    B,5        ;5 characters in target
  160.     LXI    H,TARGOP    ;point to target
  161. ;
  162. POPS1    MOV    A,M        ;get character
  163.     CPI    ' '        ;end of op?
  164.     JZ    POPS2        ;output tab character if so
  165.     CPI    TAB        ;end of op?
  166.     JZ    POPS2        ;output tab character if so
  167.     CALL    DOUTCHAR    ;output op character
  168.     INX    H        ;point to next
  169.     DCR    B        ;one less to go
  170.     JNZ    POPS1        ;continue for 5 characters maximum
  171. ;
  172. POPS2    MVI    A,TAB        ;end op with <tab>
  173.     CALL    DOUTCHAR    ;output to disk
  174. ;
  175. ;
  176. ; Copy rest of input line as-is
  177. ;
  178. COPYARGS
  179.     LHLD    INLNPTR        ;point to next character
  180. ;
  181. CARGS1    MVI    C,0
  182. ;
  183. CARGS2    MOV    A,M        ;get character
  184.     CPI    ' '        ;end of operands?
  185.     JZ    CARGS4        ;skip white space and output rest if so
  186.     CPI    TAB        ;end of operands?
  187.     JZ    CARGS4        ;skip white space and output rest if so
  188.     CPI    CR        ;end of line?
  189.     JZ    FLUSHLINE    ;flush if so
  190.     CPI    ';'        ;beginning of comment = end of operands?
  191.     JZ    CARGS5        ;copy rest if so
  192.     CPI    27H        ;single quote?
  193.     JNZ    CARGS3
  194.     DCR    C
  195.     JZ    CARGS3
  196.     MVI    C,1
  197. ;
  198. CARGS3    CALL    DOUTCHAR    ;output character in a to disk
  199.     INX    H        ;point to next
  200.     JMP    CARGS2
  201. ;
  202. CARGS4    PUSH    H
  203.     CALL    SKIPWHITE    ;skip to next non-white character
  204.     POP    H
  205.     CPI    CR        ;end of line?
  206.     JZ    FLUSHLINE    ;flush if so
  207.     CPI    ';'        ;comment?
  208.     JZ    CARGS5        ;process comment if so
  209.     CALL    OUTWHITE    ;output a tab
  210.     JMP    CARGS2        ;restart processing
  211. ;
  212. CARGS5    DCR    C
  213.     INR    C
  214.     JNZ    CARGS3
  215.     CALL    SKIPWHITE
  216.     MVI    B,41
  217. ;
  218. CARGS6    LDA    OBUFLPOS    ;check position in output line
  219.     CMP    B
  220.     JNC    FLUSHLINE
  221.     DCR    A        ;back up in output line
  222.     ANI    0F8H        ;artifically tab
  223.     ADI    TAB
  224.     CMP    B
  225.     JZ    FLUSHLINE
  226.     JC    CARGS7
  227.     MVI    A,' '
  228.     JMP    CARGS8
  229. ;
  230. CARGS7    MVI    A,TAB
  231. ;
  232. CARGS8    CALL    DOUTCHAR
  233.     JMP    CARGS6
  234. ;.....
  235. ;
  236. ;
  237. ; Write rest of 'INLN' to disk
  238. ;
  239. FLUSHLINE
  240.     CALL    OUTSTR
  241.     MVI    A,1        ;reset position counter
  242.     STA    OBUFLPOS
  243.     RET
  244. ;.....
  245. ;
  246. ;
  247. ; Print PDOT for each ten lines
  248. ;
  249. PDOT    LDA    LCOUNT        ;get line count
  250.     DCR    A        ;count down
  251.     STA    LCOUNT        ;put line count
  252.     RNZ            ;done if not zero
  253.     MVI    A,'.'        ;print PDOT
  254.     CALL    PCHAR
  255.     MVI    A,10        ;reset count
  256.     STA    LCOUNT
  257.     LDA    NLCOUNT        ;new line?
  258.     DCR    A
  259.     STA    NLCOUNT
  260.     RNZ
  261.     LXI    D,CRLFSTR    ;print new line
  262.     CALL    PMSG
  263.     MVI    A,50        ;reset counter
  264.     STA    NLCOUNT
  265.     RET
  266. ;.....
  267. ;
  268. ;
  269. ; Output string pointed to by HL to disk (string ends in 0)
  270. ;
  271. OUTSTR    MOV    A,M        ;get character
  272.     ANA    A        ;done?
  273.     RZ            ;return if so
  274.     CALL    DOUTCHAR
  275.     INX    H        ;point to next character
  276.     JMP    OUTSTR
  277. ;
  278. ;
  279. ; Output all <sp> and <tab> characters found until a non-<sp> and
  280. ;  non-<tab> encountered
  281. ;
  282. OUTWHITE
  283.     MOV    A,M        ;get character
  284.     CPI    ' '        ;<sp>?
  285.     JZ    OW1        ;output it
  286.     CPI    TAB        ;<tab>?
  287.     RNZ            ;done if not
  288. ;
  289. OW1    CALL    DOUTCHAR    ;output character in 'A' to disk
  290.     INX    H        ;point to next character
  291.     JMP    OUTWHITE    ;continue
  292. ;
  293. ;
  294. ; Extract op code for input line and place in buffer
  295. ;
  296. GETOP    LXI    H,INLN        ;point to input line
  297.     MOV    A,M        ;get 1st character in line
  298.     CPI    ' '        ;no label?
  299.     JZ    GOP3        ;skip to op code
  300.     CPI    TAB        ;no label?
  301.     JZ    GOP3        ;skip to op code
  302.     CPI    ';'        ;comment?
  303.     RZ            ;done if so
  304. ;
  305. ;
  306. ; Line begins with a label -- process it
  307. ;
  308. GOP1    MVI    C,0        ;set label character count
  309. ;
  310. GOP2    MOV    A,M        ;get next character of label
  311.     CPI    ':'        ;end of label?
  312.     JZ    GOP4
  313.     CPI    TAB        ;end of label?
  314.     JZ    GOP5
  315.     CPI    CR        ;end of label and no further processing?
  316.     JZ    GOP5
  317.     CPI    ';'        ;end of label and no further processing?
  318.     JZ    GOP5
  319.     CPI    ' '        ;end of label?
  320.     JZ    GOP5
  321.     CALL    DOUTCHAR    ;output label character to disk
  322.     INX    H        ;point to next character
  323.     INR    C        ;increment label character count
  324.     JMP    GOP2
  325. ;
  326. ;
  327. ; No label -- skip to op code, but check for a label with a leading
  328. ; space or a tab
  329. ;
  330. GOP3    CALL    SKIPWHITE    ;skip over white space
  331.     PUSH    H        ;save current .ASM ->
  332.     CALL    FTODLM        ;find a delimiter
  333.     CPI    ':'        ;is a label ?
  334.     POP    H        ;restore .ASM ->
  335.     JZ    GOP1        ;go if a label was found
  336.     JMP    GOP7        ;else continue on
  337. ;
  338. ;
  339. ; End of label by ':' character
  340. ;
  341. GOP4     IF    M80        ;space for a colon in front of EQU
  342.     CALL    CHKEQU        ;EQU follows after any spaces or tabs?
  343.     JZ    GOP4A
  344.     CALL    CHKMACRO    ;MACRO follows after any spaces or tabs?
  345.     JZ    GOP4A
  346.     CALL    CHKSET        ;SET follows after any spaces or tabs?
  347.     JNZ    GOP4B        ;no so write the colon
  348. ;
  349. GOP4A    MVI    A,' '        ;replace ':' with ' '
  350.     CALL    DOUTCHAR    ;in buffer
  351.     INX    H        ;-> next .ASM character
  352.     RET            ;copy rest of equate line as-is, Z-flag is set
  353. ;...
  354.  
  355. GOP4B    MVI    A,':'        ;restore ':'
  356.      ENDIF            ;M80
  357.  
  358.     INX    H        ;skip ':' - next address in input line
  359. ;
  360.     CALL    DOUTCHAR    ;output the ':'
  361.     MOV    A,M        ;check for EOL
  362.     CPI    CR        ;do not double new line (skip new line after gop6)
  363.     JZ    GOP8        ;just continue processing with no tab
  364.     JMP    GOP6        ;not new line, so process for new line if long label
  365. ;
  366. ;
  367. ; Output ':' at end of label
  368. ;
  369. GOP5     IF    M80        ;check for EQU after label and spaces/tabs
  370.     CALL    CHKEQU
  371.     JZ    GOP55
  372.     CALL    CHKMACRO
  373.     JZ    GOP55
  374.     CALL    CHKSET
  375.     JNZ    GOP58        ;do not add colon if EQU follows
  376. ;
  377. GOP55    MOV    A,C
  378.     CPI    7
  379.     JC    GOP7
  380.     MVI    A,' '        ;insert a space if > 7
  381.     CALL    DOUTCHAR
  382.     JMP    GOP8        ;bypass the tab insertion
  383.      ENDIF            ;M80
  384. ;
  385. GOP58    MVI    A,':'        ;output the ':'
  386.     CALL    DOUTCHAR
  387. ;
  388. ;
  389. ; See if label is less than 7 characters long - if <7, then terminate
  390. ; with <tab>; if >6, then new line and <tab>, but if  M80  EQU    YES,
  391. ; add a space instead of a CR,LF.
  392. ;
  393. GOP6    MOV    A,C        ;get label character count
  394.     CPI    7        ;less than 7?
  395.     JC    GOP7        ;tab if less than 7
  396.     JZ    GOP8
  397. ;
  398.      IF    M80
  399.     MVI    A,' '        ;insert a space if > 7
  400.     CALL    DOUTCHAR
  401.     JMP    GOP8        ;bypass the tab insertion
  402.      ENDIF            ;M80
  403. ;
  404.      IF    NOT M80        ;CR,LF and tab if 'NOT M80'
  405.     MVI    A,CR        ;<CR>
  406.     CALL    DOUTCHAR
  407.     MVI    A,LF        ;<LF>
  408.     CALL    DOUTCHAR
  409.      ENDIF            ;NOT M80
  410. ;
  411. ;
  412. ; Output <tab> after label to disk
  413. ;
  414. GOP7    MVI    A,TAB        ;<TAB>
  415.     CALL    DOUTCHAR
  416. ;
  417. ;
  418. ; Skip to op code field and extract it if present
  419. ;
  420. GOP8    CALL    SKIPWHITE    ;skip to op code field
  421.     MOV    A,M        ;get first non-white character
  422.     CPI    ';'        ;no op code if comment
  423.     RZ            ;done if comment
  424.     CPI    CR        ;no op code if eol
  425.     RZ            ;done if EOL
  426. ;
  427.     SHLD    ILTOP        ;save pointer to target op code
  428.     MVI    B,5        ;5 characters maximum in op code
  429.     LXI    D,TARGOP    ;copy to targop buffer
  430.     CALL    COPYTODELIM    ;copy until delimiter encountered
  431.     CALL    SKIPWHITE    ;skip over white space which follows
  432.     SHLD    INLNPTR        ;save pointer
  433.     SUB    A
  434.     INR    A        ;Z-flag not set
  435.     RET
  436. ;.....
  437. ;
  438. ;
  439. ;..IF M80: Z-flag set upon return if 'EQU' is the next .ASM word
  440. ;
  441.      IF    M80
  442. CHKEQU    PUSH    H        ;save .ASM text ->
  443.     INX    H        ;-> next .ASM character
  444.     CALL    SKIPWHITE    ;skip spaces & tabs for 'EQU' compare, -> next
  445.     MOV    A,M        ;character and fetch it
  446.     CPI    'E'        ;=E ?
  447.     JNZ    NOTMACRO    ;return if not
  448.     INX    H        ;-> 2nd character
  449.     MOV    A,M
  450.     CPI    'Q'        ;=Q ?
  451.     JNZ    NOTMACRO    ;return if not
  452.     INX    H
  453.     MOV    A,M
  454.     CPI    'U'        ;=U ?
  455.     POP    H        ;restore .ASM text ->
  456.     RET            ;return with Z-flag set if an equate
  457. ;...
  458. ;
  459. ;
  460. NOTEQU    POP    H        ;restore .ASM text ->
  461.     RET            ;return with Z-flag not set
  462.      ENDIF            ;M80
  463. ;.....
  464. ;
  465. ;
  466. ;..IF M80: Z-flag set upon return if 'MACRO' is the next .ASM word
  467. ;
  468.      IF    M80
  469. CHKMACRO
  470.     PUSH    H        ;save .ASM text ->
  471.     INX    H        ;-> next .ASM char.
  472.     CALL    SKIPWHITE    ;skip spaces & tabs for 'MACRO' compare, -> next
  473.     MOV    A,M        ;character and fetch it
  474.     CPI    'M'        ;=M ?
  475.     JNZ    NOTMACRO    ;return if not
  476.     INX    H        ;-> 2nd char.
  477.     MOV    A,M
  478.     CPI    'A'        ;=A ?
  479.     JNZ    NOTMACRO    ;return if not
  480.     INX    H
  481.     MOV    A,M
  482.     CPI    'C'        ;=C ?
  483.     JNZ    NOTMACRO    ;return if not
  484.     INX    H
  485.     MOV    A,M
  486.     CPI    'R'        ;=R ?
  487.     JNZ    NOTMACRO
  488.     INX    H
  489.     MOV    A,M
  490.     CPI    'O'        ;=O ?
  491.     POP    H        ;restore .ASM text ->
  492.     RET            ;return with Z-flag set if an equate
  493. ;...
  494. ;
  495. ;
  496. NOTMACRO
  497.     POP    H        ;restore .ASM text ->
  498.     RET            ;return with Z-flag not set
  499.      ENDIF            ;M80
  500. ;.....
  501. ;
  502. ;
  503. ;..IF M80: Z-flag set upon return if 'SET' is the next .ASM word
  504. ;
  505.      IF    M80
  506. CHKSET    PUSH    H        ;save .ASM text ->
  507.     INX    H        ;-> next .ASM char.
  508.     CALL    SKIPWHITE    ;skip spaces & tabs for 'SET' compare, -> next
  509.     MOV    A,M        ;character and fetch it
  510.     CPI    'S'        ;=S ?
  511.     JNZ    NOTMACRO    ;return if not
  512.     INX    H        ;-> 2nd character
  513.     MOV    A,M
  514.     CPI    'E'        ;=E ?
  515.     JNZ    NOTMACRO    ;return if not
  516.     INX    H
  517.     MOV    A,M
  518.     CPI    'T'        ;=T ?
  519.     POP    H        ;restore .ASM text ->
  520.     RET            ;return with Z-flag set if an equate
  521. ;.....
  522. ;
  523. ;
  524. NOTSET    POP    H        ;restore .ASM text ->
  525.     RET            ;return with Z-flag not set
  526.      ENDIF            ;M80
  527. ;.....
  528. ;
  529. ;
  530. ; Compare op code pointed to by HL with target op code; return with the
  531. ; Z-flag set if a match was found, NZ if no match.
  532. ;
  533. CMPOP    MOV    A,M        ;no op code to compare?
  534.     ANA    A        ;a=0 if so
  535.     JZ    CMPOP1        ;failure if so
  536.     PUSH    B
  537.     MVI    B,5        ;compare 5 bytes
  538.     LXI    D,TARGOP    ;point to target op code
  539.     CALL    COMPHLDE    ;compare
  540.     POP    B
  541.     RZ            ;done if match
  542.     DAD    B        ;point to next op code in table
  543.     JMP    CMPOP
  544. ;
  545. CMPOP1    INR    A        ;A=1 and NZ
  546.     RET
  547. ;.....
  548. ;
  549. ;
  550. ; Process op codes in set 1 -- operand and comments fields are unchanged.
  551. ; HL points to op code table entry, 2nd element of which is to be output
  552. ; to disk.
  553. ;
  554. DOOCS1    CALL    OUTNEWOP5CH    ;output new op code
  555.     JMP    COPYARGS    ;copy operand and comment fields as-is
  556. ;
  557. ;
  558. ; Output second 5-character-maximum op code field pointed to by HL to
  559. ; disk and end in <tab>.
  560. ;
  561. OUTNEWOP5CH
  562.     LXI    B,5        ;skip first 5 characters
  563.     DAD    B        ;point to second 5-character field
  564. ;
  565. ;
  566. ; Entry point to copy 5-character-maximum field pointed to by HL
  567. ;
  568. ONO5C0    MVI    B,5
  569. ;
  570. ONO5C1    MOV    A,M        ;get the character
  571.     CPI    ' '        ;<sp>?
  572.     JZ    ONO5C2        ;done if so
  573.     CPI    TAB        ;<tab>?
  574.     JZ    ONO5C2        ;done if so
  575.     CALL    DOUTCHAR    ;output character to disk
  576.     INX    H        ;point to next
  577.     DCR    B        ;one less to go
  578.     JNZ    ONO5C1        ;count down
  579. ;
  580. ONO5C2    MVI    A,TAB        ;output <tab> to disk
  581.     JMP    DOUTCHAR    ;output to disk
  582. ;
  583. ;
  584. ; Process op codes in set 2 - operand is 1 register or '(HL)' - HL points
  585. ; to op code table entry, 2nd element of which is to be output to disk
  586. ;
  587. DOOCS2    CALL    OUTNEWOP5CH    ;output new 5-character-maximum op code
  588.     LHLD    INLNPTR        ;point to operand field
  589. ;
  590. ATHLCHECK
  591.     MOV    A,M        ;check for '(HL)' reference
  592.     CPI    'M'        ;takes the form of 'M' in 8080 mnemonics
  593.     JNZ    CARGS1        ;output normally if not
  594.     INX    H        ;point to character after
  595.     PUSH    H        ;save pointer
  596.     LXI    H,ATHL        ;output '(HL)'
  597.     CALL    OUTSTR        ;output to disk
  598.     POP    H        ;get pointer
  599.     JMP    CARGS1        ;process rest of line normally
  600. ;
  601. ATHL    DB    '(HL)',0
  602. ;
  603. ;
  604. ; Pprocess op codes in set 3 - operand is BC, DE, HL, or PSW register
  605. ; pair.  HL points to op code table entry, 2nd element of which is to
  606. ; be output to disk
  607. ;
  608. DOOCS3    CALL    OUTNEWOP5CH    ;output new op code
  609. ;
  610. RPCHECK    LHLD    INLNPTR        ;point to operand field
  611.     PUSH    H        ;save pointer
  612.     MOV    A,M        ;get operand
  613.     CPI    'B'        ;for BC?
  614.     JZ    PRBC        ;output BC if so
  615.     CPI    'D'        ;for DE?
  616.     JZ    PRDE        ;output DE if so
  617.     CPI    'H'        ;for HL?
  618.     JZ    PRHL        ;output HL if so
  619.     CPI    'P'        ;for PSW?
  620.     JNZ    L0309        ;output whatever is there if not
  621.     INX    H        ;make sure it is 'PSW'
  622.     MOV    A,M
  623.     CPI    'S'
  624.     JNZ    L0309        ;output whatever is there if not
  625.     INX    H
  626.     MOV    A,M
  627.     CPI    'W'
  628.     JNZ    L0309        ;output what ever is there if not
  629.     POP    H        ;it is 'PSW', so clear stack and point
  630.     INX    H        ;  to character after 'PSW'
  631.     INX    H
  632.     PUSH    H
  633.     LXI    H,AFSTR        ;print 'AF'
  634.     JMP    PRREGPAIR    ;do print
  635. ;
  636. PRBC    LXI    H,BCSTR        ;print 'BC'
  637.     JMP    PRREGPAIR
  638. ;
  639. PRDE    LXI    H,DESTR        ;print 'DE'
  640.     JMP    PRREGPAIR
  641. ;
  642. PRHL    LXI    H,HLSTR        ;print 'HL'
  643. ;
  644. PRREGPAIR
  645.     CALL    OUTSTR        ;print string pointed to by HL and make HL on stack
  646.     POP    H        ;point to next character
  647.     INX    H
  648.     PUSH    H
  649. ;
  650. L0309    POP    H        ;print whatever other operand it is
  651.     JMP    CARGS1        ;print the operand
  652. ;
  653. AFSTR    DB    'AF',0
  654. BCSTR    DB    'BC',0
  655. DESTR    DB    'DE',0
  656. HLSTR    DB    'HL',0
  657. ;
  658. ;
  659. ; Process op code set 4 - EQ, NE, LT, GE, RET, CALL, and JMP.  HL points
  660. ; to op code table entry, 2nd element of which is to be output to disk.
  661. ;
  662. DOOCS4    LDA    TARGOP+1    ;look at second letter of target op
  663.     LXI    H,ZFLG        ;prepare for zero
  664.     CPI    'E'        ;if 'E', then form is 'EQ'
  665.     JZ    ZCPUT        ;change form to 'XZ ', where X=R,C,J
  666.     LXI    H,NZFLG        ;prepare for not zero
  667.     CPI    'N'        ;if 'N', then form is 'NE'
  668.     JZ    ZCPUT
  669.     LXI    H,CFLG        ;prepare for carry
  670.     CPI    'L'        ;if 'L', then form is 'LT'
  671.     JZ    ZCPUT
  672.     LXI    H,NCFLG        ;form must be 'GE', so no carry
  673. ;
  674. ZCPUT    MOV    A,M        ;get first character
  675.     STA    TARGOP+1    ;store it
  676.     INX    H        ;point to second character
  677.     MOV    A,M        ;get it
  678.     STA    TARGOP+2    ;store it
  679.     RET
  680. ;...
  681. ;
  682. ;
  683. ZFLG    DB    'Z '
  684. NZFLG    DB    'NZ'
  685. CFLG    DB    'C '
  686. NCFLG    DB    'NC'
  687. ;.....
  688. ;
  689. ;
  690. ; Process op code set 5 -- return forms.  HL points to op code table
  691. ; entry, 2nd element of which is to be output to disk.
  692. ;
  693. DORETS    LXI    H,RETSTR    ;point to string to copy
  694.     CALL    COPY5        ;copy with optional cond
  695.     JMP    COPYARGS    ;copy rest of operand field and comments as-is
  696.  
  697. ;
  698. RETSTR    DB    'RET  ',0
  699. ;
  700. DOCALLS    LXI    H,CALLSTR
  701.     JMP    CP5WITHCOMMA    ;copy and follow with comma
  702. ;
  703. CALLSTR        DB    'CALL ',0
  704. ;
  705. DOJMPS    LXI    H,JPSTR        ;fall through
  706. ;
  707. ;
  708. ; Copy string at HL followed by condition code, a comma, and rest of the
  709. ; operand field
  710. ;
  711. CP5WITHCOMMA
  712.     CALL    COPY5
  713.     MVI    A,','
  714.     CALL    DOUTCHAR    ;output comma to disk
  715.     JMP    COPYARGS    ;copy rest of operand field
  716. ;
  717. JPSTR    DB    'JP   ',0
  718. ;
  719. ;
  720. ; Copy 5-character-maximum string pointed to by HL followed by <tab> and
  721. ; 2-character conditional.
  722. ;
  723. COPY5    CALL    ONO5C0        ;copy 5-character-maximum string pointed to by HL
  724.     LDA    TARGOP+1    ;output first character of conditional
  725.     CALL    DOUTCHAR
  726.     LDA    TARGOP+2    ;output 2nd character of conditional if not <sp>
  727.     CPI    ' '
  728.     RZ
  729.     JMP    DOUTCHAR
  730. ;
  731. ;
  732. ; Process op code set 8 - this table contains the service routine address
  733. ; embedded in it after each op code pair; HL points to op code table
  734. ; entry, 2nd element of which is to be output to disk.
  735. ;
  736. DOOCS8    PUSH    H        ;save pointer to old (1st) op
  737.     LXI    B,10        ;point to address of service routine
  738.     DAD    B
  739.     MOV    C,M        ;BC=routine address
  740.     INX    H
  741.     MOV    B,M
  742.     POP    H        ;point to old (1st) op
  743.     PUSH    B        ;routine address on stack
  744.     RET            ;jump to routine
  745. ;.....
  746. ;
  747. ;
  748. ; This converts 'DAD <RP>' to 'ADD HL,<RP>'
  749. ;
  750. DO81    CALL    OUTNEWOP5CH    ;output 'ADD<TAB>'
  751.     LXI    H,DO81S        ;output 'HL,'
  752.     CALL    OUTSTR
  753.     JMP    RPCHECK        ;output <register pair>
  754. ;
  755. DO81S    DB    'HL,',0
  756. ;
  757. ;
  758. ; This converts 'ADD R' to 'ADD A,R'
  759. ;    and 'ADC R' to 'ADC A,R'
  760. ;    and 'SBC R' to 'SBC A,R'
  761. ;
  762. DO82    CALL    OUTNEWOP5CH    ;output the 'IN<TAB>'
  763.     LXI    H,DO82S        ;output 'A,'
  764.     JMP    DO8F1        ;04C7H
  765. ;
  766. DO82S    DB    'A,',0
  767. ;
  768. ;
  769. ; This converts 'LDA <ADR>' to 'LD A,(<ADR>)'
  770. ;    and 'IN <ADR>' to 'IN A,(<ADR>)'
  771. ;
  772. DO83    CALL    OUTNEWOP5CH
  773.     LXI    H,DO83S
  774.     JMP    OUTCLP
  775. ;
  776. DO83S    DB    'A,(',0
  777. ;
  778. ;
  779. ; This converts 'LDAX <RP>' to 'LD A,(<RP>)'
  780. ;
  781. DO84    CALL    OUTNEWOP5CH    ;output op code
  782.     LHLD    INLNPTR        ;point to operand
  783.     MOV    A,M        ;get 1st character of operand
  784.     CPI    'B'        ;bc reg pair?
  785.     JZ    DO841        ;process it
  786.     CPI    'D'        ;DE register pair?
  787.     JZ    DO842        ;process it
  788.     JMP    CARGS1        ;something funny -- process normally
  789. ;
  790. DO841    LXI    H,DO841S
  791.     JMP    DO8D3
  792. ;
  793. DO842    LXI    H,DO842S
  794.     JMP    DO8D3
  795. ;
  796. DO841S    DB    'A,(BC)',0
  797. DO842S    DB    'A,(DE)',0
  798. ;
  799. ;
  800. ; This converts 'LHLD <ADR>' to 'LD HL,(<ADR>)'
  801. ;
  802. DO85    CALL    OUTNEWOP5CH
  803.     LXI    H,DO85S
  804. ;
  805. ;
  806. ; This outputs the string pointed to by HL, outputs the rest of the
  807. ; operand field, outputs a closing ')', and outputs the rest of the
  808. ; input line
  809. ;
  810. OUTCLP    CALL    OUTSTR        ;01F9H
  811.     CALL    OUTOPER        ;04D5H
  812.     MVI    A,')'        ;29H
  813.     CALL    DOUTCHAR    ;0631H
  814.     JMP    CARGS1        ;0198H
  815. ;
  816. DO85S    DB    'HL,(',0
  817. ;
  818. ;
  819. ; This converts 'MOV R,R' to 'LD R,R'
  820. ;
  821. DO86    CALL    OUTNEWOP5CH
  822.     LHLD    INLNPTR        ;point to 1st character of operand field
  823.     MOV    A,M        ;get it
  824.     CPI    'M'        ;convert 'M' to '(HL)'?
  825.     JNZ    DO862        ;no conversion necessary
  826.     PUSH    H
  827.     LXI    H,ATHL        ;output '(HL)'
  828.     CALL    OUTSTR
  829.     POP    H
  830. ;
  831. ;
  832. ; Output ',' followed by '(HL)' or 'R'
  833. ;
  834. DO861    INX    H        ;output comma and then 2nd 'R'
  835.     MOV    A,M        ;get comma
  836.     CALL    DOUTCHAR
  837.     INX    H        ;point to 2nd 'R'
  838.     JMP    ATHLCHECK    ;output '(HL)' or 'R'
  839. ;
  840. ;
  841. ; Output 'R,' followed by '(HL)' or 'R'
  842. ;
  843. DO862    CALL    DOUTCHAR    ;output 'R'
  844.     JMP    DO861        ;output rest
  845. ;
  846. ;
  847. ; This converts 'PCHL' to 'JP<TAB>(HL)'
  848. ;
  849. DO88    CALL    OUTNEWOP5CH
  850.     LXI    H,ATHL        ;output the '(HL)'
  851.     JMP    DO8F1
  852. ;
  853. ;
  854. ; This converts 'RST N' to 'RST NNH'
  855. ;
  856. DO89    CALL    OUTNEWOP5CH
  857.     LXI    H,DO89S
  858.     JMP    DO8F1
  859. ;
  860. DO89S    DB    '8*',0        ;multiply restart number by 8 for Z80
  861. ;
  862. ;
  863. ; This converts 'SHLD <ADR>' to 'LD (<ADR>),HL'
  864. ;
  865. DO8A    CALL    OUTNEWOP5CH
  866.     MVI    A,'('        ;output opening '('
  867.     CALL    DOUTCHAR
  868.     CALL    OUTOPER        ;output operand
  869.     PUSH    H
  870.     LXI    H,DO8AS        ;output '),HL'
  871.     JMP    DO8C2
  872. ;
  873. DO8AS    DB    '),HL',0
  874. ;
  875. ;
  876. ; This converts 'SPHL' to 'LD SP,HL'
  877. ;
  878. DO8B    CALL    OUTNEWOP5CH
  879.     LXI    H,DO8BS
  880.     JMP    DO8F1
  881. ;
  882. DO8BS    DB    'SP,HL',0
  883. ;
  884. ;
  885. ; This converts 'STA <ADR>' to 'LD (<ADR>),A'
  886. ;    and 'OUT <ADR>' to 'OUT (<ADR>),A'
  887. ;
  888. DO8C    CALL    OUTNEWOP5CH
  889.     MVI    A,'('        ;output '('
  890. ;
  891. ;
  892. ; This outputs '<OPERAND>),A'
  893. ;
  894. DO8C1    CALL    DOUTCHAR    ;output character in a
  895.     CALL    OUTOPER        ;output operand field
  896.     PUSH    H
  897.     LXI    H,DO8CS        ;output '),A'
  898. ;
  899. DO8C2    CALL    OUTSTR        ;output string pointed to by HL
  900.     POP    H        ;clear stack
  901.     JMP    CARGS1        ;output rest of input line
  902. ;
  903. DO8CS    DB    '),A',0
  904. ;
  905. ;
  906. ; This converts 'STAX <RP>' to 'LD (<RP>),A'
  907. ;
  908. DO8D    CALL    OUTNEWOP5CH
  909.     LHLD    INLNPTR        ;point to 1st character of operand
  910.     MOV    A,M        ;get it
  911.     CPI    'B'        ;'BC' register pair?
  912.     JZ    DO8D1        ;output it if so
  913.     CPI    'D'        ;'DE' register pair?
  914.     JZ    DO8D2        ;output it if so
  915.     JMP    CARGS1        ;else, output whatever is there
  916. ;
  917. DO8D1    LXI    H,DO8D1S
  918.     JMP    DO8D3
  919. ;
  920. DO8D2    LXI    H,DO8D2S
  921. ;
  922. DO8D3    CALL    OUTSTR
  923.     LHLD    INLNPTR        ;point to after 'B' or 'D'
  924.     INX    H
  925.     JMP    CARGS1
  926. ;
  927. DO8D1S    DB    '(BC),A',0
  928. DO8D2S    DB    '(DE),A',0
  929. ;.....
  930. ;
  931. ;
  932. ; This converts 'XCHG' to 'EX DE,HL'
  933. ;
  934. DO8E    CALL    OUTNEWOP5CH
  935.     LXI    H,DO8ES
  936.     JMP    DO8F1
  937. ;
  938. DO8ES    DB    'DE,HL',0
  939. ;.....
  940. ;
  941. ;
  942. ; This converts 'XTHL' to 'EX (SP),HL'
  943. ;
  944. DO8F    CALL    OUTNEWOP5CH
  945.     LXI    H,DO8FS
  946. ;
  947. DO8F1    CALL    OUTSTR        ;01F9H
  948.     JMP    COPYARGS    ;0195H
  949. ;
  950. DO8FS    DB    '(SP),HL',0
  951. ;.....
  952. ;
  953. ;
  954. ; Oxtput rest of operand field up to white space before ending comment
  955. ; or end of line.
  956. ;
  957. OUTOPER    LHLD    INLNPTR        ;point to next character in input line buffer
  958. ;
  959. OOL1    MOV    A,M        ;get next character
  960.     CPI    ';'        ;beginning of comment?
  961.     JZ    OOL2        ;check for rest of operand
  962.     CPI    CR        ;end of line?
  963.     JZ    OOL2        ;check for rest of operand
  964.     INX    H        ;continue until either comment or EOL found
  965.     JMP    OOL1
  966. ;
  967. OOL2    DCX    H        ;back up (over white space?)
  968.     MOV    A,M        ;get character
  969.     CPI    ' '        ;white?
  970.     JZ    OOL2        ;continue backing
  971.     CPI    TAB        ;white?
  972.     JZ    OOL2        ;continue backing
  973.     INX    H        ;point to first white character
  974.     XCHG            ;save pointer in 'DE'
  975.     LHLD    INLNPTR        ;point to start of scan
  976. ;
  977. OOL3    MOV    A,D        ;all of operand field flushed?
  978.     CMP    H        ;check for pointer match
  979.     JNZ    OOL4        ;check for ponter match
  980.     MOV    A,E        ;rest of match?
  981.     CMP    L
  982.     RZ            ;done if all match
  983. ;
  984. OOL4    MOV    A,M        ;output operand character to disk
  985.     CALL    DOUTCHAR
  986.     INX    H        ;pint to next operand character
  987.     JMP    OOL3        ;continue until operand all out
  988. ;
  989. ;
  990. ; The following turns on various messages for manual translation
  991. ;
  992. DO91    MVI    A,TAB        ;ENDIFs
  993.     STA    XLT1ON        ;store <tab> to enable
  994.     JMP    DO941
  995. ;
  996. DO92    MVI    A,TAB        ;includes
  997.     STA    XLT2ON
  998.     JMP    DO941
  999. ;
  1000. DO93    MVI    A,TAB        ;lists
  1001.     STA    XLT3ON
  1002.     JMP    DO941
  1003. ;
  1004. DO94    MVI    A,TAB        ;MACROS
  1005.     STA    XLT4ON
  1006. ;
  1007. DO941    CALL    OUTNEWOP5CH    ;output new code
  1008.     MVI    A,CR        ;turn on printed error message
  1009.     STA    ERR5ON        ;turn on flag by starting with <cr>
  1010.     JMP    COPYARGS    ;copy rest of code
  1011. ;
  1012. ;
  1013. ; The following checks for the specification of a help option and prints
  1014. ; the help message if so
  1015. ;
  1016. HCHECK    LDA    DEFFCB+1    ;get first character of file name
  1017.     CPI    '?'        ;option?
  1018.     RNZ            ;no help requested if not option
  1019.     LXI    D,HMSG1        ;print help message
  1020.     CALL    PMSG
  1021.     POP    H        ;remove 'CALL HCHECK' from stack
  1022.     RET            ;return to original CP/M stack
  1023. ;.....
  1024. ;
  1025. ;
  1026. ; The following initializes the program for execution
  1027. ;
  1028. INIT    LXI    D,HEADER    ;print program banner
  1029.     CALL    PMSG
  1030.     MVI    A,10        ;initialize PDOT print (line) count
  1031.     STA    LCOUNT
  1032.     MVI    A,50        ;initialize new line print count
  1033.     STA    NLCOUNT
  1034.     MVI    A,1        ;initialize output buffer line position
  1035.     STA    OBUFLPOS
  1036.     CALL    MAKEFNS        ;set up file names
  1037.     CALL    OPENIN        ;open input file
  1038.     CALL    OPENOUT        ;open output file
  1039.     LXI    H,FHDR        ;output '.Z80' and 'ASEG' to .MAC file
  1040. ;
  1041. INIT1    MOV    A,M        ;get character
  1042.     ORA    A        ;done?
  1043.     JZ    INIT2
  1044.     CALL    DOUTCHAR    ;output to disk
  1045.     INX    H        ;point to next
  1046.     JMP    INIT1
  1047. ;
  1048. INIT2    LDA    FCB2+1        ;2nd file name present?
  1049.     CPI    ' '        ;<sp> if not
  1050.     RNZ            ;done if so
  1051.     XRA    A        ;a=0
  1052.     STA    OCS4        ;turn off weird op code scan (req, etc)
  1053.     STA    NOXLT        ;turn off scan for ENT, NAME, RAM, ROG
  1054.     STA    NOXLT2        ;turn off scan for IFC, ICL, MAC, LST
  1055.     RET
  1056. ;.....
  1057. ;
  1058. ;
  1059. ; Set up file names
  1060. ;
  1061. MAKEFNS    LXI    H,DEFFCB    ;copy input file name from command
  1062.     LXI    D,FCBASM    ;into this FCB for use
  1063.     MVI    B,9        ;9 bytes
  1064.     CALL    MOVE        ;copy
  1065.     MOV    A,M        ;file type specified?
  1066.     CPI    ' '        ;none if <sp>
  1067.     JZ    MFN1
  1068.     MVI    B,3        ;3 more bytes
  1069.     CALL    MOVE        ;copy
  1070. ;
  1071. MFN1    LXI    H,FCB2+1    ;2nd file specified?
  1072.     MOV    A,M        ;get first byte of file name
  1073.     DCX    H        ;point to first byte of fcb
  1074.     CPI    ' '        ;no second file name?
  1075.     JNZ    MFN2        ;skip reload of HL if there is a 2nd file name
  1076.     LXI    H,DEFFCB    ;copy file name into output FCB
  1077. ;
  1078. MFN2    LXI    D,FCBZ80    ;output FCB
  1079.     MVI    B,9        ;9 bytes
  1080.     CALL    MOVE        ;copy
  1081.     LXI    H,FCB2+9    ;point to file type
  1082.     MOV    A,M        ;check for a file type
  1083.     CPI    ' '        ;none if <sp>
  1084.     JZ    MFN3
  1085.     MVI    B,3        ;there is one, so copy it over
  1086.     CALL    MOVE        ;copy
  1087. ;
  1088. MFN3    LXI    D,PRFNM1    ;print part 1 of file name message
  1089.     CALL    PMSG
  1090.     LXI    H,FCBASM    ;print name of source file
  1091.     CALL    PRFNAME
  1092.     LXI    D,PRFNM2    ;print part 2 of file name message
  1093.     CALL    PMSG
  1094.     LXI    H,FCBZ80    ;print name of destination file
  1095.     CALL    PRFNAME
  1096.     LXI    D,CRLFSTR    ;end line
  1097.     CALL    PMSG
  1098.     RET
  1099. ;.....
  1100. ;
  1101. ;
  1102. ; Print file name message
  1103. ;
  1104. PRFNAME    MOV    A,M        ;get disk number
  1105.     ADI    '@'        ;add in ASCII bias
  1106.     CALL    PCHAR
  1107.     MVI    A,':'        ;print colon
  1108.     CALL    PCHAR
  1109.     INX    H        ;point to first character of file name
  1110.     MVI    B,8        ;8 characters
  1111.     CALL    PRFNC
  1112.     MVI    A,'.'        ;dot
  1113.     CALL    PCHAR
  1114.     MVI    B,3        ;3 characters
  1115.     CALL    PRFNC
  1116.     RET
  1117. ;...
  1118. ;
  1119. ;
  1120. PRFNC    MOV    A,M        ;get next character
  1121.     INX    H        ;point to next
  1122.     CALL    PCHAR        ;print character
  1123.     DCR    B        ;one less to go
  1124.     JNZ    PRFNC
  1125.     RET
  1126. ;.....
  1127. ;
  1128. ;
  1129. ; Open input file for processing
  1130. ;
  1131. OPENIN    LXI    D,FCBASM    ;open file for input
  1132.     MVI    C,0FH
  1133.     CALL    BDOS
  1134.     CPI    0FFH        ;error?
  1135.     JZ    OIERR        ;abort with error message if so
  1136.     MVI    A,80H        ;initialize character count for buffer
  1137.     STA    IBUFCNT
  1138.     RET
  1139. ;...
  1140. ;
  1141. OIERR    LXI    D,ERR2        ;input file error message
  1142.     JMP    ENDERR        ;abort
  1143. ;.....
  1144. ;
  1145. ;
  1146. ; Open file for output
  1147. ;
  1148. OPENOUT    LXI    D,FCBZ80    ;open output file
  1149.     MVI    C,0FH
  1150.     CALL    BDOS
  1151.     CPI    0FFH        ;error?
  1152.     JNZ    OOERR2        ;abort if no error (overwrite old file)
  1153. ;
  1154. OPENO1    LXI    D,FCBZ80    ;else create output file
  1155.     MVI    C,16H
  1156.     CALL    BDOS
  1157.     CPI    0FFH        ;error?
  1158.     JZ    OOERR1
  1159.     LXI    D,FCBZ80    ;now open output file (redundant with make)
  1160.     MVI    C,0FH
  1161.     CALL    BDOS
  1162.     MVI    A,80H        ;initialize count of bytes remaining
  1163.     STA    OBUFBACKCNT    ;set count
  1164.     LXI    H,OBUF        ;initialize address of next byte
  1165.     SHLD    OBUFPTR        ;set pointer
  1166.     RET
  1167. ;...
  1168. ;
  1169. ;
  1170. OOERR1    LXI    D,ERR3        ;disk full
  1171.     JMP    ENDERR        ;abort error
  1172. ;
  1173. OOERR2    LXI    D,ERR4        ;attempt to overwrite existing file
  1174.     CALL    PMSG
  1175.     MVI    C,1        ;get response
  1176.     CALL    BDOS
  1177.     CALL    CAPS        ;capitalize
  1178.     CPI    'Y'        ;continue if yes
  1179.     LXI    D,ERR4A        ;prep for abort
  1180.     JNZ    ENDERR        ;abort error
  1181.     LXI    D,CRLFSTR    ;new line
  1182.     CALL    PMSG
  1183.     LXI    D,FCBZ80    ;delete old file
  1184.     MVI    C,19        ;BDOS delete file
  1185.     CALL    BDOS
  1186.     JMP    OPENO1        ;create new file and continue
  1187. ;.....
  1188. ;
  1189. ;
  1190. ; Check to see if character pointed to by HL is a delimiter and flush
  1191. ; characters until it is; return with zero flag set when done.q
  1192. ;
  1193. FTODLM    PUSH    B        ;flush to delimiter
  1194.     CALL    DLIMSCAN    ;do scan
  1195.     POP    B
  1196.     RZ            ;match, so abort
  1197.     INX    H        ;point to next character
  1198.     JMP    FTODLM        ;continue scan
  1199. ;
  1200. ;
  1201. ; Copy (HL) to (DE) for (B) bytes or until a delimiter is encountered
  1202. ;
  1203. COPYTODELIM
  1204.     MOV    C,B        ;let BC=old B (for LDI instruction)
  1205.     MVI    B,0
  1206.     PUSH    B        ;save registers
  1207.     PUSH    D
  1208.     PUSH    H
  1209.     CALL    SPFILL        ;fill destination buffer with spaces (pointed to by de)
  1210.     POP    H        ; ... and 'C' bytes long
  1211.     POP    D
  1212.     POP    B
  1213. ;
  1214. CTD1    PUSH    B        ;save count
  1215.     CALL    DLIMSCAN    ;scan for delimiter if encountered
  1216.     POP    B        ;get the count back
  1217.     RZ            ;done if a delimiter was found now
  1218. ;
  1219.     MOV    A,M        ;otherwise get the character and
  1220.     STAX    D        ;  store it then increment for the
  1221.     INX    D        ;  next position
  1222.     INX    H
  1223.     DCR    C        ;one less to go
  1224.     JNZ    CTD1        ;if not finished, check for next
  1225.     JMP    DLIMSCAN    ;one last try if count is zero now
  1226. ;
  1227. ;
  1228. ; Advance buffer pointer HL until non-white (non-<sp>, non-<tab>)
  1229. ; encountered
  1230. ;
  1231. SKIPWHITE
  1232.     MOV    A,M        ;get character
  1233.     CPI    ' '        ;<sp>?
  1234.     JZ    SKPWH1        ;skip if so
  1235.     CPI    TAB        ;<tab>?
  1236.     RNZ            ;done if not
  1237. ;
  1238. SKPWH1    INX    H        ;point to next character
  1239.     JMP    SKIPWHITE
  1240. ;
  1241. ;
  1242. ; Check to see if character pointed to by HL is a delimiter
  1243. ;
  1244. DLIMSCAN
  1245.     PUSH    D
  1246.     XCHG            ;point to character with 'DE'
  1247.     LXI    H,DLIMS        ;point to table of delimiters
  1248.     CALL    DELIMCHS    ;do scan in general
  1249.     XCHG            ;point to character with 'HL'
  1250.     MOV    A,M        ;get character in 'A'
  1251.     POP    D
  1252.     RET
  1253. ;...
  1254. ;
  1255. ;
  1256. ; Table of valid delimiters
  1257. ;
  1258. DLIMS    DB    1,1        ;scan 1 byte at a time, and skip 1 byte if no match
  1259.     DB    ','        ;delimiters ...
  1260.     DB    ':'
  1261.     DB    '+'
  1262.     DB    '-'
  1263.     DB    '/'
  1264.     DB    '*'
  1265.     DB    ' '
  1266.     DB    ')'
  1267.     DB    ';'
  1268.     DB    CR
  1269.     DB    TAB        ; ... to here
  1270.     DB    0        ;end of table
  1271. ;
  1272. ;
  1273. ; Scan for delimiter -- return with nz if not found or point to the
  1274. ; delimiter with Z if found; on input, table pointed to by HL with the
  1275. ; first two bytes giving number of bytes to check and number of bytes
  1276. ; to skip, respectively, on each partial scan.
  1277. ;
  1278. DELIMCHS
  1279.     CALL    SPCHSCAN    ;do scan of table
  1280.     RNZ            ;not found
  1281.     MOV    C,B        ;character offset count in 'BC'
  1282.     MVI    B,0
  1283.     DAD    B        ;point to character
  1284.     SUB    A        ;set zero flag
  1285.     RET
  1286. ;.....
  1287. ;
  1288. ;
  1289. ; Scan special character table pointed to by HL for string pointed
  1290. ; to by 'DE'; number of significant bytes to scan as first entry in the
  1291. ; table, number of bytes to skip on failure as second entry in table;
  1292. ; table ends in a binary 0.
  1293. ;
  1294. SPCHSCAN
  1295.     MOV    B,M        ;b=number of bytes to scan
  1296.     INX    H
  1297.     MOV    C,M        ;'C'=number of bytes to skip on failure
  1298.     INX    H        ;point to first valid byte in table
  1299. ;
  1300. ;
  1301. ; Main scanning loop
  1302. ;
  1303. SPCH1    MOV    A,M        ;check for end of table
  1304.     ANA    A        ;zero?
  1305.     JZ    SPCH2        ;done if so
  1306.     CALL    COMPHLDE    ;do compare
  1307.     RZ            ;return if match
  1308.     MOV    A,C        ;point to next table entry
  1309.     CALL    ADDHLA        ;HL=HL+(size of table entry)
  1310.     JMP    SPCH1
  1311. ;
  1312. ;
  1313. ; No match -- return NZ
  1314. ;
  1315. SPCH2    INR    A        ;A=1 and NZ
  1316.     RET
  1317. ;.....
  1318. ;
  1319. ;
  1320. ; Compare characters pointed to by 'DE' with that pointed to by 'HL' for
  1321. ; 'B' bytes and return with Z-flag set if complete match, NZ if no match;
  1322. ; HL, DE, BC not affected
  1323. ;
  1324. COMPHLDE
  1325.     PUSH    H        ;save registers
  1326.     PUSH    D
  1327.     PUSH    B
  1328. ;
  1329. CMPHD1    LDAX    D        ;get 'DE' character
  1330.     CMP    M        ;compare to 'HL' character
  1331.     JNZ    CMPHD2        ;no match
  1332.     INX    H        ;point to next
  1333.     INX    D
  1334.     DCR    B        ;one less to go
  1335.     JNZ    CMPHD1        ;count down -- zero flag set on end
  1336. ;
  1337. CMPHD2    POP    B        ;restore registers
  1338.     POP    D
  1339.     POP    H
  1340.     RET
  1341. ;.....
  1342. ;
  1343. ;
  1344. ;  HL=HL+A
  1345. ;
  1346. ADDHLA    ADD    L        ;do it
  1347.     MOV    L,A
  1348.     RNC
  1349.     INX    H
  1350.     RET
  1351. ;.....
  1352. ;
  1353. ;
  1354. ; Move 'B' characters from 'HL' to 'DE'
  1355. ;
  1356. MOVE    MOV    A,M
  1357.     STAX    D
  1358.     INX    D
  1359.     INX    H
  1360.     DCR    B
  1361.     JNZ    MOVE
  1362.     RET
  1363. ;.....
  1364. ;
  1365. ;
  1366. ; Fill memory pointed to by DE with spaces for BD bytes
  1367. ;
  1368. SPFILL    MVI    A,' '        ;<sp>
  1369.     STAX    D        ;store first <sp>
  1370.     INX    D        ;DE points to next byte
  1371.     DCR    C        ;one less to go
  1372.     JNZ    SPFILL        ;copy
  1373.     RET
  1374. ;.....
  1375. ;
  1376. ;
  1377. ; Output character in 'A' to disk file
  1378. ;
  1379. DOUTCHAR
  1380.     PUSH    H        ;save registers
  1381.     PUSH    D
  1382.     PUSH    B
  1383.     PUSH    PSW
  1384.     LHLD    OBUFPTR        ;get address of next character position in out buffer
  1385.     MOV    M,A        ;store character into out buffer
  1386.     CPI    TAB        ;check for tab
  1387.     JNZ    NOTABOUT    ;not tab -- do not update count
  1388.     LDA    OBUFLPOS    ;tab -- update location in line
  1389.     DCR    A        ;'A'=out buffer line position-1
  1390.     ANI    0F8H        ;mask for tab
  1391.     ADI    TAB        ;and add 9
  1392.     JMP    DOUT1
  1393. ;
  1394. ;
  1395. ; Not a tab -- just increment position count
  1396. ;
  1397. NOTABOUT
  1398.     LDA    OBUFLPOS    ;get address of next character position in out buffer
  1399.     INR    A        ;add 1 to it
  1400. ;
  1401. DOUT1    STA    OBUFLPOS    ;update out buffer line position
  1402.     INX    H        ;increment buffer pointer
  1403.     LDA    OBUFBACKCNT    ;get buffer byte count
  1404.     DCR    A        ;buffer now full?
  1405.     JNZ    DOUT2        ;continue if not
  1406.     LXI    D,OBUF        ;write buffer to disk if so
  1407.     MVI    C,1AH        ;set DMA address
  1408.     CALL    BDOS
  1409.     LXI    D,FCBZ80    ;write block
  1410.     CALL    WRITEBLK
  1411.     LXI    H,OBUF        ;reset output buffer pointer to 1st byte
  1412.     MVI    A,80H        ;reset buffer byte count
  1413. ;
  1414. DOUT2    SHLD    OBUFPTR        ;update output buffer pointer
  1415.     STA    OBUFBACKCNT    ;update buffer byte count
  1416.     POP    PSW        ;restore registers
  1417.     POP    B
  1418.     POP    D
  1419.     POP    H
  1420.     RET
  1421. ;.....
  1422. ;
  1423. ;
  1424. ; Write block whose FCB is pointed to by 'DE' to disk
  1425. ;
  1426. WRITEBLK
  1427.     MVI    C,15H        ;CP/M BDOS write block
  1428.     CALL    BDOS
  1429.     ANA    A        ;error?
  1430.     RZ            ;ok if none
  1431.     LXI    D,ERR1        ;else print error message and abort
  1432.     JMP    ENDERR
  1433. ;.....
  1434. ;
  1435. ;
  1436. ; Fill last block with EOF (1AH) and close output file
  1437. ;
  1438. CTRLZFILL
  1439.     LDA    OBUFBACKCNT    ;get remaining count
  1440.     CPI    80H        ;full?
  1441.     JZ    CLOSEOUT    ;close file then
  1442.     MVI    A,1AH        ;else write EOL (1AH)
  1443.     CALL    DOUTCHAR
  1444.     JMP    CTRLZFILL
  1445. ;
  1446. ;
  1447. ; Close output file
  1448. ;
  1449. CLOSEOUT
  1450.     LXI    D,FCBZ80    ;output FCB
  1451.     MVI    C,10H        ;close file
  1452.     JMP    BDOS
  1453. ;.....
  1454. ;
  1455. ;
  1456. ; Extract next input line for disk file and place it as a 0-terminated
  1457. ; string in buffer 'INLN'
  1458. ;
  1459. BUILDLINE
  1460.     CALL    PDOT        ;print activity dot
  1461.     XRA    A        ;A=false or 0
  1462.     STA    INCMT        ;turn comment flag off
  1463.     STA    INQUOTE        ;turn quote flag off
  1464.     LXI    H,INLN        ;point to INLN buffer
  1465.     MVI    B,80        ;80 characters maximum
  1466. ;
  1467. ;
  1468. ; Main build loop
  1469. ;
  1470. NXTLCHAR
  1471.     PUSH    H
  1472.     LHLD    IBUFPTR        ;point to next character in file
  1473.     SHLD    IBUFPTR
  1474.     XCHG            ;put into 'DE'
  1475.     POP    H
  1476.     LDA    IBUFCNT        ;check to see if buffer empty
  1477.     CPI    80H        ;80H if so
  1478.     JNZ    PUTCHAR        ;not empty, so place character in line
  1479.     PUSH    H
  1480.     PUSH    B
  1481.     LXI    D,IBUFFER    ;read next block from input file
  1482.     MVI    C,1AH        ;set DMA address
  1483.     CALL    BDOS
  1484.     LXI    D,FCBASM    ;read the block
  1485.     MVI    C,14H
  1486.     CALL    BDOS
  1487.     DCR    A        ;error?
  1488.     JZ    ENDALL        ;done if so (assume EOF)
  1489.     POP    B
  1490.     POP    H
  1491.     LXI    D,IBUFFER    ;set pointer to 1st byte of block
  1492.     SUB    A        ;character count = 0
  1493. ;
  1494. ;
  1495. ; Place character pointed to be 'DE' into INLN
  1496. ;
  1497. PUTCHAR    STA    IBUFCNT        ;save character count
  1498.     LDAX    D        ;get character
  1499.     INX    D        ;point to next
  1500.     PUSH    H
  1501.     PUSH    D
  1502.     XCHG            ;put the 'DE' value into 'HL'
  1503.     SHLD    IBUFPTR        ;save pointer
  1504.     POP    D
  1505.     LXI    H,IBUFCNT    ;increment character count
  1506.     INR    M
  1507.     POP    H
  1508.     CALL    PCAPS        ;capitalize character optionally
  1509.     MOV    M,A        ;save character from file into INLN
  1510.     CPI    CR        ;end of line?
  1511.     JZ    ENDBLINE    ;done if so
  1512. ;
  1513.     CPI    TAB        ;tab expand?
  1514.     JZ    CONTBLINE    ;process as normal character if so
  1515.     CPI    ' '        ;less than <sp>?
  1516.     JC    NXTLCHAR    ;do not process if so
  1517. ;
  1518. CONTBLINE
  1519.     DCR    B        ;is buffer full?
  1520.     INX    H        ;point to next character in INLN buffer
  1521.     JNZ    NXTLCHAR    ;continue processing if not full
  1522.     INR    B        ;write over last character for rest of line
  1523.     DCX    H
  1524.     JMP    NXTLCHAR    ;continue
  1525. ;.....
  1526. ;
  1527. ;
  1528. ; Optionally capitalize character in 'A'
  1529. ;
  1530. PCAPS    PUSH    PSW        ;save character
  1531.     CPI    '*'
  1532.     JNZ    PCAPS0
  1533.     MOV    A,B        ;see if in first column
  1534.     CPI    80
  1535.     JNZ    PCAPS0        ;if not, continue
  1536.     POP    PSW        ;clear the stack of the asterisk
  1537.     MVI    A,';'        ;call the asterisk a semicolon instead
  1538.     PUSH    PSW        ;now put the new character on the stack
  1539.     MVI    A,0FFH        ;set comment flag
  1540.     STA    INCMT
  1541.     JMP    PCAPS5        ;done
  1542. ;
  1543. PCAPS0    LDA    INCMT        ;in a comment?
  1544.     ORA    A        ;0=no
  1545.     JNZ    PCAPS5        ;done if so and do not capitalize
  1546.     LDA    INQUOTE        ;in a quote?
  1547.     ORA    A        ;0=no
  1548.     JNZ    PCAPS1        ;do not capitalize if so
  1549.     POP    PSW        ;not in comment or quote, so capitalize
  1550.     CALL    CAPS
  1551.     JMP    PCAPS2
  1552. PCAPS1    POP    PSW        ;get character
  1553. ;
  1554. PCAPS2    CPI    ';'        ;coming into a comment?
  1555.     JNZ    PCAPS3
  1556.     PUSH    PSW        ;save character
  1557.     MVI    A,0FFH        ;set comment flag
  1558.     STA    INCMT
  1559.     JMP    PCAPS5        ;done
  1560. ;
  1561. PCAPS3    PUSH    PSW        ;save character
  1562.     LDA    INQUOTE        ;in a quote?
  1563.     ORA    A        ;0=no
  1564.     JZ    PCAPS4
  1565.     POP    PSW        ;get character -- we are in a quote
  1566.     PUSH    PSW        ;save it again
  1567.     CPI    27H        ;are we leaving the quote?
  1568.     JNZ    PCAPS5
  1569.     XRA    A        ;a=0
  1570.     STA    INQUOTE        ;yes, so set not in quote
  1571.     JMP    PCAPS5
  1572. ;
  1573. PCAPS4    POP    PSW        ;get character
  1574.     PUSH    PSW        ;save character one last time
  1575.     CPI    27H        ;coming into a quote?
  1576.     JNZ    PCAPS5
  1577.     MVI    A,0FFH        ;set inquote flag
  1578.     STA    INQUOTE
  1579. ;
  1580. PCAPS5    POP    PSW        ;get character
  1581.     RET            ;done
  1582. ;.....
  1583. ;
  1584. ;
  1585. ; Store ending <lf> and <null>
  1586. ;
  1587. ENDBLINE
  1588.     INX    H        ;point to next position
  1589.     MVI    M,LF        ;store <LF>
  1590.     INX    H
  1591.     MVI    M,0        ;store <null>
  1592.     PUSH    H
  1593.     PUSH    D
  1594.     XCHG
  1595.     SHLD    IBUFPTR        ;save input file pointer
  1596.     POP    D
  1597.     POP    H
  1598. ;
  1599. ;
  1600. ; Check for empty line and just output new line if so; else return
  1601. ;
  1602. ENDBL1    MOV    A,B        ;line empty?
  1603.     SUI    80        ;start over if so
  1604.     RNZ            ;done if not empty
  1605.     MVI    A,CR        ;output <CR><LF> to file for empty line
  1606.     CALL    DOUTCHAR
  1607.     MVI    A,LF
  1608.     CALL    DOUTCHAR
  1609.     JMP    BUILDLINE    ;do next line
  1610. ;.....
  1611. ;
  1612. ;
  1613. ; Capitalize character in 'A'
  1614. ;
  1615. CAPS    ANI    7FH        ;mask out MSB
  1616.     CPI    61H        ;do nothing if less than small 'a'
  1617.     RC
  1618.     CPI    7AH+1        ;capitalize if between small 'a' and 'z', respectively
  1619.     RNC
  1620.     ANI    5FH        ;capitalize
  1621.     RET
  1622. ;.....
  1623. ;
  1624. ;
  1625. ; End of processing
  1626. ;
  1627. ENDALL    CALL    CTRLZFILL    ;fill buffer with EOF (1AH)
  1628.     LXI    D,ERR5ON    ;optionally print each error message if set
  1629.     CALL    PMSG
  1630.     LXI    D,XLT1ON
  1631.     CALL    PMSG
  1632.     LXI    D,XLT2ON
  1633.     CALL    PMSG
  1634.     LXI    D,XLT3ON
  1635.     CALL    PMSG
  1636.     LXI    D,XLT4ON
  1637.     CALL    PMSG
  1638.     LXI    D,MSG2
  1639. ;
  1640. ;
  1641. ; Print message pointed to by de with preceeding <crlf> and finish up
  1642. ;
  1643. ENDERR    PUSH    D        ;save pointer
  1644.     LXI    D,CRLFSTR    ;print <CR><LF>
  1645.     CALL    PMSG
  1646.     POP    D
  1647.     CALL    PMSG        ;print message
  1648.     JMP    WBOOT        ;done
  1649. ;.....
  1650. ;
  1651. ;
  1652. ; Print string pointed to by DE and ending in 0
  1653. ;
  1654. PMSG    LDAX    D        ;get character
  1655.     ANA    A        ;ending 0?
  1656.     RZ            ;done if so
  1657.     CALL    PCHAR        ;output character in 'A'
  1658.     INX    D        ;point to next character
  1659.     JMP    PMSG        ;continue
  1660. ;
  1661. ;
  1662. ; Print characterin 'A' on the CRT console
  1663. ;
  1664. PCHAR    PUSH    PSW        ;save registers
  1665.     PUSH    B
  1666.     PUSH    D
  1667.     PUSH    H
  1668.     MOV    E,A        ;character in 'E'
  1669.     MVI    C,2        ;console output
  1670.     CALL    BDOS
  1671.     POP    H        ;restore registers
  1672.     POP    D
  1673.     POP    B
  1674.     POP    PSW
  1675.     RET
  1676. ;.....
  1677. ;
  1678. ;
  1679. ; ****    OP CODE TABLE, MESSAGE AND BUFFER AREA    ****
  1680. ;
  1681. ; Op code tables
  1682. ;
  1683. OCS1    DB    'ANI  AND  '
  1684.     DB    'CMA  CPL  '
  1685.     DB    'CMC  CCF  '
  1686.     DB    'CPI  CP   '
  1687.     DB    'HLT  HALT '
  1688.     DB    'JMP  JP   '
  1689.     DB    'ORI  OR   '
  1690.     DB    'RAL  RLA  '
  1691.     DB    'RAR  RRA  '
  1692.     DB    'RLC  RLCA '
  1693.     DB    'RRC  RRCA '
  1694.     DB    'STC  SCF  '
  1695.     DB    'SUI  SUB  '
  1696.     DB    'XRI  XOR  '
  1697. ;
  1698. POPS    DB    'DB   DEFB '
  1699.     DB    'DS   DEFS '
  1700.     DB    'DW   DEFW '
  1701.     DB    'SET  DEFL '
  1702.  
  1703. NOXLT    DB    'ENT  ENTRY'
  1704.     DB    'NAM  NAME '
  1705.     DB    'RAM  DATA '
  1706.     DB    'ROG  REL  '
  1707.     DB    0        ;end of table for OCS1
  1708. ;
  1709. OCS2    DB    'ANA  AND  '
  1710.     DB    'CMP  CP   '
  1711.     DB    'DCR  DEC  '
  1712.     DB    'INR  INC  '
  1713.     DB    'MVI  LD   '
  1714.     DB    'ORA  OR   '
  1715.     DB    'SUB  SUB  '
  1716.     DB    'XRA  XOR  '
  1717.     DB    0        ;end of table for OCS2
  1718. ;
  1719. OCS3    DB    'DCX  DEC  '
  1720.     DB    'INX  INC  '
  1721.     DB    'LXI  LD   '
  1722.     DB    'POP  POP  '
  1723.     DB    'PUSH PUSH '
  1724.     DB    0        ;end of table for OCS3
  1725. ;
  1726. OCS4    DB    'REQ  RNE  RLT  RGE  CEQ '
  1727.     DB    ' CNE  CLT  CGE  JEQ  JNE '
  1728.     DB    ' JLT  JGE  '
  1729.     DB    0        ;end of table for OCS4
  1730. ;
  1731. RETS    DB    'RC   RNC  RZ   RNZ  RP  '
  1732.     DB    ' RM   RPE  RPO  '
  1733.     DB    0        ;end of table for returns
  1734. ;
  1735. CALLS    DB    'CC   CNC  CZ   CNZ  CP  '
  1736.     DB    ' CM   CPE  CPO  '
  1737.     DB    0        ;end of table for calls
  1738. ;
  1739. JMPS    DB    'JC   JNC  JZ   JNZ  JP  '
  1740.     DB    ' JM   JPE  JPO  '
  1741.     DB    0        ;end of table for jmps
  1742. ;
  1743. OCS8    DB    'DAD  ADD  '
  1744.     DW    DO81
  1745.     DB    'ADD  ADD  '
  1746.     DW    DO82
  1747.     DB    'ADC  ADC  '
  1748.     DW    DO82
  1749.     DB    'SBB  SBC  '
  1750.     DW    DO82
  1751.     DB    'ADI  ADD  '
  1752.     DW    DO82
  1753.     DB    'ACI  ADC  '
  1754.     DW    DO82
  1755.     DB    'SBI  SBC  '
  1756.     DW    DO82
  1757.     DB    'IN   IN   '
  1758.     DW    DO83
  1759.     DB    'LDA  LD   '
  1760.     DW    DO83
  1761.     DB    'LDAX LD   '
  1762.     DW    DO84
  1763.     DB    'LHLD LD   '
  1764.     DW    DO85
  1765.     DB    'MOV  LD   '
  1766.     DW     DO86
  1767.     DB    'PCHL JP   '
  1768.     DW    DO88
  1769.     DB    'RST  RST  '
  1770.     DW    DO89
  1771.     DB    'SHLD LD   '
  1772.     DW    DO8A
  1773.     DB    'SPHL LD   '
  1774.     DW    DO8B
  1775.     DB    'STA  LD   '
  1776.     DW    DO8C
  1777.     DB    'OUT  OUT  '
  1778.     DW    DO8C
  1779.     DB    'STAX LD   '
  1780.     DW    DO8D
  1781.     DB    'XCHG EX   '
  1782.     DW    DO8E
  1783.     DB    'XTHL EX   '
  1784.     DW    DO8F
  1785. ;
  1786. NOXLT2    DB    'IFC  IF   '
  1787.     DW    DO91
  1788.     DB    'ICL  *INCL'
  1789.     DW    DO92
  1790.     DB    'LST  LIST '
  1791.     DW    DO93
  1792.     DB    'MAC  MACRO'
  1793.     DW    DO94
  1794.     DB    0        ;end of table for OCS8 and NOXLT2
  1795. ;.....
  1796. ;
  1797. ;
  1798. ; Various messages and program header
  1799. ;
  1800. HEADER    DB    CR,LF,CR,LF
  1801.     DB    'XLATE',VERS/1+'0','  8080-to-Z80 Translator  '
  1802.     DB    MONTH/10+'0',(MONTH MOD    10)+'0','/',DAY/10+'0'
  1803.     DB    (DAY MOD 10)+'0','/',YEAR/10+'0',(YEAR MOD 10)+'0'
  1804.     DB    CR,LF,CR,LF,0
  1805. ;.....
  1806. ;
  1807. ;
  1808. ; Help messages
  1809. ;
  1810. HMSG1    DB    CR,LF,CR,LF,'XLATE translates an 8080 source code file '
  1811.     DB    'into a new Z80 source code',CR,LF,'file that is ready '
  1812.     DB    'to assemble using the Microsoft M80 assembler.  To'
  1813.     DB    CR,LF,'use, all these examples expect ''HELLO'' to be '
  1814.     DB    'an 8080 source code file.',CR,LF,'If a single name is '
  1815.     DB    'used the output file will have the same name, with'
  1816.     DB    CR,LF,'a .MAC type.',CR,LF
  1817.     DB    CR,LF,TAB,'A>XLATE HELLO',TAB,TAB,TAB,'(1)'
  1818.     DB    CR,LF,TAB,'A>XLATE HELLO.ASM',TAB,TAB,'(2)'
  1819.     DB    CR,LF,TAB,'A>XLATE HELLO.ASM TEST.TXT',TAB,'(3)',CR,LF
  1820.     DB    CR,LF,'Two lines will be automatically added at the '
  1821.     DB    'very start, for use with',CR,LF,'the M80 assembler:  '
  1822.     DB    '.Z80 and ASEG.  The first makes it unnecessary to'
  1823.     DB    CR,LF,'use the "/Z" when assembling and the second '
  1824.     DB    'insures absolute addresses',CR,LF,'when using L80 to '
  1825.     DB    'load the ''HELLO.REL'' file made by M80.',CR,LF,CR,LF
  1826.     DB    'All source code will be capitalized.  Any comment '
  1827.     DB    'line starting with an',CR,LF,'asterisk will be changed'
  1828.     DB    ' to a semilcolon.',CR,LF,CR,LF,'Colons will be placed '
  1829.     DB    'behind all labels except EQU, MACRO and SET.  The'
  1830.     DB    CR,LF,'time it takes to run the program may double, '
  1831.     DB    'depending where on the disk',CR,LF,'the input and '
  1832.     DB    'output files are physically located at the moment.  A '
  1833.     DB    'dot',CR,LF,'is shown each 10 pmg lines, 50 dots to a '
  1834.     DB    'line - two are 1000 pgm lines.',CR,LF
  1835.     DB    0
  1836. ;.....
  1837. ;
  1838. ;
  1839. ; File name messages
  1840. ;
  1841. PRFNM1    DB    'Source file: ',0
  1842. ;
  1843. PRFNM2    DB    '  destination file: ',0
  1844. ;
  1845. ;
  1846. ; First two lines of .MAC file will now have the following two lines:
  1847. ;
  1848. FHDR    DB    CR,LF,TAB,'.Z80' ;for using Zilog mnemonics
  1849.     DB    CR,LF,TAB,'ASEG' ;insures absolute addresses
  1850.     DB    CR,LF,CR,LF,0
  1851. ERR1    DB    '++ Output file write error ++',CR,LF,BELL,0
  1852. ERR2    DB    '++ No source file found, for help type XLATE ? '
  1853.     DB    '<ret> ++',CR,LF,CR,LF,BELL,0
  1854. ERR3    DB    '++ No directory space ++',CR,LF,BELL,0
  1855. ERR4    DB    'Output file already exists - delete it and '
  1856.     DB    'continue (Y/N)? ',BELL,0
  1857. ERR4A    DB    CR,LF,'++ Aborting to CP/M ++',CR,LF,BELL,0
  1858. MSG2    DB    'Processing complete',CR,LF,BELL,0
  1859. CRLFSTR    DB    CR,LF,0
  1860. ;.....
  1861. ;
  1862. ;
  1863. ; Various error messages
  1864. ;
  1865. ERR5ON    DB    0        ;this byte is set to <CR> if string enabled
  1866. ERR5    DB    LF
  1867.     DB    'The following pseudo-ops have been used in your source '
  1868.     DB    'and have not',CR,LF,'been fully translated.  You must '
  1869.     DB    'complete the translation using an editor.',CR,LF
  1870.     DB    TAB,'Original:',TAB,TAB,'Must Be Translated To:',CR,LF
  1871.     DB    0        ;end of string
  1872. XLT1ON    DB    0        ;this byte is set to <tab> if string enabled
  1873. XLT1    DB    '#ENDIF',TAB,TAB,TAB,'ENDIF',CR,LF,0
  1874. XLT2ON    DB    0        ;this byte is set to <tab> if string enabled
  1875. XLT2    DB    'ICL',TAB,TAB,TAB,'*INCLUDE',CR,LF,0
  1876. XLT3ON    DB    0        ;this byte is set to <tab> if string enabled
  1877. XLT3    DB    'LST  <operands>',TAB,TAB,'LIST <valid ASMB operands>'
  1878.     DB    CR,LF,0
  1879. XLT4ON    DB    0        ;this byte is set to <tab> if string enabled
  1880. XLT4    DB    'MAC <$parameters>',TAB,'MACRO <#parameters>',CR,LF
  1881.     DB    TAB,'[ ... ]',TAB,TAB,TAB,'MEND',CR,LF
  1882.     DB    TAB,'#macro-call',TAB,TAB,'macro-call',CR,LF,0
  1883. ;.....
  1884. ;
  1885. ;
  1886. ; Input file FCB
  1887. ;
  1888. FCBASM    DB    0,0,0,0,0,0,0,0,0,'ASM',0
  1889.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  1890.     DB    0,0,0,0,0,0,0
  1891. ;
  1892. ;
  1893. ; Output file FCB
  1894. ;
  1895. FCBZ80    DB    0,0,0,0,0,0,0,0,0,'MAC',0
  1896.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  1897.     DB    0,0,0,0,0,0,0
  1898. ;.....
  1899. ;
  1900. ;
  1901. ; BUFFER DATA AREA
  1902. ;
  1903. ; stack area
  1904. ;
  1905.     DS    128
  1906. ;
  1907. ; Current position in line of output buffer
  1908. ;
  1909. OBUFLPOS  DS    1
  1910. ;
  1911. ; Counter for every 10 lines
  1912. ;
  1913. LCOUNT     DS    1
  1914. ;
  1915. ; Counter for every 50*10 lines
  1916. ;
  1917. NLCOUNT     DS    1
  1918. ;
  1919. ; In comment flag -- 0 means not
  1920. ;
  1921. INCMT     DS    1
  1922. ;
  1923. ; In quote flag -- 0 means not
  1924. ;
  1925. INQUOTE     DS    1
  1926. ;
  1927. ; Pointer to target op code in input line
  1928. ;
  1929. ILTOP     DS    2
  1930. ;
  1931. ; Op code to match against
  1932. ;
  1933. TARGOP     DS    5
  1934. ;
  1935. ; Pointer to current position in current input line
  1936. ;
  1937. INLNPTR     DS    2
  1938. ;
  1939. ; Pointer to current position in output buffer (block)
  1940. ;
  1941. OBUFPTR     DS    2
  1942. ;
  1943. ; Count of characters remaining in output buffer
  1944. ;
  1945. OBUFBACKCNT  DS    1
  1946. ;
  1947. ; Output buffer (block)
  1948. ;
  1949. OBUF     DS    128
  1950. ;
  1951. ; Current input line buffer
  1952. ;
  1953. INLN     DS    80        ;80 characters in line
  1954.      DS    3        ;3 extra for <cr> <lf> <null>
  1955. ;
  1956. ; Pointer to current position in input buffer
  1957. ;
  1958. IBUFPTR     DS    2
  1959. ;
  1960. ; Count of number of characters left in input buffer
  1961. ;
  1962. IBUFCNT     DS    1
  1963. ;
  1964. ; Input buffer (block)
  1965. ;
  1966. IBUFFER     DS    128
  1967.  
  1968.      END
  1969.