home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol095 / crowlink.z80 < prev    next >
Encoding:
Text File  |  1984-04-29  |  7.3 KB  |  391 lines

  1.      TITLE    'Z80-ASSEMBLER TO CP/M LINKAGES'
  2. ;
  3. ;    EQUATE TABLE
  4. ;
  5. CR    EQU    13
  6. LF    EQU    10
  7. ENTRY    EQU    5        ;FDOS ENTRY
  8. BOOT    EQU    0        ;WARM START
  9. SETDMA    EQU    26        ;CP/M FUNCTION NUMBER
  10. OPNFIL    EQU    15        ;OPEN FILE
  11. CLSFIL    EQU    16        ;CLOSE FILE
  12. DELFIL    EQU    19        ;DELETE FILE
  13. MAKFIL    EQU    22        ;CREATE FILE
  14. RDNR    EQU    20        ;READ NEXT RECORD
  15. WRNR    EQU    21        ;WRITE NEXT RECORD
  16. PRBUF    EQU    9        ;PRINT STRING
  17. DFCB    EQU    5CH        ;CP/M DEFAULT FCB
  18. DEFBUF    EQU    80H        ;CP/M DEFAULT I/O ADDR
  19. PASSNO    EQU    1B03H        ;CURRENT PASS NO.
  20. ;
  21. GETCON    EQU    0F009H        ;MONITOR CONSOLE INPUT
  22. PUTCON    EQU    0F00CH        ;MONITOR CONSOLE OUTPUT
  23. CTLZ    EQU    1AH        ;^Z = EOF MARK
  24. ;
  25. ;
  26.     ORG    102H
  27.     JP    CONIN
  28.     JP    CONOUT
  29.     JP    LSTO
  30.     JP    RDRIN
  31.     JP    PCHO
  32.     JP    MEMCHK
  33.     JP    BOOT
  34. ;
  35.     ORG    2400H        ;PUT ABOVE SYMBOL TABLE
  36. ;
  37. SRCFCB    DEFB    0        ;FCB STARTS WITH 0
  38. SRCFN    DEFM    '        '    ;RESERVE 8 CHARS FOR FILE NAME
  39.     DEFM    'Z80'        ;USE EXTENSION OF Z80
  40.     DEFS    21        ;21 BYTES FOR CP/M
  41. SRCPTR    DEFS    2        ;FOR CHARACTER POINTER
  42. SRCOPN    DEFM    'C'        ;DECLARE CLOSED
  43. ;
  44. LSTFCB    DEFB    0        ;LISTING FILE SETUP
  45. LSTFN    DEFM    '        '
  46.     DEFM    'PRN'        ;PRINT FILE
  47.     DEFS    21
  48. LSTPTR    DEFS    2
  49. LSTOPN    DEFM    'C'
  50. ;
  51. HEXFCB    DEFB    0        ;SAME FOR HEX FILE
  52. HEXFN     DEFM    '        '
  53.     DEFM    'HEX'
  54.     DEFS    21
  55. HEXPTR    DEFS    2
  56. HEXOPN    DEFM    'C'
  57. ;
  58. MEMCHK    LD A, 0FFH        ;MAX MEM = 23FFH
  59.     LD B, 23H
  60.     RET
  61. ;
  62. CONOUT    PUSH     BC        ;NO REGISTERS MAY BE DESTROYED
  63.     PUSH    DE
  64.     PUSH    HL
  65. OUT4    LD A,C
  66.     CALL    PUTCON
  67. ;
  68. GENRET    POP    HL        ;GENERAL RETURN FOR ALL SUBR'S
  69.     POP     DE
  70.     POP    BC
  71.     RET
  72. ;
  73. ;
  74. OPNOUT    PUSH    DE        ;OPEN (DE) FCB FOR OUTPUT
  75.     LD C, DELFIL        ;FIRST DELETE CURRENT
  76.     CALL    ENTRY
  77.     POP    DE
  78.     LD C, MAKFIL        ;THEN RE-CREATE
  79.     JP    ENTRY
  80. ;
  81. CONIN    PUSH    BC        ;CONSOLE INP IS ONLY COMMON
  82.     PUSH    DE        ; POINT FOR ALL PASSES SO DO
  83.     PUSH    HL        ; SETUP HERE
  84. ;
  85.     LD A, (SRCOPN)        ;IS SRC OPEN?
  86.     CP 'O'
  87.     CALL NZ, CPYFCB        ;IF NOT, CREATE FCB'S
  88.     LD HL, (NXTPAS)        ;POINT TO PASS SEQUENCE
  89.     LD A, (HL)        ;GET NEXT PASS NUMBER
  90.     INC HL            ;UPDATE POINTER
  91.     LD (NXTPAS), HL        ;SAVE POINTER
  92.     PUSH    AF
  93. ;
  94.     CP 'Q'            ;QUIT ?
  95.     CALL Z    FLUSH        ;YES, FLUSH BUFFERS
  96.     POP    AF
  97.     PUSH    AF
  98. ;
  99.     CP '1'            ;PASS 1?
  100.     JR Z,    PASS1  
  101.     CP '2'            ;PASS 2?
  102.     JP Z,    PASS2  
  103.     CP '3'            ;PASS 3?
  104.     JP Z,    PASS3  
  105.     CP '4'            ;PASS 4 USES CONSOLE OUTPUT 
  106.     JR Z,    PASS1  
  107. INPRET    POP    AF        ;IF NONE OF ABOVE, EXIT
  108.     JR    GENRET  
  109. ;
  110. NXTPAS    DEFW    SEQNO        ;SEQUENCE # POINTER
  111. SEQNO    DEFM    '1423Q'        ;DEFAULT SEQUENCE
  112. CPYFCB  LD HL, DFCB+9        ;POINT TO FILE EXTENSION
  113.     LD DE, SEQNO+2        ;POINT TO PASS 2 FLAG
  114.     LD A, 'N'        ;IF N, SKIP PASS
  115.     CP (HL)            ;SKIP IT?
  116.     JR NZ    DOIT        ;NO, DO LISTING
  117.     LD (DE), A        ;SKIP IT
  118. DOIT    INC HL            ;POINT TO HEX SWITCH
  119.     INC DE            ;POINT TO PASS 3 FLAG
  120.     CP (HL)            ;SKIP IT?
  121.     JR NZ    COPYIT        ;NO, DO HEX FILE
  122.     LD (DE), A        ;DON'T DO IT
  123. COPYIT    LD BC, 8H        ;SETUP FOR LDIR
  124. ;
  125.     LD DE, SRCFN        ;DESTINATION
  126.     PUSH    BC
  127.     CALL    MOVFCB
  128. ;
  129.     LD DE, LSTFN
  130.     POP    BC
  131.     PUSH    BC
  132.     CALL    MOVFCB
  133. ;
  134.     LD DE, HEXFN
  135.     POP    BC
  136. ;
  137. MOVFCB    LD HL, DFCB+1        ;FILE NAME STARTS IN POS 1
  138.     LDIR
  139.     RET
  140. ;
  141. PASS1    XOR A            ;MAKE SURE OPEN FIRST 
  142.     LD (SRCFCB+12), A     ; EXTENT
  143.     LD DE,    SRCFCB
  144.     LD C, OPNFIL
  145.     CALL     ENTRY
  146.     CP 0FFH            ;SUCESSFUL?
  147.     JR Z,    NOSRC          ; NO, LET US KNOW
  148.     LD A, 'O'        ; DECLARE OPEN
  149.     LD (SRCOPN), A
  150.     XOR A            ;FIRST RECORD IS #0
  151.     LD (SRCFCB+32), A
  152.     LD HL, SRCBUF+1024
  153.     LD (SRCPTR), HL
  154.     JR    INPRET  
  155. ;
  156. NOSRC    LD DE, NFMSG        ;NO FILE MESSAGE
  157. ERROUT    LD C, PRBUF        ;PRINT STRING FUNCTION
  158.     CALL     ENTRY
  159.     CALL    GETCON        ;WAIT FOR KEYSTROKE TO EXIT
  160.     JP    BOOT
  161. ;
  162. NFMSG    DEFB    CR
  163.     DEFB    LF
  164.     DEFM    'NO SOURCE FILE FOUND'
  165.     DEFB    CR
  166.     DEFB    LF
  167.     DEFM    '$'
  168. ;
  169. PASS2    LD A, (HEXOPN)        ;HEX FILE OPEN FROM PREV?
  170.     CP 'O'
  171.     CALL Z, FLUSH        ;YES, FLUSH AND CLOSE
  172. ;
  173.     LD DE, LSTFCB        ;OPEN LISTING FILE
  174.     CALL    OPNOUT
  175.     CP 0FFH            ;SUCESSFUL?
  176.     JR Z,    DSKERR      ;NO, ERROR MSG
  177.     LD A, 'O'
  178.     LD (LSTOPN),A        ;DECLARE OPEN
  179.     XOR A            ;START WITH RECORD 0
  180.     LD (LSTFCB+32), A
  181.     LD HL, LSTBUF        ;DECLARE EMPTY
  182.     LD (LSTPTR), HL
  183.     JR    PASS1          ;GO OPEN SRC
  184. ;
  185. DSKERR    LD DE, ERRMSG
  186.     JR    ERROUT      ;GOTO ERROR OUTPUT RTN
  187. ;
  188. ERRMSG    DEFB    CR
  189.     DEFB    LF
  190.     DEFM    'DISK ERROR, ASSEMBLY ABORTED'
  191.     DEFB    CR
  192.     DEFB    LF
  193.     DEFM    '$'
  194. ;
  195. PASS3    LD A, (LSTOPN)        ;LIST STILL OPEN?
  196.     CP 'O'
  197.     CALL Z,    FLUSH        ;YES, FLUSH AND CLOSE
  198.     LD DE, HEXFCB
  199.     CALL    OPNOUT        ;OPEN HEX FILE FOR OUTPUT
  200.     CP 0FFH            ;SUCESS?
  201.     JR Z,    DSKERR      ;NO, ABORT
  202. ;
  203.     LD A, 'O'
  204.     LD (HEXOPN),A        ;DECLARE OPEN
  205.     XOR A
  206.     LD (HEXFCB+32), A
  207.     LD HL, HEXBUF         ;DECLARE EMPTY
  208.     LD (HEXPTR), HL
  209.     JP    PASS1          ;GO OPEN SRC
  210. ;
  211. FLUSH    LD A, (HEXOPN)        ;HEX FILE OPEN?
  212.     CP 'O'            ; IF O, YES
  213.     JR Z,    HEXFL  
  214. ;
  215.     LD A, (LSTOPN)        ;LIST FILE OPEN?
  216.     CP 'O'            ; IF O, YES
  217.     RET NZ            ; NO OPEN OUTPUT FILES, EXIT
  218. ;
  219.     LD DE, LSTBUF        ;DE POINTS TO START
  220.     LD HL, (LSTPTR)        ;HL POINTS TO CURRENT CHAR
  221.     LD BC, LSTFCB        ;NEED FCB PTR FOR CP/M
  222.     JR    MTBUF  
  223. ;
  224. HEXFL    LD DE, HEXBUF        ;COMMENTS AS FOR LST FILE
  225.     LD HL, (HEXPTR)
  226.     LD BC, HEXFCB
  227. ;
  228. MTBUF    LD A, L            ;FIND IF ON RECORD BOUNDARY
  229.     AND 127
  230.     JR Z,    MTBUF2      ;IF Z, YES
  231.     LD (HL), CTLZ        ;PUT ^Z AS EOF MARK
  232. ;
  233. MTBUF2    PUSH    BC        ;SAVE FCB PTR
  234.     OR A            ;CLEAR CARRY
  235.     SBC HL, DE        ;CALC # BYTES IN BUFFER
  236.     JR NZ,    AREREC      ;IF NZ, ARE RECORDS TO WRITE
  237.     POP BC            ;ELSE EXIT
  238.     RET
  239. ;
  240. AREREC    LD B, 7            ;B = SHIFT COUNTER
  241. DIV128    SRL H            ; BYTES/128 = # RECORDS
  242.     RR  L
  243.     DJNZ    DIV128      ;LOOP TIL DONE
  244. ;
  245.     LD B, L            ;B = # RECORDS
  246.     OR A            ;FIND IF EVEN RECORD AGAIN
  247.     JR Z,    EVNREC  
  248. ;
  249.     INC B            ;DON'T WANT TO LOSE PARTIAL
  250. EVNREC    EX DE, HL        ;HL = BUFFER POINTER
  251.     POP    DE        ;DE = FCB POINTER
  252. ;
  253.     CALL    FLBUF        ;WRITE BUFFER TO DISK
  254.     LD C, CLSFIL        ;CLOSE FUNCTION
  255.     PUSH    DE
  256.     CALL    ENTRY
  257.     POP    DE
  258.     LD HL, 35        ;(DE+35) = FILE OPEN FLAG
  259.     ADD HL, DE
  260.     EX DE, HL
  261.     LD (HL), 'C'        ;DECLARE CLOSED
  262.     RET
  263. ;
  264. FLBUF    PUSH    BC        ;B=#RECS, C=CHAR
  265.     PUSH    HL        ;HL=BUFFER POINTER
  266.     PUSH    DE        ;DE=FCB PTR
  267. ;
  268.     EX DE, HL        ;DE NOW = BUFFER PTR
  269.     LD C, SETDMA
  270.     CALL    ENTRY        ;DMA NOW = BUFFER
  271. ;
  272.     POP    DE        ;GET FCB PTR BACK
  273.     PUSH    DE
  274.     LD C, WRNR        ;WRITE NEXT REC FUNCTION
  275.     CALL    ENTRY
  276. ;
  277.     OR A            ;SET FLAGS
  278.     JP NZ,    DSKERR
  279. ;
  280.     POP    DE
  281.     POP    HL
  282.     POP    BC
  283. ;
  284.     DEC B
  285.     RET Z            ;IF Z, ALL RECORDS WRITTEN
  286. ;
  287.     LD A, L
  288.     ADD A, 128        ;UPDATE DATA POINTER
  289.     LD L, A
  290.     JR NC,    FLBUF  
  291.     INC H
  292.     JR    FLBUF  
  293. ;
  294. PCHO    PUSH    BC
  295.     PUSH    DE
  296.     PUSH    HL
  297.     LD HL, (HEXPTR)        ;BUFFER POINTER
  298.     LD A,H            ;GET HIGH ORDER
  299.     CP 34H                  ;FULL?
  300.     JR Z,    DMPHEX      ;IF Z, BUFFER FULL
  301. ;
  302. HEXCHR    LD (HL),C
  303.     INC HL            ;NOT FULL, JUST STORE CHAR
  304.     LD (HEXPTR), HL
  305.     JP    GENRET
  306. ;
  307. DMPHEX    PUSH    BC        ;SAVE CHAR
  308.     LD B, 8            ;8 RECORD BUFFER
  309.     LD HL, HEXBUF        ;SETUP FOR FLBUF
  310.     LD DE, HEXFCB
  311.     CALL    FLBUF
  312. ;
  313.     POP    BC        ;GET CHAR BACK
  314.     LD HL,    HEXBUF         ;START AT BEGINNING AGAIN
  315.     JR    HEXCHR  
  316. ;
  317. LSTO    PUSH    BC
  318.     PUSH    DE
  319.     PUSH    HL
  320.     LD A,(PASSNO)        ;GET CURRENT PASS
  321.     CP 4            ;IS IT PASS 4 ?
  322.     JP Z,    OUT4        ;IF YES, OUTPUT TO CONSOLE
  323.     LD HL, (LSTPTR)        ;NO, OUTPUT TO .PRN
  324.     LD A, H
  325.     CP 30H            ;FULL?
  326.     JR Z,    DMPLST      ;YES, FLUSH
  327. ;
  328. LSTCHR    LD (HL), C        ;STORE CHAR IN I/O BUFFER
  329.     INC HL            ;UPDATE POINTER
  330.     LD (LSTPTR), HL
  331.     JP    GENRET
  332. ;
  333. DMPLST    PUSH    BC
  334.     LD B, 8            ;BUFFER = 8 RECORDS
  335.     LD HL, LSTBUF        ;START AT BEGINNING
  336.     LD DE, LSTFCB        ;FCB FOR CP/M
  337.     CALL    FLBUF
  338. ;
  339.     POP    BC        ;GET THIS OUTPUT CHAR BACK
  340.     LD HL, LSTBUF        ;RESTART AT BEGINNING
  341.     JR    LSTCHR  
  342. ;
  343. RDRIN    PUSH    BC
  344.     PUSH    DE
  345.     PUSH    HL
  346.     LD HL, (SRCPTR)        ;GET SRC POINTER
  347.     LD A, H
  348.     CP 2CH                  ;PAST END? 
  349.     JR Z,    SRCRD          ;YES, GO GET MORE
  350. ;
  351. NXTCHR    LD A, (HL)        ;GET CHAR
  352.     INC HL
  353.     LD (SRCPTR), HL        ;SAVE POINTER
  354.     JP    GENRET
  355. ;
  356. SRCRD    LD BC, 0880H        ;B=#RECS, C=BYTES/REC
  357.     LD DE, SRCBUF        ;DESTINATION
  358. ;
  359. NXTREC    PUSH    DE
  360.     PUSH    BC
  361.     LD C, SETDMA
  362.     CALL    ENTRY
  363. ;
  364.     LD DE, SRCFCB
  365.     LD C, RDNR        ;READ NEXT RECORD
  366.     CALL    ENTRY
  367. ;
  368.     POP    BC
  369.     POP    DE
  370.     CP 1            ;1 MEANS FILE DONE
  371.     JR Z,    SRCDON  
  372. ;
  373.     LD A, E            ;UPDATE DESTINATION
  374.     ADD A, C
  375.     LD E, A
  376.     JR NC,    DOK  
  377.     INC D
  378. DOK    DEC B            ;DONE 8 RECORDS?
  379.     JR NZ,    NXTREC      ;NO, CONTINUE
  380. ;
  381. SRCDON    LD HL, SRCBUF        ;START AT BEGINNING
  382.     JR    NXTCHR  
  383. ;
  384. ;
  385.     ORG    2800H        ;I/O BUFFERS
  386. SRCBUF    DEFS    1024
  387. LSTBUF    DEFS    1024
  388. HEXBUF    DEFS    1024
  389. ;
  390.     END
  391.