home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol091 / xlate2.mac < prev   
Text File  |  1984-04-29  |  35KB  |  1,672 lines

  1. ;
  2. ;  Program:  XLATE2
  3. ;  Author:  Richard Conn
  4. ;  Derivation:  Disassembled XLATE.COM of Cromemco's CDOS and Modified
  5. ;        into XLATE2; XLATE.COM was Version 2.40
  6. ;  Version:  1.1
  7. ;  Date:  21 July 82
  8. ;  Previous Versions:  1.0 (3 May 82)
  9. ;
  10. ;    XLATE2 inputs an Intel-Standard 8080 Assembly Language Source File
  11. ; and converts it into a Zilog-Standard Z80 Assembly Language Source File.
  12. ;
  13. VERS    EQU    11    ;VERSION NUMBER
  14.  
  15. ;
  16. ;  USE ZILOG MNEMONICS AND ABSOLUTE SEGMENTS
  17. ;
  18.     .Z80
  19.     ASEG
  20.  
  21. ;
  22. ;  CP/M CONSTANTS
  23. ;
  24. WBOOT    EQU    0
  25. BDOS    EQU    5
  26. DEFFCB    EQU    5CH
  27. FCB2    EQU    6CH
  28.  
  29. ;
  30. ;  START OF PROGRAM
  31. ;
  32.     ORG    100H
  33.  
  34.     CALL    HCHECK        ;CHECK FOR HELP REQUEST
  35.     LD    SP,OBUFLPOS    ;INIT STACK PTR
  36.     CALL    INIT        ;INIT THE PROGRAM
  37. LOOP:
  38.     CALL    BUILDLINE    ;BUILD THE NEXT INPUT LINE
  39.     CALL    PROCESSOPS    ;CONVERT THE OP CODES
  40.     JR    LOOP
  41.  
  42. ;
  43. ;  MAIN PROCESSING MODULE
  44. ;
  45. PROCESSOPS:
  46.     CALL    GETOP    ;EXTRACT THE NEXT OP CODE
  47.     JP    Z,FLUSHLINE    ;IF NONE, FLUSH
  48. ;
  49.     LD    HL,OCS1    ;PROCESS OP CODE SET 1
  50.     LD    BC,10    ;10 CHARS/DUAL ENTRY (OLD OP = 5, NEW OP = 5)
  51.     CALL    CMPOP    ;SCAN FOR MATCH IN INLN BUFFER
  52.     JP    Z,DOOCS1    ;PROCESS IF FOUND
  53. ;
  54.     LD    HL,OCS2    ;PROCESS OP CODE SET 2
  55.     LD    BC,10    ;10 CHARS/DUAL ENTRY
  56.     CALL    CMPOP    ;SCAN FOR MATCH
  57.     JP    Z,DOOCS2    ;PROCESS
  58. ;
  59.     LD    HL,OCS3    ;PROCESS OP CODE SET 3
  60.     LD    BC,10    ;10 CHARS/DUAL ENTRY
  61.     CALL    CMPOP    ;SCAN FOR MATCH
  62.     JP    Z,DOOCS3    ;PROCESS
  63. ;
  64.     LD    HL,OCS4    ;PROCESS (EXTENDED RET) OP CODE SET 4
  65.     LD    BC,5    ;5 CHARS/SINGLE ENTRY
  66.     CALL    CMPOP    ;SCAN FOR MATCH
  67.     CALL    Z,DOOCS4    ;CONVERT INTO STANDARD RET FORMS IF MATCH
  68. ;
  69.     LD    HL,RETS    ;PROCESS (NORMAL RET) OP CODE SET 5
  70.     LD    BC,5    ;5 CHARS/SINGLE ENTRY
  71.     CALL    CMPOP    ;SCAN FOR MATCH
  72.     JP    Z,DORETS    ;PROCESS
  73. ;
  74.     LD    HL,CALLS    ;PROCESS (CALL) OP CODE SET 6
  75.     LD    BC,5    ;5 CHARS/SINGLE ENTRY
  76.     CALL    CMPOP    ;SCAN FOR MATCH
  77.     JP    Z,DOCALLS    ;PROCESS
  78. ;
  79.     LD    HL,JMPS    ;PROCESS (JMP) OP CODE SET 7
  80.     LD    BC,5    ;5 CHARS/SINGLE ENTRY
  81.     CALL    CMPOP    ;SCAN FOR MATCH
  82.     JP    Z,DOJMPS    ;PROCESS
  83. ;
  84.     LD    HL,OCS8    ;PROCESS OP CODE SET 8
  85.     LD    BC,12    ;12 CHARS/DUAL ENTRY
  86.     CALL    CMPOP    ;SCAN FOR MATCH
  87.     JP    Z,DOOCS8    ;PROCESS
  88. ;
  89. ;  NO MATCH IN OP CODE SETS -- PASS TARGET OP CODE AS IS
  90. ;
  91.     LD    B,5    ;5 CHARS IN TARGET
  92.     LD    HL,TARGOP    ;POINT TO TARGET
  93. POPS1:
  94.     LD    A,(HL)    ;GET CHAR
  95.     CP    ' '    ;END OF OP?
  96.     JR    Z,POPS2    ;OUTPUT TAB CHAR IF SO
  97.     CP    9    ;END OF OP?
  98.     JR    Z,POPS2    ;OUTPUT TAB CHAR IF SO
  99.     CALL    DOUTCHAR    ;OUTPUT OP CHAR
  100.     INC    HL    ;PT TO NEXT
  101.     DJNZ    POPS1    ;CONTINUE FOR 5 CHARS MAX
  102. POPS2:
  103.     LD    A,9    ;END OP WITH <TAB>
  104.     CALL    DOUTCHAR    ;OUTPUT TO DISK
  105. ;
  106. ;  COPY REST OF INPUT LINE AS-IS
  107. ;
  108. COPYARGS:
  109.     LD    HL,(INLNPTR)    ;PT TO NEXT CHAR
  110. CARGS1:
  111.     LD    C,0
  112. CARGS2:
  113.     LD    A,(HL)    ;GET CHAR
  114.     CP    ' '    ;END OF OPERANDS?
  115.     JR    Z,CARGS4    ;SKIP WHITE SPACE AND OUTPUT REST IF SO
  116.     CP    9    ;END OF OPERANDS?
  117.     JR    Z,CARGS4    ;SKIP WHITE SPACE AND OUTPUT REST IF SO
  118.     CP    0DH    ;END OF LINE?
  119.     JR    Z,FLUSHLINE    ;FLUSH IF SO
  120.     CP    ';'    ;BEGINNING OF COMMENT = END OF OPERANDS?
  121.     JR    Z,CARGS5    ;COPY REST IF SO
  122.     CP    ''''    ;SINGLE QUOTE?
  123.     JR    NZ,CARGS3
  124.     DEC    C
  125.     JR    Z,CARGS3
  126.     LD    C,1
  127. CARGS3:
  128.     CALL    DOUTCHAR    ;OUTPUT CHAR IN A TO DISK
  129.     INC    HL    ;PT TO NEXT
  130.     JR    CARGS2
  131. CARGS4:
  132.     PUSH    HL
  133.     CALL    SKIPWHITE    ;SKIP TO NEXT NON-WHITE CHAR
  134.     POP    HL
  135.     CP    0DH    ;END OF LINE?
  136.     JR    Z,FLUSHLINE    ;FLUSH IF SO
  137.     CP    ';'    ;COMMENT?
  138.     JR    Z,CARGS5    ;PROCESS COMMENT IF SO
  139.     CALL    OUTWHITE    ;OUTPUT A TAB
  140.     JR    CARGS2        ;RESTART PROCESSING
  141. CARGS5:
  142.     DEC    C
  143.     INC    C
  144.     JR    NZ,CARGS3
  145.     CALL    SKIPWHITE
  146.     LD    B,41
  147. CARGS6:
  148.     LD    A,(OBUFLPOS)    ;CHECK POSITION IN OUTPUT LINE
  149.     CP    B
  150.     JR    NC,FLUSHLINE
  151.     DEC    A    ;BACK UP IN OUTPUT LINE
  152.     AND    0F8H    ;ARTIFICALLY TAB
  153.     ADD    A,9
  154.     CP    B
  155.     JR    Z,FLUSHLINE
  156.     JR    C,CARGS7
  157.     LD    A,' '
  158.     JR    CARGS8
  159. CARGS7:
  160.     LD    A,9
  161. CARGS8:
  162.     CALL    DOUTCHAR
  163.     JR    CARGS6
  164. ;
  165. ;  WRITE REST OF INLN TO DISK
  166. ;
  167. FLUSHLINE:
  168.     CALL    OUTSTR
  169.     LD    A,1    ;RESET POSITION COUNTER
  170.     LD    (OBUFLPOS),A
  171.     RET
  172. ;
  173. ;  PRINT PDOT FOR EVERY TEN LINES
  174. ;
  175. PDOT:
  176.     LD    A,(LCOUNT)    ;GET LINE COUNT
  177.     DEC    A    ;COUNT DOWN
  178.     LD    (LCOUNT),A    ;PUT LINE COUNT
  179.     RET    NZ    ;DONE IF NOT ZERO
  180.     LD    A,'.'    ;PRINT PDOT
  181.     CALL    PCHAR
  182.     LD    A,10    ;RESET COUNT
  183.     LD    (LCOUNT),A
  184.     LD    A,(NLCOUNT)    ;NEW LINE?
  185.     DEC    A
  186.     LD    (NLCOUNT),A
  187.     RET    NZ
  188.     LD    DE,CRLFSTR    ;PRINT NEW LINE
  189.     CALL    PMSG
  190.     LD    A,60    ;RESET COUNTER
  191.     LD    (NLCOUNT),A
  192.     RET
  193. ;
  194. ;  OUTPUT STRING PTED TO BY HL TO DISK (STRING ENDS IN 0)
  195. ;
  196. OUTSTR:
  197.     LD    A,(HL)    ;GET CHAR
  198.     AND    A    ;DONE?
  199.     RET    Z    ;RET IF SO
  200.     CALL    DOUTCHAR
  201.     INC    HL    ;PT TO NEXT CHAR
  202.     JR    OUTSTR
  203. ;
  204. ;  OUTPUT ALL <SP> AND <TAB> CHARS FOUND UNTIL A NON-<SP> AND NON-<TAB>
  205. ;    ENCOUNTERED
  206. ;
  207. OUTWHITE:
  208.     LD    A,(HL)    ;GET CHAR
  209.     CP    ' '    ;<SP>?
  210.     JR    Z,OW1    ;OUTPUT IT
  211.     CP    9    ;<TAB>?
  212.     RET    NZ    ;DONE IF NOT
  213. OW1:
  214.     CALL    DOUTCHAR    ;OUTPUT CHAR IN A TO DISK
  215.     INC    HL    ;PT TO NEXT CHAR
  216.     JR    OUTWHITE    ;CONTINUE
  217. ;
  218. ;  EXTRACT OP CODE FOR INPUT LINE AND PLACE IN BUFFER
  219. ;
  220. GETOP:
  221.     LD    HL,INLN    ;PT TO INPUT LINE
  222.     LD    A,(HL)    ;GET 1ST CHAR IN LINE
  223.     CP    ' '    ;NO LABEL?
  224.     JR    Z,GOP3    ;SKIP TO OP CODE
  225.     CP    9    ;NO LABEL?
  226.     JR    Z,GOP3    ;SKIP TO OP CODE
  227.     CP    ';'    ;COMMENT?
  228.     RET    Z    ;DONE IF SO
  229. ;
  230. ;  LINE BEGINS WITH A LABEL -- PROCESS IT
  231. ;
  232. GOP1:
  233.     LD    C,0    ;SET LABEL CHAR CNT
  234. GOP2:
  235.     LD    A,(HL)    ;GET NEXT CHAR OF LABEL
  236.     CP    ':'    ;END OF LABEL?
  237.     JR    Z,GOP4
  238.     CP    9    ;END OF LABEL?
  239.     JR    Z,GOP5
  240.     CP    0DH    ;END OF LABEL AND NO FURTHER PROCESSING?
  241.     JR    Z,GOP5
  242.     CP    ';'    ;END OF LABEL AND NO FURTHER PROCESSING?
  243.     JR    Z,GOP5
  244.     CP    ' '    ;END OF LABEL?
  245.     JR    Z,GOP5
  246.     CALL    DOUTCHAR    ;OUTPUT LABEL CHAR TO DISK
  247.     INC    HL    ;PT TO NEXT CHAR
  248.     INC    C    ;INCR LABEL CHAR CNT
  249.     JR    GOP2
  250. ;
  251. ;  NO LABEL -- SKIP TO OP CODE
  252. ;
  253. GOP3:
  254.     CALL    SKIPWHITE    ;SKIP OVER WHITE SPACE
  255.     PUSH    HL
  256.     CALL    FTODLM
  257.     CP    ':'
  258.     POP    HL
  259.     JR    Z,GOP1
  260.     JR    GOP7
  261. ;
  262. ;  END OF LABEL BY ':' CHAR
  263. ;
  264. GOP4:
  265.     INC    HL    ;SKIP ':'
  266.     CALL    DOUTCHAR    ;OUTPUT THE ':'
  267.     LD    A,(HL)    ;CHECK FOR EOL
  268.     CP    0DH    ;DON'T DOUBLE NEW LINE (SKIP NEW LINE AFTER GOP6)
  269.     JR    Z,GOP8    ;JUST CONTINUE PROCESSING WITH NO TAB
  270.     JR    GOP6    ;NOT NEW LINE, SO PROCESS FOR NEW LINE IF LONG LABEL
  271. ;
  272. ;  OUTPUT ':' AT END OF LABEL
  273. ;
  274. GOP5:
  275.     LD    A,':'    ;OUTPUT THE ':'
  276.     CALL    DOUTCHAR
  277. ;
  278. ;  SEE IF LABEL IS LESS THAN 7 CHARS LONG
  279. ;    IF <7, THEN TERMINATE WITH <TAB>; IF >6, THEN NEW LINE AND <TAB>
  280. ;
  281. GOP6:
  282.     LD    A,C    ;GET LABEL CHAR CNT
  283.     CP    7    ;LESS THAN 7?
  284.     JR    C,GOP7    ;JUST TAB IF LESS THAN 7
  285.     LD    A,0DH    ;<CR>
  286.     CALL    DOUTCHAR
  287.     LD    A,0AH    ;<LF>
  288.     CALL    DOUTCHAR
  289. ;
  290. ;  OUTPUT <TAB> AFTER LABEL TO DISK
  291. ;
  292. GOP7:
  293.     LD    A,9    ;<TAB>
  294.     CALL    DOUTCHAR
  295. ;
  296. ;  SKIP TO OP CODE FIELD AND EXTRACT IT IF PRESENT
  297. ;
  298. GOP8:
  299.     CALL    SKIPWHITE    ;SKIP TO OP CODE FIELD
  300.     LD    A,(HL)    ;GET FIRST NON-WHITE CHAR
  301.     CP    ';'    ;NO OP CODE IF COMMENT
  302.     RET    Z    ;DONE IF COMMENT
  303.     CP    0DH    ;NO OP CODE IF EOL
  304.     RET    Z    ;DONE IF EOL
  305.     LD    (ILTOP),HL    ;SAVE PTR TO TARGET OP CODE
  306.     LD    B,5    ;5 CHARS MAX IN OP CODE
  307.     LD    DE,TARGOP    ;COPY TO TARGOP BUFFER
  308.     CALL    COPYTODELIM    ;COPY UNTIL DELIMITER ENCOUNTERED
  309.     CALL    SKIPWHITE    ;SKIP OVER WHITE SPACE WHICH FOLLOWS
  310.     LD    (INLNPTR),HL    ;SAVE PTR
  311.     SUB    A
  312.     INC    A    ;A=1 AND NZ
  313.     RET
  314. ;
  315. ;  COMPARE OP CODE PTED TO BY HL WITH TARGET OP CODE; RET WITH Z SET IF
  316. ;    MATCH, NZ IF NO MATCH
  317. ;
  318. CMPOP:
  319.     LD    A,(HL)    ;NO OP CODE TO COMPARE?
  320.     AND    A    ;A=0 IF SO
  321.     JR    Z,CMPOP1    ;FAILURE IF SO
  322.     PUSH    BC
  323.     LD    B,5    ;COMPARE 5 BYTES
  324.     LD    DE,TARGOP    ;PT TO TARGET OP CODE
  325.     CALL    COMPHLDE    ;COMPARE
  326.     POP    BC
  327.     RET    Z    ;DONE IF MATCH
  328.     ADD    HL,BC    ;PT TO NEXT OP CODE IN TABLE
  329.     JR    CMPOP
  330. CMPOP1:
  331.     INC    A    ;A=1 AND NZ
  332.     RET
  333. ;
  334. ;  PROCESS OP CODES IN SET 1 -- OPERAND AND COMMENTS FIELDS ARE UNCHANGED
  335. ;    HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK
  336. ;
  337. DOOCS1:
  338.     CALL    OUTNEWOP5CH    ;OUTPUT NEW OP CODE
  339.     JP    COPYARGS    ;COPY OPERAND AND COMMENT FIELDS AS-IS
  340. ;
  341. ;  OUTPUT 2ND 5-CHAR-MAX OP CODE FIELD PTED TO BY HL TO DISK AND END IN <TAB>
  342. ;
  343. OUTNEWOP5CH:
  344.     LD    BC,5    ;SKIP FIRST 5 CHARS
  345.     ADD    HL,BC    ;PT TO 2ND 5-CHAR FIELD
  346. ;
  347. ;  ENTRY PT TO COPY 5-CHAR-MAX FIELD PTED TO BY HL
  348. ;
  349. ONO5C0:
  350.     LD    B,5
  351. ONO5C1:
  352.     LD    A,(HL)    ;GET NEXT CHAR
  353.     CP    ' '    ;<SP>?
  354.     JR    Z,ONO5C2    ;DONE IF SO
  355.     CP    9    ;<TAB>?
  356.     JR    Z,ONO5C2    ;DONE IF SO
  357.     CALL    DOUTCHAR    ;OUTPUT CHAR TO DISK
  358.     INC    HL    ;PT TO NEXT
  359.     DJNZ    ONO5C1    ;COUNT DOWN
  360. ONO5C2:
  361.     LD    A,9    ;OUTPUT <TAB> TO DISK
  362.     JP    DOUTCHAR    ;OUTPUT TO DISK
  363. ;
  364. ;  PROCESS OP CODES IN SET 2 - OPERAND IS 1 REG OR '(HL)'
  365. ;    HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK
  366. ;
  367. DOOCS2:
  368.     CALL    OUTNEWOP5CH    ;OUTPUT NEW 5-CHAR-MAX OP CODE
  369.     LD    HL,(INLNPTR)    ;PT TO OPERAND FIELD
  370. ATHLCHECK:
  371.     LD    A,(HL)    ;CHECK FOR '(HL)' REFERENCE
  372.     CP    'M'    ;TAKES THE FORM OF 'M' IN 8080 MNEMONICS
  373.     JP    NZ,CARGS1    ;OUTPUT NORMALLY IF NOT
  374.     INC    HL    ;PT TO CHAR AFTER
  375.     PUSH    HL    ;SAVE PTR
  376.     LD    HL,ATHL    ;OUTPUT '(HL)'
  377.     CALL    OUTSTR    ;OUTPUT TO DISK
  378.     POP    HL    ;GET PTR
  379.     JP    CARGS1    ;PROCESS REST OF LINE NORMALLY
  380. ATHL:
  381.     DB    '(HL)',0
  382. ;
  383. ;  PROCESS OP CODES IN SET 3 - OPERAND IS BC, DE, HL, OR PSW REG PAIR
  384. ;    HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK
  385. ;
  386. DOOCS3:
  387.     CALL    OUTNEWOP5CH    ;OUTPUT NEW OP CODE
  388. RPCHECK:
  389.     LD    HL,(INLNPTR)    ;PT TO OPERAND FIELD
  390.     PUSH    HL    ;SAVE PTR
  391.     LD    A,(HL)    ;GET OPERAND
  392.     CP    'B'    ;FOR BC?
  393.     JR    Z,PRBC    ;OUTPUT BC IF SO
  394.     CP    'D'    ;FOR DE?
  395.     JR    Z,PRDE    ;OUTPUT DE IF SO
  396.     CP    'H'    ;FOR HL?
  397.     JR    Z,PRHL    ;OUTPUT HL IF SO
  398.     CP    'P'    ;FOR PSW?
  399.     JR    NZ,L0309    ;OUTPUT WHATEVER'S THERE IF NOT
  400.     INC    HL    ;MAKE SURE IT IS 'PSW'
  401.     LD    A,(HL)
  402.     CP    'S'
  403.     JR    NZ,L0309    ;OUTPUT WHAT'S THERE IF NOT
  404.     INC    HL
  405.     LD    A,(HL)
  406.     CP    'W'
  407.     JR    NZ,L0309    ;OUTPUT WHAT'S THERE IF NOT
  408.     POP    HL        ;IT IS 'PSW', SO CLEAR STACK AND PT
  409.     INC    HL        ; ... TO CHAR AFTER 'PSW'
  410.     INC    HL
  411.     PUSH    HL
  412.     LD    HL,AFSTR    ;PRINT 'AF'
  413.     JR    PRREGPAIR    ;DO PRINT
  414. PRBC:
  415.     LD    HL,BCSTR    ;PRINT 'BC'
  416.     JR    PRREGPAIR
  417. PRDE:
  418.     LD    HL,DESTR    ;PRINT 'DE'
  419.     JR    PRREGPAIR
  420. PRHL:
  421.     LD    HL,HLSTR    ;PRINT 'HL'
  422. PRREGPAIR:
  423.     CALL    OUTSTR    ;PRINT STRING PTED TO BY HL AND MAKE HL ON STACK
  424.     POP    HL    ; ... PT TO NEXT CHAR
  425.     INC    HL
  426.     PUSH    HL
  427. L0309:
  428.     POP    HL    ;PRINT WHATEVER OTHER OPERAND IT IS
  429.     JP    CARGS1    ;PRINT THE OPERAND
  430. AFSTR:
  431.     DB    'AF',0
  432. BCSTR:
  433.     DB    'BC',0
  434. DESTR:
  435.     DB    'DE',0
  436. HLSTR:
  437.     DB    'HL',0
  438. ;
  439. ;  PROCESS OP CODE SET 4 - EQ, NE, LT, GE RETS, CALLS, AND JMPS
  440. ;    HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK
  441. ;
  442. DOOCS4:
  443.     LD    A,(TARGOP+1)    ;LOOK AT 2ND LETTER OF TARGET OP
  444.     LD    HL,ZFLG    ;PREP FOR ZERO
  445.     CP    'E'    ;IF 'E', THEN FORM IS 'EQ'
  446.     JR    Z,ZCPUT    ;CHANGE FORM TO 'XZ ', WHERE X=R,C,J
  447.     LD    HL,NZFLG    ;PREP FOR NOT ZERO
  448.     CP    'N'    ;IF 'N', THEN FORM IS 'NE'
  449.     JR    Z,ZCPUT
  450.     LD    HL,CFLG    ;PREP FOR CARRY
  451.     CP    'L'    ;IF 'L', THEN FORM IS 'LT'
  452.     JR    Z,ZCPUT
  453.     LD    HL,NCFLG    ;FORM MUST BE 'GE', SO NO CARRY
  454. ZCPUT:
  455.     LD    A,(HL)    ;GET FIRST CHAR
  456.     LD    (TARGOP+1),A    ;STORE IT
  457.     INC    HL    ;PT TO 2ND CHAR
  458.     LD    A,(HL)    ;GET IT
  459.     LD    (TARGOP+2),A    ;STORE IT
  460.     RET
  461. ZFLG:
  462.     DB    'Z '
  463. NZFLG:
  464.     DB    'NZ'
  465. CFLG:
  466.     DB    'C '
  467. NCFLG:
  468.     DB    'NC'
  469. ;
  470. ;  PROCESS OP CODE SET 5 -- RETURN FORMS
  471. ;    HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK
  472. ;
  473. DORETS:
  474.     LD    HL,RETSTR    ;PT TO STR TO COPY
  475.     CALL    COPY5    ;COPY WITH OPTIONAL COND
  476.     JP    COPYARGS    ;COPY REST OF OPERAND FIELD AND COMMENTS AS-IS
  477. RETSTR:
  478.     DB    'RET  ',0
  479. DOCALLS:
  480.     LD    HL,CALLSTR
  481.     JR    CP5WITHCOMMA    ;COPY AND FOLLOW WITH COMMA
  482. CALLSTR:
  483.     DB    'CALL ',0
  484. DOJMPS:
  485.     LD    HL,JPSTR    ;FALL THRU TO DO JP FORMS
  486. ;
  487. ;  COPY STRING AT HL FOLLOWED BY CONDITION CODE, A COMMA, AND REST OF
  488. ;    OPERAND FIELD
  489. ;
  490. CP5WITHCOMMA:
  491.     CALL    COPY5
  492.     LD    A,','
  493.     CALL    DOUTCHAR    ;OUTPUT COMMA TO DISK
  494.     JP    COPYARGS    ;COPY REST OF OPERAND FIELD
  495. JPSTR:
  496.     DB    'JP   ',0
  497. ;
  498. ;  COPY 5-CHAR-MAX STRING PTED TO BY HL FOLLOWED BY <TAB> AND 2-CHAR COND
  499. ;
  500. COPY5:
  501.     CALL    ONO5C0    ;COPY 5-CHAR-MAX STRING PTED TO BY HL
  502.     LD    A,(TARGOP+1)    ;OUTPUT FIRST CHAR OF COND
  503.     CALL    DOUTCHAR
  504.     LD    A,(TARGOP+2)    ;OUTPUT 2ND CHAR OF COND IF NOT <SP>
  505.     CP    ' '
  506.     RET    Z
  507.     JP    DOUTCHAR
  508. ;
  509. ;  PROCESS OP CODE SET 8 - THIS TABLE CONTAINS THE SERVICE ROUTINE ADR
  510. ;    EMBEDDED IN IT AFTER EACH OP CODE PAIR;
  511. ;    HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK
  512. ;
  513. DOOCS8:
  514.     PUSH    HL    ;SAVE PTR TO OLD (1ST) OP
  515.     LD    BC,10    ;PT TO ADR OF SERVICE ROUTINE
  516.     ADD    HL,BC
  517.     LD    C,(HL)    ;BC=ROUTINE ADDRESS
  518.     INC    HL
  519.     LD    B,(HL)
  520.     POP    HL    ;PT TO OLD (1ST) OP
  521.     PUSH    BC    ;ROUTINE ADDRESS ON STACK
  522.     RET        ;JMP TO ROUTINE
  523. ;
  524. ;  THIS CONVERTS 'DAD <RP>' TO 'ADD HL,<RP>'
  525. ;
  526. DO81:
  527.     CALL    OUTNEWOP5CH    ;OUTPUT 'ADD<TAB>'
  528.     LD    HL,DO81S    ;OUTPUT 'HL,'
  529.     CALL    OUTSTR
  530.     JP    RPCHECK    ;OUTPUT <REG PAIR>
  531. DO81S:
  532.     DB    'HL,',0
  533. ;
  534. ;  THIS CONVERTS 'ADD R' TO 'ADD A,R'
  535. ;    AND 'ADC R' TO 'ADC A,R'
  536. ;    AND 'SBC R' TO 'SBC A,R'
  537. ;
  538. DO82:
  539.     CALL    OUTNEWOP5CH    ;OUTPUT THE 'IN<TAB>'
  540.     LD    HL,DO82S    ;OUTPUT 'A,'
  541.     JP    DO8F1    ;04C7H
  542. DO82S:
  543.     DB    'A,',0
  544. ;
  545. ;  THIS CONVERTS 'LDA <ADR>' TO 'LD A,(<ADR>)'
  546. ;    AND 'IN <ADR>' TO 'IN A,(<ADR>)'
  547. ;
  548. DO83:
  549.     CALL    OUTNEWOP5CH
  550.     LD    HL,DO83S
  551.     JR    OUTCLP
  552. DO83S:
  553.     DB    'A,(',0
  554. ;
  555. ;  THIS CONVERTS 'LDAX <RP>' TO 'LD A,(<RP>)'
  556. ;
  557. DO84:
  558.     CALL    OUTNEWOP5CH    ;OUTPUT OP CODE
  559.     LD    HL,(INLNPTR)    ;PT TO OPERAND
  560.     LD    A,(HL)    ;GET 1ST CHAR OF OPERAND
  561.     CP    'B'    ;BC REG PAIR?
  562.     JR    Z,DO841    ;PROCESS IT
  563.     CP    'D'    ;DE REG PAIR?
  564.     JR    Z,DO842    ;PROCESS IT
  565.     JP    CARGS1    ;SOMETHING FUNNY -- PROCESS NORMALLY
  566. DO841:
  567.     LD    HL,DO841S
  568.     JP    DO8D3
  569. DO842:
  570.     LD    HL,DO842S
  571.     JP    DO8D3
  572. DO841S:
  573.     DB    'A,(BC)',0
  574. DO842S:
  575.     DB    'A,(DE)',0
  576. ;
  577. ;  THIS CONVERTS 'LHLD <ADR>' TO 'LD HL,(<ADR>)'
  578. ;
  579. DO85:
  580.     CALL    OUTNEWOP5CH
  581.     LD    HL,DO85S
  582. ;
  583. ;  THIS OUTPUTS THE STRING PTED TO BY HL, OUTPUTS THE REST OF THE OPERAND
  584. ;    FIELD, OUTPUTS A CLOSING ')', AND OUTPUTS THE REST OF THE INPUT LINE
  585. ;
  586. OUTCLP:
  587.     CALL    OUTSTR    ;01F9H
  588.     CALL    OUTOPER    ;04D5H
  589.     LD    A,')'    ;29H
  590.     CALL    DOUTCHAR    ;0631H
  591.     JP    CARGS1    ;0198H
  592. DO85S:
  593.     DB    'HL,(',0
  594. ;
  595. ;  THIS CONVERTS 'MOV R,R' TO 'LD R,R'
  596. ;
  597. DO86:
  598.     CALL    OUTNEWOP5CH
  599.     LD    HL,(INLNPTR)    ;PT TO 1ST CHAR OF OPERAND FIELD
  600.     LD    A,(HL)    ;GET IT
  601.     CP    'M'    ;CONVERT 'M' TO '(HL)'?
  602.     JR    NZ,DO862    ;NO CONVERSION NECESSARY
  603.     PUSH    HL
  604.     LD    HL,ATHL    ;OUTPUT '(HL)'
  605.     CALL    OUTSTR
  606.     POP    HL
  607. ;
  608. ;  OUTPUT ',' FOLLOWED BY '(HL)' OR 'R'
  609. ;
  610. DO861:
  611.     INC    HL    ;OUTPUT COMMA AND THEN 2ND R
  612.     LD    A,(HL)    ;GET COMMA
  613.     CALL    DOUTCHAR
  614.     INC    HL    ;PT TO 2ND R
  615.     JP    ATHLCHECK    ;OUTPUT '(HL)' OR R
  616. ;
  617. ;  OUTPUT 'R,' FOLLOWED BY '(HL)' OR 'R'
  618. ;
  619. DO862:
  620.     CALL    DOUTCHAR    ;OUTPUT 'R'
  621.     JR    DO861    ;OUTPUT REST
  622. ;
  623. ;  THIS CONVERTS 'PCHL' TO 'JP<TAB>(HL)'
  624. ;
  625. DO88:
  626.     CALL    OUTNEWOP5CH
  627.     LD    HL,ATHL    ;OUTPUT THE '(HL)'
  628.     JP    DO8F1
  629. ;
  630. ;  THIS CONVERTS 'RST N' TO 'RST NNH'
  631. ;
  632. DO89:
  633.     CALL    OUTNEWOP5CH
  634.     LD    HL,DO89S
  635.     JP    DO8F1
  636. DO89S:
  637.     DB    '8*',0    ;MULTIPLY RESTART NUMBER BY 8 FOR Z80
  638. ;
  639. ;  THIS CONVERTS 'SHLD <ADR>' TO 'LD (<ADR>),HL'
  640. ;
  641. DO8A:
  642.     CALL    OUTNEWOP5CH
  643.     LD    A,'('    ;OUTPUT OPENING '('
  644.     CALL    DOUTCHAR
  645.     CALL    OUTOPER    ;OUTPUT OPERAND
  646.     PUSH    HL
  647.     LD    HL,DO8AS    ;OUTPUT '),HL'
  648.     JR    DO8C2
  649. DO8AS:
  650.     DB    '),HL',0
  651. ;
  652. ;  THIS CONVERTS 'SPHL' TO 'LD SP,HL'
  653. ;
  654. DO8B:
  655.     CALL    OUTNEWOP5CH
  656.     LD    HL,DO8BS
  657.     JR    DO8F1
  658. DO8BS:
  659.     DB    'SP,HL',0
  660. ;
  661. ;  THIS CONVERTS 'STA <ADR>' TO 'LD (<ADR>),A'
  662. ;    AND 'OUT <ADR>' TO 'OUT (<ADR>),A'
  663. ;
  664. DO8C:
  665.     CALL    OUTNEWOP5CH
  666.     LD    A,'('    ;OUTPUT '('
  667. ;
  668. ;  THIS OUTPUTS '<OPERAND>),A'
  669. ;
  670. DO8C1:
  671.     CALL    DOUTCHAR    ;OUTPUT CHAR IN A
  672.     CALL    OUTOPER    ;OUTPUT OPERAND FIELD
  673.     PUSH    HL
  674.     LD    HL,DO8CS    ;OUTPUT '),A'
  675. DO8C2:
  676.     CALL    OUTSTR    ;OUTPUT STRING PTED TO BY HL
  677.     POP    HL    ;CLEAR STACK
  678.     JP    CARGS1    ;OUTPUT REST OF INPUT LINE
  679. DO8CS:
  680.     DB    '),A',0
  681. ;
  682. ;  THIS CONVERTS 'STAX <RP>' TO 'LD (<RP>),A'
  683. ;
  684. DO8D:
  685.     CALL    OUTNEWOP5CH
  686.     LD    HL,(INLNPTR)    ;PT TO 1ST CHAR OF OPERAND
  687.     LD    A,(HL)    ;GET IT
  688.     CP    'B'    ;BC REG PAIR?
  689.     JR    Z,DO8D1    ;OUTPUT IT IF SO
  690.     CP    'D'    ;DE REG PAIR?
  691.     JR    Z,DO8D2    ;OUTPUT IT IF SO
  692.     JP    CARGS1    ;ELSE, OUTPUT WHAT'S THERE
  693. DO8D1:
  694.     LD    HL,DO8D1S
  695.     JR    DO8D3
  696. DO8D2:
  697.     LD    HL,DO8D2S
  698. DO8D3:
  699.     CALL    OUTSTR
  700.     LD    HL,(INLNPTR)    ;PT TO AFTER 'B' OR 'D'
  701.     INC    HL
  702.     JP    CARGS1
  703. DO8D1S:
  704.     DB    '(BC),A',0
  705. DO8D2S:
  706.     DB    '(DE),A',0
  707. ;
  708. ;  THIS CONVERTS 'XCHG' TO 'EX DE,HL'
  709. ;
  710. DO8E:
  711.     CALL    OUTNEWOP5CH
  712.     LD    HL,DO8ES
  713.     JR    DO8F1
  714. DO8ES:
  715.     DB    'DE,HL',0
  716. ;
  717. ;  THIS CONVERTS 'XTHL' TO 'EX (SP),HL'
  718. ;
  719. DO8F:
  720.     CALL    OUTNEWOP5CH
  721.     LD    HL,DO8FS
  722. DO8F1:
  723.     CALL    OUTSTR    ;01F9H
  724.     JP    COPYARGS    ;0195H
  725. DO8FS:
  726.     DB    '(SP),HL',0
  727. ;
  728. ;  OUTPUT REST OF OPERAND FIELD UP TO WHITE SPACE BEFORE ENDING COMMENT
  729. ;    OR END OF LINE
  730. ;
  731. OUTOPER:
  732.     LD    HL,(INLNPTR)    ;PT TO NEXT CHAR IN INPUT LINE BUFFER
  733. OOL1:
  734.     LD    A,(HL)    ;GET NEXT CHAR
  735.     CP    ';'    ;BEGINNING OF COMMENT?
  736.     JR    Z,OOL2    ;CHECK FOR REST OF OPERAND
  737.     CP    0DH    ;END OF LINE?
  738.     JR    Z,OOL2    ;CHECK FOR REST OF OPERAND
  739.     INC    HL    ;CONTINUE UNTIL EITHER COMMENT OR EOL FOUND
  740.     JR    OOL1
  741. OOL2:
  742.     DEC    HL    ;BACK UP (OVER WHITE SPACE?)
  743.     LD    A,(HL)    ;GET CHAR
  744.     CP    ' '    ;WHITE?
  745.     JR    Z,OOL2    ;CONTINUE BACKING
  746.     CP    9    ;WHITE?
  747.     JR    Z,OOL2    ;CONTINUE BACKING
  748.     INC    HL    ;PT TO FIRST WHITE CHAR
  749.     EX    DE,HL    ;SAVE PTR IN DE
  750.     LD    HL,(INLNPTR)    ;PT TO START OF SCAN
  751. OOL3:
  752.     LD    A,D    ;ALL OF OPERAND FIELD FLUSHED?
  753.     CP    H    ;CHECK FOR PTR MATCH
  754.     JR    NZ,OOL4    ;NO MATCH, SO FLUSH NEXT CHAR
  755.     LD    A,E    ;REST OF MATCH?
  756.     CP    L
  757.     RET    Z    ;DONE IF ALL MATCH
  758. OOL4:
  759.     LD    A,(HL)    ;OUTPUT OPERAND CHAR TO DISK
  760.     CALL    DOUTCHAR
  761.     INC    HL    ;PT TO NEXT OPERAND CHAR
  762.     JR    OOL3    ;CONTINUE UNTIL OPERAND ALL OUT
  763. ;
  764. ;  THE FOLLOWING TURNS ON VARIOUS MESSAGES FOR MANUAL TRANSLATION
  765. ;
  766. DO91:
  767.     LD    A,9    ;ENDIFS
  768.     LD    (XLT1ON),A    ;STORE <TAB> TO ENABLE
  769.     JR    DO941
  770. DO92:
  771.     LD    A,9    ;INCLUDES
  772.     LD    (XLT2ON),A
  773.     JR    DO941
  774. DO93:
  775.     LD    A,9    ;LISTS
  776.     LD    (XLT3ON),A
  777.     JR    DO941
  778. DO94:
  779.     LD    A,9    ;MACROS
  780.     LD    (XLT4ON),A
  781. DO941:
  782.     CALL    OUTNEWOP5CH    ;OUTPUT NEW CODE
  783.     LD    A,0DH    ;TURN ON PRINTED ERR MESSAGE
  784.     LD    (ERR5ON),A    ;TURN ON FLAG BY STARTING WITH <CR>
  785.     JP    COPYARGS    ;COPY REST OF CODE
  786. ;
  787. ;  THE FOLLOWING CHECKS FOR THE SPECIFICATION OF A HELP OPTION AND
  788. ;    PRINTS THE HELP MESSAGE IF SO
  789. ;
  790. HCHECK:
  791.     LD    A,(DEFFCB+1)    ;GET FIRST CHAR OF FILE NAME
  792.     CP    '/'        ;OPTION?
  793.     RET    NZ        ;NO HELP REQUESTED IF NOT OPTION
  794.     LD    DE,HEADER    ;PRINT PROGRAM BANNER
  795.     CALL    PMSG
  796.     LD    DE,HMSG1    ;PRINT HELP MESSAGE
  797.     CALL    PMSG
  798.     LD    C,1        ;GET ANY CHAR
  799.     CALL    BDOS
  800.     LD    DE,HMSG2    ;PRINT REST OF HELP MESSAGE
  801.     CALL    PMSG
  802.     POP    DE        ;CLEAR STACK
  803.     RET            ;RETURN TO CP/M
  804. ;
  805. ;  THE FOLLOWING INITIALIZES THE PROGRAM FOR EXECUTION
  806. ;
  807. INIT:
  808.     LD    DE,HEADER    ;PRINT PROGRAM BANNER
  809.     CALL    PMSG
  810.     LD    A,10        ;INIT PDOT PRINT (LINE) COUNT
  811.     LD    (LCOUNT),A
  812.     LD    A,60        ;INIT NEW LINE PRINT COUNT
  813.     LD    (NLCOUNT),A
  814.     LD    A,1        ;INITIALIZE OUTPUT BUFFER LINE POSITION
  815.     LD    (OBUFLPOS),A
  816.     CALL    MAKEFNS        ;SET UP FILE NAMES
  817.     CALL    OPENIN        ;OPEN INPUT FILE
  818.     CALL    OPENOUT        ;OPEN OUTPUT FILE
  819.     LD    HL,FHDR        ;OUTPUT '.Z80' AND 'ASEG' TO MAC FILE
  820. INIT1:
  821.     LD    A,(HL)        ;GET CHAR
  822.     OR    A        ;DONE?
  823.     JR    Z,INIT2
  824.     CALL    DOUTCHAR    ;OUTPUT TO DISK
  825.     INC    HL        ;PT TO NEXT
  826.     JR    INIT1
  827. INIT2:
  828.     LD    A,(FCB2+1)    ;2ND FILE NAME PRESENT?
  829.     CP    ' '        ;<SP> IF NOT
  830.     RET    NZ        ;DONE IF SO
  831.     XOR    A        ;A=0
  832.     LD    (OCS4),A    ;TURN OFF WEIRD OP CODE SCAN (REQ, ETC)
  833.     LD    (NOXLT),A    ;TURN OFF SCAN FOR ENT, NAME, RAM, ROG
  834.     LD    (NOXLT2),A    ;TURN OFF SCAN FOR IFC, ICL, MAC, LST
  835.     RET
  836. ;
  837. ;  SET UP FILE NAMES
  838. ;
  839. MAKEFNS:
  840.     LD    HL,DEFFCB    ;COPY INPUT FILE NAME FROM COMMAND
  841.     LD    DE,FCBASM    ;INTO THIS FCB FOR USE
  842.     LD    BC,9        ;9 BYTES
  843.     LDIR            ;COPY
  844.     LD    A,(HL)        ;FILE TYPE SPECIFIED?
  845.     CP    ' '        ;NONE IF <SP>
  846.     JR    Z,MFN1
  847.     LD    BC,3        ;3 MORE BYTES
  848.     LDIR
  849. MFN1:
  850.     LD    HL,FCB2+1    ;2ND FILE SPECIFIED?
  851.     LD    A,(HL)        ;GET FIRST BYTE OF FILE NAME
  852.     DEC    HL        ;PT TO FIRST BYTE OF FCB
  853.     CP    ' '        ;NO 2ND FILE NAME?
  854.     JR    NZ,MFN2        ;SKIP RELOAD OF HL IF THERE IS A 2ND FILE NAME
  855.     LD    HL,DEFFCB    ;COPY FILE NAME INTO OUTPUT FCB
  856. MFN2:
  857.     LD    DE,FCBZ80    ;OUTPUT FCB
  858.     LD    BC,9        ;9 BYTES
  859.     LDIR            ;COPY
  860.     LD    HL,FCB2+9    ;PT TO FILE TYPE
  861.     LD    A,(HL)        ;CHECK FOR A FILE TYPE
  862.     CP    ' '        ;NONE IF <SP>
  863.     JR    Z,MFN3
  864.     LD    BC,3        ;THERE IS ONE, SO COPY IT OVER
  865.     LDIR
  866. MFN3:
  867.     LD    DE,PRFNM1    ;PRINT PART 1 OF FILE NAME MESSAGE
  868.     CALL    PMSG
  869.     LD    HL,FCBASM    ;PRINT NAME OF SOURCE FILE
  870.     CALL    PRFNAME
  871.     LD    DE,PRFNM2    ;PRINT PART 2 OF FILE NAME MESSAGE
  872.     CALL    PMSG
  873.     LD    HL,FCBZ80    ;PRINT NAME OF DESTINATION FILE
  874.     CALL    PRFNAME
  875.     LD    DE,CRLFSTR    ;END LINE
  876.     CALL    PMSG
  877.     RET
  878. ;
  879. ;  PRINT FILE NAME MESSAGE
  880. ;
  881. PRFNAME:
  882.     LD    A,(HL)        ;GET DISK NUMBER
  883.     ADD    A,'@'        ;ADD IN ASCII BIAS
  884.     CALL    PCHAR
  885.     LD    A,':'        ;PRINT COLON
  886.     CALL    PCHAR
  887.     INC    HL        ;PT TO FIRST CHAR OF FILE NAME
  888.     LD    B,8        ;8 CHARS
  889.     CALL    PRFNC
  890.     LD    A,'.'        ;DOT
  891.     CALL    PCHAR
  892.     LD    B,3        ;3 CHARS
  893.     CALL    PRFNC
  894.     RET
  895. PRFNC:
  896.     LD    A,(HL)        ;GET NEXT CHAR
  897.     INC    HL        ;PT TO NEXT
  898.     CALL    PCHAR        ;PRINT CHAR
  899.     DJNZ    PRFNC
  900.     RET
  901.  
  902. ;
  903. ;  OPEN INPUT FILE FOR PROCESSING
  904. ;
  905. OPENIN:
  906.     LD    DE,FCBASM    ;OPEN FILE FOR INPUT
  907.     LD    C,0FH
  908.     CALL    BDOS
  909.     CP    0FFH        ;ERROR?
  910.     JR    Z,OIERR        ;ABORT WITH ERROR MESSAGE IF SO
  911.     LD    A,80H        ;INIT CHAR COUNT FOR BUFFER
  912.     LD    (IBUFCNT),A
  913.     RET
  914. OIERR:
  915.     LD    DE,ERR2        ;INPUT FILE ERROR MESSAGE
  916.     JP    ENDERR        ;ABORT
  917. ;
  918. ;  OPEN FILE FOR OUTPUT
  919. ;
  920. OPENOUT:
  921.     LD    DE,FCBZ80    ;OPEN OUTPUT FILE
  922.     LD    C,0FH
  923.     CALL    BDOS
  924.     CP    0FFH        ;ERROR?
  925.     JR    NZ,OOERR2    ;ABORT IF NO ERROR (OVERWRITE OLD FILE)
  926. OPENO1:
  927.     LD    DE,FCBZ80    ;ELSE CREATE OUTPUT FILE
  928.     LD    C,16H
  929.     CALL    BDOS
  930.     CP    0FFH        ;ERROR?
  931.     JR    Z,OOERR1
  932.     LD    DE,FCBZ80    ;NOW OPEN OUTPUT FILE (REDUNDANT WITH MAKE)
  933.     LD    C,0FH
  934.     CALL    BDOS
  935.     LD    A,80H        ;INIT COUNT OF BYTES REMAINING
  936.     LD    (OBUFBACKCNT),A    ;SET COUNT
  937.     LD    HL,OBUF        ;INIT ADDRESS OF NEXT BYTE
  938.     LD    (OBUFPTR),HL    ;SET PTR
  939.     RET
  940. OOERR1:
  941.     LD    DE,ERR3    ;DISK FULL
  942.     JP    ENDERR    ;ABORT ERROR
  943. OOERR2:
  944.     LD    DE,ERR4    ;ATTEMPT TO OVERWRITE EXISTING FILE
  945.     CALL    PMSG
  946.     LD    C,1    ;GET RESPONSE
  947.     CALL    BDOS
  948.     CALL    CAPS    ;CAPITALIZE
  949.     CP    'Y'    ;CONTINUE IF YES
  950.     LD    DE,ERR4A    ;PREP FOR ABORT
  951.     JP    NZ,ENDERR    ;ABORT ERROR
  952.     LD    DE,CRLFSTR    ;NEW LINE
  953.     CALL    PMSG
  954.     LD    DE,FCBZ80    ;DELETE OLD FILE
  955.     LD    C,19        ;BDOS DELETE FILE
  956.     CALL    BDOS
  957.     JR    OPENO1        ;CREATE NEW FILE AND CONTINUE
  958. ;
  959. ;  CHECK TO SEE IF CHAR PTED TO BY HL IS A DELIMITER AND FLUSH CHARS UNTIL
  960. ;    IT IS; RET WITH ZERO FLAG SET WHEN DONE
  961. ;
  962. FTODLM:                ;Flush TO DeLiMiter
  963.     PUSH    BC
  964.     CALL    DLIMSCAN    ;DO SCAN
  965.     POP    BC
  966.     RET    Z        ;MATCH, SO ABORT
  967.     INC    HL        ;PT TO NEXT CHAR
  968.     JR    FTODLM        ;CONTINUE SCAN
  969. ;
  970. ;  COPY (HL) TO (DE) FOR B BYTES OR UNTIL A DELIMITER IS ENCOUNTERED
  971. ;
  972. COPYTODELIM:
  973.     LD    C,B    ;LET BC=OLD B (FOR LDI INSTR)
  974.     LD    B,0
  975.     PUSH    BC    ;SAVE REGS
  976.     PUSH    DE
  977.     PUSH    HL
  978.     CALL    SPFILL    ;FILL DESTINATION BUFFER WITH SPACES (PTED TO BY DE)
  979.     POP    HL    ; ... AND C BYTES LONG
  980.     POP    DE
  981.     POP    BC
  982. CTD1:
  983.     PUSH    BC    ;SAVE COUNT
  984.     CALL    DLIMSCAN    ;SCAN FOR DELIMITER IF ENCOUNTERED
  985.     POP    BC
  986.     RET    Z    ;DONE IF SO
  987.     LDI        ;COPY NEXT CHAR INTO DESTINATION BUFFER
  988.     JP    PO,DLIMSCAN    ;FINAL DELIMITER SCAN IF DONE
  989.     JR    CTD1
  990. ;
  991. ;  ADVANCE BUFFER POINTER HL UNTIL NON-WHITE (NON-<SP>, NON-<TAB>)
  992. ;    ENCOUNTERED
  993. ;
  994. SKIPWHITE:
  995.     LD    A,(HL)    ;GET CHAR
  996.     CP    ' '    ;<SP>?
  997.     JR    Z,SKPWH1    ;SKIP IF SO
  998.     CP    9    ;<TAB>?
  999.     RET    NZ    ;DONE IF NOT
  1000. SKPWH1:
  1001.     INC    HL    ;PT TO NEXT CHAR
  1002.     JR    SKIPWHITE
  1003. ;
  1004. ;  CHECK TO SEE IF CHAR PTED TO BY HL IS A DELIMITER
  1005. ;
  1006. DLIMSCAN:
  1007.     PUSH    DE
  1008.     EX    DE,HL    ;PT TO CHAR WITH DE
  1009.     LD    HL,DLIMS    ;PT TO TABLE OF DELIMITERS
  1010.     CALL    DELIMCHS    ;DO SCAN IN GENERAL
  1011.     EX    DE,HL    ;PT TO CHAR WITH HL
  1012.     LD    A,(HL)    ;GET CHAR IN A
  1013.     POP    DE
  1014.     RET
  1015. ;
  1016. ;  TABLE OF VALID DELIMITERS
  1017. ;
  1018. DLIMS:
  1019.     DB    1,1    ;SCAN 1 BYTE AT A TIME, AND SKIP 1 BYTE IF NO MATCH
  1020.     DB    ','    ;DELIMITERS ...
  1021.     DB    ':'
  1022.     DB    '+'
  1023.     DB    '-'
  1024.     DB    '/'
  1025.     DB    '*'
  1026.     DB    ' '
  1027.     DB    ')'
  1028.     DB    ';'
  1029.     DB    0DH
  1030.     DB    9    ; ... TO HERE
  1031.     DB    0    ;END OF TABLE
  1032. ;
  1033. ;  SCAN FOR DELIMITER -- RETURN WITH NZ IF NOT FOUND OR PT TO DELIMITER
  1034. ;    WITH Z IF FOUND; ON INPUT, TABLE PTED TO BY HL WITH 1ST 2 BYTES
  1035. ;    GIVING NUMBER OF BYTES TO CHECK AND NUMBER OF BYTES TO SKIP, RESP,
  1036. ;    ON EACH PARTIAL SCAN
  1037. ;
  1038. DELIMCHS:
  1039.     CALL    SPCHSCAN    ;DO SCAN OF TABLE
  1040.     RET    NZ    ;NOT FOUND
  1041.     LD    C,B    ;CHAR OFFSET COUNT IN BC
  1042.     LD    B,0
  1043.     ADD    HL,BC    ;PT TO CHAR
  1044.     SUB    A    ;SET ZERO FLAG
  1045.     RET
  1046. ;
  1047. ;  SCAN SPECIAL CHAR TABLE PTED TO BY HL FOR STRING PTED TO BY DE;
  1048. ;    NUMBER OF SIGNIFICANT BYTES TO SCAN AS FIRST ENTRY IN TABLE,
  1049. ;    NUMBER OF BYTES TO SKIP ON FAILURE AS 2ND ENTRY IN TABLE;
  1050. ;    TABLE ENDS IN A BINARY 0
  1051. ;
  1052. SPCHSCAN:
  1053.     LD    B,(HL)    ;B=NUMBER OF BYTES TO SCAN
  1054.     INC    HL
  1055.     LD    C,(HL)    ;C=NUMBER OF BYTES TO SKIP ON FAILURE
  1056.     INC    HL    ;PT TO FIRST VALID BYTE IN TABLE
  1057. ;
  1058. ;  MAIN SCANNING LOOP
  1059. ;
  1060. SPCH1:
  1061.     LD    A,(HL)    ;CHECK FOR END OF TABLE
  1062.     AND    A    ;ZERO?
  1063.     JR    Z,SPCH2    ;DONE IF SO
  1064.     CALL    COMPHLDE    ;DO COMPARE
  1065.     RET    Z    ;RETURN IF MATCH
  1066.     LD    A,C    ;POINT TO NEXT TABLE ENTRY
  1067.     CALL    ADDHLA    ;HL=HL+(SIZE OF TABLE ENTRY)
  1068.     JR    SPCH1
  1069. ;
  1070. ;  NO MATCH -- RETURN NZ
  1071. ;
  1072. SPCH2:
  1073.     INC    A    ;A=1 AND NZ
  1074.     RET
  1075. ;
  1076. ;  COMPARE CHARS PTED TO BY DE WITH THAT PTED TO BY HL FOR B BYTES
  1077. ;    RET WITH ZERO FLAG SET IF COMPLETE MATCH, NZ IF NO MATCH;
  1078. ;    HL, DE, BC NOT AFFECTED
  1079. ;
  1080. COMPHLDE:
  1081.     PUSH    HL    ;SAVE REGS
  1082.     PUSH    DE
  1083.     PUSH    BC
  1084. CMPHD1:
  1085.     LD    A,(DE)    ;GET DE CHAR
  1086.     CP    (HL)    ;COMPARE TO HL CHAR
  1087.     JR    NZ,CMPHD2    ;NO MATCH
  1088.     INC    HL    ;PT TO NEXT
  1089.     INC    DE
  1090.     DJNZ    CMPHD1    ;COUNT DOWN -- ZERO FLAG SET ON END
  1091. CMPHD2:
  1092.     POP    BC    ;RESTORE REGS
  1093.     POP    DE
  1094.     POP    HL
  1095.     RET
  1096. ;
  1097. ;  HL=HL+A
  1098. ;
  1099. ADDHLA:
  1100.     ADD    A,L    ;DO IT
  1101.     LD    L,A
  1102.     RET    NC
  1103.     INC    HL
  1104.     RET
  1105. ;
  1106. ;  FILL MEMORY PTED TO BY DE WITH SPACES FOR BC BYTES
  1107. ;
  1108. SPFILL:
  1109.     LD    A,' '    ;<SP>
  1110.     LD    (DE),A    ;STORE FIRST <SP>
  1111.     LD    H,D    ;MAKE HL PT TO 1ST <SP>
  1112.     LD    L,E
  1113.     INC    DE    ;DE PTS TO NEXT BYTE
  1114.     DEC    BC    ;BC IS 1 BYTE LESS
  1115.     LDIR        ;COPY USING LDIR
  1116.     RET
  1117. ;
  1118. ;  OUTPUT CHAR IN A TO DISK FILE
  1119. ;
  1120. DOUTCHAR:
  1121.     PUSH    HL        ;SAVE REGS
  1122.     PUSH    DE
  1123.     PUSH    BC
  1124.     PUSH    AF
  1125.     LD    HL,(OBUFPTR)    ;GET ADDRESS OF NEXT CHAR POS IN OUT BUFFER
  1126.     LD    (HL),A        ;STORE CHAR INTO OUT BUFFER
  1127.     CP    9        ;CHECK FOR TAB
  1128.     JR    NZ,NOTABOUT    ;NOT TAB -- DON'T UPDATE COUNT
  1129.     LD    A,(OBUFLPOS)    ;TAB -- UPDATE LOCATION IN LINE
  1130.     DEC    A        ;A=OUT BUFFER LINE POSITION - 1
  1131.     AND    0F8H        ;MASK FOR TAB
  1132.     ADD    A,9        ;AND ADD 9
  1133.     JR    DOUT1
  1134. ;  NOT A TAB -- JUST INCR POSITION COUNT
  1135. NOTABOUT:
  1136.     LD    A,(OBUFLPOS)    ;GET ADDRESS OF NEXT CHAR POS IN OUT BUFFER
  1137.     INC    A        ;ADD 1 TO IT
  1138. DOUT1:
  1139.     LD    (OBUFLPOS),A    ;UPDATE OUT BUFFER LINE POSITION
  1140.     INC    HL        ;INCREMENT BUFFER PTR
  1141.     LD    A,(OBUFBACKCNT)    ;GET BUFFER BYTE COUNT
  1142.     DEC    A        ;BUFFER NOW FULL?
  1143.     JR    NZ,DOUT2    ;CONTINUE IF NOT
  1144.     LD    DE,OBUF        ;WRITE BUFFER TO DISK IF SO
  1145.     LD    C,1AH        ;SET DMA ADDRESS
  1146.     CALL    BDOS
  1147.     LD    DE,FCBZ80    ;WRITE BLOCK
  1148.     CALL    WRITEBLK
  1149.     LD    HL,OBUF        ;RESET OUTPUT BUFFER PTR TO 1ST BYTE
  1150.     LD    A,80H        ;RESET BUFFER BYTE COUNT
  1151. DOUT2:
  1152.     LD    (OBUFPTR),HL    ;UPDATE OUTPUT BUFFER PTR
  1153.     LD    (OBUFBACKCNT),A    ;UPDATE BUFFER BYTE COUNT
  1154.     POP    AF        ;RESTORE REGS
  1155.     POP    BC
  1156.     POP    DE
  1157.     POP    HL
  1158.     RET
  1159. ;
  1160. ;  WRITE BLOCK WHOSE FCB IS PTED TO BY DE TO DISK
  1161. ;
  1162. WRITEBLK:
  1163.     LD    C,15H    ;CP/M BDOS WRITE BLOCK
  1164.     CALL    BDOS
  1165.     AND    A    ;ERROR?
  1166.     RET    Z    ;OK IF NONE
  1167.     LD    DE,ERR1    ;ELSE PRINT ERROR MESSAGE AND ABORT
  1168.     JP    ENDERR
  1169. ;
  1170. ;  FILL LAST BLOCK WITH ^Z AND CLOSE OUTPUT FILE
  1171. ;
  1172. CTRLZFILL:
  1173.     LD    A,(OBUFBACKCNT)    ;GET REMAINING COUNT
  1174.     CP    80H        ;FULL?
  1175.     JR    Z,CLOSEOUT    ;CLOSE FILE THEN
  1176.     LD    A,1AH        ;ELSE WRITE ^Z
  1177.     CALL    DOUTCHAR
  1178.     JR    CTRLZFILL
  1179. ;
  1180. ;  CLOSE OUTPUT FILE
  1181. ;
  1182. CLOSEOUT:
  1183.     LD    DE,FCBZ80    ;OUTPUT FCB
  1184.     LD    C,10H    ;CLOSE FILE
  1185.     JP    BDOS
  1186. ;
  1187. ;  EXTRACT NEXT INPUT LINE FOR DISK FILE AND PLACE IT AS A 0-TERMINATED
  1188. ;    STRING IN BUFFER 'INLN'
  1189. ;
  1190. BUILDLINE:
  1191.     CALL    PDOT    ;PRINT ACTIVITY DOT
  1192.     XOR    A    ;A=FALSE OR 0
  1193.     LD    (INCMT),A    ;TURN IN COMMENT FLAG OFF
  1194.     LD    (INQUOTE),A    ;TURN IN QUOTE FLAG OFF
  1195.     LD    HL,INLN    ;PT TO INLN BUFFER
  1196.     LD    B,80    ;80 CHARS MAX
  1197. ;
  1198. ;  MAIN BUILD LOOP
  1199. ;
  1200. NXTLCHAR:
  1201.     LD    DE,(IBUFPTR)    ;PT TO NEXT CHAR IN FILE
  1202.     LD    A,(IBUFCNT)    ;CHECK TO SEE IF BUFFER EMPTY
  1203.     CP    80H        ;80H IF SO
  1204.     JR    NZ,PUTCHAR    ;NOT EMPTY, SO PLACE CHAR IN LINE
  1205.     EXX            ;SAVE REGS
  1206.     LD    DE,IBUFFER    ;READ NEXT BLOCK FROM INPUT FILE
  1207.     LD    C,1AH        ;SET DMA ADDRESS
  1208.     CALL    BDOS
  1209.     LD    DE,FCBASM    ;READ THE BLOCK
  1210.     LD    C,14H
  1211.     CALL    BDOS
  1212.     DEC    A        ;ERROR?
  1213.     JP    Z,ENDALL    ;DONE IF SO (ASSUME EOF)
  1214.     EXX            ;GET REGS BACK
  1215.     LD    DE,IBUFFER    ;SET PTR TO 1ST BYTE OF BLOCK
  1216.     SUB    A        ;CHAR COUNT = 0
  1217. ;
  1218. ;  PLACE CHAR PTED TO BE DE INTO INLN
  1219. ;
  1220. PUTCHAR:
  1221.     LD    (IBUFCNT),A    ;SAVE CHAR COUNT
  1222.     LD    A,(DE)        ;GET CHAR
  1223.     INC    DE        ;PT TO NEXT
  1224.     LD    (IBUFPTR),DE    ;SAVE PTR
  1225.     PUSH    HL
  1226.     LD    HL,IBUFCNT    ;INCR CHAR COUNT
  1227.     INC    (HL)
  1228.     POP    HL
  1229.     CALL    PCAPS        ;CAPITALIZE CHAR OPTIONALLY
  1230.     LD    (HL),A        ;SAVE CHAR FROM FILE INTO INLN
  1231.     CP    0DH        ;END OF LINE?
  1232.     JR    Z,ENDBLINE    ;DONE IF SO
  1233.     CP    9        ;TAB EXPAND?
  1234.     JR    Z,CONTBLINE    ;PROCESS AS NORMAL CHAR IF SO
  1235.     CP    ' '    ;LESS THAN <SP>?
  1236.     JR    C,NXTLCHAR    ;DON'T PROCESS IF SO
  1237. CONTBLINE:
  1238.     DEC    B    ;IS BUFFER FULL?
  1239.     INC    HL    ;PT TO NEXT CHAR IN INLN BUFFER
  1240.     JR    NZ,NXTLCHAR    ;CONTINUE PROCESSING IF NOT FULL
  1241.     INC    B    ;WRITE OVER LAST CHAR FOR REST OF LINE
  1242.     DEC    HL
  1243.     JR    NXTLCHAR    ;CONTINUE
  1244. ;
  1245. ;  OPTIONALLY CAPITALIZE CHAR IN A
  1246. ;
  1247. PCAPS:
  1248.     PUSH    AF    ;SAVE CHAR
  1249.     LD    A,(INCMT)    ;IN A COMMENT?
  1250.     OR    A    ;0=NO
  1251.     JR    NZ,PCAPS5    ;DONE IF SO AND DON'T CAPITALIZE
  1252.     LD    A,(INQUOTE)    ;IN A QUOTE?
  1253.     OR    A    ;0=NO
  1254.     JR    NZ,PCAPS1    ;DON'T CAPITALIZE IF SO
  1255.     POP    AF    ;NOT IN COMMENT OR QUOTE, SO CAPITALIZE
  1256.     CALL    CAPS
  1257.     JR    PCAPS2
  1258. PCAPS1:
  1259.     POP    AF    ;GET CHAR
  1260. PCAPS2:
  1261.     CP    ';'    ;COMING INTO A COMMENT?
  1262.     JR    NZ,PCAPS3
  1263.     PUSH    AF    ;SAVE CHAR
  1264.     LD    A,0FFH    ;SET INCMT FLAG
  1265.     LD    (INCMT),A
  1266.     JR    PCAPS5    ;DONE
  1267. PCAPS3:
  1268.     PUSH    AF    ;SAVE CHAR
  1269.     LD    A,(INQUOTE)    ;IN A QUOTE?
  1270.     OR    A    ;0=NO
  1271.     JR    Z,PCAPS4
  1272.     POP    AF    ;GET CHAR -- WE ARE IN A QUOTE
  1273.     PUSH    AF    ;SAVE IT AGAIN
  1274.     CP    ''''    ;ARE WE LEAVING THE QUOTE?
  1275.     JR    NZ,PCAPS5
  1276.     XOR    A    ;A=0
  1277.     LD    (INQUOTE),A    ;YES, SO SET NOT IN QUOTE
  1278.     JR    PCAPS5
  1279. PCAPS4:
  1280.     POP    AF    ;GET CHAR
  1281.     PUSH    AF    ;SAVE CHAR ONE LAST TIME
  1282.     CP    ''''    ;COMING INTO A QUOTE?
  1283.     JR    NZ,PCAPS5
  1284.     LD    A,0FFH    ;SET INQUOTE FLAG
  1285.     LD    (INQUOTE),A
  1286. PCAPS5:
  1287.     POP    AF    ;GET CHAR
  1288.     RET        ;DONE
  1289. ;
  1290. ;  STORE ENDING <LF> AND <NULL>
  1291. ;
  1292. ENDBLINE:
  1293.     INC    HL        ;PT TO NEXT POSITION
  1294.     LD    (HL),0AH    ;STORE <LF>
  1295.     INC    HL
  1296.     LD    (HL),0        ;STORE <NULL>
  1297.     LD    (IBUFPTR),DE    ;SAVE INPUT FILE PTR
  1298. ;
  1299. ;  IF LINE STARTS WITH AN ASTERISK (COMMENT LINE), MAKE IT START WITH A
  1300. ;    SEMICOLON
  1301. ;
  1302.     LD    A,(INLN)    ;LOOK AT FIRST CHAR
  1303.     CP    '*'        ;ASTERISK?
  1304.     JR    NZ,ENDBL1
  1305.     LD    A,';'        ;REPLACE WITH SEMICOLON
  1306.     LD    (INLN),A
  1307. ;
  1308. ;  CHECK FOR EMPTY LINE AND JUST OUTPUT NEW LINE IF SO; ELSE RETURN
  1309. ;
  1310. ENDBL1:
  1311.     LD    A,B        ;LINE EMPTY?
  1312.     SUB    80        ;START OVER IF SO
  1313.     RET    NZ        ;DONE IF NOT EMPTY
  1314.     LD    A,0DH        ;OUTPUT <CR> <LF> TO FILE FOR EMPTY LINE
  1315.     CALL    DOUTCHAR
  1316.     LD    A,0AH
  1317.     CALL    DOUTCHAR
  1318.     JP    BUILDLINE    ;DO NEXT LINE
  1319. ;
  1320. ;  CAPITALIZE CHAR IN A
  1321. ;
  1322. CAPS:
  1323.     AND    7FH        ;MASK OUT MSB
  1324.     CP    61H        ;DO NOTHING IF LESS THAN SMALL A
  1325.     RET    C
  1326.     CP    7AH+1        ;CAP IF BETWEEN SMALL A AND Z, RESP
  1327.     RET    NC
  1328.     AND    5FH        ;CAPITALIZE
  1329.     RET
  1330. ;
  1331. ;  END OF PROCESSING
  1332. ;
  1333. ENDALL:
  1334.     CALL    CTRLZFILL    ;FILL BUFFER WITH ^Z
  1335.     LD    DE,ERR5ON    ;OPTIONALLY PRINT EACH ERROR MESSAGE IF SET
  1336.     CALL    PMSG
  1337.     LD    DE,XLT1ON
  1338.     CALL    PMSG
  1339.     LD    DE,XLT2ON
  1340.     CALL    PMSG
  1341.     LD    DE,XLT3ON
  1342.     CALL    PMSG
  1343.     LD    DE,XLT4ON
  1344.     CALL    PMSG
  1345.     LD    DE,MSG2
  1346. ;
  1347. ;  PRINT MESSAGE PTED TO BY DE WITH PRECEEDING <CRLF> AND FINISH UP
  1348. ;
  1349. ENDERR:
  1350.     PUSH    DE    ;SAVE PTR
  1351.     LD    DE,CRLFSTR    ;PRINT <CRLF>
  1352.     CALL    PMSG
  1353.     POP    DE
  1354.     CALL    PMSG    ;PRINT MESSAGE
  1355.     JP    WBOOT    ;DONE
  1356. ;
  1357. ;  PRINT STRING PTED TO BY DE AND ENDING IN 0
  1358. ;
  1359. PMSG:
  1360.     LD    A,(DE)    ;GET CHAR
  1361.     AND    A    ;ENDING 0?
  1362.     RET    Z    ;DONE IF SO
  1363.     CALL    PCHAR    ;OUTPUT CHAR IN A
  1364.     INC    DE    ;PT TO NEXT CHAR
  1365.     JR    PMSG    ;CONTINUE
  1366. ;
  1367. ;  PRINT CHAR IN A ON CON:
  1368. ;
  1369. PCHAR:
  1370.     PUSH    AF    ;SAVE REGS
  1371.     PUSH    BC
  1372.     PUSH    DE
  1373.     PUSH    HL
  1374.     LD    E,A    ;CHAR IN E
  1375.     LD    C,2    ;CON: OUTPUT
  1376.     CALL    BDOS
  1377.     POP    HL    ;RESTORE REGS
  1378.     POP    DE
  1379.     POP    BC
  1380.     POP    AF
  1381.     RET
  1382.  
  1383. ;
  1384. ;  **** OP CODE TABLE, MESSAGE, AND BUFFER AREA ****
  1385. ;
  1386.  
  1387. ;
  1388. ;  OP CODE TABLES
  1389. ;
  1390. OCS1:
  1391.     DB    'ANI  AND  '
  1392.     DB    'CMA  CPL  '
  1393.     DB    'CMC  CCF  '
  1394.     DB    'CPI  CP   '
  1395.     DB    'HLT  HALT '
  1396.     DB    'JMP  JP   '
  1397.     DB    'ORI  OR   '
  1398.     DB    'RAL  RLA  '
  1399.     DB    'RAR  RRA  '
  1400.     DB    'RLC  RLCA '
  1401.     DB    'RRC  RRCA '
  1402.     DB    'STC  SCF  '
  1403.     DB    'SUI  SUB  '
  1404.     DB    'XRI  XOR  '
  1405. POPS:
  1406.     DB    'DB   DEFB '
  1407.     DB    'DS   DEFS '
  1408.     DB    'DW   DEFW '
  1409.     DB    'SET  DEFL '
  1410. NOXLT:
  1411.     DB    'ENT  ENTRY'
  1412.     DB    'NAM  NAME '
  1413.     DB    'RAM  DATA '
  1414.     DB    'ROG  REL  '
  1415.     DB    0        ;END OF TABLE FOR OCS 1
  1416. OCS2:
  1417.     DB    'ANA  AND  '
  1418.     DB    'CMP  CP   '
  1419.     DB    'DCR  DEC  '
  1420.     DB    'INR  INC  '
  1421.     DB    'MVI  LD   '
  1422.     DB    'ORA  OR   '
  1423.     DB    'SUB  SUB  '
  1424.     DB    'XRA  XOR  '
  1425.     DB    0        ;END OF TABLE FOR OCS 2
  1426. OCS3:
  1427.     DB    'DCX  DEC  '
  1428.     DB    'INX  INC  '
  1429.     DB    'LXI  LD   '
  1430.     DB    'POP  POP  '
  1431.     DB    'PUSH PUSH '
  1432.     DB    0        ;END OF TABLE FOR OCS 3
  1433. OCS4:
  1434.     DB    'REQ  RNE  RLT  RGE  CEQ '
  1435.     DB    ' CNE  CLT  CGE  JEQ  JNE '
  1436.     DB    ' JLT  JGE  '
  1437.     DB    0        ;END OF TABLE FOR OCS 4
  1438. RETS:
  1439.     DB    'RC   RNC  RZ   RNZ  RP  '
  1440.     DB    ' RM   RPE  RPO  '
  1441.     DB    0        ;END OF TABLE FOR RETS
  1442. CALLS:
  1443.     DB    'CC   CNC  CZ   CNZ  CP  '
  1444.     DB    ' CM   CPE  CPO  '
  1445.     DB    0        ;END OF TABLE FOR CALLS
  1446. JMPS:
  1447.     DB    'JC   JNC  JZ   JNZ  JP  '
  1448.     DB    ' JM   JPE  JPO  '
  1449.     DB    0        ;END OF TABLE FOR JMPS
  1450. OCS8:
  1451.     DB    'DAD  ADD  '
  1452.     DW    DO81
  1453.     DB    'ADD  ADD  '
  1454.     DW    DO82
  1455.     DB    'ADC  ADC  '
  1456.     DW    DO82
  1457.     DB    'SBB  SBC  '
  1458.     DW    DO82
  1459.     DB    'ADI  ADD  '
  1460.     DW    DO82
  1461.     DB    'ACI  ADC  '
  1462.     DW    DO82
  1463.     DB    'SBI  SBC  '
  1464.     DW    DO82
  1465.     DB    'IN   IN   '
  1466.     DW    DO83
  1467.     DB    'LDA  LD   '
  1468.     DW    DO83
  1469.     DB    'LDAX LD   '
  1470.     DW    DO84
  1471.     DB    'LHLD LD   '
  1472.     DW    DO85
  1473.     DB    'MOV  LD   '
  1474.     DW    DO86
  1475.     DB    'PCHL JP   '
  1476.     DW    DO88
  1477.     DB    'RST  RST  '
  1478.     DW    DO89
  1479.     DB    'SHLD LD   '
  1480.     DW    DO8A
  1481.     DB    'SPHL LD   '
  1482.     DW    DO8B
  1483.     DB    'STA  LD   '
  1484.     DW    DO8C
  1485.     DB    'OUT  OUT  '
  1486.     DW    DO8C
  1487.     DB    'STAX LD   '
  1488.     DW    DO8D
  1489.     DB    'XCHG EX   '
  1490.     DW    DO8E
  1491.     DB    'XTHL EX   '
  1492.     DW    DO8F
  1493. NOXLT2:
  1494.     DB    'IFC  IF   '
  1495.     DW    DO91
  1496.     DB    'ICL  *INCL'
  1497.     DW    DO92
  1498.     DB    'LST  LIST '
  1499.     DW    DO93
  1500.     DB    'MAC  MACRO'
  1501.     DW    DO94
  1502.     DB    0        ;END OF TABLE FOR OCS8 AND NOXLT2
  1503. ;
  1504. ;  VARIOUS MESSAGES AND PROGRAM HEADER
  1505. ;
  1506. HEADER:
  1507.     DB    'XLATE2 -- 8080-to-Z80 Translator, Version '
  1508.     DB    VERS/10+'0','.',(VERS MOD 10)+'0'
  1509.     DB    0DH,0AH,0
  1510. ;  HELP MESSAGES
  1511. HMSG1:
  1512.     DB    0DH,0AH,0AH
  1513.     DB    '   XLATE2 translates 8080 assembly language source',0DH,0AH
  1514.     DB    'code into Zilog-Standard Z80 assembly language',0DH,0AH
  1515.     DB    'source code.  It is invoked by a command of the',0DH,0AH
  1516.     DB    'following form:',0DH,0AH,0AH
  1517.     DB    '      XLATE2 d:SRCFILE.typ d:destfile.typ',0DH,0AH,0AH
  1518.     DB    '   All characters in lower case are optional, and,',0DH,0AH
  1519.     DB    'if omitted, the following values are assumed:',0DH,0AH,0AH
  1520.     DB    '   . The Source File will have a type of ASM',0DH,0AH
  1521.     DB    '   . The Destination File will have the same name',0DH,0AH
  1522.     DB    '      as the Source File',0DH,0AH
  1523.     DB    '   . The Destination File will have a type of MAC',0DH,0AH,0AH
  1524.     DB    'Type <RETURN> to Continue - ',0
  1525. HMSG2:
  1526.     DB    0DH,0AH,0AH
  1527.     DB    'The following are examples of its use:',0DH,0AH,0AH
  1528.     DB    '      XLATE2 DEMO1 <-- Translates DEMO1.ASM to DEMO1.MAC'
  1529.     DB    0DH,0AH
  1530.     DB    '      XLATE2 DEMO1 DEMO2 <-- DEMO1.ASM to DEMO2.MAC'
  1531.     DB    0DH,0AH
  1532.     DB    '      XLATE2 DEMO1.TXT DEMO2.GGG <-- DEMO1.TXT to DEMO2.GGG'
  1533.     DB    0DH,0AH,0AH
  1534.     DB    'The following functions are also performed by XLATE2:'
  1535.     DB    0DH,0AH,0AH
  1536.     DB    '   . The M80 Pseudo-Ops .Z80 and ASEG will be inserted '
  1537.     DB    'at the front',0DH,0AH
  1538.     DB    '      of the MAC File',0DH,0AH
  1539.     DB    '   . The text in the Destination File will be '
  1540.     DB    'capitalized',0DH,0AH
  1541.     DB    '   . All comment lines beginning with an asterisk will '
  1542.     DB    'begin with',0DH,0AH
  1543.     DB    '      a semicolon instead',0DH,0AH,0AH
  1544.     DB    0
  1545. ;  FILE NAME MESSAGES
  1546. PRFNM1:
  1547.     DB    'Source File: ',0
  1548. PRFNM2:
  1549.     DB    '    Destination File: ',0
  1550. ;  FIRST TWO LINES OF MAC FILE
  1551. FHDR:
  1552.     DB    9,'.Z80',0DH,0AH    ;USE ZILOG MNEMONICS
  1553.     DB    9,'ASEG',0DH,0AH    ;USE ABSOLUTE SEGMENTS
  1554.     DB    0
  1555. ERR1:
  1556.     DB    'Output File Write Error',0DH,0AH,7,0
  1557. ERR2:
  1558.     DB    'No Source File Found',0DH,0AH,7,0
  1559. ERR3:
  1560.     DB    'No Directory Space',0DH,0AH,7,0
  1561. ERR4:
  1562.     DB    'Output File Already Exists -- Delete It and Continue (Y/N)? '
  1563.     DB    0
  1564. ERR4A:
  1565.     DB    'XLATE2 Aborting to CP/M',0
  1566. MSG2:
  1567.     DB    'XLATE2 Processing Complete',0
  1568. CRLFSTR:
  1569.     DB    0DH,0AH,0
  1570. ;
  1571. ;  VARIOUS ERROR MESSAGES
  1572. ;
  1573. ERR5ON:
  1574.     DB    0    ;THIS BYTE IS SET TO <CR> IF STRING ENABLED
  1575. ERR5:
  1576.     DB    0AH
  1577.     DB    'The following pseudo-ops '
  1578.     DB    'have been used in your source '
  1579.     DB    'and have not',0DH,0AH
  1580.     DB    'been '
  1581.     DB    'fully translated.  You must '
  1582.     DB    'complete the translation '
  1583.     DB    'using an editor.',0DH,0AH
  1584.     DB    9,'Original:',9,9,'Must Be Translated To:',0DH,0AH
  1585.     DB    0    ;END OF STRING
  1586. XLT1ON:
  1587.     DB    0    ;THIS BYTE IS SET TO <TAB> IF STRING ENABLED
  1588. XLT1:
  1589.     DB    '#ENDIF',9,9,9,'ENDIF',0DH,0AH,0
  1590. XLT2ON:
  1591.     DB    0    ;THIS BYTE IS SET TO <TAB> IF STRINGENABLED
  1592. XLT2:
  1593.     DB    'ICL',9,9,9,'*INCLUDE',0DH,0AH,0
  1594. XLT3ON:
  1595.     DB    0    ;THIS BYTE IS SET TO <TAB> IF STRING ENABLED
  1596. XLT3:
  1597.     DB    'LST  <operands>',9,9,'LIST <valid ASMB operands>'
  1598.     DB    0DH,0AH,0
  1599. XLT4ON:
  1600.     DB    0    ;THIS BYTE IS SET TO <TAB> IF STRING ENABLED
  1601. XLT4:
  1602.     DB    'MAC <$parameters>',9,'MACRO <#parameters>',0DH,0AH
  1603.     DB    9,'[ ... ]',9,9,9,'MEND',0DH,0AH
  1604.     DB    9,'#macro-call',9,9,'macro-call',0DH,0AH,0
  1605. ;
  1606. ;  INPUT FILE FCB
  1607. ;
  1608. FCBASM:
  1609.     DB    0,0,0,0,0,0,0,0,0,'ASM',0
  1610.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  1611.     DB    0,0,0,0,0,0,0
  1612. ;
  1613. ;  OUTPUT FILE FCB
  1614. ;
  1615. FCBZ80:
  1616.     DB    0,0,0,0,0,0,0,0,0,'MAC',0
  1617.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0
  1618.     DB    0,0,0,0,0,0,0
  1619. ;
  1620. ;  BUFFERS
  1621. ;
  1622. ;  STACK AREA
  1623.     DS    128
  1624. ;  CURRENT POSITION IN LINE OF OUTPUT BUFFER
  1625. OBUFLPOS:
  1626.     DS    1
  1627. ;  COUNTER FOR EVERY 10 LINES
  1628. LCOUNT:
  1629.     DS    1
  1630. ;  COUNTER FOR EVERY 60*10 LINES
  1631. NLCOUNT:
  1632.     DS    1
  1633. ;  IN COMMENT FLAG -- 0 MEANS NOT
  1634. INCMT:
  1635.     DS    1
  1636. ;  IN QUOTE FLAG -- 0 MEANS NOT
  1637. INQUOTE:
  1638.     DS    1
  1639. ;  PTR TO TARGET OP CODE IN INPUT LINE
  1640. ILTOP:
  1641.     DS    2
  1642. ;  OP CODE TO MATCH AGAINST
  1643. TARGOP:
  1644.     DS    5
  1645. ;  PTR TO CURRENT POSITION IN CURRENT INPUT LINE
  1646. INLNPTR:
  1647.     DS    2
  1648. ;  PTR TO CURRENT POSITION IN OUTPUT BUFFER (BLOCK)
  1649. OBUFPTR:
  1650.     DS    2
  1651. ;  COUNT OF CHARS REMAINING IN OUTPUT BUFFER
  1652. OBUFBACKCNT:
  1653.     DS    1
  1654. ;  OUTPUT BUFFER (BLOCK)
  1655. OBUF:
  1656.     DS    128
  1657. ;  CURRENT INPUT LINE BUFFER
  1658. INLN:
  1659.     DS    80    ;80 CHARS IN LINE
  1660.     DS    3    ;3 EXTRA FOR <CR> <LF> <NULL>
  1661. ;  PTR TO CURRENT POSITION IN INPUT BUFFER
  1662. IBUFPTR:
  1663.     DS    2
  1664. ;  COUNT OF NUMBER OF CHARS LEFT IN INPUT BUFFER
  1665. IBUFCNT:
  1666.     DS    1
  1667. ;  INPUT BUFFER (BLOCK)
  1668. IBUFFER:
  1669.     DS    128
  1670.  
  1671.     END
  1672.