home *** CD-ROM | disk | FTP | other *** search
- .TITLE "CP/M DISK I/O DRIVERS FOR TDL'S TEXT OUTPUT PROCESSOR VER. 1.0"
- ;
- ; MIKE FAVITTA
- ; 2 JANET LANE
- ; ALBANY, NY 12203
- ;
- ; THIS PROGRAM ADAPTS THE TDL TEXT OUTPUT PROCESSOR
- ; TO WORK UNDER CP/M.
- ;
- ; SEE TOP.DOC FOR DETAILS
- ;
- ;***********************************
- ; CP/M STANDARD EQUATES
- ;***********************************
-
- BOOT = 0000H ;WARM START ADDRESS
- TFCB = 005CH ;DEFAULT FCB ADDRESS
- TBUF = 0080H ;DEFAULT BUFFER ADDRESS
- TBASE = 0100H ;TRANSIENT PROGRAM BASE
- BDOS = 0005H ;BDOS ENTRY POINT
-
- ;***********************************
- ; CP/M FUNCTION CODES
- ;***********************************
-
- SRSET = 00 ;SYSTEM RESET
- RCON = 01 ;READ CONSOLE
- WCON = 02 ;WRITE CONSOLE
- RRDR = 03 ;READ READER
- WPUN = 04 ;WRITE PUNCH
- WLST = 05 ;WRITE LIST
- ISTAT = 07 ;GET IOSTATUS
- SSTAT = 08 ;SET IOSTATUS
- WCONB = 09 ;WRITE CONSOLE BUFFER
- RCONB = 10 ;READ CONSOLE BUFFER
- CSTAT = 11 ;CHECK CONSOLE STATUS
- LHEAD = 12 ;LIFT DISK HEAD
- RSDSK = 13 ;RESET DISK SYSTEM
- SDISK = 14 ;SELECT DISK
- OPEN = 15 ;OPEN FILE
- CLOSE = 16 ;CLOSE FILE
- SFRST = 17 ;SEARCH FIRST
- SNEXT = 18 ;SEARCH NEXT
- FDELT = 19 ;DELETE FILE
- READ = 20 ;READ RECORD
- WRITE = 21 ;WRITE RECORD
- CREATE = 22 ;CREATE FILE
- RENAM = 23 ;RENAME FILE
- LOGIN = 24 ;GET LOGIN
- IDISK = 25 ;GET DISK NUMBER
- SDMA = 26 ;SET DMA VECTOR
- IALLOC = 27 ;GET ALLOCATION VECTOR
- ;
- EOF = 1AH ; CP/M END OF FILE CHAR
- CR = 0DH
- LF = 0AH
- ;
- .PABS ; USE INTEL HEX FORMAT
- .LOC 100H ; USE CP/M RUN ADDRESS
- ;
- START: JMP TOPDK
- ;
- ;
- ; TRANSIENT PROGRAM STORAGE
- ; DEFINITIONS
- ;
- SDSK: .WORD 0 ; SOURCE DRIVE
- ODSK: .WORD 1 ; OUTPUT DRIVE
- OPT: .WORD 0 ; SAVE OPTIONS HERE
- SRCPTR: .WORD SRCBUF+128; SOURCE BUFFER POINTER
- LSTPTR: .WORD LSTBUF ; LISTING BUFFER POINTER
- SRCFCB: .BLKB 36 ; SOURCE FILE CONTROL BLOCK
- SRCBUF: .BLKB 128 ; SOURCE FILE BUFFER
- LSTFCB: .BLKB 36 ; LISTING FILE CONTROL BLOCK
- LSTBUF: .BLKB 128 ; LISTING FILE BUFFER
- ;
- ;
- TOPDK: LXI SP,TOPST+16EH ; SET TEMP STACK
- LXI H,SRCFCB
- LXI B,TOPDK-SRCFCB
- MVI A,0
- CLEAR: MOV M,A ; ZERO FCB AND BUFFER
- INX H ; AREAS
- DCX B
- CMP C
- JRNZ CLEAR
- CMP B
- JRNZ CLEAR
- LDA TFCB+17 ; SAVE OPTIONS
- STA OPT
- LDA TFCB+18
- STA OPT+1
- MVI C,IDISK ; GET ACTIVE DRIVE #
- CALL BDOS
- MOV C,A
- MVI A,'S' ; IS THE
- CALL OPTS ; S OPTION SET
- MOV A,C
- JRNZ DUAL ; NO,SET UP FOR 2 DRIVES
- STA SDSK ; SET UP FOR 1 DRIVE
- STA ODSK
- JMPR SKIP
- DUAL: BIT 0,A ; IS SOURCE ON A
- JRZ SKIP
- STA SDSK ; SOURCE ON B
- MVI A,0
- STA ODSK
- SKIP: LXI H,TOP ; INSERT FILETYPE
- CALL CKFIL
- CPI 0FFH ; FILE EXIST?
- JRNZ GOTFIL ; YES
- LXI H,DOC ; NO, TRY DOC EXT
- CALL CKFIL
- MVI C,0 ; ERROR 0
- CPI 0FFH ; FILE EXIST?
- CZ ERROR ; NO, ERROR
- GOTFIL: LXI H,TFCB ; MOVE FILE NAME TO SRCFCB
- LXI D,SRCFCB
- LXI B,12
- LDIR ; MOVE BLOCK
- LXI D,SRCBUF ; MAKE SURE SRCBUF
- MVI C,SDMA ; IS USED
- CALL BDOS
- LXI D,SRCFCB ; OPEN SOURCE FILE
- MVI C,OPEN
- CALL BDOS
- MVI C,1 ; ERROR 1
- CPI 0FFH
- CZ ERROR
- MVI A,'D' ; ONLY WANT LIST FILE
- CALL OPTS ; IF D OPT IS SET
- JRNZ ..SKP
- LDED ODSK ; LOG IN OUTPUT DRIVE
- MVI C,SDISK
- CALL BDOS
- LXI D,LSTFCB ; CREATE LISTING FILE
- LXI B,PRN
- CALL MAKEF
- ..SKP: JMP TOPST ; GO ASSEMBLE
- ;
- ; TABLE OF FILETYPES
- ;
- TOP: .ASCII 'TOP'
- DOC: .ASCII 'DOC'
- PRN: .ASCII 'PRN'
- ;
- ; CHECK IF FILE EXISTS WITH
- ; EXT POINTED TO BY HL
- ;
- CKFIL: LXI D,TFCB+9
- LXI B,3 ; IN TRANSIENT FCB
- LDIR ; MOVE FILETYPE
- LXI D,TFCB ; CHECK DIRECTORY
- MVI C,SFRST ; TO SEE IF FILE EXISTS
- CALL BDOS
- RET
- ;
- ; TEXT OUTPUT PROCESSOR IS DONE
- ; MUST WRAP UP LOOSE ENDS
- ;
- TRPSIM: MVI A,'D' ; DON'T CLOSE IF
- CALL OPTS ; D OPT ISN'T SET
- JRNZ DONE
- MVI C,EOF ; FILL WITH EOF'S
- LOOP: CALL OUTSIM ; AND EMPTY BUFFER
- JRNC LOOP
- MVI C,CLOSE ; CLOSE FILE
- LXI D,LSTFCB
- CALL BDOS
- DONE: JMP BOOT
- ;
- ; IF CHAR IN A MATCHES 1 OF THE
- ; OPTIONS, SET THE ZERO FLAG
- ;
- OPTS: PUSH H
- LXI H,OPT ; POINT TO OPTIONS
- CMP M ; MATCH ?
- JRZ ..SKP ; YES,RETURN
- INX H ; NO,TRY NEXT ONE
- CMP M
- ..SKP: POP H
- RET
- ;
- ; SIMULATE CONSOLE INPUT
- ;
- CISIM: PUSH H ; SAVE ASSEMBLER REGISTERS
- PUSH D
- PUSH B
- MVI C,RCON ; READ A CHAR FROM
- CALL BDOS ; CP/M CONSOLE
- POP B
- POP D
- POP H
- RET
- ;
- ; CHARACTER INPUT SUBROUTINE
- ;
- ; CREATE A SOURCE BUFFER AND LOAD
- ; IT FROM THE DISK. AT EACH CALL
- ; SUPPLY ONE CHARCTER IN A REG.
- ; IF BUFFER EMPTY, CALL BDOS TO
- ; FILL IT. SET CARRY IF EOF IS
- ; FOUND IN FILE.
- ;
- RISIM: PUSH H ; SAVE ASSM HL,DE
- PUSH D
- LXI D,SRCFCB ; GET FCB ADDRESS
- LHLD SRCPTR ; GET BUFFER POINTER
- CALL BUFIN ; READ A BYTE
- SHLD SRCPTR ; SAVE BUFFER POINTER
- POP D ; RESTORE HL,DE
- POP H
- CPI EOF ; CHECK FOR EOF CHAR
- STC ; SET EOF FLAG IN CARRY
- RZ
- CMC ; NOT EOF, ERASE MARK
- RET
- ;
- ; DETERMINE WHERE OUTPUT
- ; SHOULD GO
- ;
- OUTSIM: PUSH D ; SAVE TOP'S REGISTERS
- PUSH H
- MVI A,'D' ; D OPT SET ?
- CALL OPTS
- JRZ POSIM ; YES, DISK FILE
- JMPR LOSIM ; NO, LIST DEVICE
- ;
- ; LIST DEVICE CHARACTER OUTPUT
- ;
- ; WRITE TOP OUTPUT TO THE
- ; LIST DEVICE
- ;
- LOSIM: PUSH B
- MOV E,C
- MVI C,WLST ; OUTPUT 1 CHAR
- CALL BDOS
- POP B
- POP H
- POP D
- MOV A,C
- RET
- ;
- ;
- ; PUNCH CHARACTER OUTPUT
- ; SIMILAR TO LIST OUTPUT BUT CHAR
- ; GOES TO A DISK FILE
- ;
- POSIM: LHLD LSTPTR
- LXI D,LSTFCB
- CALL BUFOUT
- SHLD LSTPTR
- POP H
- POP D
- RET
- ;
- ; SOURCE BUFFER CONTROL
- ; REFILL BUFFER IF EMPTY, PUT NEXT CHARACTER IN A
- ; ENTER WITH FCB ADDRESS IN DE, BUFFER POINTER IN HL
- ; SAVES BC, RETURNS WITH CHAR IN A, BUFFER POINTER IN HL
- ;
- BUFIN: MOV A,E ; COMPUTE END OF BUFFER
- ADI SRCBUF+128-SRCFCB
- CMP L
- JRNZ SRCB1
- PUSH B
- MVI C,READ
- CALL REFILL
- ANI 0FEH ; CHECK FOR GOOD READ
- CPI 0
- MVI C,2 ; ERROR 2
- CNZ ERROR
- POP B
- SRCB1: MOV A,M
- INX H
- RET
- ;
- ;
- ; OUTPUT BUFFER CONTROL
- ;
- ; IF BUFFER FULL, WRITE CONTENTS TO DISK,
- ; PUT CHAR FROM C IN BUFFER.
- ;
- ; ENTER WITH FCB ADDR IN DE, BUFFER PTR IN HL,
- ; AND CHAR IN C.
- ; RETURN WITH BUFFER PTR IN HL,SAVE BC,SET CARRY AFTER
- ; BUFFER REFILL.
- ;
- BUFOUT: MOV A,E ; COMPUTE END OF BUFFER
- ADI 164
- CMP L ; FULL?
- STC ; CLEAR CARRY
- CMC
- JRNZ BUFOU1 ; NOT FULL, STORE CHAR
- PUSH B ; FULL, SAVE CHAR
- MVI C,WRITE
- CALL REFILL
- CPI 0 ; GOOD WRITE?
- MVI C,3 ; ERROR 3
- CNZ ERROR
- POP B
- STC ; MARK REFILL
- BUFOU1: MOV M,C ; STORE CHAR IN BUFFER
- INX H ; MOVE PTR TO NEXT CHAR
- RET
- ;
- ;
- ; BUFFER I/O ROUTINE
- ;
- ; ENTER WITH CP/M READ OR WRITE CODE
- ; IN BC AND FCB ADDRESS IN DE.
- ; RETURN WITH INITIALIZED BUFFER
- ; POINTER IN HL.
- ;
- REFILL: PUSH D
- PUSH B
- BIT 0,C ; IN OR OUT DRIVE
- JRZ SEL
- LDED ODSK ; OUTPUT DRIVE
- JMPR CONT
- SEL: LDED SDSK ; SOURCE DRIVE
- CONT: MVI C,SDISK ; LOG IN DRIVE
- CALL BDOS
- POP B
- POP D
- LXI H,36 ; CALC START OF BUFFER
- DAD D
- PUSH H ; SAVE START OF BUFFER
- PUSH D ; SAVE FCB ADDRESS
- XCHG
- PUSH B ; SAVE CP/M CODE
- MVI C,SDMA
- CALL BDOS ; SET DMA ADDRESS
- POP B ; GET CP/M CODE
- POP D ; GET FCB ADDRESS
- CALL BDOS ; READ OR WRITE BUFFER
- POP H ; SET PTR TO START OF BUFFER
- RET
- ;
- ;
- ; CREATE AND OPEN A FILE WITH SAME NAME AS DEFAULT FCB
- ;
- ; ENTER WITH ADDRESS OF FCB IN DE, AND
- ; ADDRESS OF FILETYPE STRING IN BC.
- ;
- MAKEF: LXI H,TFCB
- PUSH D
- PUSH B
- LXI B,9
- LDIR ; MOVE FILENAME
- POP H
- LXI B,3
- LDIR ; MOVE FILETYPE
- MVI C,FDELT
- POP D
- PUSH D
- CALL BDOS ; DELETE FILE
- MVI C,CREATE
- POP D
- PUSH D
- CALL BDOS ; CREATE FILE
- MVI C,4 ; ERROR 4
- CPI 0FFH
- CZ ERROR
- MVI C,OPEN
- POP D
- CALL BDOS ; OPEN FILE
- MVI C,5 ; ERROR 5
- CPI 0FFH
- CZ ERROR
- RET
- ;
- ; MEMORY SIZE TEST
- ;
- MEMSIM: PUSH H
- LHLD BDOS+1
- DCX H
- MOV A,L
- MOV B,H
- POP H
- RET
- ;
- ; CONSOLE STATUS CHECK
-
- CSTSIM: PUSH B ; SAVE REGISTERS
- PUSH D
- PUSH H
- MVI C,CSTAT ; SEE IF CHAR WAITING
- CALL BDOS
- ANI 1 ; YES IF TRUE
- MVI A,0
- JRZ ..SKP ; NO
- CMA
- ..SKP: POP H ; YES, A=0FFH
- POP D
- POP B
- RET
-
- ; IOCHECK
- ;
- IOSIM: MVI A,0A5H
- RET
- ;
- ; ERROR HANDLER
- ;
- ERROR: PUSH B ; SAVE ERROR INDEX
- PUSH PSW
- LXI D,ERMES1
- CALL PRTMES
- POP PSW
- POP B
- POP H ; CALLER'S ADDRESS
- PUSH B
- ORA A ; CLEAR CARRY
- LXI D,3 ; ADJUST ADDRESS
- DSBC D
- PUSH PSW
- CALL OUTHHL ; PRINT IT
- LXI D,ERMES2
- CALL PRTMES
- POP PSW
- CALL OUT2H ; PRINT ERR STATUS
- LXI D,CRLF
- CALL PRTMES
- POP D ; GET ERROR INDEX
- MVI D,0 ; CLEAR HIGH ORDER BYTE
- SLAR E ; MULTIPLY BY 2
- LXI H,MESLST ; POINT TO MES ADDR
- DAD D
- MOV E,M ; LOAD IT IN DE
- INX H
- MOV D,M
- CALL PRTMES ; PRINT IT
- LXI D,CRLF
- CALL PRTMES
- JMP BOOT
- ;
- PRTMES: MVI C,WCONB ; PRINT A LINE
- CALL BDOS
- RET
- ;
- ;
- ERMES1: .ASCII [CR][LF]'TEXT OUTPUT PROCESSOR DISK ERROR '
- .ASCII 'AT ADDRESS $'
- ERMES2: .ASCII [CR][LF]'CP/M RETURNED A STATUS OF $'
- CRLF: .ASCII [CR][LF]'$'
- ;
- MESLST: .WORD EMES0
- .WORD EMES1
- .WORD EMES2
- .WORD EMES3
- .WORD EMES4
- .WORD EMES5
- ;
- EMES0: .ASCII 'INPUT FILE NOT FOUND$'
- EMES1: .ASCII 'CAN NOT OPEN INPUT FILE$'
- EMES2: .ASCII '** BAD READ **$'
- EMES3: .ASCII '** BAD WRITE **$'
- EMES4: .ASCII 'CAN NOT CREATE OUTPUT FILE$'
- EMES5: .ASCII 'CAN NOT OPEN OUTPUT FILE$'
- ;
- ;
- ; OUT2H PRINT 2 HEX DIGITS FROM A
- ; OUTHHL PRINT HL
-
- OUTHHL: MOV A,H ; PRINT HL
- CALL OUT2H
- MOV A,L
-
- OUT2H: PUSH PSW
- CALL OUTHL
- POP PSW
- JMPR OUTHR
-
- OUTHL: RRC
- RRC
- RRC
- RRC
- OUTHR: ANI 0FH
- ADI '0'
- CPI '9'+1
- JRC OUTCH
- ADI '@'-'9'
- JMPR OUTCH
- COSIM: MOV A,C
- OUTCH: PUSH PSW
- PUSH B
- PUSH D
- PUSH H
- MVI C,WCON
- MOV E,A
- CALL BDOS
- POP H
- POP D
- POP B
- POP PSW
- RET
- TEND:
-
-
- ; NEW TEXT OUTPUT PROCESSOR I/O VECTOR TABLE
- ; TO OVERWRITE PRESENT VECTOR TABLE
-
- .BLKB 500H-(TEND-START)
- OFFSET = . ; OFFSET=TOP LOAD ADDR - 100H
-
- TOPST: JMP OFFSET + 34AH
- JMP OFFSET + 34EH
- JMP CISIM
- JMP RISIM
- JMP COSIM
- JMP OUTSIM
- JMP CSTSIM
- JMP IOSIM
- JMP MEMSIM
- JMP TRPSIM
-
- .END
-