.z80 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; TDIABLO.DRIVER ; ; This driver was donated by RICH LERSETH of ; LEPAC SERVICES ; 8245 MEDITERRANEAN WAY ; SACRAMENTO, CA ; 95826 ; 916-381-1717 August 1980 ; ; This DIABLO driver is a 1200 baud buffered package ; that allows the host to spool with minimum quequing. ; ; This version resides in the CP/M file DIABLO.COM that ; will load in the diablo driver to a specified location ; and modify the jump addresses of the BIOS for LIST and ; LISTST pointed to indirectly by the location (0001H). ; ; The driver uses half the diablo buffer (79 bytes) and an ; internal buffer (79 bytes) to guarentee no over run. ; The driver accepts data from the host and puts it into ; its internal buffer. It then checks to see if the diablo ; is ready to accept data from the driver's buffer. If not ; then it immediately returns to the host. Otherwise, it ; sends one byte to the diablo then returns to the host. ; When the driver senses that its internal buffer is full ; it will take time out and wait until the diablo is ready ; to accept the remainder of the internal buffer (wait for ; an ACK to come back) It will then dump the remainder of ; the buffer and send a ETX). ; At any time the driver encounters a CR or LF it will ; also dump the buffer and send a ETX. ; ; DIABLO PRINTER PARAMETERS ; (set up for TELETEK FDC-I version 3) ; LOADPT EQU 0DE00H FDC EQU 0E000H BUFFSZ EQU 79 ; ; ; Loader for the driver ; ENTRY START START: LD HL,BEGIN LD DE,LOADPT LD BC,BACK-FRONT+1 LDIR LD HL,(1) LD L,10H LD BC,LOADPT LD (HL),C INC HL LD (HL),B LD L,2EH LD BC,LOADPT+3 LD (HL),C INC HL LD (HL),B ; ; Serial port B initialization, set to 1200 baud ; LD C,0BH LD DE,3 CALL FDC+45H ; ; RETURN TO CP/M ; JP 0 ; ; DIABLO CODE ; BEGIN EQU $ .PHASE LOADPT ; ; ENTRY VECTORS ; FRONT: JP LIST JP LISTST ; ;************************************************** ; FDC DEPENDENT CODE ; ; CHECK FOR STATUS OF OUTPUT ; ; OUSTAT: IN A,(3) AND 4 RET ; ; OUTPUT A CHARACTER ; OUTPUT: LD A,C OUT (2),A RET ; ; CHECK FOR STATUS OF INPUT ; INSTAT: JP FDC+1EH ; ; INPUT A CHAR FROM THE PRINTER ; INPUT: CALL FDC+0CH AND 7FH RET ; ;******************************************************* ; ; DIABLO CODE ; ; DIABLO LIST STATUS ; LISTST: LD A,(WFLAG) OR A JR Z,LB1 ;READY PUSH HL LD HL,(WTIME) LD A,L OR H JR NZ,LB0 LD (WFLAG),A POP HL JR LB1 ;READY LB0: DEC HL LD (WTIME),HL POP HL CALL INSTAT JR Z,LB2 ;NOT READY CALL INPUT CP 6 JR NZ,LB2 ;NOT READY XOR A LD (WFLAG),A LD (WTIME),A LD (WTIME+1),A ; ; READY ; LB1: LD A,-1 RET ; ; NOT READY ; LB2: XOR A RET ; ; LIST DEVICE ; LIST: ; ; INPUT A BYTE INTO THE BUFFER, CHECK IF ESC OR ETX ; SEQUENCE IS SENT ; CALL LISTST ;CLEAR WAIT STATE IF TIMED OUT. LD A,C LD HL,(NBYTES) INC HL LD (NBYTES),HL EX DE,HL LD HL,BLOCK-1 ADD HL,DE LD (HL),A LD A,(EFLAG2) ;END OF 3 BYTE ESC SEQ? OR A JR NZ,IB1 LD A,(EFLAG1) ;SECOND BYTE OF ESC SEQ? OR A JR NZ,IB3 LD A,27 ;START OF ESC SEQ? CP (HL) JR Z,IB4 LD A,3 ;START OF ETX SEQ? CP (HL) JR NZ,IB6 DEC DE EX DE,HL LD (NBYTES),HL JR OUTBLK ; IB3: LD A,9 ;CK FOR THE FOUR 3-B ESC CP (HL) JR Z,IB5 LD A,11 CP (HL) JR Z,IB5 LD A,30 CP (HL) JR Z,IB5 LD A,31 CP (HL) JR Z,IB5 JR IB1 ; IB4: LD A,-1 LD (EFLAG1),A RET ; IB5: LD A,-1 LD (EFLAG2),A RET ; IB1: XOR A LD (EFLAG1),A LD (EFLAG2),A ; IB6: LD A,0AH ;CK LN FD CP (HL) JR NZ,IB6A LD (LFCK),A JR OUTBLK ; IB6A: LD A,0DH CP (HL) JR NZ,IB6B LD A,(LFCK) ;CK RETURN IF NOT LINE FEED BEFORE OR A JR Z,IB6C XOR A LD (LFCK),A JR OUTBLK ; IB6B: XOR A LD (LFCK),A ; IB6C: LD A,BUFFSZ-3 CP E JR C,OUTBLK LD A,(WFLAG) OR A RET NZ CALL OUSTAT RET Z LD HL,(JBYTES) INC HL LD (JBYTES),HL EX DE,HL LD HL,BLOCK-1 ADD HL,DE LD C,(HL) CALL OUTPUT RET ; ; OUTPUT THE BLOCK ; OUTBLK: LD A,(WFLAG) OR A CALL NZ,WAIT LD HL,(JBYTES) EX DE,HL LD HL,(NBYTES) ;SETUP TO DUMP THE BLOCK XOR A SBC HL,DE LD A,L OR H JR Z,DONE PUSH HL LD HL,BLOCK ADD HL,DE POP DE ; LOOP1: CALL OUSTAT JR Z,LOOP1 LD C,(HL) CALL OUTPUT INC HL DEC DE LD A,D OR E JR NZ,LOOP1 ; DONE: LD HL,0 LD (NBYTES),HL LD (JBYTES),HL DEC HL LD (WTIME),HL LD A,-1 LD (WFLAG),A ; ; SEND OUT THE END OF TEXT CODE ; LOOPC: CALL OUSTAT JR Z,LOOPC LD C,3 CALL OUTPUT RET ; ; WAIT UNTIL ACKNOWLEDGE COMES BACK ; WAIT: LD HL,(WTIME) LOOP2: LD A,L OR H JR Z,W1 DEC HL LD (WTIME),HL CALL INSTAT JR Z,WAIT CALL INPUT CP 6 JR NZ,WAIT XOR A W1: LD (WFLAG),A LD (WTIME),A LD (WTIME+1),A RET ; ; DIABLO PRINTER PARAMETERS ; NBYTES: DEFW 0000 LFCK: DEFB 00 EFLAG1: DEFB 00 EFLAG2: DEFB 00 WFLAG: DEFB 00 WTIME: DEFW 0000 JBYTES: DEFW 0000 ; ; PARAMETER AREA EXTERNAL TO CPM BIOS AREA ; ; BUFFER AREA FOR DIABLO PRINTER ; BACK EQU $ BLOCK: DS BUFFSZ+1 .DEPHASE END START