|
DataMuseum.dkPresents historical artifacts from the history of: Zilog MCZ Floppy Disks |
This is an automatic "excavation" of a thematic subset of
Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 13428 (0x3474) Types: TextFile Names: »LP.S«
└─⟦efdad4bc9⟧ Bits:30006812 8" ZilogMCZ floppy NThun_0014 (OPERATIVSYSTEM DRIVE.0) └─ ⟦this⟧ »LP.S«
*H CENTRONICS PRINTER DRIVER ; PROGRAM NAME ; LP ; COPYRIGHT ZILOG (UK) LTD. 1978 ; ALL RIGHTS RESERVED. NO PART OF THIS ; PROGRAMME MAY BE COPIED OR USED WITHOUT THE ; EXPRESS WRITTEN CONSENT OF ZILOG (UK) LTD. ; AUTHORS ; PETER BECKETT, DOMINIC DUNLOP ; ZILOG (UK) LTD. ; NICHOLSON HOUSE, ; MAIDENHEAD, ; BERKSHIRE SL6 1LD ; ENGLAND ; TELEPHONE (0628) 36131 ; TELEX 848609 ; DATE, REVISION LEVEL ; ; SEE CODE ENTRY POINT ; ; ; FUNCTION ; ; THIS PROGRAMME IS A DRIVER FOR THE CENTRONICS MODEL 306C ; DOT MATRIX IMPACT PRINTER. IT IS INTENDED FOR USE WITH ; THE RIO EXECUTIVE, REVISION F OR HIGHER, AND OFFERS ; COMPREHENSIVE CONTROL OF PRINTING FORMAT. ; THE FILE PRINTER_MANUAL ACCOMPANYING THIS ; PROGRAMME CONTAINS FULL DETAILS OF THE ; CHARACTERISTICS AND USE OF THE DRIVER. *H ENTRY POINT: CHECK REQUEST GLOBAL LP EXTERNAL PRTCNT PRTDAT SYSTEM ERCODE JR LP DEFM 'LP 780806 COPYRIGHT, ZILOG (UK) LTD. 1978' LP: LD A,(LINCNT) ; GET LAST LINE COUNT LD D,A ; INTO D LD A,(COLCNT) ; GET LAST COLUMN COUNT LD E,A ; INTO E LD B,(IY+OFDTLH) ; GET HIGH ORDER BYTE OF DATA LENGTH LD C,(IY+OFDTLL) ; GET LOW ORDER BYTE OF DATA LENGTH LD H,(IY+OFDTAH) ; GET HIGH ORDER BYTE OF DATA ADDRESS LD L,(IY+OFDTAL) ; GET LOW ORDER BYTE OF DATA ADDRESS LD A,(IY+OFRQCD) ; GET REQUEST CODE CP INITRQ ; IS IT INITIALISATION REQUEST JP Z,LPINIT CP ASSNRQ ; IS IT AN ASSIGN REQUEST ? JP Z,OPEN ; SELECT THE PRINTER CP OPENRQ ; IS IT AN OPEN REQUEST JP Z,OPEN ; IF SO, SELECT THE PRINTER CP CLOSRQ ; IS IT A CLOSE REQUEST JP Z,CLOSE ; DESELECT THE PRINTER. CP WRTBRQ ; IT IT A WRITE BINARY REQUEST JR Z,MLOOP ; IF SO PRINT CP WRTLRQ ; IS IT A WRITE LINE REQUEST JR Z,MLOOP ; IF SO PRINT CP DEACRQ ; IS IT A DEACTIVATE REQUEST ? JP Z,CLOSE ; JUST DESELECT THE PRINTER CP RDSTRQ ; IS IT A READ STATUS REQUEST ? JP Z,MOVSTA ; GO MOVE BUFFER CONTENTS. CP WRSTRQ ; IS IT A WRITE STATUS REQUEST ? JP Z,MOVSTA ; GO FILL THE BUFFER. LD (IY+OFCCOD),INVLRQ ; CODE FOR INVALID REQUEST JR RETURN *H PRINTING LOOP MLOOP: LD A,B ; IF THERE'S NOTHING TO PRINT, OR C ; EXIT AT ONCE. JR Z,OKEXIT PUSH HL ; SAVE DATA ADDRESS FOR NOW. LD HL,LCONSTA ; GET THE ENTIRE CONSOLE STATUS LD (CONVEC+OFDTLL),HL ; TO ESTABLISH TAB STOPS. CALL GETCON JR NZ,RETURN ; EXIT IF ANY ERROR. LD HL,1 ; SUBSEQUENT CONSOLE STATUS CALLS LD (CONVEC+OFDTLH),HL ; FETCH ONLY THE FIRST BYTE. POP HL ; RESTORE DATA ADDRESS. LOOP: LD A,(HL) ; GET BYTE FOR OUTPUT CP ASCTAB ; IS IT A TAB CODE JP Z,TAB CP ASCILF ; IS IT A LINEFEED JR Z,LINFD CP ASCICR ; IS IT A C.RETURN JR Z,ENDLIN CP ASCIFF ; IS IT A FORM FEED JR Z,FMFD CP EXPCOD ; EXPANDED TYPEFACE CODE ? JP Z,XPAND CP EOF ; END OF FILE MARK ? JP Z,FILEND SENDIT: CALL SEND ; ISSUE THE CHARACTER UNCHANGED NEXT?: CPI ; INCREMENT HL, AND USE BC AS LOOP COUNTER PUSH AF LD A,(LPSTA+OFPGLN) ; GET MAXIMUM LINE COUNT AND A ; IS IT ZERO ? JR Z,NOFF ; IF SO, AUTO FORM FEED INHIBITED. DEC A ; HAVE WE REACHED IT YET? CP D CALL C,SENDFF ; IF SO AUTO FORMFEED NOFF: POP AF JP PE,LOOP ; CONTROL FALLS FROM HERE TO RETURN ROUTINE *H RETURN SEQUENCE ; RETURN: SAVE CURRENT LINE AND COLUMN THEN ; CALCULATE NUMBER OF BYTES TRANSFERRED. RETURN TO CALLER ; OR ERROR ADDRESS DEPENDING ON COMPLETION CODE AND ; VECTOR CONTENTS. OKEXIT: LD (IY+OFCCOD),OPCOMP ; COMPLETION CODE FOR OK RETURN: LD A,E ; GET COLUMN COUNT LD (COLCNT),A ; AND STORE IT FOR NEXT TIME LD A,D ; GET LINE COUNT LD (LINCNT),A ; AND STORE IT FOR NEXT TIME LD L,(IY+OFDTLL) ; CALCULATE HOW MANY LD H,(IY+OFDTLH) ; BYTES HAVE BEEN OUTPUT AND A ; FROM BUFFER. SBC HL,BC LD (IY+OFDTLL),L ; LOAD INTO VECTOR LD (IY+OFDTLH),H LD A,OPCOMP ; SUCCESSFUL COMPLETION ? CP (IY+OFCCOD) RET Z ; EXIT IF SO LD L,(IY+OFEADL) ; IF NOT GET ERROR LD H,(IY+OFEADH) ; RETURN ADDRESS LD A,H ; IF RETURN ADDRESS IS ZERO OR L ; MAKE NORMAL RETURN RET Z JP (HL) ; OTHERWISE JUMP TO IT. *H LINE FEED, FORM FEED ;LINFD ;MUST CHECK IF COLUMN COUNT IS ZERO, IF SO, SEND ASCII LF, ;OTHERWISE IGNORE IT LINFD: XOR A CP E ; E CONTAINS THE COLUMN COUNT JR NZ,NEXT? ; GO IF WANT TO IGNORE IT LD A,ASCILF CALL SEND1 ; ISSUE WITHOUT INCREMENTING COLUMN COUNT INC D ; INCREMENT LINE COUNTER JR NEXT? ; GET NEXT CHARACTER ; FMFD: OUTPUT FORM FEED THEN ZERO LINE & COLUMN COUNTS FMFD: CALL SENDFF JR NEXT? ; SENDFF: OUTPUT A FORM FEED, ZERO LINE AND COLUMN COUNTS. SENDFF: LD A,ASCIFF CALL SEND1 LD DE,0 ; ZERO LINE AND COLUMN COUNTS RET *H LINE END (CARRIAGE RETURN) ;ENDLIN ;LINE TERMINATION ;IF COLUMN COUNT = 0, MUST SEND ASCILF IN PLACE OF THE ASCICR ;ALSO MUST SET COLUMN COUNTER TO ZERO ENDLIN: XOR A CP E ; IS COLUMN POSITION ZERO LD E,A ; CLEAR COLUMN COUNTER LD A,ASCICR ; SEND CR IF COLUMN JR NZ,END1 ; COUNT WAS NON-ZERO, LD A,ASCILF ; OTHERWISE SEND LF. END1: CALL SEND1 ; SEND IT WITHOUT INCREMENTING POC CNTR INC D ; INCREMENT LINE COUNTER LD A,WRTLRQ ; IF THIS IS A WRITE LINE REQUEST CP (IY+OFRQCD) ; THE CARRIAGE RETURN TERMINATES IT. JR Z,OKEXIT LD A,(LPSTA+OFFLAG) ; WRITE BINARY. IS THE ABORT BIT NOABRT,A ; OPTION ENABLED ? JP NZ,NEXT? ; IF NOT,DO NOTHING XOR A ; IF FINAL CHAR. IN WRITE BINARY CP B ; DONT BOTHER TO CHECK FOR ESC. JR NZ,CHKESC INC A CP C JP Z,NEXT? CHKESC: CALL GETCON ; WRITE BINARY. GET CONSOLE STATUS. JP NZ,RETURN ; EXIT IF ERROR OCCURS. LD A,(CONSTA) ; HAS AN ESC BEEN INPUT ON THE CONSOLE ? BIT ESCPND,A JP NZ,NEXT? ; NO. GO GET NEXT CHARACTER. LD A,ABORT ; YES. ABORT CURRENT REQUEST. LD (IY+OFCCOD),A LD (ERCODE),A JP RETURN *H CHARACTER OUTPUT ; ENTRY AT SEND CAUSES CHECKS ON MARGIN LIMITS AND ; PRINT SIZE TO BE MADE BEFORE THE CHARACTER IN A ; IS OUTPUT WHILE ENTRY AT SEND1 OUTPUTS THE CHARACTER ; UNCONDITIONALLY. SEND: EX AF,AF' ; MAKE CHECKS ON CURRENT COLUMN: DUNMAR: PUSH BC DEC E ; HAS THE LEFT MARGIN BEEN SET ? JP P,MARDUN ; YES: GO SEE IF RIGHT MARGIN REACHED. LD A,(LPSTA+OFFLAG) ; TEST THE NORMAL/EXPANDED BIT EXPAND,A ; TYPEFACE FLAG. LD A,EXPCOD ; IF EXPANDED, TELL PRINTER. CALL NZ,SEND1 LD A,(LPSTA+OFLMAR) ; LOAD LEFT MARGIN SIZE AND A ; IF MARGIN IS ZERO, DO NOTHING JR Z,MARDUN LD B,A ; OTHERWISE OUTPUT THE CORRECT LD A,ASCISP ; NUMBER OF SPACES. MAKMAR: CALL SEND1 DJNZ MAKMAR MARDUN: INC E ; INCREMENT COLUMN COUNTER INC E LD A,(LPSTA+OFLMAR) ; LOAD LEFT MARGIN SIZE ADD A,E ; ARE WE BEYOND RIGHT MARGIN ? LD B,A ; ADD LEFT MARGIN WIDTH TO CURRENT LD A,(LPSTA+OFRMAR) ; POSITION ON LINE TO FIND OUT. CP B POP BC JR NC,PRINT ; THERE'S ROOM LEFT: PRINT IT. LD A,(LPSTA+OFFLAG) ; BEYOND RIGHT MARGIN: BIT WRPRND,A ; WANT TO WRAP AROUND ? RET Z ; NO. LD A,ASCICR ; YES. SEND CARRIAGE RETURN CALL SEND1 INC D ; BUMP LINE COUNT LD E,0 ; RESET THE COLUMN COUNT JR DUNMAR ; START AT BEGINNING AGAIN PRINT: EX AF,AF' ; RETRIEVE AND PRINT THE CHARACTER. SEND1: PUSH BC ; SAVE PUSH AF ;SAVE CALL WAITB ; ENSURE NOT ALREADY BUSY POP AF ; RESTORE LD BC,PRTDAT ;SELECT PORT OUT (C),A ; SEND THE CHARACTER CALL STROBE POP BC ;RESTORE RET *H TABULATION CONTROL ;TAB CONTROL SEGMENT TAB: LD A,ASCISP CALL SEND ; ENSURE AT LEAST ONE SPACE SENT LD IX,TABS ; CALCULATE ADDRESS OF BYTE PUSH DE ; FOR CURRENT COLUMN IN LD D,0 ; TAB DRUM TABLE. ADD IX,DE POP DE STOP?: XOR A OR (IX) ; ARE WE AT TAB STOP ? JP NZ,NEXT? ; YES. GET NEXT CHARACTER. LD A,ASCISP ; NOT A STOP. SEND ANOTHER SPACE. CALL SEND INC IX ; NEXT COLUMN JR STOP? *H CONSOLE/PRINTER STATUS ; GETCON: GET CONSOLE STATUS GETCON: PUSH IY ; GET CONSOLE STATUS EXX LD IY,CONVEC CALL SYSTEM LD A,(IY+OFCCOD) ; COMPLETED OK ? EXX POP IY CP OPCOMP RET Z ; YES. RETURN AT ONCE LD (ERCODE),A ; NO. SET SYSTEM ERROR LD (IY+OFCCOD),A ; & INPUT RETURN CODE RET ; THEN EXIT. ; MOVSTA: READ OR WRITE STATUS MOVSTA: LD DE,LPSTA ; READ OR WRITE STATUS. CP RDSTRQ ; WHICH WAS IT ? IF READ, JR NZ,CHECKL ; STATUS BUFFER IS SOURCE, EX DE,HL ; OTHERWISE DESTINATION. CHECKL: XOR A ;!IF (DATA LENGTH) > 4 LD B,A ; TRANSFER JUST 4 BYTES. OR C ; IF NOTHING TO TRANSFER JR Z,STADUN ; EXIT AT ONCE LD A,LLPSTA CP C JR NC,MOVIT LD C,A MOVIT: LDIR STADUN: JP OKEXIT *H INITIALISE PIO & PRINTER ;LPINIT ;INITIALISES THE PIO AND SETS COLUMN POSITION TO ZERO LPINIT: LD A,0FH ; SET CHANNEL B TO DATA OUTPUT LD BC,PRTDAT+2 ;SELECT PORT OUT (C),A LD A,07H ; NO INTERRUPTS OUT (C),A LD BC,PRTCNT+2 :SELECT CONTROL PORT OUT (C),A LD A,0CFH ; SET CHANNEL A TO CONTROL MODE OUT (C),A LD A,3CH ; SET DIRECTION OF LINES OUT (C),A LD A,1 LD BC,PRTCNT OUT (C),A ; SET STROBE LINE HIGH SET 1,A ; SET PRIME LINE OUT (C),A CALL SELECT XOR A ; ZERO LD (COLCNT),A ; INTO COLUMN COUNT LD (LINCNT),A ; AND INTO LINE COUNT CALL SENDFF ; SLEW TO TOP OF FORM JP OKEXIT *H MISCELLANEOUS ROUTINES ; OPEN: JUST SELECT THE PRINTER OPEN: CALL SELECT JP OKEXIT ; CLOSE: PAPER THROW FOLLOWED BY DESELECT CLOSE: CALL SELECT ; ENTRY POINT FOR DESELECT LD A,13H ; DESELECT CODE CALL SEND1 ; SEND IT JP OKEXIT ; EXPANDED TYPEFACE: ZERO LENGTH IF FIRST CHARACTER ON LINE XPAND: XOR A ; IS COLUMN ZERO ? CP E LD A,EXPCOD PUSH AF CALL Z,SEND1 ; IF SO, DON'T DISTURB IT. POP AF ; OTHERWISE TREAT AS CALL NZ,SEND ; ANY OTHER CHARACTER. JP NEXT? ; FILEND: PROCESS END OF FILE MARK FILEND: LD A,WRTBRQ ; END OF FILE MARK. ARE WE CP (IY+OFRQCD) ; DOING WRITE BINARY ? JP Z,OKEXIT ; YES. EOF TERMINATES REQUEST. LD (IY+OFCCOD),UNXEOF ; WRITE LINE: SHOULDN'T FIND JP RETURN ; EOF. FLAG ERROR AND EXIT. ; SELECT: SEND SELECT CODE TO PRINTER SELECT: LD A,11H ; SELECT CODE LD BC,PRTDAT OUT (C),A ; SEND IT CALL STROBE RET ; WAITB: ROUTINE TO WAIT UNTIL PRINTER READY WAITB: LD BC,PRTCNT IN A,(C) BIT BUSY,A JR NZ,WAITB RET ; STROBE: PULSE PRINTER STROBE LINE STROBE: PUSH AF LD BC,PRTCNT LD A,2 ; DROP STROBE LINE OUT (C),A LD A,3 OUT (C),A ; RAISE IT AGAIN POP AF RET *H WORKING STORAGE ; BUFFER IN WHICH CONSOLE STATUS IS DELIVERED. CONSTA: DEFS 1 ; BIT 0 - LOCAL FLAG ; BIT 1 - AUTO LINEFEED ON/OFF ; BIT 2 - ECHO ON/OFF ; BIT 3 - T.I.B. FULL/EMPTY ; BIT 4 - ECHO CR OFF/ON ; BIT 5 - ESC PENDING '1' NO ; '0' YES ; BIT 6 - LOCAL FLAG ; BIT 7 - FULL/HALF DUPLEX ; '1' HALF ; '0' FULL DEFS 1 ; RESERVED TIB: DEFS 1 ; LAST CHARACTER ENTERED BUT ; NOT YET READ BY READ REQUEST CURLOC: DEFS 2 ; RESERVED FOR CURSOR LOCATION TABS: DEFS 134 ; TAB STOPS. BIT 0 IS SET LCONSTA EQU $-CONSTA ; FOR A TAB. (TABS) CORRESPONDS ; TO LEFTMOST COLUMN. ; EQUATES FOR THE FLAGS IN THE FIRST BYTE AUTOLF EQU 1 ECHO EQU 2 TIBFE EQU 3 ECHOCR EQU 4 ESCPND EQU 5 FHDUP EQU 7 CONVEC: DEFB CONIN ; LOGICAL UNIT DEFB RDSTRQ ; REQUEST CODE DEFW CONSTA ; DTA -> CONSTA DEFW 0 ; DTL=#BYTES REQUIRED DEFW 0 ; COMPLETION: RETURN TO CALL DEFW 0 ; ERROR: RETURN TO CALL DEFB 0 ; COMPLETION CODE DEFW 0 ; NO SUPPLEMENTARY PARAMETERS ; LINEPRINTER STATUS BUFFER LPSTA: OFFLAG EQU $-LPSTA ; OPTION FLAGS - DEFAULT IS DEFB 0 ; NORMAL TYPE, ABORT ENABLED, TRUNCATE. OFLMAR EQU $-LPSTA ; LEFT MARGIN WIDTH DEFB 0 ; DEFAULT IS ZERO OFRMAR EQU $-LPSTA ; RIGHT MARGIN POSITION (TOTAL PAPER WIDTH) DEFB 132 ; DEFAULT IS 132 OFPGLN EQU $-LPSTA ; PAGE LENGTH IN LINES DEFB 63 ; DEFAULT IS 63 LLPSTA EQU $-LPSTA ; ; OPTION FLAGS FOR FIRST BYTE ; EXPAND EQU 0 ; EXPANDED TYPEFACE IF SET NOABRT EQU 1 ; ABORT OPTION DISABLED IF SET WRPRND EQU 2 ; WRAP-AROUND ENABLED IF SET COLCNT DEFS 1 ; STORAGE FOR FINAL COLUMN COUNT LINCNT DEFS 1 ; STOR«soh»AGE FOR FINAL LINE COUNT *H EQUATES ETC OFLUN EQU 0 ; LOGICAL UNIT OFFSET OFRQCD EQU 1 ; REQUEST CODE OFFSET OFDTAL EQU 2 ; DATA TRANSFER ADDRESS, LOW, OFFSET OFDTAH EQU 3 ; DATA TRANSFER ADDRESS, HIGH, OFFSET OFDTLL EQU 4 ; DATA LENGTH, LOW, OFFSET OFDTLH EQU 5 ; DATA LENGTH, HIGH, OFFSET OFCADL EQU 6 ; COMPLETION ADDRESS, LOW, OFFSET OFCADH EQU 7 ; COMPLETION ADDRESS. HIGH, OFFSET OFEADL EQU 8 ; ERROR RETURN ADDRESS, LOW, OFFSET OFEADH EQU 9 ; ERROR RETURN ADDRESS, HIGH, OFFSET OFCCOD EQU 10 ; COMPLETION CODE OFFSET OFSPVL EQU 11 ; SUPPLEMENTARY PARAM. VECTOR ADDRESS, LOW, OFFSET OFSPVH EQU 12 ; SUPPLEMENTARY PARAM. VECTOR ADDRESS, HIGH, OFFSET INITRQ EQU 0 ; INITIALISATION REQUEST ASSNRQ EQU 2 ; ASSIGN REQUEST OPENRQ EQU 4 ; OPEN REQUEST CLOSRQ EQU 6 ; CLOSE REQUEST WRTBRQ EQU 0EH ; WRITE BINARY REQUEST WRTLRQ EQU 10H ; WRITE ASCII REQUEST RDSTRQ EQU 40H ; READ STATUS REQUEST WRSTRQ EQU 42H ; WRITE STATUS REQUEST DEACRQ EQU 44H ; DEACTIVATE REQUEST BUSY EQU 4 ; PRINTER BUSY LINE ASCTAB EQU 09H ; ASCII TAB CODE ASCILF EQU 0AH ; ASCII LINEFEED CODE ASCIFF EQU 0CH ; ASCII FORM FEED CODE ASCICR EQU 0DH ; ASCII CARRIAGE RETURN CODE EXPCOD EQU 0EH ; SET EXPANDED TYPEFACE CONTROL CHAR. ASCISP EQU 20H ; ASCII SPACE CODE EOF EQU 0FFH ; END OF FILE MARK ABORT EQU 49H ; RETURN CODE: PROGRAM ABORT OPCOMP EQU 080H ; RETURN CODE: OPERATION COMPLETE INVLRQ EQU 0C1H ; RETURN CODE: INVALID REQUEST UNXEOF EQU 0C9H ; RETURN CODE: END OF FILE CONIN EQU 1 ; LOGICAL UNIT FOR CONSOLE INPUT END