*FILE "OKIDATA" * *SOURCE LISTING * *DRIVER ROUTINE FOR OKIDATA LINE PRINTER *TO OPERATE WITH PROC. TECH. HELIOS PTDOS * *WRITEN BY LONNIE CLIFTON, INSTRUCTOR *INDIANA VOCATIONAL TECHNICAL COLLEGE *3501 FIRST AVENUE *EVANSVILLE, INDIANA 47710 * *1/4/79 * *USES RS 232 SERIAL OUTPUT TO PRINTER *REVERSE CHANNEL BUSY TO INPUT PORT OF *THE CROMENCO TUART BOARD * * ********************************************** *PIN CONNECTIONS ON LINE PRINTER ARE * PIN 3 -----DATA IN TO PRINTER * PIN 11 ----BUSY STATUS FROM PRINTER * +12 V = BUSY (LOGIC 1) * PIN 7 -----GROUND * PIN 5 (CTS) MUST BE TIED TO +12 VOLTS * PIN 6 (DSR) " " " " " " * *SETUP FOR SIMPLEX (REVERSE CHANNEL BUSY ACK) * IC 13 SWITCH 6 OFF (ON SERIAL BOARD) * IC 13 SWITCH 7 ON * JUMPER F TO D * ********************************************** * *TUART CONNECTIONS ARE AS FOLLOWS: * *SETUP FOR DEVICE B OF TUART * * PIN 2 REVERSE CHANNEL BUSY ACK -12 OR +12V * USES RS232 INPUT BUT DOES NOT USE UART (5501) * IC 9 IS USED TO CONVERT RS232 TO TTL FOR * FOR PARALLEL INPUT * * NOTE THAT RS232 RCVR INVERTS STATUS * SO THAT NOW LOGIC 0 = BUSY AT MSB * * PIN 3 DATA OUT TO PRINTER (RS232) * * THE TUART HAS A JUMPER FROM THE RS232 RCR * TO THE DEVICE B MSB PARALLEL INPUT PORT * THIS IS FROM IC 9 PIN 8 TO IC 16 PIN 4 ********************************************** * *SET TO OPERATE DRIVER ABOVE HELIOS PTDOS *(MAY BE ORGINED FOR ANY PLACE IN MEMORY) * ORG 0D000H * *DISPATCH TABLE FOR HELIOS SYSTEM * TOTAL OF 25 BYTES DTRB: DW 0 DTRND: DW 0 DTRLB: DW 0 DTWBR: DW PRINT DTWB: DW PRINT DTREW: DW INIT DTEOF: DW INIT DTCLO: DW CLOSE DTSEK: DW 0 DTCTL: DW 0 DTBLK: DW 80 DTITO: DB 1 DTINI: DW INIT ********************************************** * END OF DISPATCH TABLE ********************************************** * ********************************************* *PROGRAM EQUATES ********************************************** * TBE EQU 80H ;UART EMPTY FLAG * STAT EQU 50H ;DEVICE B BAUD EQU STAT ;ON TUART DATA EQU STAT+1 RSET EQU STAT+2 MASK EQU STAT+3 SENSE EQU STAT+4 ;PARALLEL PRT * CR EQU 0DH ;CAR. RET. LF EQU 0AH ;LINE FEED FF EQU 0CH ;FORM FEED * ********************************************** * INITIALIZATION ROUTINE ********************************************** * INIT: MVI A,1H ;RESET B OUT RSET MVI A,40H ;SET BAUD RATE OUT BAUD ;40 IS 9600 BAUD MVI A,0 ;MASK OUT INT. OUT MASK ;NO INTRPTS * *SET UP FORM FEEDS *WHEN OPENED * MVI A,66 ;FORM FEED STA FORM MVI A,0 STA LFSW CLOSE: LXI H,MSG LXI D,END-MSG CALL NXT RET MSG: ASC " " ;CAUSE TRANSVERSE DB CR ;TELL PTR TO DO IT DB CR ;CLEAR BUFFERS DB CR END EQU $ * ********************************************** * ROUTINE TO PRINT OUT BUFFER ********************************************** * PRINT: XTHL ;INCREASE INX H ;RETURN INX H ;ADDRESS INX H ;BY 3 XTHL . ;FOR RETURN TRIP NXT: MOV B,M CALL LFCK ;SEE IF LF NEEDED CALL PUT ;PRINT CHR DCX D ;COUNT IT INX H ;POINT TO NEXT MOV A,D ;CHECK FOR ORA E ;ZERO IN REG DE JNZ NXT ; ZERO? XCHG . ;YES--PUT ZERO IN HL RET . ;DONE * *ROUTINE TO CHECK LINEFEED STATUS *AND OUTPUT LF IF NEEDED *LFSW TELLS IF LAST CHR WAS CR * LFCK: LDA LFSW CPI 0 RZ ;RETURN IF NOT SET MVI A,LF CMP B JZ LFOK ;RET IF LINE FEED PUSH B ;SAVE CHAR MVI B,LF CALL PUT ;DO A LF POP B LFOK: MVI A,0 ;REPLACE STA LFSW ;FLAG FOR NO CR RET * ********************************************** *ROUTINE TO OUTPUT CHR. AT HL ********************************************** * THE RS232 CHIP IN THE TUART * WILL INVERT THE SIGNAL FROM THE * PTR SO THAT A 0=BUSY ********************************************** * PUT: IN SENSE ;CHECK ANI 080H ;MASK ALL BUT MSB JZ PUT ;WILL BE 0 IF BUSY MOV A,B ;PUT CHR IN A ANI 07FH ;STRIP PARITY OUT DATA ;SEND TO PTR CPI CR ;CHECK FOR CR JZ DCRFF ;DCR FORM IF CR CPI FF ;CHECK FOR FORMS JZ DOFF ;SKIP TO TOP OF PAGE * EMPTY: IN STAT ;BEST TO ANI TBE ;WAIT FOR TUART JZ EMPTY ; TO EMPTY RET * *ROUTINE TO DECREASE LINE CNT * DCRFF: MVI A,1 STA LFSW ;GOT CR LDA FORM DCR A STA FORM JNZ EMPTY * * SUBROUTINE TO PUT LINE COUNT *FOR TOP OF PAGE * TOP: MVI A,66 STA FORM JMP EMPTY * *ROUTINE TO CNT DOWN FROM *CURRENT POSITION *TO TOP OF PAGE * DOFF: LDA FORM ;GET CNT MOV B,A WTFF: DCR B ;DO LF UNTIL JZ DOIT ;TOP OF NEXT MVI A,LF ;PAGE OUT DATA CALL EMPTY ;EMPTY TUART JMP WTFF DOIT: CALL TOP ;RESTORE 66 MVI A,CR ;SEND CR DO DO OUT DATA ;THE LINE FEEDS JMP EMPTY FORM DB 66 LFSW DB 0