;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; DIABLO 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. ; It 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 SD SYSTEMS 100) ORG 0DF00H ; SIPORT EQU 7DH SOPORT EQU 7DH DIPORT EQU 7CH DOPORT EQU 7CH SIMASK EQU 01H SOMASK EQU 02H BUFFSZ EQU 79 ; ; ; DIABLO LIST STATUS ; LISTST: CALL WAITST JR Z,LB1 ;READY CALL INSTAT JR Z,LB2 ;NOT READY CALL INPUT CP 6 JR NZ,LB2 ;NOT READY XOR A LD (WFLAG),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 TIME 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 JR Z,OB1 CALL WAIT OB1: 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 INPUT CALL OUSTAT JR Z,LOOPC LD C,3 CALL OUTPUT RET ; ; WAIT STATUS CHECK ; WAITST: LD A,(WFLAG) OR A RET Z PUSH HL LD HL,(WTIME) LD A,L OR H JR Z,WS1 DEC HL LD (WTIME),HL XOR A INC A RET WS1: LD (WFLAG),A RET ; ; WAIT UNTIL ACKNOWLEDGE COMES BACK ; WAIT: LD HL,0 LOOP2: DEC HL LD A,L OR H JR Z,W1 CALL INSTAT JR Z,LOOP2 CALL INPUT CP 6 JR NZ,LOOP2 W1: XOR A LD (WFLAG),A RET ; ; CHECK FOR STATUS OF OUTPUT ; ; OUSTAT: IN A,(SOPORT) NOP ;RES FOR COMPLEMENT AND SOMASK RET ; ; OUTPUT A CHARACTER ; OUTPUT: LD A,C OUT (DOPORT),A RET ; ; CHECK FOR STATUS OF INPUT ; INSTAT: IN A,(SIPORT) NOP ;RES FOR COMPLEMENT AND SIMASK RET ; ; INPUT A CHAR FROM THE PRINTER ; INPUT: IN A,(DIPORT) AND 127 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 ; BLOCK: DS 80 END