.TITLE LPA. /COPYRIGHT 1970, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. /LPA. /LPA.=IOPS LINE PRINTER (647) HANDLER. /647 WITHOUT API /M. SIFNAS /J.J. MURPHY, JR. /6-2-69. /CALLING SEQUENCE: /CAL+.DAT SLOT (9-17) /FUNCTION /N ARGUMENTS, WHERE N IS A FUNCTION OF FUNCTION. /NORMAL RETURN LSDF=706501 /SKIP ON DONE FLAG -CONNECTED TO INTERRUPT LPCB=706502 /CLEAR DONE FLAG, CLEAR PRINTER BUFFER, /SET DONE FLAG LPL1=706566 /LOAD PRINTER BUFFER 1 CHAR (AC 12-17) LPL2=706526 /LOAD PRINTER BUFFER 2 CHAR (AC 6-11, 12-17) LPLD=706546 /LOAD PRINTER BUFFER 3 CHAR (AC 0-5,6-11,12-8) LSEF=706601 /SKIP ON ERROR FLAG -NOT CONNECTED TO /INTERRUPT LPCF=706602 /CLEAR DONE FLAG LPPB=706606 /CLEAR DONE FLAG, SELECT PRINTER, /PRINT BUFFER, CLEAR BUFFER, SET DONE FLAG LPLS=706626 /LOAD SPACING BUFFER (AC 15-17), SPACE /SET DONE FLAG .MED=3 .GLOBL LPA. LPA. DAC LPCALP /SAVE CAL POINTER DAC LPARGP /AND ARGUMENT POINTER. ISZ LPARGP /POINTS TO FUNCTION CODE. /DISPATCH TO FUNCTION LAC* LPARGP ISZ LPARGP /POINTS TO 3RD WORD OF CALLING SEQUENCE. TAD (JMP LTABL-1 DAC .+1 HLT LTABL JMP LPIN /1 .INIT SKP /2 .IODR---IGNORED. JMP LPER06 /3 .SEEK --- ERROR ISZ LPARGP /4. .ENTER---IGNORED JMP LPNOR /5 .CLEAR---IGNORED JMP LPCLOS /6 .CLOSE LPILPR JMP LPNOR /7 .MTAPE---IGNORED JMP LPER06 /10 .READ---ERROR JMP LPWRT /11 .WRITE JMP LPWATR /12 .WAIT OR .WAITR LPER06 LAW 6 /ILLEGAL FUNCTIONS /13 .TRAN. ---ERROR JMP* (.MED+1 LPWATR LAW 1000 AND* LPCALP SNA JMP LPWAIT /.WAIT LAC LPCALP /.WAITR AND (700000 /L,EX,MP DAC LPCALP LAC* LPARGP AND (77777 /BUSY ADDR XOR LPCALP DAC LPCALP ISZ LPARGP /TO NOT BUSY /.WAIT LPT ROUTINE. LPWAIT JMS LPCKUN JMP LPNOR /.CLOSE LPT ROUTINE LPCLOS JMS LPCKUN /CHECK IF I/O UNDERWAY ISZ LPCLS1 /777777 IN AC. JMP LPDZMC /.CLOSE JUST COMPLETED. DAC LPUND /SET BUSY INDICATOR DZM LV2WC /FORM FEED. DZM PGECNT /INITIALIZE #LINES/PAGE COUNTER LPLS /WAIT ON .CLOSE FOR LPCALX DBR XCT .+1 JMP* LPCALP /COMPLETION OF FORM FEED. LPCLS1 777777 /777777=.CLOSE NOT DONE. /INIT LPT ROUTINE. LPIN CLA!CMA DAC LV2WC DAC LPUND DAC LPCLS1 /INITIALIZE .CLOSE INDICATOR DAC LV2FC /SET UP FOR FORM FEED ON INTERRUPT FROM LPCB. ISZ LPARGP LAC (64 /52 (DECIMAL)---RETURN DAC* LPARGP /STANDARD LINE BUFFER SIZE TO USER. ISZ LPARGP LPIN2 CAL 56 /CHANNEL REG. 56 - ONCE ONLY CODE. LP57T 16 /.SETUP - THESE 6 REGISTERS ARE OVERLAYED. LSDF LPINT LPWORD LAC .+2 LPHRTB DAC LPIN2 LP3CHR JMP .+1 JMS LPNRDY /CHECK IF DEVICE READY. LAW 17775 /INITIALIZE 6-BIT DAC LP3CHR /CHAR. COUNTER DZM LPWORD /AND ACCUMULATOR. LPCB /CLEAR PRINTER BUFFER. / /NORMAL EXIT ROUTINE LPNOR DBR XCT .+1 JMP* LPARGP /EXIT LPNRDY 0 LSEF JMP* LPNRDY /DEVICE READY. LAC (LPNRDY+1 /INDICATE DEVICE NOT READY VIA .MED, DAC* (.MED /RETURN TO LSEF INSTRUCTION ON ^R LAC (4 /TO RE-CHECK READY CONDITION. JMP* (.MED+1 LPDZMC DAC LPCLS1 /INITIALIZE .CLOSE INDICATOR JMP LPNOR /WRITE LPT ROUTINE. LPWRT JMS LPCKUN /IS I/O UNDERWAY DAC LPUND /NO DAC LP5CH /INIT BEFORE CALL TO .LPCONV LAC LPLPLD /LPLD DAC LV2XIT LAW 7000 AND* LPCALP /DATA MODE BITS 6-8 SAD (2000 JMP .+3 /IOPS ASCII LAW 7 /ILLEGAL DATA MODE. JMP* (.MED+1 LAC* LPARGP /L.B.H. POINTER IN USER'S AREA DAC LPLBHP ISZ LPARGP ISZ LPARGP /POINTS TO RETURN ADDRESS. LAC* LPLBHP /WPC AND (377000 DAC LPWPC ISZ LPLBHP /MOVE L.B. POINTER (IN USER'S ISZ LPLBHP /AREA) TO 1ST DATA WORD. DZM LV2FC /IOPS ASCII MODE NO FORM CONTROL LAW 17770 /INITIALIZE SWITCH AT LPCONV DAC LPCONV /THIS ROUTINE GETS THE /NEXT 7-BIT ASCII CHAR. /FROM THE 5/7 LINE BUFFER (USER'S AREA) /IT RETURNS WITH IT RIGHT /JUSTIFIED IN AN OTHERWISE /CLEAR AC. /LP5CH MUST BE SET TO /777777 BEFORE THE INITIAL /CALL TO LPCONV, LPWPC TO WPC INCLUDING HEADER. /LPLBHP TO 1ST DATA WORD IN L.B.(USER'S AREA) LPCONV LAW 17770 /INITIALIZATION DAC LP8CT /FOR LAC (SAD LPCTAB /CONTROL CHAR. DAC LPVTST /SCANNING. ISZ LP5CH /MODIFIED FOR HOR. TAB. JMP LPGET5 /THIS 5/7 PAIR NOT EXHAUSTED. LAW 17000 TAD LPWPC DAC LPWPC /SKIP ON NON 0. SNA!SPA JMP LPEND /WORD PAIRS EXHAUSTED LAC* LPLBHP /PICK UP NEXT DAC LP57T /WORD PAIR ISZ LPLBHP LAC* LPLBHP DAC LP57T+1 ISZ LPLBHP LAW 17773 /RESET CHAR. COUNTER DAC LP5CH /FOR THIS WORD PAIR LPGET5 LAW 17770 DAC LP57T+2 /GO THROUGH SHIFT LOOP 7 1/2 TIMES. LPGET6 LAC LP57T+1 RAL ISZ LP57T+2 JMP .+3 AND (177 /GOT CHARACTER. JMP LPCON1 DAC LP57T+1 LAC LP57T RAL DAC LP57T JMP LPGET6 LPCON1 SAD (177 JMP LPCONV /DELETE RUBOUTS. TAD LPM40 /-40 SPA JMP LPVTST /CHAR. <40---CONTROL CHAR. SAD (135 JMP LPEMPT /ALTMODE TAD (777700 /-100 SPA TAD (40 TAD (100 /140-176 MAPPED INTO 100-136 LPCON2 AND (77 /6-BIT TRIMMED. XOR LPWORD /CONSTRUCT 3/6 WORD. ISZ LP3CHR /3 CHARACTER COUNTER. JMP LPCON3 DAC LPWORD LAW 17775 /INITIALIZE 6-BIT DAC LP3CHR /CHAR. COUNTER LAC LPWORD /AND ACCUMULATOR DZM LPWORD /DATA WORD COMPLETE. ISZ LV2WC /INDEX DATA WORD COUNT LV2XIT LPLD /LPLD OR JMP LPFBUF DBR XCT .+1 JMP* LPARGP LPCON3 RTL /SHIFT CHARS. LEFT RTL RTL AND (777700 /IN CASE LINK WAS ON. DAC LPWORD JMP LPCONV /GET NEXT CHAR. /END OF CHARACTER STRING OR CARR. RETURN (IOPS ASCII) LPEND LAC (47 DAC LV2WC JMP LPHT3 /PAD LAST WORD WITH SPACES. /CONTROL CHARACTER ROUTINE. - CHAR. IN AC. LPVTST XX /SAD LPCTAB-SAD LPCTAB+7 JMP LPFORM /VERTICAL FORM CONTROL CHAR. ISZ LPVTST /SAD LPCTAB+N-SAD LPCTAB+N+1 ISZ LP8CT JMP LPVTST SAD LPCTAB+10 JMP LPEND /CARRIAGE RETURN. SAD LPCTAB+11 JMP LPHT /HORIZONTAL TAB. JMP LPCONV /DELETE MEANINGLESS CHAR. /COMPUTE FORM CONTROL CODE AND PLACE /IN LV2FC LPFORM LAC LP8CT DAC LV2FC /L.B.H. IN D.B. JMP LPCONV /CONVERT HOR. TAB TO N SPACES, WHERE N IS THE NUMBER /NECESSARY TO HAVE THE NEXT CHAR. IN COLUMN 11,21,31,41,51...,111. LPHT LAC LV2WC /DATA WORD COUNT CLL!RAL /X2 TAD LV2WC /X3 TAD (4 TAD LP3CHR /CURRENT WORD CHAR. COUNTER. TAD (777766 /-10 (DECIMAL) SMA!SZA JMP .-2 TAD LPOVRP LPHT3 DAC LPHRTB LAC (JMP LPHT2 DAC LPCONV LPHT2 LAW 40 ISZ LPHRTB JMP LPCON2 LAW 17770 DAC LPCONV JMP LPCONV /INTERRUPT HANDLER. LPEMPT DZM LPUND /CLEAR I/O UNDERWAY INDICATOR. LAC LV2XIT /DETERMINE SAD LPLPLD /WAY JMP LPNOR /OUT. LPDSMS LAC LPSVAC /RESTORE AC LPSWCH ION /ION OR IOF. DBR XCT .+1 JMP* LPTOUT LPPIC DAC LPSVAC /SAVE AC LAC* (0 DAC LPTOUT /SAVE PC, L, EM, MP LAC LPION JMP LPSTON LPINT JMP LPPIC /PIC ENTRY. DAC LPSVAC /API ENTRY, SAVE AC. LAC LPINT /PC, L, EM, MP DAC LPTOUT IORS /READ I/O STATUS SMA!CLA LPM40 LAW 17740 /PIC OFF -- BUILD IOF TAD LPION /PIC ON -- ION LPSTON DAC LPSWCH LPCF /CLEAR LPT DONE FLAG LPION ION /ENABLE PIC LAC LPIDSM DAC LV2XIT JMS LPNRDY /CHECK FOR DEVICE NOT READY. LPTOK LAC LV2WC SNA JMP LPEMPT SPA JMP LPCLSE SAD (50 /BUFFER FULL. JMP LPSPPR JMP LPCONV LPIDSM JMP LPFBUF LPCLSE DZM LV2WC LPSPPR LAW 17706 /IS PAGE FULL? TAD PGECNT SZA!CMA /YES - FORM FEED LAC LV2FC SAD LPOVRP JMP LPIOT /OVERPRINT. AND (7 SAD (7 DZM PGECNT /INIT #LINES/PAGE CNT LPVMOV IOF LPLS /VERT. SPACING BEFORE PRINTING. LPOVRP LAW 17776 DAC LV2FC JMP LPDSMS /WORD COUNT EXHAUSTED. LPIOT DZM LV2WC ISZ PGECNT /INCREMENT #LINES/PAGE CNT IOF LPPB /PRINT BUFFER. JMP LPDSMS LPFBUF IOF LPLPLD LPLD /PLACE IN LPT BUFFER JMP LPDSMS /SUBROUTINE TO CHECK IF I/O UNDERWAY. LPCKUN 0 LAC LPUND SMA!CLA!CMA JMP* LPCKUN /I/O NOT UNDERWAY JMP LPCALX LPCALP 0 /CAL POINTER WITH L, EM, MP. LPARGP 0 /NORMAL RETURN POINTER WITH L, EM, MP. /REGISTERS USED AT LEVEL 2. LPLBHP 0 /L.B.H. POINTER (IN USER'S AREA) LPWPC 0 /W.P.C. ( INCLUDING HEADER) LP5CH 0 /5/7 COUNTER. LP8CT 0 /8 VERTICAL FORM CONTROLS. LV2WC 0 /DATA WORD COUNT. LPSVAC 0 /SAVED AC ON INTERRUPT LPTOUT 0 /DISMISS ADDRESS LV2FC 0 /FORM CONTROL (15-17) LPUND 0 /I/O UNDERWAY INDICATOR (777777=UNDERWAY) PGECNT 0 /INITIALIZED TO 0 WHEN AT TOP OF FORM /INCREMENTED BY 1 UNTIL 58(10) LINES / HAVE BEEN OUTPUT OR FORM FEED IS ENCOUNTERED /TABLE OF ASCII CONTROL CHAR'S SCANNED BY LPT IN IOPS ASCII MODE LPCTAB 777752 /LF-EVERY LINE 0 ---12 777761 /DC1-EVERY 2ND LINE 1 ---21 777762 /DC2-EVERY 3RD LINE 2 ---22 777753 /VT-EVERY 6TH LINE 3 ---13 777763 /DC3-EVERY 10TH LINE 4 ---23 777764 /DC4-EVERY 20TH LINE 5 ---24 777760 /DLE-OVER PRINT 6 ---20 777754 /FF-TOP ON NEXT FORM 7 ---14 777755 /CR ---15 777751 /HT ---11 .END