home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG036.ARK
/
TOP.AZM
< prev
next >
Wrap
Text File
|
1984-04-29
|
10KB
|
519 lines
.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