//***NEW LPTSER (FIXES LQPSE WITH TIMER) FOR VERSION 4 /LPTSER.PA SERIAL LPT-TYPE HANDLER FOR VT278 /ADAPTED FROM LQP.PA BY C.D. 6-APR-81 / / / THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE / AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT / CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY / FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / / THE SOFTWARE DESCRIBED HEREIN IS FURNISHED TO THE PURCHASER / UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED / (WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH / SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / / DIGITAL EQUIPMENT ASSUMES NO RESPONSIBILITY FOR THE USE / OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED / BY DIGITAL. / / COPYRIGHT (C) 1977,1978,1979,1981 BY DIGITAL EQUIPMENT CORPORATION / PDPC=6336 /PRINT CHARACTER PDSF=6331 /SKIP ON FLAG PDBD=6333 /SET BAUD RATE PDEI=6335 /CLEAR/SET INTERRUPT ENABLE RDSKP=6321 /SKIP ON SERIAL PORT INPUT FLAG RDXF=6326 /READ SERIAL XON/OFF FLAG XON=21 XOFF= 23 LPVERSION="A&77^100+PATCH+60 /VERSION A (CD) PATCH= 0 /PATCH LEVEL *0 /ORIGIN FOR BUILD INFO -1 /ONE ENTRY POINT DEVICE LPTS DEVICE LPT /DEVICE NAME 1040 /DEVICE TYPE LQP&177+4000 /ENTRY POINT + TWO-PAGE FLAG 0 /REQUIRED ZEROES 0 PAGE LQPORG=. STLINE, -205 /-(WIDTH+1) MODIFIED BY "SET LPT WIDTH NN" LINE, 0 /POINTER TO SECOND PAGE LINE COUNTER LPTSER, DEVICE LPTS /USED BY "SET" FOR IDENTIFICATION OF SERIAL HANDLER STBAUD, 16 /CAN BE MODIFIED BY "SET LPT BAUD NN" LQP, LPVERSION /ENTRY POINT (MH) LQBAUD, TAD STBAUD /INIT PRINTER BAUD RATE PDBD CLA JMS LQPDCZ /INIT SECOND PAGE LINK RDF /SAVE RETURN FIELD TAD (CIF CDF) DCA LQPRDF TAD I LQP /GET FUNCTION WORD AND (70) TAD (CDF) DCA LQPBDF /SET BUFFER CDF TAD I LQP AND (3700) CMA DCA LQPDWC /SET DOUBLE-WORD COUNT +1 ISZ LQP TAD I LQP DCA LQPBUF /SET BUFFER PTR ISZ LQP TAD I LQP LQPBDF, 0 /CDF TO BUFFER SZA CLA JMP LQPGO ESC6A, JMS ESC6 //KLUGE TO RESET POSSIBLE LQPSE FATAL ERRORS. TAD (215) JMS LQPDOC /NEW PAGE PN BLOCK 0 TAD (214) JMS LQPDOC LQPGO, ISZ LQPDWC JMP LQPGO1 /LOOP IF MORE TO DO LQPCZ, TAD (213) JMS LQPDOC /CLEAR SPACE ACCUMULATORS LQPRDF, 0 /THEN RETURN TO CALLER ISZ LQP ISZ LQP JMP I LQP LQPGO1, TAD I LQPBUF /GET NEXT WORD AND (7400) CLL RTR DCA LQPCSV /SAVE PART OF THIRD CHAR TAD I LQPBUF JMS LQPDOC /OUTPUT FIRST CHAR ISZ LQPBUF NOP /PATCH TO AVOID SKIP ON ZERO TAD I LQPBUF JMS LQPDOC /OUTPUT SECOND CHAR TAD I LQPBUF AND (7400) /PUT THIRD CHAR TOGETHER BSW TAD LQPCSV CLL RTR JMS LQPDOC /OUTPUT THIRD CHAR ISZ LQPBUF NOP /PATCH TO AVOID SKIP ON ZERO JMP LQPGO /LOOP FOR DONE TEST LQPDCZ, 0 /SET UP SECOND PAGE POINTERS TAD LQPDCZ AND (7600) DCA CORPAG /SAVE CURRENT PAGE # TAD CORPAG TAD (LQPDCX-LQPORG) DCA LQPDCY RDF /GET RETURN FIELD TAD (CDF /BUILD DATA FIELD INSTRUCTION DCA RTFLD /SAVE IT FOR LATER CDF 0 /SET DF TO OUR FIELD TAD (LQLINE-LQPORG TAD CORPAG /ADD BASE PAGE DCA LINE /SAVE IT AS A POINTER TAD STLINE /GET THE MINUS CHARACTER COUNT IAC /SUBTRACT ONE FROM IT, BECAUSE "SET LPT WIDTH" ADDS ONE. DCA I LINE /SET IT IN THE SECOND PAGE RTFLD, CDF JMP I LQPDCZ LQPDOC, 0 JMS I LQPDCY JMP LQPCZ JMP I LQPDOC ESC6, 0 TAD (33 JMS ESC6B //OUTPUT A RESET CODE FOR THE LQPSE. DONE IN THE TAD ("6 //BLIND. FUNCTION IS TO CLEAR THE INPUT BUFFER AND JMS ESC6B //RESET LQPSE INTERNAL REGISTERS TO ALLOW RECOVERY //FROM FATAL ERRORS, LIKE TAKING THE COVER OFF BEFORE //SETTING PRINTER PAUSE SWITCH. LQPSE THEN //XMITS STATUS AND XON TO THE HOST. OS78 IGNORES THE //STATUS, TIMES OUT, THEN CHECKS FOR XON. LATE MODEL //DECSTANDARD PRINTERS SHOULD IGNORE THE ESCAPE 6. DCA ESC6A //ONLY ON INITIALIZATON FOR EACH NEW LOAD OF HANDLER. ISZ INNER JMP .-1 ISZ OUTER JMP .-3 JMP I ESC6 //SO WE DON'T WALK ON THE XON COMING BACK THRU. ESC6B, 0 PDPC PDSF JMP .-1 CLA JMP I ESC6B OUTER, -200 CORPAG, 0 INNER, LQPCSV, 0 LQPBUF, 0 LQPDWC, 0 LQPDCY, 0 PAGE LQPDCX, 0 /OUTPUT ONE CHAR AND (177) TAD (200 TAD (-240) /TEST FOR SPECIAL OR BLANK SPA JMP LQPSPC /JUMP IF SPECIAL ISZ LQPX /PRINTABLE CHAR; BUMP CHAR COUNTER TAD (240) /RESTORE THE CHAR CODE LQPDC1, DCA LQPCTM /SAVE CHAR CODE JMS LQPNDX /PRINT A CHAR LQPDCR, ISZ LQPDCX /BUMP TO OK RETURN JMS LQPEOL /CHECK FOR END OF LINE JMP I LQPDCX /RETURN TO CALLER LQPNDX, 0 /ROUTINE TO PRINT A CHAR JMS XONOFF //LOOK FOR XONOFF TAD LQPCTM /RETRIEVE SAVED CHAR SNA JMP I LQPNDX /EXIT IF NONE PDPC /PRINT CHAR PDSF JMP .-1 JMP I LQPNDX /XON, EXIT XONOFF, 0 KRB AND (177 TAD (-3 SNA CLA JMP XONOF3 //EASIER THAN REWRITING FOR 2-WAY CROSS PAGE LINKAGE. RDSKP JMP XONOF1 //NO FLAG. CHECK XON STATUS. RDXF AND (177 TAD (-XON SNA JMP XONOF2 //XON. RESET OR KEEP OUTPUT GOING. TAD (XON-XOFF SNA CLA JMP .+3 //XOFF. SET THE WAIT FLAG. XONOF1, ISZ XOFLAG JMP XONOF2 //NOTHING DOING, SO EXIT TO PRINT. STA //KEEP XOFF SET, DCA XOFLAG JMP XONOFF+1 //UNTIL WE GET XON. XONOF2, DCA XOFLAG JMP I XONOFF //LEGIT XON. XONOF3, CDF CIF 0 JMP I (7600 XOFLAG, 0 /CHECK FOR END OF LINE TO BE FORCED. LQPEOL, 0 TAD LQPX /GET AMOUNT OF CHAR SO FAR ON THIS LINE TAD LQLINE /ARE WE OVER THE LIMIT? SPA CLA JMP I LQPEOL /OK, KEEP PRINTING ON CURRENT LINE JMS LQCRLF /THAT'S IT, OUTPUT CR/LF JMP I LQPEOL LQCRLF, 0 DCA LQPX /CLEAR CHARACTER COUNTER TAD (215 DCA LQPCTM /OUTPUT CR JMS LQPNDX TAD (212 DCA LQPCTM /OUTPUT LF JMS LQPNDX JMP I LQCRLF /SPECIAL CHARACTER CHECKING LQPSPC, TAD (240-232) /CONTROL Z? SNA JMP I LQPDCX /TAKE EOF RETURN IF SO TAD (232-215) /CARRIAGE RETURN? SNA JMP LQPCR /JUMP IF SO IAC /FORM FEED? SNA JMP LQPFF /JUMP IF SO IAC /VERTICAL TAB? SNA JMP LQPDC1 /CLEAR ACCUMULATORS, IF SO IAC /LINE FEED? SNA JMP LQPLF /BUMP LINE COUNTER IF SO IAC /TAB? SZA CLA JMP LQPDCR /RETURN IF NOT RECOGNIZED LQPTB, TAD LQPX /DO TAB AND (7 /8 COLUMNS PER TAB TAD (-10 /SUBTRACT 8 DCA CRCNTR /MAKE IT A COUNTER LQPTB1, TAD (240 DCA LQPCTM ISZ LQPX /BUMP CHAR COUNTER JMS LQPNDX /PRINT A SPACE ISZ CRCNTR JMP LQPTB1 /KEEP GOING ROUND JMP LQPDCR /EXIT LQPCR, DCA LQPX /CLEAR CHAR COUNTER TAD (215 JMP LQPDC1 /OUTPUT A CR LQPLF, ISZ LQPDY /BUMP LINE COUNTER TAD LQPDY /CHECK FOR NEXT PAGE TAD LQPAGE SMA CLA JMP LQPFF /OUTPUT FF TAD (212 JMP LQPDC1 /OUTPUT A LF LQPFF, DCA LQPDY /CLEAR LINE COUNTER TAD (214 /DO FORM FEED JMP LQPDC1 /DO PAGE EJECT NOW LQPX, 0 CRCNTR, 0 LQPDY, 0 LQPCTM, 0 LQPAGE, -102 /-NUMBER OF LINES PER PAGE LQLINE, -204 /-NUMBER OF CHARACTERS PER LINE