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

  1. ;-----------------------------------------------;
  2. ;    Z80 RESIDENT ASSEMBLER            ;
  3. ;-----------------------------------------------;
  4. ;                        ;
  5. ;(C) 1977 LEHMAN CONSULTING SERVICES        ;
  6. ;    ALL RIGHTS RESERVED            ;
  7. ;                        ;
  8. ;-----------------------------------------------;
  9. ;                        ;
  10. ;    SUBROUTINE PACKAGE            ;
  11. ;                        ;
  12. ;-----------------------------------------------;
  13. ;                        ;
  14. ;    REV 0    14-JULY-77    MGL        ;
  15. ;                        ;
  16. ;-----------------------------------------------;
  17. ;
  18. ;    EJECT
  19. ;-----------------------------------------------;
  20. ;                        ;
  21. ;    CPMUTIL COMMUNICATIONS AREA        ;
  22. ;                        ;
  23. ;-----------------------------------------------;
  24. ;
  25.     ORG    103H
  26. ;
  27. ;    JUMP TABLE EQUATES
  28. ;
  29. WLINE    DS    3    ;WRITE PRINTER LINE
  30. WMSG    DS    3    ;WRITE CONSOLE MSG
  31. DSKSEL    DS    3    ;SELECT DISK
  32. OPNFIL    DS    3    ;OPEN FILE
  33. CLSFIL    DS    3    ;CLOSE FILE
  34. DELFIL    DS    3    ;DELETE FILE
  35. DREAD    DS    3    ;DISK READ
  36. DWRITE    DS    3    ;DISK WRITE
  37. CREFIL    DS    3    ;CREATE FILE
  38. DMASET    DS    3    ;SET DMA ADDRESS
  39. MOVE    DS    3    ;MOVE BYTES
  40. CMPCHR    DS    3    ;COMPARE CHARACTERS
  41. CMPHD    DS    3    ;COMPARE HL:DE
  42. MUL16    DS    3    ;HL <= HL * DE
  43. GNB    DS    3    ;GET NEXT BYTE (1K BLOCKING)
  44. WNB    DS    3    ;WRITE NEXT BYTE
  45. GNB2    DS    3    ;GET NEXT BYTE (FCB2)
  46. WNB2    DS    3    ;WRITE NEXT BYTE (FCB2)
  47. CNV2HX    DS    3    ;CONVERT TO HEX - BUF => HL REG
  48. ;
  49. ;
  50. FCB1    DS    33
  51. FCB2    DS    33
  52. IBP    DS    2
  53. IBP2    DS    1
  54. OBP    DS    1
  55. OBP2    DS    1
  56. IBUF    DS    2
  57. OBUF    DS    2
  58. IBUF2    DS    2
  59. OBUF2    DS    2
  60. INBUF    DS    1024
  61. OUTBUF    DS    128
  62. INBUF2    DS    128
  63. OUTBF2    DS    128
  64. ;
  65. ;    EJECT
  66. ;-----------------------------------------------;
  67. ;    COMMON DATA AREA (CDA)            ;
  68. ;-----------------------------------------------;
  69. ;
  70.     ORG    980H    ;LEAVE SPACE FOR CPMUTIL
  71. ;
  72. HDRBUF    DS    16    ;MUST FOLLOW ORG
  73. REC    DS    80    ;MUST FOLLOW HDRBUF
  74. PC    DS    2    ;CURRENT PROGRAM COUNTER
  75. OBJ    DS    32    ;OBJECT CODE BUFFER
  76. OBJCNT    DS    1    ;LEN OF DATA IN OBJ
  77. LEN    DS    1    ;LEN OF CURRENT INSTRUCTION
  78. VAL    DS    2    ;RETURN FROM EVAL ROUTINE
  79. INST    DS    80    ;CURRENT INSTRUCTION (OR DATA FROM DB)
  80. EOM    DB    0    ;END OF BUFFER CHARACTER (FOR WLINE)
  81. PTR1    DS    2    ;POINTS TO NEXT CHAR IN REC
  82. PASSNO    DS    1    ;CURRENT PASS  =0 PASS1   =FF PASS2
  83. IDBUF    DS    16    ;CURRENT ID
  84. INTBUF    DS    2    ;RETURNED VALUE FROM INT ROUTINE
  85. CURLNE    DS    1    ;CURRENT LINE NUMBER FOR PAGING OUTPUT
  86. LEN2    DS    2    ;FOR DEFS
  87. LBLADR    DS    2    ;LAST LBL ADDR IN SYM (FOR EQU)
  88. EQUFLG    DS    1    ;IF NON-ZERO EQUVAL IS USED INSTEAD OF PC FOR PRINT
  89. EQUVAL    DS    2    ;VALUE OF LAST EQU
  90. ENDADR    DS    2    ;EXPRESSION VALUE ON END STATEMENT
  91. EFLG    DS    1    ;END OF PROGRAM FLAG (TO ALLOW PRINTING OF END STMT)
  92. OPCODE    DS    2    ;CURRENT OPCODE FROM SYMBOL TABLE
  93. SAVVAL    DS    2    ;SAVED CONTENTS OF VAL
  94. LFLAG    DS    1    ;LISTING FLAG =N NO LISTING, =' ' OR 'Y' LISTING
  95. HFLAG    DS    1    ;HEX OBJ FLAG =N NO HEX OBJ, =' ' OR 'Y' HEX OBJ OUTPUT
  96. ERRFLG    DS    1    ;ERROR CHARACTER FOR THIS LINE
  97. TEMP    DS    2    ;TEMP 2 BYTE AREA
  98. MULT    DS    2    ;BASE OF NUMBER IN INT CONVERT LOOP
  99. SYMPTR    DS    2    ;ADDRESS OF NEXT SYMBOL TABLE ENTRY
  100. SYMPT    DS    2    ;ADDRESS OF BEGINING OF SYMBOL TABLE
  101. UFLAG    DS    1    ;UNDEFINED FLAG FROM EVAL, =0 ALL OK, =1 >1 UNDEFINED
  102. EVFLGS    DS    1    ;FLAG FIELD FROM LAST SYMLUK
  103. ;
  104. ;    EJECT
  105. ;
  106. ;    JUMP TABLE FOR ROUTINES IN THIS ASSEMBLY
  107. ;
  108.     JMP    EVAL
  109.     JMP    ID
  110.     JMP    INT
  111.     JMP    SETUP    ;INIT FILES FOR ASSEMBLER
  112.     JMP    SYMENT
  113.     JMP    SYMLUK
  114.     JMP    GNR    ;GET NEXT RECORD
  115.     JMP    GNC    ;GET NEXT CHARACTER
  116.     JMP    BACKUP    ;BACKUP TO LAST CHARACTER
  117. ;
  118. ;    EJECT
  119. ;
  120. ;
  121. ;    EXPRESSION EVALUATOR
  122. ;
  123. ;    VALID OPERATORS ARE: +, - AND *
  124. ;
  125. ;    VALID ELEMENTS ARE: ID'S, NUMBERS, AND '$' FOR PC
  126. ;
  127. ;
  128. EVAL    EQU    $
  129.     MVI A,0    ! STA OP ! STA UFLAG ;DEFAULT OP TO +, UFLAG=0
  130.     STA EVFLGS    ;RESET FLAGS FROM LAST SEARCH
  131.     LXI H,0    ! SHLD VAL ;SET VAL TO 0000
  132. EVAL1    EQU    $
  133.     CALL    GNC    ;GET NEXT ELEMENT OR OPERATOR
  134.     CPI '0'    ! JC EVAL3 ! CPI '9'+1 ! JC EVAL9 ;BRANCH IF NUMBER
  135. EVAL3    EQU    $
  136.     CPI '$'    ! JZ EVAL11 ;BRANCH IF PC REF
  137.     CPI 'A'    ! JC EVAL5 ! CPI 'Z'+1 ! JC EVAL13 ;BRANCH IF ID
  138. EVAL5    EQU    $
  139.     CPI '+'    ! JZ EVAL22
  140.     CPI '-'    ! JZ EVAL24
  141.     CPI '*'    ! JZ EVAL26
  142.     CPI 27H    ! JZ EVAL29    ;PROCESS SINGLE BYTE QUOTED STRING
  143.     RET        ;GET OUT OF HERE WE ARE DONE
  144. ;
  145. ;    PROCESS NUMBER
  146. ;
  147. EVAL9    EQU    $
  148.     CALL BACKUP ! CALL INT ! JMP EVAL28
  149. ;
  150. ;
  151. ;    PROCESS '$' REF
  152. ;
  153. EVAL11    EQU    $
  154.     LHLD PC    ! SHLD INTBUF !    JMP EVAL28
  155. ;
  156. ;
  157. ;    PROCESS ID
  158. ;
  159. ;
  160. EVAL13    EQU    $
  161.     CALL BACKUP ! CALL ID
  162.     CALL BACKUP ;BACKUP SO AS TO NOT IGNORE OPERATOR OR COMMA
  163.     LXI H,IDBUF ! CALL SYMLUK ! JNZ    EVAL19 ;BRANCH IF UNDEFINED
  164.     MOV A,M    ! STA INTBUF ! INX H ! MOV A,M ! STA INTBUF+1 !    JMP EVAL28
  165. EVAL19    EQU    $    ;PROCESS UNDEFINED ID
  166.     LXI H,0    ! SHLD INTBUF ;SET VALUE TO 0000
  167.     LDA UFLAG ! ORI    1 ! STA    UFLAG ;SET UNDEFINED FLAG
  168.     JMP EVAL28
  169. ;
  170. ;    PROCESS OPERATORS
  171. ;
  172. EVAL22    EQU    $
  173.     MVI A,0    ! JMP EVAL27
  174. ;
  175. EVAL24    EQU    $
  176.     MVI A,1    ! JMP EVAL27
  177. ;
  178. EVAL26    EQU    $
  179.     MVI A,2
  180. EVAL27    EQU    $
  181.     STA OP
  182.     JMP EVAL1
  183. ;
  184. ;
  185. ;    PROCESS VALUE USING CURRENT OPERATOR
  186. ;
  187. ;
  188. EVAL28    EQU    $    ;VAL = VAL OP INTBUF
  189.     LDA OP
  190.     CPI 1 !    JZ EVAL28A ;BRANCH IF SUBTRACT
  191.     CPI 2 !    JZ EVAL28B ;BRANCH IF MULTIPLY
  192.     LHLD VAL ! XCHG    ! LHLD INTBUF !    DAD D !    SHLD VAL ;+
  193.     JMP EVAL1
  194. ;
  195. EVAL28A    EQU    $    ;SUBTRACT
  196.     LHLD VAL ! XCHG    ! LHLD INTBUF
  197.     MOV A,E    ! SUB L    ! MOV L,A ! MOV    A,D ! SBB H ! MOV H,A !    SHLD VAL
  198.     JMP EVAL1
  199. ;
  200. EVAL28B    EQU    $    ;MULTIPLY
  201.     LHLD VAL ! XCHG    ! LHLD INTBUF !    CALL MUL16 ! SHLD VAL
  202.     JMP EVAL1
  203. ;
  204. ;
  205. ;    PROCESS SINGLE BYTE IN QUOTES
  206. ;
  207. EVAL29    EQU    $
  208.     CALL GNC ;GET CHARACTER
  209.     STA INTBUF ! XRA A ! STA INTBUF+1 ;FAKE 2 BYTE VALUE
  210.     CALL GNC ;BYPASS TRAILING QUOTE
  211.     JMP EVAL28    ;AND GO PROCESS VALUE NORMALLY
  212. ;
  213. ;
  214. OP    DS    1    ;CURRENT OPERATOR FOR EVAL
  215. ;
  216. ;    EJECT
  217. ;
  218. ;
  219. ;    ID - COLLECT ID AND PLACE IN IDBUF
  220. ;
  221. ID    EQU    $
  222.     PUSH H ! PUSH D    ! PUSH B ;SAVE REGS
  223.     MVI A,' ' ! STA    IDBUF
  224.     LXI H,IDBUF+1 !    LXI D,IDBUF ! LXI B,15 ! CALL MOVE ;BLANK IDBUF
  225.     LXI H,IDBUF
  226.     CALL GNC
  227. ID2    EQU    $
  228.     CPI 'A'    ! JC ID1 ! CPI 'Z'+1 ! JNC ID1 ;IF NOT A LETTER THEN BRANCH
  229. ID3    MOV M,A    ! INX H
  230.     PUSH H ! LHLD PTR1 ! MOV A,M ! INX H ! SHLD PTR1 ! POP H
  231.     JMP ID2
  232. ;
  233. ID1    CPI '.'    ! JZ ID3 ; ALLLOW LABELS WITH '.' IN THEM (E.G.  LAB.01)
  234.     CPI '$'    ! JZ ID2 ; ALLOW $ FILLERS (E.G.  SQR$ROOT)
  235.     CPI '0'    ! JC ID4 ! CPI '9'+1 ! JC ID3 ;ALLOW DIGITS
  236. ID4    POP B !    POP D !    POP H
  237.     RET
  238. ;
  239. ;    EJECT
  240. ;
  241. ;
  242. ;    INT - CONVERT CHARACTERS TO BINARY
  243. ;
  244. ;    ALLOW TRAILING 'H' FOR HEX AND 'B' FOR BINARY
  245. ;    DEFAULT TYPE IS DECIMAL (BASE 10)
  246. ;
  247. INT    EQU    $
  248.     LHLD PTR1 ! SHLD TEMP  ;SAVE POINTER
  249.     LXI H,10 ! SHLD    MULT ;SET DEFAULT BASE TO 10
  250.     MVI B,0    ;SET UP LENGTH COUNTER
  251.     CALL GNC    ;SKIP BLANKS
  252. INT1    EQU    $
  253.     CPI '+'    ! JZ INT1A ;BRANCH IF A TERMINATOR
  254.     CPI '-'    ! JZ INT1A
  255.     CPI '*'    ! JZ INT1A
  256.     CPI 0DH    ! JZ INT1A
  257.     CPI ';'    ! JZ INT1A
  258.     CPI ')'    ! JZ INT1A
  259.     CPI ','    ! JZ INT1A
  260.     CPI 20H    ! JZ INT1A
  261.     LHLD PTR1 ! MOV    A,M ! INX H ! SHLD PTR1    ;GET NEXT CHARACTER
  262.     INR B !    JMP INT1 ;INCREMENT COUNTER AND CONTINUE LOOP
  263. INT1A    EQU    $
  264.     DCX H !    SHLD PTR1 ! DCX    H ! MOV    A,M
  265. INT2    CPI 'H'    ! JNZ INT3 ;BRANCH IF NOT HEX
  266.     DCR B    ;DECREMENT COUNTER
  267.     LXI H,16 ! SHLD    MULT ;SET UP BASE 16
  268.     JMP INT4
  269. ;
  270. INT3    CPI 'B'    ! JNZ INT4 ;BRANCH IF NOT BINARY
  271.     DCR B        ;DECREMENT COUNTER
  272.     LXI H,2    ! SHLD MULT  ;SET UP BASE 2
  273. INT4    LHLD PTR1 ! XCHG ! LHLD    TEMP ! SHLD PTR1 ! XCHG    ! SHLD TEMP ;SAVE PTR
  274.     LXI D,0    ;SET UP ACCUMULATOR
  275.     CALL GNC ! CALL    BACKUP
  276. INT5    EQU    $
  277.     LHLD PTR1 ! MOV    A,M
  278.     INX H !    SHLD PTR1
  279.     CPI 'A'    ! JC $+5 ! ADI 9 ;FOR A-F
  280.     ANI 0FH    ! PUSH PSW ;GET BINARY VALUE OF THIS DIGIT
  281.     PUSH B    ;SAVE COUNTER
  282.     LHLD MULT ! CALL MUL16
  283.     POP B    ;RESTORE COUNTER
  284.     POP PSW    ! MOV E,A ! MVI    D,0 ! DAD D ;ADD IN NEW DIGIT
  285.     XCHG ! DCR B ! JNZ INT5    ;GO BACK IF MORE TO DO
  286. INT6    LHLD TEMP ! SHLD PTR1
  287.     XCHG ! SHLD INTBUF ;SAVE VALUE
  288.     RET
  289. ;
  290. ;    EJECT
  291. ;
  292. ;    SETUP - SET UP FILES FOR Z80ASM
  293. ;
  294. ;    INPUT FROM CONSOLE IS FILENAME.AB
  295. ;
  296. ;    A= Y OR N FOR LISTING
  297. ;    B= Y OR N FOR HEX FILE
  298. ;
  299. SETUP    EQU    $
  300.     LXI H,FCB1 ! LXI D,5CH ! LXI B,33 ! CALL MOVE ;GET DEFAULT FCB
  301.     LXI H,FCB1+9 ! LXI D,ASMEXT ! LXI B,3 !    CALL MOVE ;SET UP EXTENSION
  302.     LXI H,FCB2 ! LXI D,5CH ! LXI B,33 ! CALL MOVE ;GET DEFAULT FCB
  303.     LXI H,FCB2+9 ! LXI D,HEXEXT ! LXI B,3 !    CALL MOVE ;SET UP EXTENSION
  304.     LDA 5CH+9 ! STA    LFLAG ;SET UP LISTING FLAG
  305.     LDA 5CH+10 ! STA HFLAG ;SET UP HEX FLAG
  306.     LXI D,FCB1 ! CALL OPNFIL ! JZ SETER1 ;BRANCH IF SOURCE FILE NOT FOUND
  307.     LDA HFLAG ! CPI    'N' ! JZ SETUP1    ;BRANCH IF NO HEX FILE SETUP
  308.     LXI D,FCB2 ! CALL DELFIL ;DELETE FILE
  309.     LXI D,FCB2 ! CALL CREFIL ! JZ SETER2 ;BRANCH IF UNABLE TO CREATE
  310.     LXI D,FCB2 ! CALL OPNFIL ! JZ SETER2 ;BRANCH IF UNABLE TO OPEN
  311. SETUP1    EQU    $
  312.     LXI H,INBUF+1024 ! SHLD    IBP ! XRA A ! STA OBP2 ;SET UP POINTERS
  313.     RET ;AND GET OUT OF HERE
  314. ;
  315. SETER1    LXI D,SM1 ! CALL WMSG !    JMP 0 ;MSG AND REBOOT
  316. ;
  317. SETER2    LXI D,SM2 ! CALL WMSG !    JMP 0 ;MSG AND REBOOT
  318. ;
  319. SM1    DB    13,10,'SOURCE (.ASM) FILE NOT FOUND',13,10,'$'
  320. ;
  321. SM2    DB    13,10,'UNABLE TO CREATE/OPEN OBJECT (.HEX) FILE',13,10,'$'
  322. ;
  323. ASMEXT    DB    'ASM'
  324. HEXEXT    DB    'HEX'
  325. ;
  326. ;    EJECT
  327. ;
  328. ;    SYMENT - ENTER A SYMBOL INTO THE SYMBOL TABLE
  329. ;
  330. ;    UPON ENTRY HL POINTS TO NEW ENTRY
  331. ;
  332. ;    ENTRY FORMAT:    FLAGS/LENGTH (EACH 4 BITS)
  333. ;            N A M E ...  (UP TO 11 BYTES)
  334. ;            VALUE LOW    (1 BYTE)
  335. ;            VALUE HIGH   (1 BYTE)
  336. ;            TYPE BYTE    (1 BYTE)
  337. ;
  338. ;    ON RETURN HL POINTS TO VALUE LOW BYTE IN NEW ENTRY FOR POSSIBLE
  339. ;    FURTHER UPDATE (USED BY EQU PSEUDO OPERATOR)
  340. ;
  341. ;
  342. SYMENT    EQU    $
  343.     MOV A,M    ! PUSH B ! XCHG    ! ANI 0FH ! MOV    C,A ! MVI B,0 ;GET LEN
  344.     LHLD SYMPTR ! CALL MOVE    ;MOVE INTO SYMBOL TABLE
  345.     SHLD SYMPTR ! MVI M,0 ; SET UP NEW POINTER AND NEW END MARKER
  346.     DCX H !    DCX H !    DCX H ;BACKUP TO POINT TO VALUE LOW FIELD
  347.     POP B
  348.     RET
  349. ;
  350. ;    EJECT
  351. ;
  352. ;
  353. ;    SYMLUK - LOOK UP SYMBOLS IN TABLE
  354. ;
  355. ;    ON RETURN Z=0 MEANS SYMBOL NOT FOUND.
  356. ;          Z=1 SYMBOL FOUND, HL POINTS TO VALUE LOW BYTE IN TABLE ENTRY
  357. ;
  358. ;
  359. SYMLUK    EQU    $
  360.     XCHG
  361.     LHLD SYMPT ;GET POINTER TO BEGINING OF TABLE
  362.     XCHG
  363. SYML1    LDAX D ! CPI 0 ! JZ SYMNF ;BRANCH IF END OF TABLE
  364.     STA EVFLGS ;SAVE FOR MAIN PROCESSOR
  365.     ANI 0FH    ! SUI 4    ! MOV B,A ! INX    D ;SET UP FOR COMPARE
  366.     CALL CMPCHR ! JZ SYML2 ;BRANCH IF MATCH
  367.     DCX D    ;BACK UP LENGTH BYTE AGAIN
  368. SYML3    EQU    $
  369.     LDAX D ! ANI 0FH ! MOV C,A ! MVI B,0 ! XCHG ! DAD B ! XCHG
  370.     JMP SYML1 ;ADVANCE POINTER AND CONTINUE TO LOOP
  371. ;
  372. SYML2    EQU    $    ;NOW SEE IF EXACT MATCH
  373.     DCX D !    LDAX D ! ANI 0FH ! SUI 4  ;GET LENGTH
  374.     PUSH H ! MOV C,A ! MVI B,0 ! DAD B ! MOV A,M
  375.     CPI ' '    ! POP H    ! JNZ SYML3 ;IF NXT CHR NOT BLANK THEN NOT EXACT MATCH
  376.     LDAX D ! ANI 0FH ! DCR A ! DCR A ! DCR A ! MOV C,A ! MVI B,0
  377.     XCHG ! DAD B ! XRA A ! RET ;POINT TO VALUE LOW AND EXIT
  378. ;
  379. SYMNF    XRA A !    INR A !    RET ;SET Z=0 AND RETURN
  380. ;
  381. ;    EJECT
  382. ;
  383. ;    GNR - GET NEXT RECORD - FILL REC UNTIL 0AH OR 1AH (CTRL/Z) IS FOUND
  384. ;
  385. GNR    LXI H,REC ! SHLD PTR1 ;RESET POINTER
  386.     MVI M,' ' ! XCHG ! LXI H,REC+1 ! LXI B,79 ! CALL MOVE ;BLNK BUFFER
  387.     LXI H,REC    ;GET ADDRESS OF RECORD BACK AGAIN
  388. GNR1    CALL GNB ! CPI 1AH ! RZ    ;RETURN IF EOF MARKER (CTRL/Z) IF FOUND
  389.     CPI 09H    ! JZ GNR2    ;BRANCH IF TAB CHARACTER
  390.     MOV M,A    ! INX H    ! CPI 0AH ! JNZ    GNR1 ;BRANCH IF NOT LF
  391.     RET
  392. GNR2    EQU    $    ;PROCESS TAB
  393.     LXI D,8    ! DAD D    ! MOV A,L ! ANI    0F8H ! MOV L,A ;PROCESS TAB STOP
  394.     JMP GNR1
  395. ;
  396. ;    EJECT
  397. ;
  398. ;
  399. ;    GNC - GET NEXT CHARACTER
  400. ;    USE PTR1 TO INDEX INTO REC, SKIP BLANKS
  401. ;
  402. GNC    EQU    $
  403.     PUSH H ! LHLD PTR1
  404.     MOV A,M    ! CPI ' ' ! INX    H ! JZ $-4 ;SKIP BLANKS
  405.     CPI 09H    ! JZ $-9 ;BRANCH IF TAB CHARACTER
  406.     SHLD PTR1 ! POP    H
  407.     RET
  408. ;
  409. ;
  410. ;    BACKUP - BACKUP PTR1 AND RETURN CHARACTER
  411. ;
  412. ;
  413. BACKUP    PUSH H ! LHLD PTR1
  414.     DCX H !    MOV A,M
  415.     SHLD PTR1 ! POP    H
  416.     RET
  417. ;
  418. ;    EJECT
  419.