home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / p / z80asm.lbr / Z80MAIN.AZM / Z80MAIN.ASM
Encoding:
Assembly Source File  |  1993-10-25  |  27.5 KB  |  1,140 lines

  1. ;-----------------------------------------------;
  2. ;    Z80 RESIDENT ASSEMBLER            ;
  3. ;-----------------------------------------------;
  4. ;                        ;
  5. ;    (C) COPYRIGHT 1977            ;
  6. ;    LEHMAN CONSULTING SERVICES        ;
  7. ;                        ;
  8. ;    ALL RIGHTS RESERVED            ;
  9. ;                        ;
  10. ;-----------------------------------------------;
  11. ;                        ;
  12. ;    MAIN ASSEMBLER MODULE            ;
  13. ;                        ;
  14. ;-----------------------------------------------;
  15. ;                        ;
  16. ;    REV 0    14-JULY-1977    MGL        ;
  17. ;    REV 1    20-OCT-77    MGL        ;
  18. ;                        ;
  19. ;-----------------------------------------------;
  20. ;
  21. ;
  22.     ORG    100H        ;MAIN MODULE
  23. ;
  24.     JMP    Z80ASM        ;CP/M ENTRY POINT BRANCH
  25. ;
  26. ;    EJECT
  27. ;-----------------------------------------------;
  28. ;                        ;
  29. ;    CPMUTIL LINKAGE             ;
  30. ;                        ;
  31. ;-----------------------------------------------;
  32. ;
  33.     ORG    103H        ;JUMP TABLE BASE ADDRESS
  34. ;
  35. ;
  36. ;    FOR AN EXPLANATION OF THESE ROUTINES SEE CPMUTIL ASSEMBLY
  37. ;
  38. ;
  39. WLINE    DS    3
  40. WMSG    DS    3
  41. DSKSEL    DS    3
  42. OPNFIL    DS    3
  43. CLSFIL    DS    3
  44. DELFIL    DS    3
  45. DREAD    DS    3
  46. DWRITE    DS    3
  47. CREFIL    DS    3
  48. DMASET    DS    3
  49. MOVE    DS    3
  50. CMPCHR    DS    3
  51. CMPHD    DS    3
  52. MUL16    DS    3
  53. GNB    DS    3
  54. WNB    DS    3
  55. GNB2    DS    3
  56. WNB2    DS    3
  57. CNV2HX    DS    3
  58. ;
  59. ;
  60. ;    CPMUTIL DATA AREA - FOR MORE DETAIL SEE CPMUTIL LISTING
  61. ;
  62. ;
  63. FCB1    DS    33
  64. FCB2    DS    33
  65. IBP    DS    2
  66. IBP2    DS    1
  67. OBP    DS    1
  68. OBP2    DS    1
  69. IBUF    DS    2
  70. OBUF    DS    2
  71. IBUF2    DS    2
  72. OBUF2    DS    2
  73. INBUF    DS    1024
  74. OUTBUF    DS    128
  75. INBUF2    DS    128
  76. OUTBF2    DS    128
  77. ;
  78. ;    EJECT
  79. ;-----------------------------------------------;
  80. ;    Z80SUBS LINKAGE AREA            ;
  81. ;-----------------------------------------------;
  82. ;
  83.     ORG    980H
  84. ;
  85. ;    FOR A MORE DETAILED DESCRIPTION OF THESE FIELDS SEE Z80SUBS LISTING
  86. ;
  87. HDRBUF    DS    16
  88. REC    DS    80
  89. PC    DS    2
  90. OBJ    DS    32
  91. OBJCNT    DS    1
  92. LEN    DS    1
  93. VAL    DS    2
  94. INST    DS    80
  95. EOM    DS    1
  96. PTR1    DS    2
  97. PASSNO    DS    1
  98. IDBUF    DS    16
  99. INTBUF    DS    2
  100. CURLNE    DS    1
  101. LEN2    DS    2
  102. LBLADR    DS    2
  103. EQUFLG    DS    1
  104. EQUVAL    DS    2
  105. ENDADR    DS    2
  106. EFLG    DS    1
  107. OPCODE    DS    2
  108. SAVVAL    DS    2
  109. LFLAG    DS    1
  110. HFLAG    DS    1
  111. ERRFLG    DS    1
  112. TEMP    DS    2
  113. MULT    DS    2
  114. SYMPTR    DS    2
  115. SYMPT    DS    2
  116. UFLAG    DS    1
  117. EVFLGS    DS    1    ;FLAGS FROM LAST SYMLUK
  118. EVFLAGS    EQU    EVFLGS
  119. ;
  120. ;
  121. ;    Z80SUBS JUMP TABLE
  122. ;
  123. EVAL    DS    3
  124. ID    DS    3
  125. INT    DS    3
  126. SETUP    DS    3
  127. SYMENT    DS    3
  128. SYMLUK    DS    3
  129. GNR    DS    3
  130. GNC    DS    3
  131. BACKUP    DS    3
  132. ;
  133. ;    EJECT
  134. ;
  135. ;    LOCAL DATA AREA FOR ASSEMBLER
  136. ;
  137.     ORG    0E80H
  138. SYMAREA    DS    15    ;AREA FOR SYMBOL TABLE BUILD
  139. SYMADR    DS    2    ;ADDRESS OF VALUE LOW FIELD FOR LAST SYMENT
  140. OLDADR    DW    -1    ;LAST ADDR OF WOBJ
  141. OBJADR    DS    2
  142. PAGENO    DS    1
  143. ;
  144. RNAME    EQU    20H    ;FLAG BIT - REGISTER NAME
  145. RPNAME    EQU    80H    ;FLAG BIT - REGISTER PAIR NAME
  146. ;
  147. ;
  148. MAXLNE    EQU    55    ;LINES PER PAGE
  149. ;:::::::::::::::::::::::::::::::::::::::::::::::;
  150. ;                        ;
  151. ;    SYMBOL TABLE ADDRESS EQUATES        ;
  152. ;                        ;
  153. ;:::::::::::::::::::::::::::::::::::::::::::::::;
  154. ;
  155. SYMBEG    EQU    1F80H    ;POINTER TO FIRST USABLE ENTRY
  156. SYMCND    EQU    SYMBEG+2    ;POINTER TO COND CODE TABLE
  157. SYM    EQU    SYMCND+2    ;ACTUAL BEGINING ADDRESS FOR SEARCHES
  158. ;
  159. ;
  160. ;
  161. ;
  162. ;    EJECT
  163. ;-----------------------------------------------;
  164. ;                        ;
  165. ;    Z 8 0 A S M  - RESIDENT Z80 ASSEMBLER    ;
  166. ;                        ;
  167. ;    WRITTEN IN 8080 ASSEMBLY LANGUAGE    ;
  168. ;    TO BE ASSEMBLED BY THE CP/M ASSEMBLER    ;
  169. ;                        ;
  170. ;    AUTHOR: MICHAEL G. LEHMAN        ;
  171. ;                        ;
  172. ;-----------------------------------------------;
  173. ;
  174. ;
  175. Z80ASM    EQU    $
  176. ;
  177. ;    INIT FIELDS AND SETUP FILES
  178. ;
  179.     LXI SP,STACK+128
  180.     JMP STACK+128
  181. VSNMSG    DB    13,10,10,'ZILOG/MOSTEK Z-80 ASSEMBLER   VERSION 2.0'
  182.     DB    13,10,'(C) 1977 LCS',13,10,'$'
  183. STACK    DS    128
  184.     LXI D,VSNMSG ! CALL WMSG    ;DISPLAY ON CONSOLE
  185.     LXI H,SYM        ;GET ADDRESS OF SYMBOL TABLE
  186.     SHLD SYMPT ! LHLD SYMBEG ! SHLD    SYMPTR ;SET UP POINTERS
  187.     CALL SETUP        ;PROCESS FILE NAME, PARAMETERS, ETC.
  188.     MVI A,MAXLNE+1 ! STA CURLNE ;SET UP FOR HEAD OF FORM ON FIRST PRINT
  189.     XRA A !    STA PASSNO ;INDICATE PASS 1
  190.     LXI H,0    ! SHLD PC    ;SET UP DEFAULT PROGRAM ORIGIN
  191. ;
  192. ;
  193. ;    MAIN LOOP - READ A SOURCE RECORD
  194. ;            PROCESS LABEL AND OPCODE
  195. ;            PRINT LINE (UNLESS OPTION=N)
  196. ;            OUTPUT HEX (IF NECESSARY)
  197. ;            BACK TO MAIN LOOP FOR NEXT RECORD
  198. ;
  199. ;
  200. NEXT    EQU    $
  201.     XRA A !    STA LEN    ! STA EFLG ! STA EQUFLG    ! LXI H,0 ! SHLD LEN2 ;INIT LENGTH & FLGS
  202.     MVI A,' ' ! STA    ERRFLG ;FOR THIS RECORD
  203.     CALL GNR ;GET NEXT RECORD
  204.     CPI 1AH    ! JZ S321    ;BRANCH IF EOF
  205.     LDA REC    ;GET COL 1
  206.     CPI 09H    ! JZ S12    ;BRANCH IF TAB
  207.     CPI 0DH    ! JZ ENDSTMT    ;IGNORE NULL LINE
  208.     CPI ' '    ! JZ S12    ;BRANCH IF NO LABEL
  209.     CPI ';'    ! JZ ENDSTMT    ;IF COMMENT THEN IGNORE
  210.     CALL ID    ! CALL GNC ! CPI ':' ! JZ S9 ! CALL BACKUP
  211. S9    EQU    $
  212.     LDA PASSNO ! ORA A ! JNZ S12 ;BRANCH IF PASS 2
  213. ;
  214. ;    CALCULATE LENGTH OF SYMBOL AND BUILD ENTRY
  215. ;
  216.     MVI B,0    ;LENGTH + FLAGS ! LXI H,IDBUF
  217.     LXI D,SYMAREA+1
  218. S10    EQU    $
  219.     MOV A,M    ! CPI ' ' ! JZ S10A
  220.     STAX D ! INX H ! INX D ! INR B ! JMP S10
  221. S10A    EQU    $    ;SYMBOL COLLECTED
  222.     MOV A,B    ! CPI 0CH ! JC S10B    ;BRANCH IF LEN < 12 (I.E. OK)
  223.     MVI A,'L' ! STA    ERRFLG ! JMP ENDSTMT ;ELSE LABEL ERROR
  224. S10B    EQU    $
  225.     ADI 4 !    STA SYMAREA ;ADD 4 FOR OVERHEAD
  226.     XCHG    ;SWITCH REGISTERS
  227.     LDA PC ! MOV M,A ! INX H ;MOVE IN PC AS VALUE
  228.     LDA PC+1 ! MOV M,A ! INX H ! MVI M,0 ;AND SET TYPE =0
  229.     LXI H,IDBUF ! CALL SYMLUK ! JNZ    S11 ;BRANCH IF NOT ALREADY THERE
  230.     MVI A,'M' ! STA    ERRFLG ! JMP ENDSTMT ;ELSE MULTI DEFINED ERROR
  231. S11    EQU    $
  232.     LXI H,SYMAREA !    CALL SYMENT    ;ENTER SYMBOL INTO TABLE
  233.     SHLD SYMADR    ;SAVE ADDRESS FOR EQU
  234. ;
  235. ;
  236. ;    NOW PROCESS OPCODE
  237. ;
  238. ;
  239. S12    EQU    $
  240.     CALL    ID
  241.     LDA IDBUF ! CPI    ' ' ! JZ ENDSTMT ;BRANCH IF NO OPCODE (COMMENT)
  242.     LXI H,IDBUF ! CALL SYMLUK ! JZ S16 ;BRANCH IF FOUND
  243.     MVI A,'O' ! STA    ERRFLG ! JMP ENDSTMT ;ERROR IF UNDEFINED OPCODE
  244. S16    EQU    $
  245.     MOV A,M    ! STA OPCODE ! INX H ! MOV A,M ! STA OPCODE+1 ;SAVE OPCODE
  246.     INX H !    MOV A,M    ;GET TYPE BYTE
  247.     DCR A !    ADD A ;-1 AND DOUBLE FOR TABLE INDEX
  248.     MOV E,A    ! MVI D,0 ! LXI    H,TYPTBL ! DAD D
  249.     MOV E,M    ! INX H    ! MOV D,M ! XCHG
  250.     PCHL        ;DISPATCH TO PROPER INSTRUCTION TYPE
  251. ;
  252. ;    EJECT
  253. ;-----------------------------------------------;
  254. ;                        ;
  255. ;    INSTRUCTION CLASS DISPATCH TABLE    ;
  256. ;                        ;
  257. ;-----------------------------------------------;
  258. ;
  259. TYPTBL    EQU    $
  260.     DW    S18    ;CLASS 1 - OPCODE ONLY
  261.     DW    S24    ;CLASS 2 - ROTATES
  262.     DW    S42    ;CLASS 3 - JUMPS (NON RELATIVE) CALLS
  263.     DW    S62    ;CLASS 4 - RELATIVE JUMPS (JR AND DJNZ)
  264.     DW    S73    ;CLASS 5 - RST
  265.     DW    S77    ;CLASS 6 - ARITHMETIC INSTRUCTIONS
  266.     DW    S97    ;CLASS 7 - I/O
  267.     DW    S116    ;CLASS 8 - LD INSTRUCTIONS
  268.     DW    S220    ;CLASS 9 - PUSH,POP
  269.     DW    S228    ;CLASS 10- EXCHANGE (EX)
  270.     DW    S243    ;CLASS 11- RETURNS
  271.     DW    S250    ;CLASS 12- BIT,SET,RES
  272.     DW    S268    ;CLASS 13- INC,DEC
  273.     DW    S301    ;CLASS 14- PSEUDO OPERATORS
  274. ;
  275. ;    EJECT
  276. ;
  277. ;    CLASS 1 - OPCODE ONLY
  278. ;
  279. S18    EQU    $
  280.     MVI A,1    ! STA LEN
  281.     LDA OPCODE ! STA INST
  282.     LDA OPCODE+1 ! ORA A ! JZ ENDSTMT ;BRANCH IF ONLY 1 BYTE
  283.     MVI A,2    ! STA LEN
  284.     LDA OPCODE+1 ! STA INST+1
  285.     JMP ENDSTMT
  286. ;
  287. ;    EJECT
  288. ;
  289. ;    CLASS 2 - ROTATES
  290. ;
  291. S24    EQU    $
  292.     CALL GNC ! CPI '(' ! JZ    S30 ;BRANCH IF () FORM
  293.     CALL BACKUP ! CALL ID !    LXI H,IDBUF ! CALL SYMLUK ! JZ S27
  294.     MVI A,'U' ! STA    ERRFLG ! JMP ENDSTMT ;BRANCH IF UNDEFINED OPERAND
  295. S27    EQU    $
  296.     LDA IDBUF ! CPI    'A' ! JZ S41 ;BRANCH IF A REGISTER
  297.     MVI A,0CBH ! STA INST
  298.     LDA OPCODE ! MOV B,A ! MOV A,M ! ORA B ! STA INST+1
  299.     MVI A,2    ! STA LEN ! JMP    ENDSTMT
  300. ;
  301. S30    EQU    $
  302.     CALL GNC ! CALL    GNC ! CPI 'L' !    JZ S40 ;BRANCH IF (HL)
  303.     CPI 'Y'    ! JZ S38 ;BRANCH IF (IY)
  304.     MVI A,0DDH ! STA INST
  305. S33    EQU    $
  306.     MVI A,0CBH ! STA INST+1
  307.     LDA OPCODE ! ADI 6 ! STA INST+3
  308.     CALL GNC ;BYPASS +
  309.     CALL EVAL
  310.     LDA VAL    ! STA INST+2
  311.     MVI A,4    ! STA LEN
  312.     JMP ENDSTMT
  313. S38    EQU    $
  314.     MVI A,0FDH ! STA INST !    JMP S33    ;DO IX AND IY SIMILARLY
  315. ;
  316. S40    EQU    $
  317.     MVI A,0CBH ! STA INST !    LDA OPCODE ! ADI 6 ! STA INST+1
  318.     MVI A,2    ! STA LEN ! JMP    ENDSTMT
  319. ;
  320. S41    EQU    $    ;COMPATIBILITY WITH RRA, ETC
  321.     LDA OPCODE ! ORI 7 ! STA INST
  322.     MVI A,1    ! STA LEN ! JMP    ENDSTMT
  323. ;
  324. ;
  325. ;    EJECT
  326. ;
  327. ;    CLASS 3 - JUMPS - CALLS
  328. ;
  329. S42    EQU    $
  330.     CALL    GNC
  331.     CPI '('    ! JZ S53 ;BRANCH IF () FORM
  332.     LHLD PTR1 ! MOV    A,M ! CPI ',' !    JZ S49 ;BRANCH IF CONDITIONAL TYPE
  333.     INX H !    MOV A,M    ! CPI ',' ! JZ S49
  334.     LDA OPCODE ! STA INST !    MVI A,3    ! STA LEN
  335.     CALL BACKUP
  336. S46    EQU    $
  337.     CALL EVAL
  338.     LHLD VAL ! SHLD    INST+1 ! JMP ENDSTMT
  339. ;
  340. S49    EQU    $    ;PROCESS CONDITIONAL JUMPS, CALLS
  341.     LDA OPCODE ! ANI 0C6H !    STA INST ! MVI A,3 ! STA LEN
  342.     LHLD SYMCND ! SHLD SYMPT ;SO NO CONFLICTS WITH REGISTER NAMES
  343.     CALL BACKUP ! CALL EVAL    ! LDA VAL ! RLC    ! RLC !    RLC ! ANI 38H
  344.     LXI H,SYM ! SHLD SYMPT ;PUT IT BACK THE WAY IT WAS
  345.     MOV B,A    ! LDA INST ! ORA B ! STA INST
  346.     MVI A,3    ! STA LEN
  347.     JMP S46    ;NOW GO PROCESS LIKE NON CONDITIONAL
  348. ;
  349. S53    EQU    $    ;PROCESS () FORM
  350.     CALL GNC ! CALL    GNC ;GET REGISTER TYPE
  351.     CPI 'L'    ! JZ S58 ;BRANCH IF (HL)
  352.     CPI 'Y'    ! JZ S60
  353.     MVI A,0DDH ! STA INST
  354. S56    EQU    $
  355.     MVI A,0E9H ! STA INST+1
  356.     MVI A,2    ! STA LEN ! JMP    ENDSTMT
  357. ;
  358. S58    EQU    $
  359.     MVI A,0E9H ! STA INST
  360.     MVI A,1    ! STA LEN ! JMP    ENDSTMT
  361. ;
  362. S60    EQU    $
  363.     MVI A,0FDH ! STA INST !    JMP S56
  364. ;
  365. ;    EJECT
  366. ;
  367. ;    CLASS 4 - RELATIVE JUMPS (JR AND DJNZ)
  368. ;
  369. ;
  370. S62    EQU    $
  371.     CALL GNC
  372.     LHLD PTR1 ! MOV    A,M ! CPI ',' !    JZ S68
  373.     INX H !    MOV A,M    ! CPI ',' ! JZ S68 ;BRANCH IF CONDITIONAL
  374.     LDA OPCODE ! STA INST !    MVI A,2    ! STA LEN
  375.     CALL BACKUP ! CALL EVAL    ! LDA VAL ! DCR    A ! DCR    A ! STA    INST+1
  376.     JMP ENDSTMT
  377. ;
  378. S68    EQU    $
  379.     LHLD SYMCND ! SHLD SYMPT ;SO NOT CONFLICT WITH REG NAMES
  380.     CALL BACKUP ! CALL EVAL    ! LDA VAL ! RLC    ! RLC !    RLC ! ANI 38H
  381.     LXI H,SYM ! SHLD SYMPT ;PUT IT BACK
  382.     ADI 20H    ! STA INST ! MVI A,2 ! STA LEN
  383.     CALL EVAL ! LDA    VAL ! DCR A ! DCR A ! STA INST+1 ! JMP ENDSTMT
  384. ;
  385. ;    EJECT
  386. ;
  387. ;
  388. ;    CLASS 5 - RESTARTS
  389. ;
  390. ;
  391. S73    EQU    $
  392.     CALL EVAL ! LDA    VAL ! ANI 38H !    ORI 0C7H ! STA INST
  393.     MVI A,1    ! STA LEN ! JMP    ENDSTMT
  394. ;
  395. ;    EJECT
  396. ;
  397. ;
  398. ;    CLASS 6 - ARITHMETIC OPCODES
  399. ;
  400. ;    ADD,SUB,ADC,SBC,AND,OR,XOR,CP
  401. ;
  402. ;
  403. S77    EQU    $
  404.     CALL GNC ! CPI '(' ! JZ    S85 ;BRANCH IF () FORM
  405.     LHLD PTR1 ! INX    H ! MOV    A,M ! CPI ',' !    JZ S96A    ;BR IF REG PAIR
  406.     CALL BACKUP ! CALL EVAL    ! LDA EVFLGS ! ANI RNAME ! JNZ S84
  407.     LDA OPCODE ! ADI 0C6H !    STA INST ! LDA VAL ! STA INST+1
  408.     MVI A,2    ! STA LEN ! JMP    ENDSTMT
  409. ;
  410. ;    PROCESS REGISTER NAME
  411. ;
  412. S84    EQU    $
  413.     LDA OPCODE ! ADI 80H ! MOV B,A ! LDA VAL ! ADD B ! STA INST
  414.     MVI A,1    ! STA LEN ! JMP    ENDSTMT
  415. ;
  416. S85    EQU    $
  417.     CALL GNC ! CALL    GNC ! CPI 'L' !    JZ S95
  418.     CPI 'Y'    ! JZ S93
  419.     MVI A,0DDH ! STA INST
  420. S88    EQU    $
  421.     LDA OPCODE ! ADI 86H ! STA INST+1
  422.     MVI A,3    ! STA LEN
  423.     CALL GNC
  424.     CALL EVAL ! LDA    VAL ! STA INST+2 ! JMP ENDSTMT
  425. ;
  426. S93    EQU    $
  427.     MVI A,0FDH ! STA INST !    JMP S88
  428. ;
  429. S95    EQU    $
  430.     LDA OPCODE ! ADI 86H ! STA INST    ! MVI A,1 ! STA    LEN ! JMP ENDSTMT
  431. ;
  432. ;
  433. ;    PROCESS REGISTER PAIR ADD,SUB,ADC,SBC
  434. ;
  435. S96A    EQU    $
  436.     CALL BACKUP ! CALL EVAL
  437.     LDA VAL    ! CPI 0FFH ;IX ! JZ S96H ! CPI 0FEH ;IY ! JZ S96J
  438.     LDA OPCODE+1 ! CPI 9 ! JZ S96F
  439.     MVI A,0EDH ! STA INST !    MVI A,2    ! STA LEN
  440.     CALL EVAL
  441.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! MOV B,A !    LDA OPCODE+1 ! ADD B
  442.     STA INST+1 ! JMP ENDSTMT
  443. ;
  444. S96F    EQU    $
  445.     CALL EVAL
  446.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! MOV B,A !    LDA OPCODE+1 ! ADD B
  447.     STA INST ! MVI A,1 ! STA LEN ! JMP ENDSTMT
  448. ;
  449. S96H    EQU    $
  450.     MVI A,0DDH ! STA INST
  451.     JMP S96K
  452. ;
  453. S96J    EQU    $
  454.     MVI A,0FDH ! STA INST
  455. S96K    EQU    $
  456.     CALL EVAL
  457.     LDA VAL    ! CPI 0FFH ! JNZ S96L !    CPI 0FEH ! JNZ S96L ! MVI A,4 !    STA VAL
  458. S96L    EQU    $
  459.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! MOV B,A !    LDA OPCODE+1 ! ADD B
  460.     STA INST+1 ! MVI A,2 ! STA LEN ! JMP ENDSTMT
  461. ;
  462. ;    EJECT
  463. ;
  464. ;    CLASS 7 - I/O INSTRUCTIONS
  465. ;
  466. ;
  467. S97    EQU    $
  468.     LDA OPCODE ! CPI 0D3H !    JZ S107    ;BRANCH IF OUT OPCODE
  469.     CALL GNC ! CPI 'A' ! JNZ S104 ;BRANCH IF  8080 TYPE I/O
  470.     CALL GNC ! CALL    GNC ! CALL EVAL    ;GET PORT ADDRESS
  471.     MVI A,0DBH ! STA INST !    LDA VAL    ! STA INST+1 ! MVI A,2 ! STA LEN
  472.     JMP ENDSTMT
  473. ;
  474. S104    EQU    $
  475.     CALL BACKUP ! CALL EVAL    ;GET REGISTER NAME
  476.     MVI A,0EDH ! STA INST
  477.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! ADI 40H !    STA INST+1
  478.     MVI A,2    ! STA LEN ! JMP    ENDSTMT
  479. ;
  480. S107    EQU    $    ;PROCESS OUT INSTRUCTION
  481.     CALL GNC ! CALL    GNC ! CPI 'C'  ! JNZ S109
  482.     LHLD PTR1 ! MOV    A,M ! CPI ')' !    JZ S112
  483. S109    EQU    $
  484.     CALL BACKUP ! CALL EVAL    ;GET PORT NUMBER
  485.     MVI A,0D3H ! STA INST !    LDA VAL    ! STA INST+1 ! MVI A,2 ! STA LEN
  486.     JMP ENDSTMT
  487. ;
  488. S112    EQU    $
  489.     CALL GNC ! CALL    GNC
  490.     CALL EVAL
  491.     MVI A,0EDH ! STA INST
  492.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! ADI 41H !    STA INST+1
  493.     MVI A,2    ! STA LEN ! JMP    ENDSTMT
  494. ;
  495. ;    EJECT
  496. ;
  497. ;    CLASS 8 - LD INSTRUCTIONS
  498. ;
  499. ;
  500. ;    THE FOLLOWING ARE STRINGS WHICH ARE SPECIAL OPERAND FORMS
  501. ;
  502. LD1    DB    'A,I'
  503. LD2    DB    'A,R'
  504. LD3    DB    'I,A'
  505. LD4    DB    'R,A'
  506. LD5    DB    'SP,HL'
  507. LD6    DB    'SP,IX'
  508. LD7    DB    'SP,IY'
  509. ;
  510. S116    EQU    $
  511.     CALL GNC ! CALL    BACKUP ;POINT TO OPERAND FIELD
  512.     LHLD PTR1 ;SET UP POINTER TO OPERAND FIELD
  513.     LXI D,LD1 ! MVI    B,3 ! CALL CMPCHR ! JZ S171
  514.     LXI D,LD2 ! MVI    B,3 ! CALL CMPCHR ! JZ S173
  515.     LXI D,LD3 ! MVI    B,3 ! CALL CMPCHR ! JZ S175
  516.     LXI D,LD4 ! MVI    B,3 ! CALL CMPCHR ! JZ S177
  517.     LXI D,LD5 ! MVI    B,5 ! CALL CMPCHR ! JZ S179
  518.     LXI D,LD6 ! MVI    B,5 ! CALL CMPCHR ! JZ S181
  519.     LXI D,LD7 ! MVI    B,5 ! CALL CMPCHR ! JZ S183 ;PROCESS SPECIAL OPRNDS
  520. ;
  521.     CALL GNC
  522.     CPI '('    ! JZ S185 ;BRANCH IF () FORM
  523.     CALL BACKUP ! CALL EVAL
  524.     LDA EVFLGS ! ANI RPNAME    ! JNZ S147    ;BRANCH IF RPAIR NAME
  525.     CALL GNC ! CPI '(' ! JZ    S130 ;BRANCH IF () OPERAND
  526.     LHLD VAL ! SHLD    SAVVAL
  527.     CALL BACKUP ! CALL EVAL    ! LDA EVFLAGS !    ANI RNAME ! JNZ    S128 ;> RNAME
  528.     LDA SAVVAL ! RLC ! RLC ! RLC ! ANI 38H ! ADI 6 ! STA INST
  529.     LDA VAL    ! STA INST+1 ! MVI A,2 ! STA LEN ! JMP ENDSTMT ;IMMED OPERAND
  530. ;
  531. S128    EQU    $    ;PROCESS RNAME
  532.     LDA SAVVAL ! RLC ! RLC ! RLC ! ANI 38H ! MOV B,A ! LDA VAL ! ADD B
  533.     ADI 40H    ;FOR R-R TYPE INST
  534.     STA INST ! MVI A,1 ! STA LEN ;REG-REG OPERAND
  535.     JMP ENDSTMT
  536. ;
  537. S130    EQU    $
  538.     CALL GNC ! CALL    GNC
  539.     CPI 'L'    ! JZ S138
  540.     CPI 'X'    ! JZ S140
  541.     CPI 'Y'    ! JZ S145
  542.     CALL BACKUP ! CALL BACKUP ! CALL EVAL
  543.     LDA EVFLAGS ! ANI RPNAME ! JNZ S136 ;BRANCH IF REG PAIR
  544.     MVI A,3AH ! STA    INST ! LHLD VAL    ! SHLD INST+1
  545.     MVI A,3    ! STA LEN ! JMP    ENDSTMT
  546. ;
  547. S136    EQU    $
  548.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H
  549.     ADI 0AH    ! STA INST ! MVI A,1 ! STA LEN ! JMP ENDSTMT
  550. ;
  551. S138    EQU    $
  552.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H
  553.     ADI 46H    ! STA INST ! MVI A,1 ! STA LEN ! JMP ENDSTMT
  554. ;
  555. S140    MVI A,0DDH ! STA INST
  556. S140A    LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! ADI 46H !    STA INST+1
  557.     CALL GNC
  558.     CALL EVAL ! LDA    VAL ! STA INST+2
  559.     MVI A,3    ! STA LEN
  560.     JMP ENDSTMT
  561. ;
  562. S145    EQU    $
  563.     MVI A,0FDH ! STA INST !    JMP S140A
  564. ;
  565. S147    EQU    $
  566.     CALL GNC ! CPI '(' ! JZ    S159
  567.     LHLD VAL ! SHLD    SAVVAL
  568.     CALL BACKUP
  569.     CALL EVAL
  570.     LDA SAVVAL ! CPI 0FFH !    JZ S155    ! CPI 0FEH ! JZ    S157
  571.     LDA SAVVAL ! RLC ! RLC ! RLC ! ANI 38H ! INR A ! STA INST
  572.     LHLD VAL ! SHLD    INST+1 ! MVI A,3 ! STA LEN ! JMP ENDSTMT
  573. ;
  574. S155    EQU    $
  575.     MVI A,0DDH ! STA INST
  576. S156    EQU    $
  577.     MVI A,21H ! STA    INST+1 ! MVI A,4 ! STA LEN
  578.     LHLD VAL ! SHLD    INST+2
  579.     JMP ENDSTMT
  580. ;
  581. S157    EQU    $
  582.     MVI A,0FDH ! STA INST !    JMP S156
  583. ;
  584. S159    EQU    $
  585.     LHLD VAL ! SHLD    SAVVAL
  586.     CALL EVAL
  587.     LDA SAVVAL ! CPI 4 ! JZ    S165
  588.     CPI 0FFH ! JZ S167
  589.     CPI 0FEH ! JZ S169
  590.     MVI A,0EDH ! STA INST
  591.     LDA SAVVAL ! RLC ! RLC ! RLC ! ANI 38H ! ADI 4BH ! STA INST+1
  592.     LHLD VAL ! SHLD    INST+2 ! MVI A,4 ! STA LEN
  593.     JMP ENDSTMT
  594. ;
  595. S165    EQU    $
  596.     MVI A,2AH ! STA    INST ! LHLD VAL    ! SHLD INST+1 !    MVI A,3    ! STA LEN
  597.     JMP ENDSTMT
  598. ;
  599. S167    EQU    $
  600.     MVI A,0DDH ! STA INST
  601. S168    MVI A,2AH ! STA    INST+1 ! LHLD VAL ! SHLD INST+2    ! MVI A,4 ! STA    LEN
  602.     JMP ENDSTMT
  603. ;
  604. S169    EQU    $
  605.     MVI A,0FDH ! STA INST !    JMP S168
  606. ;
  607. S171    LXI H,57EDH
  608. S171A    SHLD INST ! MVI    A,2 ! STA LEN !    JMP ENDSTMT
  609. ;
  610. S173    LXI H,5FEDH ! JMP S171A
  611. ;
  612. S175    LXI H,47EDH ! JMP S171A
  613. ;
  614. S177    LXI H,4FEDH ! JMP S171A
  615. ;
  616. S179    MVI A,0F9H ! STA INST !    MVI A,1    ! STA LEN ! JMP    ENDSTMT
  617. ;
  618. S181    LXI H,0F9DDH ! JMP S171A
  619. ;
  620. S183    LXI H,0F9FDH ! JMP S171A
  621. ;
  622. S185    JMP    S186
  623. ;
  624. LD01    DB    'HL)'
  625. LD02    DB    'IX+'
  626. LD03    DB    'IY+'
  627. ;
  628. S186    LHLD PTR1
  629.     LXI D,LD01 ! MVI B,3 ! CALL CMPCHR ! JZ    S204
  630.     LXI D,LD02 ! MVI B,3 ! CALL CMPCHR ! JZ    S210A
  631.     LXI D,LD03 ! MVI B,3 ! CALL CMPCHR ! JZ    S210B
  632.     CALL EVAL ! LHLD VAL ! SHLD SAVVAL
  633.     LDA EVFLAGS ! ANI RPNAME ! JNZ S202
  634.     CALL GNC    ;BYPASS COMMA
  635.     CALL EVAL ! LDA    EVFLAGS    ! ANI RPNAME ! JNZ S193
  636.     MVI A,32H ! STA    INST ! LHLD SAVVAL ! SHLD INST+1
  637.     MVI A,3    ! STA LEN ! JMP    ENDSTMT
  638. ;
  639. S193    EQU    $
  640.     LDA VAL
  641.     CPI 4 !    JZ S196
  642.     CPI 0FFH ! JZ S198
  643.     CPI 0FEH ! JZ S200
  644. ;
  645.     MVI A,0EDH ! STA INST
  646.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! ADI 43H !    STA INST+1
  647.     LHLD SAVVAL ! SHLD INST+2
  648.     MVI A,4    ! STA LEN ! JMP    ENDSTMT
  649. ;
  650. S196    EQU    $
  651.     MVI A,22H ! STA    INST
  652.     LHLD SAVVAL ! SHLD INST+1 ! MVI    A,3 ! STA LEN !    JMP ENDSTMT
  653. ;
  654. S198    EQU    $
  655.     MVI A,0DDH ! STA INST
  656. S199    EQU    $
  657.     MVI A,22H ! STA    INST+1 ! LHLD SAVVAL ! SHLD INST+2
  658.     MVI A,4    ! STA LEN ! JMP    ENDSTMT
  659. ;
  660. S200    EQU    $
  661.     MVI A,0FDH ! STA INST !    JMP S199
  662. ;
  663. S202    EQU    $
  664.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! ADI 2 ! STA INST
  665.     MVI A,1    ! STA LEN ! JMP    ENDSTMT
  666. ;
  667. S204    EQU    $
  668.     CALL GNC ! CALL    GNC ! CALL GNC ! CALL GNC
  669.     CALL EVAL
  670.     LDA EVFLAGS ! ANI RNAME    ! JNZ S209
  671.     MVI A,36H ! STA    INST ! LDA VAL ! STA INST+1 ! MVI A,2 !    STA LEN
  672.     JMP ENDSTMT
  673. ;
  674. S209    EQU    $
  675.     LDA VAL    ! ADI 70H ! STA    INST ! MVI A,1 ! STA LEN ! JMP ENDSTMT
  676. ;
  677. S210A    MVI A,0DDH ! STA INST !    JMP S211
  678. S210B    MVI A,0FDH ! STA INST
  679. S211    EQU    $
  680.     CALL GNC ! CALL    GNC ! CALL GNC ! CALL EVAL
  681.     LHLD VAL ! SHLD    SAVVAL
  682.     CALL GNC    ;BYPASS COMMA
  683.     CALL EVAL
  684.     LDA EVFLAGS ! ANI RNAME    ! JNZ S218
  685.     MVI A,36H ! STA    INST+1
  686.     LDA SAVVAL ! STA INST+2    ! LDA VAL ! STA    INST+3
  687.     MVI A,4    ! STA LEN ! JMP    ENDSTMT
  688. ;
  689. S218    EQU    $
  690.     LDA VAL    ! ADI 70H ! STA    INST+1 ! LDA SAVVAL ! STA INST+2
  691.     MVI A,3    ! STA LEN ! JMP    ENDSTMT
  692. ;
  693. ;    EJECT        ;END OF LD PROCESSING
  694. ;
  695. ;    CLASS 9 - PUSH POP
  696. ;
  697. ;
  698. S220    EQU    $
  699.     CALL EVAL
  700.     LDA VAL    ! CPI 0FFH ! JZ    S224 ! CPI 0FEH    ! JZ S226
  701.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! MOV B,A !    LDA OPCODE ! ADD B
  702.     STA INST
  703.     MVI A,1    ! STA LEN ! JMP    ENDSTMT
  704. ;
  705. S224    EQU    $
  706.     MVI A,0DDH ! STA INST
  707. S225    EQU    $
  708.     LDA OPCODE ! ADI 20H ! STA INST+1 ! MVI    A,2 ! STA LEN
  709.     JMP ENDSTMT
  710. ;
  711. S226    MVI A,0FDH ! STA INST !    JMP S225
  712. ;
  713. ;    EJECT
  714. ;
  715. ;
  716. ;    CLASS 10 - EXCHANGE (EX)
  717. ;
  718. ;
  719. S228    EQU    $
  720.     CALL GNC ! CPI '(' ! JZ    S235 ;BRANCH IF () FORM
  721.     CPI 'A'    ! JZ S233 ; BRANCH IF EX AF,AF'
  722.     MVI A,0EBH ! STA INST !    MVI A,1    ! STA LEN ! JMP    ENDSTMT
  723. ;
  724. S233    EQU    $
  725.     MVI A,8    ! STA INST ! MVI A,1 ! STA LEN ! JMP ENDSTMT
  726. ;
  727. S235    EQU    $
  728.     LHLD PTR1 ! LXI    D,5 ! DAD D ! SHLD PTR1
  729.     CALL GNC
  730.     CPI 'L'    ! JZ S239
  731.     CPI 'Y'    ! JZ S241
  732. ;
  733.     MVI A,0DDH ! STA INST
  734. S238    EQU    $
  735.     MVI A,0E3H ! STA INST+1    ! MVI A,2 ! STA    LEN ! JMP ENDSTMT
  736. ;
  737. S239    EQU    $
  738.     MVI A,0E3H ! STA INST !    MVI A,1    ! STA LEN ! JMP    ENDSTMT
  739. ;
  740. S241    EQU    $
  741.     MVI A,0FDH ! STA INST !    JMP S238
  742. ;
  743. ;    EJECT
  744. ;
  745. ;
  746. ;    CLASS 11 - RETURNS
  747. ;
  748. ;
  749. S243    EQU    $
  750.     CALL GNC
  751.     CPI 0AH    ! JZ S248    ;BRANCH IF NO OPERAND
  752.     CPI 0DH    ! JZ S248 ! CPI    ';' ! JZ S248 ;BRANCH IF NO OPERAND
  753.     LHLD SYMCND ! SHLD SYMPT ;FOR ELIMINATING REG NAME CONFLICTS
  754.     CALL BACKUP ! CALL EVAL
  755.     LXI H,SYM ! SHLD SYMPT ;PUT IT BACK
  756.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! ADI 0C0H ! STA INST
  757.     MVI A,1    ! STA LEN ! JMP    ENDSTMT
  758. ;
  759. S248    EQU    $
  760.     LDA OPCODE ! STA INST !    MVI A,1    ! STA LEN ! JMP    ENDSTMT
  761. ;
  762. ;    EJECT
  763. ;
  764. ;    CLASS 12 - BIT,SET,RES
  765. ;
  766. ;
  767. S250    EQU    $
  768.     CALL EVAL ! LHLD VAL ! SHLD SAVVAL ;SAVE BIT NUMBER
  769.     CALL GNC ! CPI '(' ! JZ    S257
  770.     CALL BACKUP ! CALL EVAL
  771.     MVI A,0CBH ! STA INST
  772.     LDA SAVVAL ! RLC ! RLC ! RLC ! ANI 38H ! MOV B,A ! LDA OPCODE !    ADD B
  773.     MOV B,A    ! LDA VAL ! ADD    B ! STA    INST+1
  774.     MVI A,2    ! STA LEN ! JMP    ENDSTMT
  775. ;
  776. S257    EQU    $
  777.     CALL GNC ! CALL    GNC ! CPI 'L' !    JZ S266
  778.     CPI 'Y'    ! JZ S264
  779. ;
  780.     MVI A,0DDH ! STA INST
  781. S260    CALL GNC
  782.     CALL EVAL
  783.     MVI A,0CBH ! STA INST+1    ! LDA VAL ! STA    INST+2
  784.     LDA SAVVAL ! RLC ! RLC ! RLC ! ANI 38H ! ADI 6 ! MOV B,A
  785.     LDA OPCODE ! ADD B ! STA INST+3
  786.     MVI A,4    ! STA LEN ! JMP    ENDSTMT
  787. ;
  788. S264    EQU    $
  789.     MVI A,0FDH ! STA INST !    JMP S260
  790. ;
  791. S266    EQU    $
  792.     MVI A,0CBH ! STA INST !    LDA SAVVAL ! RLC ! RLC ! RLC ! ANI 38H
  793.     ADI 6 !    MOV B,A    ! LDA OPCODE ! ADD B ! STA INST+1
  794.     MVI A,2    ! STA LEN ! JMP    ENDSTMT
  795. ;
  796. ;    EJECT
  797. ;
  798. ;    CLASS 13 - INC,DEC
  799. ;
  800. ;
  801. S268    EQU    $
  802.     CALL GNC ! CPI '(' ! JZ    S290
  803.     CALL BACKUP ! CALL EVAL
  804.     LDA EVFLAGS ! ANI RNAME    ! JNZ S280
  805.     LDA VAL    ! CPI 0FFH ! JZ    S275 ! CPI 0FEH    ! JZ S278
  806.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! MOV B,A !    LDA OPCODE+1 ! ADD B
  807.     STA INST ! MVI A,1 ! STA LEN ! JMP ENDSTMT
  808. ;
  809. S275    MVI A,0DDH ! STA INST
  810. S276    LDA OPCODE+1 ! ADI 20H ! STA INST+1 ! MVI A,2 !    STA LEN
  811.     JMP ENDSTMT
  812. ;
  813. S278    EQU    $
  814.     MVI A,0FDH ! STA INST !    JMP S276
  815. ;
  816. S280    EQU    $
  817.     LDA VAL    ! RLC !    RLC ! RLC ! ANI    38H ! MOV B,A !    LDA OPCODE ! ADD B
  818.     STA INST ! MVI A,1 ! STA LEN ! JMP ENDSTMT
  819. ;
  820. S290    EQU    $
  821.     CALL GNC ! CALL    GNC
  822.     CPI 'L'    ! JZ S299
  823.     CPI 'Y'    ! JZ S297
  824.     MVI A,0DDH ! STA INST
  825. S293    CALL GNC ! CALL    EVAL
  826.     LDA OPCODE ! ADI 30H ! STA INST+1 ! LDA    VAL ! STA INST+2
  827.     MVI A,3    ! STA LEN ! JMP    ENDSTMT
  828. ;
  829. S297    EQU    $
  830.     MVI A,0FDH ! STA INST !    JMP S293
  831. ;
  832. S299    EQU    $
  833.     LDA OPCODE ! ADI 30H ! STA INST    ! MVI A,1 ! STA    LEN ! JMP ENDSTMT
  834. ;
  835. ;    EJECT
  836. ;
  837. ;    CLASS 14 - PSEUDO OPERATORS
  838. ;
  839. ;
  840. S301    EQU    $
  841.     LDA OPCODE ! DCR A ! ADD A
  842.     MOV E,A    ! MVI D,0 ! LXI    H,PSDTAB ! DAD D
  843.     MOV E,M    ! INX H    ! MOV D,M
  844.     XCHG
  845.     PCHL
  846. ;
  847. PSDTAB    EQU    $
  848.     DW    S302    ;EQU
  849.     DW    S305    ;DEFS
  850.     DW    S308    ;DEFB
  851.     DW    S317    ;DEFW
  852.     DW    S320    ;END
  853.     DW    S323    ;ORG
  854.     DW    S324    ;EJECT
  855.     DW    S325    ;IBM    FOR FORMATTING 3270 (ICC) SCREENS
  856. ;
  857. ;
  858. S302    EQU    $    ;EQU
  859.     CALL EVAL ! LHLD VAL ! XCHG ! LHLD SYMADR
  860.     MOV M,E    ! INX H    ! MOV M,D
  861.     LHLD VAL ! SHLD    EQUVAL ! MVI A,1 ! STA EQUFLG
  862.     JMP ENDSTMT
  863. ;
  864. S305    EQU    $    ;DEFS
  865.     CALL EVAL ! LHLD VAL ! SHLD LEN2 ! JMP ENDSTMT
  866. ;
  867. S308    EQU    $    ;DEFB
  868.     CALL GNC ! CPI 27H ! JZ    S313 ;BRANCH IF QUOTE
  869.     CALL BACKUP ! CALL EVAL    ! MVI A,1 ! STA    LEN
  870.     LDA VAL    ! STA INST
  871.     JMP ENDSTMT
  872. ;
  873. S313    EQU    $
  874.     LXI D,INST
  875.     LHLD PTR1
  876. S313A    LDA LEN    ! INR A    ! STA LEN
  877.     MOV A,M    ! INX H    ! STAX D ! INX D ! MOV A,M
  878.     CPI 0DH    ! JZ ENDSTMT ! CPI 27H ! JNZ S313A
  879.     JMP ENDSTMT
  880. ;
  881. S317    EQU    $
  882.     CALL EVAL    ;DEFW
  883.     LHLD VAL ! SHLD    INST
  884.     MVI A,2    ! STA LEN
  885.     JMP ENDSTMT
  886. ;
  887. S320    EQU    $    ;END
  888.     CALL EVAL ! LHLD VAL ! SHLD ENDADR ! SHLD EQUVAL
  889. S321    MVI A,1
  890.     STA EQUFLG ! STA EFLG
  891.     JMP ENDSTMT
  892. ;
  893. S323    EQU    $    ;ORG
  894.     CALL EVAL ! LHLD VAL ! SHLD PC
  895.     SHLD EQUVAL ! MVI A,1 !    STA EQUFLG
  896.     JMP ENDSTMT
  897. ;
  898. ;
  899. S324    EQU    $    ;EJECT
  900.     MVI A,MAXLNE-1 ! STA CURLNE ;CAUSE HOF ON RECORD AFTER EJECT
  901.     JMP ENDSTMT    ;TREAT THIS LIKE A COMMENT
  902. ;
  903. ;
  904. S325    EQU    $    ;IBM PSEUDO FOR 3270 (ICC 40+) SCREEN FORMATTING
  905.     LXI H,INST ! SHLD TEMP ;SET UP FOR MULTI-BYTE OUTPUT
  906. S325X    EQU    $
  907.     CALL GNC ! CPI 27H ! JZ    S326 ;BRANCH IF LEADING QUOTE
  908. ;
  909. ;    DO HEX UNTIL COMMA FOUND
  910. ;
  911. S325A    EQU    $
  912.     CALL S325B ;CONVERT TO BINARY AND STORE AWAY
  913.     LDA LEN    ! INR A    ! STA LEN ;INCREMENT LENGTH
  914.     CALL GNC ;GET NEXT CHARACTER
  915.     CPI ','    ! JZ S326 ;IF COMMA THEN SWITCH TO ASCII
  916.     CPI 0DH    ! JNZ S325A ;BRANCH IF NOT DONE
  917.     JMP ENDSTMT ;BRANCH IF CARRIAGE RETURN FOUND
  918. ;
  919. ;    DO ASCII UNTIL COMMA FOUND
  920. ;
  921. S326    EQU    $
  922.     LHLD PTR1 ! MOV    A,M ! INX H ! SHLD PTR1    ;(GNC SKIPS BLANKS)
  923.     CPI 0DH    ! JZ ENDSTMT ;BRANCH IF END
  924.     CPI ','    ! JZ S325X ;BRANCH IF END OF ASCII- SWITCH BACK TO HEX
  925.     LHLD TEMP ! MOV    M,A ! INX H ! SHLD TEMP    ;PUT CHARACTER AWAY
  926.     LDA LEN    ! INR A    ! STA LEN ;INCREMENT LENGTH COUNTER
  927.     JMP S326 ;AND CONTINUE
  928. ;
  929. ;    CONVERT HEX TO BIN FOR 'IBM' PSEUDO (INTERNAL SUBROUTINE)
  930. ;
  931. S325B    EQU    $
  932.     LXI B,0    ;SET UP FOR POSSIBLE SINGLE CHAR HEX DIG, ZERO B AND C
  933.     CALL CNVDIG ;CONVERT DIGIT WE ALREADY HAVE
  934.     CALL GNC
  935.     CPI ','    ! JZ S325D ! CPI 0DH ! JZ S325D    ;BRANCH IF ONLY SINGLE DIGIT
  936.     PUSH PSW ;SAVE CHARACTER
  937.     MOV A,B    ! RLC !    RLC ! RLC ! RLC    ! ANI 0F0H ! MOV C,A ;SET UP
  938.     POP PSW    ! CALL CNVDIG ;CONVERT SECOND DIGIT
  939. S325C    EQU    $    ;NOW COMBINE THEM
  940.     MOV A,B    ! ORA C
  941.     LHLD TEMP ! MOV    M,A ! INX H ! SHLD TEMP    ;PUT CHARACTER AWAY
  942.     RET
  943. ;
  944. S325D    CALL BACKUP
  945.     JMP S325C
  946. ;
  947. CNVDIG    EQU    $    ;CONVERT DIGIT TO BINARY (0-9 , A-F)
  948.     CPI 'A'    ! JC CNVD2 ;BRANCH IF NUMBER
  949.     ADI 9 ;ADJUST 41 (A) TO 4A TO MAKE IT BINARY EQUIVALENT
  950. CNVD2    ANI 0FH    ! MOV B,A
  951.     RET
  952. ;
  953. ;    EJECT
  954. ;
  955. ;
  956. ;    E N D    O F   S T A T E M E N T   P R O C E S S I N G
  957. ;
  958. ;
  959. ;    ENDSTMT------HERE IT IS!!!!
  960. ;
  961. ;
  962. ENDSTMT    EQU    $
  963.     LDA PASSNO ! ORA A ! JZ    S417    ;DONT PRINT DURING PASS 1
  964.     LDA UFLAG ! ORA    A ! JZ $+8 ! MVI A,'U' ! STA ERRFLG ! XRA A ! STA UFLAG
  965.     LDA ERRFLG ! CPI ' ' ! JNZ S402    ;ALWAYS PRINT ERRORS
  966.     LDA LFLAG ! CPI    'N' ! JZ S412 ;DON'T PRINT IF USER ASKED US NOT TO
  967. S402    EQU    $
  968.     LDA ERRFLG ! STA HDRBUF
  969.     MVI A,' ' ! STA    HDRBUF+1
  970.     LXI H,HDRBUF+2 ! LXI D,HDRBUF+1    ! LXI B,14 ! CALL MOVE
  971.     LDA EQUFLG ! ORA A ! JNZ S410 ;BRANCH IF TO USE EQUVAL
  972.     LHLD PC    ! XCHG ! LXI H,HDRBUF+1
  973.     MOV A,D    ! CALL CNV2HX
  974.     MOV A,E    ! CALL CNV2HX
  975.     INX H
  976.     LXI D,INST
  977.     MVI C,4    ! LDA LEN ! MOV    B,A
  978.     ORA A !    JZ S408    ;BRANCH IF LENGTH IF ZERO
  979. S406    EQU    $
  980.     LDAX D ! CALL CNV2HX
  981.     INX D
  982.     DCR B !    JZ S408
  983.     DCR C !    JNZ S406
  984. S408    EQU    $
  985.     LXI H,HDRBUF ! CALL PLINE ;WRITE AND PAGE
  986.     JMP S412
  987. ;
  988. S410    EQU    $
  989.     LHLD EQUVAL ! XCHG ! LXI H,HDRBUF+1
  990.     MOV A,D    ! CALL CNV2HX
  991.     MOV A,E    ! CALL CNV2HX
  992.     LXI H,HDRBUF ! CALL PLINE
  993. ;
  994. S412    EQU    $
  995.     LDA LEN    ! ORA A    ! JZ S417
  996.     MOV B,A
  997.     LXI D,INST
  998.     LHLD PC    ! SHLD TEMP
  999. S414    EQU    $
  1000.     PUSH B
  1001.     LDAX D ! LHLD TEMP ! CALL WOBJ
  1002.     POP B
  1003.     INX D
  1004.     LHLD TEMP ! INX    H ! SHLD TEMP
  1005.     DCR B !    JNZ S414
  1006. ;
  1007. S417    EQU    $
  1008.     LHLD PC    ! LDA LEN ! MOV    C,A ! MVI B,0 !    DAD B
  1009.     XCHG ! LHLD LEN2 ! DAD D ! SHLD    PC
  1010.     LDA EFLG ! ORA A ! JZ NEXT ;GO PROCESS NEXT RECORD
  1011.     LDA PASSNO ! CMA ! STA PASSNO
  1012.     CPI 0 !    JZ ENDIT
  1013.     LXI H,FCB1+12 !    MVI M,0
  1014.     LXI D,FCB1 ! CALL OPNFIL
  1015.     LXI H,FCB1+32 !    MVI M,0
  1016.     LXI H,INBUF+1024 ! SHLD    IBP
  1017.     XRA A !    STA EFLG    ;RESET END OF RECORD FLAG
  1018.     LXI H,0    ! SHLD PC    ;RESET PC
  1019.     MVI A,1    ! STA PAGENO    ;SET UP PAGE NUMBER
  1020.     MVI A,MAXLNE+1 ! STA CURLNE
  1021.     LXI D,-1 ! SHLD    OBJADR
  1022.     JMP NEXT
  1023. ;
  1024. ENDIT    EQU    $
  1025.     LDA HFLAG ! CPI    'N' ! JZ ENDITX    ;BRANCH IF NO HEX FILE
  1026.     LDA OBJCNT ! ORA A ! JZ    ENDIT1 ;BRANCH IF NO OBJ TO WRITE
  1027.     CALL WREC    ;ELSE WRITE FINAL RECORD
  1028. ENDIT1    LXI H,EOFREC ! MVI B,13
  1029. ENDIT2    MOV A,M    ! CALL WNB2 ! INX H ! DCR B ! JNZ ENDIT2
  1030.     MVI B,255    ;FLUSH BUFFER
  1031. ENDIT3    MVI A,1AH ! CALL WNB2 !    DCR B !    JNZ ENDIT3
  1032.     LXI D,FCB2 ! CALL CLSFIL
  1033. ENDITX    EQU    $
  1034.     LHLD PC    ! XCHG ! LXI H,PCMSGA
  1035.     MOV A,D    ! CALL CNV2HX !    MOV A,E    ! CALL CNV2HX
  1036.     LXI D,PCMSG ! CALL WMSG
  1037.     LHLD SYMPTR ! XCHG ! LXI H,SYMSGA
  1038.     MOV A,D    ! CALL CNV2HX !    MOV A,E    ! CALL CNV2HX
  1039.     LXI D,SYMSG ! CALL WMSG
  1040.     LXI D,ENDMSG ! CALL WMSG
  1041.     JMP    0000H
  1042. PCMSG    DB    13,10,'LAST ADDRESS USED IN THIS ASSEMBLY IS: '
  1043. PCMSGA    DB    'XXXX','$'
  1044. ;
  1045. SYMSG    DB    13,10,'NEXT SYMBOL ADDRESS IS: '
  1046. SYMSGA    DB    'XXXX$'
  1047. ;
  1048. ENDMSG    DB    13,10,10,'Z-80 ASSEMBLY COMPLETE',13,10,10,'$'
  1049. ;
  1050. EOFREC    DB    ':00000001FF',13,10
  1051. ;
  1052. ;    EJECT
  1053. ;
  1054. ;    WOBJ - WRITE OBJECT BYTE ROUTINE
  1055. ;
  1056. ;    INPUT BYTE IN A REGISTER
  1057. ;
  1058. WOBJ    EQU    $
  1059.     MOV B,A    ;SAVE INPUT
  1060.     LDA HFLAG ! CPI    'N' ! RZ ;RETURN IF NO HEX FILE
  1061.     MOV A,B    ;GET INPUT CHARACTER BACK
  1062.     PUSH D ! PUSH PSW
  1063.     PUSH H ! LHLD OBJADR ! LXI D,-1
  1064.     CALL CMPHD ! POP H ! JZ    WOBJ0 ;BRANCH IF FIRST TIME THROUGH
  1065.     XCHG ! LHLD OLDADR ! INX H ! CALL CMPHD    ! JZ WOBJ1 ;BRA IF NEXT SEQ BYT
  1066.     CALL WREC
  1067. WOBJ0    EQU    $
  1068.     XCHG ! SHLD OBJADR ! XCHG
  1069.     XRA A !    STA OBJCNT
  1070. WOBJ1    EQU    $
  1071.     XCHG ! SHLD OLDADR
  1072.     LDA OBJCNT ! CPI 10H ! JC WOBJ2    ;BRANCH IF NOT TIME TO WRITE
  1073.     CALL WREC
  1074.     LHLD OBJADR ! LXI D,16 ! DAD D ! SHLD OBJADR ;ADVANCE ADDR
  1075.     XRA A !    STA OBJCNT
  1076. WOBJ2    EQU    $
  1077.     INR A !    STA OBJCNT    ;UPDATE COUNT
  1078.     DCR A !    MOV E,A    ! MVI D,0 ! LXI    H,OBJ !    DAD D
  1079. WOBJ3    POP PSW    ! MOV M,A
  1080.     POP D
  1081.     RET
  1082. ;
  1083. ;    WREC - FORMAT AND WRITE HEX RECORD
  1084. ;
  1085. ;
  1086. WREC    EQU    $
  1087.     PUSH H ! PUSH D
  1088.     LHLD OLDADR ! LXI D,-1 ! CALL CMPHD ! JZ WREC3 ;BRANCH IF FIRST TIME
  1089.     LDA OBJCNT ! MOV C,A ! MOV B,A ;SET CHKSUM AND COUNT
  1090.     LXI H,REC ! MVI    M,':' !    INX H
  1091.     MOV A,B    ! CALL CNV2HX
  1092.     LDA OBJADR+1 ! ADD C ! MOV C,A ! LDA OBJADR+1 !    CALL CNV2HX
  1093.     LDA OBJADR   ! ADD C ! MOV C,A ! LDA OBJADR ! CALL CNV2HX
  1094.     XRA A !    CALL CNV2HX
  1095.     LXI D,OBJ
  1096. WREC1    EQU    $
  1097.     LDAX D ! ADD C ! MOV C,A ! LDAX    D ! CALL CNV2HX
  1098.     INX D !    DCR B !    JNZ WREC1
  1099.     MOV A,C    ! CMA !    INR A !    CALL CNV2HX
  1100.     MVI M,0DH ! INX    H ! MVI    M,0AH    ;PUT CRLF ON END
  1101.     LXI H,REC    ;WRITE OUT RECORD
  1102. WREC2    EQU    $
  1103.     MOV A,M    ! CALL WNB2
  1104.     MOV A,M    ! CPI 0AH ! INX    H ! JNZ    WREC2 ;GO UNTIL LF
  1105. WREC3    EQU    $
  1106.     POP D !    POP H
  1107.     RET
  1108. ;
  1109. ;    EJECT
  1110. ;
  1111. ;
  1112. ;    PLINE ROUTINE - WRITE AND PAGE
  1113. ;
  1114. ;
  1115. PLINE    EQU    $
  1116.     LDA CURLNE ! CPI MAXLNE    ! JC PLINE1 ;BRANCH IF LESS
  1117.     LXI D,FCB1+1 ! LXI H,HOFNAM ! LXI B,8 !    CALL MOVE ;GET FILE NAME
  1118.     LXI H,HOFPG ! LDA PAGENO ! CALL    CNV2HX
  1119.     LDA HOFPG ! CPI    '0' ! JNZ $+8 !    MVI A,' ' ! STA    HOFPG
  1120.     LDA PAGENO ! ADI 1 ! DAA ! STA PAGENO
  1121.     LXI H,HOFMSG ! CALL WLINE ! XRA    A
  1122. PLINE1    EQU    $
  1123.     INR A !    STA CURLNE
  1124.     LXI H,HDRBUF ! CALL WLINE
  1125.     RET
  1126. ;
  1127. HOFMSG    EQU    $
  1128.     DB 0DH,8AH,0DH,8AH,0CH
  1129.     DB 'Z80ASM-2.0A (C) 1977 LCS'
  1130.     DB 0DH,8AH,0DH,8AH
  1131.     DB 'SOURCE FILE NAME: '
  1132. HOFNAM    DB 'XXXXXXXX           PAGE # '
  1133. HOFPG    DB    'XX'
  1134.     DB 8AH,0DH,8AH,0DH,0AH
  1135. ;
  1136. ;
  1137. ;    EJECT
  1138. ;
  1139. ;
  1140.