;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 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