Trailing-Edge
-
PDP-10 Archives
-
BB-4170G-SM
-
sources/lpksdv.mac
There are 20 other files named lpksdv.mac in the archive. Click here to see a list.
;<3A.MONITOR>LPKSDV.MAC.75, 22-Jun-78 20:08:41, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.74, 3-May-78 15:36:12, Edit by MCLEAN
;FIX FOR LINEPRINTER NOT THERE
;<3.SM10-RELEASE-3>LPKSDV.MAC.73, 3-Apr-78 13:01:33, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.72, 2-Apr-78 15:49:25, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.71, 2-Apr-78 13:39:47, Edit by MCLEAN
;FIX FLUSH TO CAUSE INTERRUPT AFTER INIT SO LPT WON'T HANG
;<3.SM10-RELEASE-3>LPKSDV.MAC.70, 22-Mar-78 20:36:49, Edit by MCLEAN
;FIX FESFLO TO ENABLE INTERRUPT AFTER RESET
;<3.SM10-RELEASE-3>LPKSDV.MAC.69, 15-Mar-78 18:15:19, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.68, 14-Mar-78 23:48:45, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.67, 11-Mar-78 23:37:09, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.66, 11-Mar-78 23:35:52, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.65, 11-Mar-78 22:42:17, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.64, 11-Mar-78 21:58:29, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.63, 11-Mar-78 20:53:48, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.62, 5-Mar-78 14:10:41, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.61, 3-Mar-78 14:21:54, Edit by MCLEAN
;FIX SHUFFL ROUTINE
;<3.SM10-RELEASE-3>LPKSDV.MAC.60, 16-Feb-78 13:12:57, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.59, 15-Feb-78 23:47:39, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.58, 15-Feb-78 23:45:23, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.57, 15-Feb-78 20:44:43, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.56, 14-Feb-78 15:35:07, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.55, 13-Feb-78 23:40:32, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.54, 13-Feb-78 00:10:19, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.53, 13-Feb-78 00:06:28, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.52, 12-Feb-78 23:29:08, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.51, 12-Feb-78 23:07:32, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.50, 10-Feb-78 16:46:43, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.49, 10-Feb-78 16:36:28, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.48, 10-Feb-78 16:34:31, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.47, 10-Feb-78 16:33:01, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.46, 10-Feb-78 00:45:38, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.45, 9-Feb-78 18:46:56, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.44, 9-Feb-78 18:03:55, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.43, 9-Feb-78 17:17:37, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.42, 9-Feb-78 16:33:06, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.41, 9-Feb-78 00:02:19, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.40, 8-Feb-78 23:43:45, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.39, 8-Feb-78 23:33:29, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.38, 8-Feb-78 23:32:01, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.37, 8-Feb-78 23:30:07, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.36, 8-Feb-78 23:24:14, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.35, 8-Feb-78 23:16:55, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.20, 8-Feb-78 23:06:08, Edit by MCLEAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.19, 8-Feb-78 23:04:18, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.33, 8-Feb-78 22:49:51, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.32, 8-Feb-78 22:15:29, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.31, 8-Feb-78 22:12:04, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.30, 8-Feb-78 22:05:07, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.29, 8-Feb-78 21:51:53, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.28, 8-Feb-78 21:50:16, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.27, 8-Feb-78 20:35:40, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.26, 8-Feb-78 20:18:39, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.25, 8-Feb-78 17:13:08, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.24, 8-Feb-78 17:08:59, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.23, 8-Feb-78 14:48:27, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.22, 7-Feb-78 16:55:28, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.21, 7-Feb-78 16:50:27, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.20, 7-Feb-78 16:28:00, Edit by MCLEAN
;<1MCLEAN>LPKSDV.MAC.19, 7-Feb-78 15:21:05, Edit by MCLEAN
;ADD INTERRUPT ENABLE CHECK AND OTHER GOODIES
;<3.SM10-RELEASE-3>LPKSDV.MAC.18, 25-Jan-78 16:09:48, EDIT BY OSMAN
;DON'T SET LOCAL INIT EVERY TIME A BUFFER IS SENT (WAS CAUSING TABS TO GET SCREWED UP)
;<3.SM10-RELEASE-3>LPKSDV.MAC.17, 5-Dec-77 20:08:23, EDIT BY OSMAN
;USE UNIBUS NUMBER "LPTUBN" INSTEAD OF 0
;<3.SM10-RELEASE-3>LPKSDV.MAC.16, 11-Nov-77 14:09:41, EDIT BY OSMAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.15, 10-Nov-77 22:02:47, EDIT BY OSMAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.14, 10-Nov-77 21:47:36, EDIT BY OSMAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.13, 10-Nov-77 18:41:38, EDIT BY OSMAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.12, 10-Nov-77 18:01:22, EDIT BY OSMAN
;MAKE INITIALIZATION CHECK FOR EXISTENCE OF LP'S, AND MAKE WORK ROUTINES FAIL IF CALLED FOR NONX LP
;<3.SM10-RELEASE-3>LPKSDV.MAC.11, 10-Nov-77 00:26:02, Edit by MCLEAN
;USE PROKS SYMBOLS FOR EXTERNAL PAGE AND INTERRUPT VECTOR
;<3.SM10-RELEASE-3>LPKSDV.MAC.10, 1-Nov-77 11:09:46, EDIT BY OSMAN
;DON'T CALL OURTLS ON EVERY CONTROL CHARACTER
;<3.SM10-RELEASE-3>LPKSDV.MAC.9, 25-Oct-77 13:23:07, EDIT BY OSMAN
;IN OURTLS, USE RDIO INSTEAD OF RDIOB. IN LPINT+6, USE TIOE INSTEAD OF TION
;<3.SM10-RELEASE-3>LPKSDV.MAC.8, 21-Oct-77 14:23:58, EDIT BY OSMAN
;REMOVE ALL REFERENCES TO P1,P2,P3,P4 (CHANGE THEM TO Q2,Q3)
;<3.SM10-RELEASE-3>LPKSDV.MAC.7, 21-Oct-77 14:14:09, EDIT BY OSMAN
;REMOVE %P1% KLUDGE
;DOING ERROR RESET SETS DONE, SO BE CAREFUL!
;<3.SM10-RELEASE-3>LPKSDV.MAC.5, 20-Oct-77 22:49:59, EDIT BY OSMAN
;TRY TO MAKE OFF-LINE/ON-LINE CONTINUE PRINTER
;<3.SM10-RELEASE-3>LPKSDV.MAC.4, 20-Oct-77 13:42:53, EDIT BY OSMAN
;USE 600000 BITS OF PDP-11 ADDRESS FOR BUS A17 AND BUS A16 WHEN SETTING "GO"
;<3.SM10-RELEASE-3>LPKSDV.MAC.2, 18-Oct-77 16:02:54, EDIT BY OSMAN
;<3.SM10-RELEASE-3>LPKSDV.MAC.1, 18-Oct-77 15:47:47, EDIT BY OSMAN
;IF LINEPRINTER COMES ON-LINE, GET IT ROLLING AGAIN
;<3-MONITOR>LPKSDV.MAC.25, 12-Oct-77 15:22:10, EDIT BY OSMAN
;CALL OURTLS WHEN SNDEOF REQUESTED
;<3-MONITOR>LPKSDV.MAC.24, 12-Oct-77 13:56:29, EDIT BY KIRSCHEN
;UPDATE COPYRIGHT FOR RELEASE 3
;<3-MONITOR>LPKSDV.MAC.23, 11-Oct-77 10:41:02, EDIT BY OSMAN
;IT'S CALLED SAVBCT, NOT SAVCNT!
;<3-MONITOR>LPKSDV.MAC.22, 11-Oct-77 10:33:32, EDIT BY OSMAN
;IN INITIALIZATION, SET INTERRUPT ENABLE.
;PUT IN FESACK ROUTINE.
;<3-MONITOR>LPKSDV.MAC.21, 11-Oct-77 10:15:40, EDIT BY OSMAN
;MAKE CONTROL CHARACTERS WORK, AND PUT IN "FLUSH" ROUTINE TO STOP OUTPUT
;<3-MONITOR>LPKSDV.MAC.20, 6-Oct-77 13:30:27, EDIT BY OSMAN
;REMEMBER TO RESTORE BUFFER CHARACTER BEFORE RESUMING ORIGINAL PRINT JOB
;<3-MONITOR>LPKSDV.MAC.19, 6-Oct-77 13:16:30, EDIT BY OSMAN
;ALSO, SET UP LPBSAD WHEN PRINTING CONTROL CHARACTER
;SAVE BUFFER CHARACTER BEFORE PUTTING UPARROW - CHARACTER IN BUFFER
;<3-MONITOR>LPKSDV.MAC.18, 5-Oct-77 16:47:12, EDIT BY OSMAN
;WITHIN LPCINT:, USE "DPB" INSTEAD OF "DBP"!
;<3-MONITOR>LPKSDV.MAC.17, 4-Oct-77 16:34:30, EDIT BY OSMAN
;FORGOT NOCINT:
;<3-MONITOR>LPKSDV.MAC.16, 4-Oct-77 15:59:56, EDIT BY OSMAN
;PUT IN CODE TO TYPE CONTROL CHARS AS UP-ARROW CHAR
;<3-MONITOR>LPKSDV.MAC.15, 3-Oct-77 18:00:13, EDIT BY OSMAN
;CHANGE LPCCTR REF TO LPBCTR, USE RDIO INSTEAD OF MOVE, ONLY CHECK 12 BITS OF COUNTER
;<3-MONITOR>LPKSDV.MAC.14, 3-Oct-77 15:49:25, EDIT BY OSMAN
;MAKE OURTLS SET .DVFEF IF PRINTER IS DONE PRINTING WHAT IT'S BEEN SENT
;<3-MONITOR>LPKSDV.MAC.13, 3-Oct-77 09:26:14, EDIT BY OSMAN
;MAKE FESNDS SET LARGE PAGE COUNTER IF PGENB IS 0
;MAKE STATUS ERROR BIT COME ON IF PRINTER INTERRUPTS ON PAGE-COUNTER-REACHED-0
;<3-MONITOR>LPKSDV.MAC.12, 2-Oct-77 16:44:43, EDIT BY OSMAN
;CALL LODDON IN FESDTA INSTEAD OF LPINT (AS DTEQ WOULD!)
;<3-MONITOR>LPKSDV.MAC.11, 2-Oct-77 05:02:04, EDIT BY OSMAN
;MAKE FESNDS CALL LPTINT
;GET RID OF .DVOIR, AND REFER TO LP1PER INSTEAD OF LP1DPE
;FLUSH THE SETONE LPTBL IN FESNDS. (ARNIE, YOU WERE WRONG!)
;<3-MONITOR>LPKSDV.MAC.10, 30-Sep-77 05:46:19, EDIT BY OSMAN
;DIVIDE BYTE COUNT BY 2 IN "CHANGE" TO GET CORRECT WORD COUNT, SET
;LOAD-VFU BIT WHEN LOADING RAM (REAL LOGICAL, AIN'T IT!), BEFORE
;PRINTING DATA, SET ERROR-RESET AND LOCAL INIT, MAKE FESNDS AND DESLOP
;SKIP.
;<3-MONITOR>LPKSDV.MAC.9, 29-Sep-77 23:48:18, EDIT BY OSMAN
;PASS VFU/RAM DATA TO "CHANGE" VIA 16-BIT BYTE POINTER
;USE XWD INSTEAD OF IOWD, BECAUSE LINK DOESN'T FIX UP LEFT HALF OF IOWD CORRECTLY!!!
;<3-MONITOR>LPKSDV.MAC.8, 28-Sep-77 14:43:32, EDIT BY OSMAN
;DON'T SHUFFLE RAM/VFU DATA LIKE PRINTER CHARACTERS, AND CLEAR ERROR BEFORE SENDING DATA TO PRINTER
;<3-MONITOR>LPKSDV.MAC.7, 27-Sep-77 17:11:20, EDIT BY OSMAN
;FIX GETLPA ( ADD => ADDI), FIX OURTLS ROUTINE
;<3-MONITOR>LPKSDV.MAC.6, 21-Sep-77 23:15:41, EDIT BY OSMAN
;P1 => U (BUG AT ABOUT L2INI+5). ALSO, @A => (A) TO AVOID POSSIBLE XADR PROBLEMS
;<3-MONITOR>LPKSDV.MAC.5, 19-Sep-77 16:03:31, EDIT BY OSMAN
;FIX TYPO (]] => ])
;<3-MONITOR>LPKSDV.MAC.4, 19-Sep-77 14:54:26, EDIT BY OSMAN
;PUT IN %P1% KLUDGE TO ALLOW US TO USE P1 WITHIN THIS MODULE ETC.
;<SM10-MONITOR>LPKSDV.MAC.27, 14-Sep-77 23:08:03, EDIT BY OSMAN
;REMOVE PRINTX'S, WHICH WERE NICE BUT DEPEND ON LPTN WHICH ISN'T DEFINED IN THIS CONTEXT
;<SM10-MONITOR>LPKSDV.MAC.26, 14-Sep-77 17:40:51, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.25, 14-Sep-77 17:17:28, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.24, 14-Sep-77 17:13:23, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.23, 14-Sep-77 17:01:09, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.21, 14-Sep-77 16:27:53, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.20, 8-Sep-77 16:10:18, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.19, 6-Sep-77 16:47:47, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.18, 6-Sep-77 13:57:51, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.17, 3-Sep-77 17:48:01, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.16, 3-Sep-77 17:10:35, EDIT BY OSMAN
;PUT IN ALL SPECIFIC FUNCTION ROUTINES
;<SM10-MONITOR>LPKSDV.MAC.15, 3-Sep-77 16:42:11, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.14, 3-Sep-77 14:14:03, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.13, 3-Sep-77 11:24:41, EDIT BY OSMAN
;PUT IN SHUFFL ROUTINE
;<SM10-MONITOR>LPKSDV.MAC.12, 2-Sep-77 15:07:06, EDIT BY OSMAN
;<SM10-MONITOR>LPKSDV.MAC.11, 2-Sep-77 14:29:47, EDIT BY OSMAN
;START ADDING LINEPRINTER REGISTER DEFINITIONS
;<SM10-MONITOR>LPKS10.MAC.1, 1-Aug-77 16:38:02, EDIT BY OSMAN
;CREATE KS10 LINEPRINTER DEVICE-DEPENDENT MODULE
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION
; DEVICE DEPENDENT CODE FOR THE LINE PRINTER
; (LP20 SERVICE) SPECIFIC CODE.
;DEFSTRS NEEDED WITHIN
DEFSTR (LPXBTS,L11A,19,2) ;PDP-11 TWO EXTENDED ADDRESSING BITS
; LINE PRINTER DEVICE DISPATCH TABLE
FELPVT: IFIW!FESFLO ;SEND FLUSH
IFIW!FESLOP ;PAGE COUNTER
IFIW!FESACK ;ACK
IFIW!FESDTA ;SEND DATA
IFIW!FESEOF ;EOF
IFIW!FESNDS ;STRING DATA
IFIW!OURTLS ;SEND STATUS
IFIW!LP20RS ;RESTART
IFIW!LP20IN ;INITALIZE
IFIW!LP20IE ;CHECK INTERRUPT ENABLE
IFN <.-FELPMX>-FELPVT,<PRINTX %%INVALID DEVICE DEPENDENT TABLE SIZE>
;TABLE OF -11 HARDWARE ADDRESSES OF THE LINEPRINTER CONTROLLER REGISTERS
;LCRTAB+N SHOWS THE ADDRESS FOR THE DATA BASE FOR LINEPRINTER N.
LCRTAB: LP11CA
;PARALLEL TABLE OF -11 INTERRUPT VECTOR ADDRESSES. THAT IS, THE
;CONTENTS OF LPVTAB+N IS THE -11 ADDRESS WHICH WOULD CONTAIN THE
;ADDRESS OF THE INTERRUPT ROUTINE FOR LINEPRINTER N, IF WE WERE
;AN -11.
LPVTAB: LP11IV
;TABLE OF ADDRESSES OF INTERRUPT ROUTINES, ONE FOR EVERY LINEPRINTER.
LPINTB: LP0INT
;INITIALIZATION ROUTINE.
LP20IN: MOVEI U,LPTN
LP20I1: SOJL U,R ;RETURN IF ALL LP'S INITIALIZED
SKIPE PROFLG ;IF PROFLG DON'T INITALIZE
CALL L2INI ;INITIALIZE A LINE PRINTER
JRST LP20I1 ;LOOP FOR ALL LP'S
RET ;DONE
;ROUTINE TO INITIALIZE A LINE PRINTER. IT EXPECTS U TO CONTAIN 0
;THROUGH N-1 WHERE THERE ARE N LINE PRINTERS ON THE SYSTEM.
L2INI: MOVE A,LCRTAB(U) ;GET ADDRESS ON UNIBUS FOR THIS LP
SETZRO LPXBIT,(U) ;ASSUME NONE
CALL UBGOOD ;CHECK FOR EXISTANCE
RET ;RETURN NO DEVICE
SETONE LPXBIT,(U) ;SET DEVICE EXISTS
MOVE A,U ;SEE WHICH LINE PRINTER WE'RE DOING
LSH A,2 ;MULTIPLY BY FOUR BECAUSE XPCW NEEDS FOUR WORDS
ADDI A,LPXPTB ;POINT XPCW AT CORRECT PLACE
SETZM 2(A) ;CLEAR FLAGS OUT OF WHERE XPCW WILL POINT TO
MOVE B,LPINTB(U) ;GET INTERRUPT ROUTINE ADDRESS FOR THIS LP
MOVEM B,3(A) ;STORE IT FOR XPCW TO TRANSFER TO ON INTERRUPT
HRLI A,(XPCW) ;MAKE THE XPCW INSTRUCTION
MOVE B,SMTEPT+LPTUBN ;GET ADDRESS OF XPCW TABLE
MOVE C,LPVTAB(U) ;GET -11 ADDRESS THAT HOLDS LP INTERRUPT ROUTINE ADDRESS
LSH C,-2 ;DIVIDE BY 4 TO GET OFFSET INTO XPCW TABLE
ADD B,C ;GET ADDRESS WHERE XPCW SHOULD GO
MOVEM A,(B) ;STORE THE XPCW
MOVEI A,LPTUBN ;UNIBUS ADAPTOR NUMBER
MOVEI B,1 ;WE NEED ONE -11 PAGE
CALL ALUBWA ;GET IT
BUG(HLT,NLWA,<L2INI: No lineprinter window available>)
MOVEM A,LPWINA(U) ;SAVE ADDRESS OF UBA
MOVEM B,L11A(U) ;REMEMBER -11 ADDRESS WE GOT
LP20RS: CALL GETLPA ;GET ADDRESS OF THIS LINEPRINTER'S BUFFER
MOVE C,A
MOVE B,L11A(U) ;GET BUFFER ADDRESS
LSH C,-9 ;MAKE PAGE NUMBER
TXO C,UNBD18+UNBVBT ;DISABLE 18-BIT TRANSFERS, SAY VALID TRANSFER
WRIO C,@LPWINA(U) ;ASSOCIATE -10 PAGE WITH FAKE -11 PAGE
CALL LPTRUE ;MAKE SURE PRINTER EXISTS
RET ;DON'T REFERENCE NONEXISTENT HARDWARE!
move B,LCRTAB(U) ;GET BASE ADDRESS FOR REGISTERS
MOVX A,LP1RSE+LP1INT ;SET ERROR RESET AND INITIALIZE
WRIOB A,LPCSRA+1(B)
MOVX A,LP1IEN ;INTERRUPT ENABLE BIT
WRIOB A,LPCSRA(B) ;MAKE SURE INTERRUPTS ARE ENABLED
RET
;ROUTINE TO CALL WITH U SET UP, WHICH SKIPS IFF LINEPRINTER EXISTS,
;AS DETERMINED DURING SYSTEM STARTUP
LPTRUE: LOAD A,LPXBIT,(U) ;GET EXISTENCE BIT FOR THIS LP
JUMPE A,R ;NON-SKIP IF NONX LINEPRINTER
RETSKP ;SKIP IF EXISTENT PRINTER
;LINEPRINTER INTERRUPT ROUTINES.
LP0INT: MOVEM P,LPACS+P ;SAVE CALLER'S P
MOVEI P,LPACS ;SAVE ACS
BLT P,LPACS+16
MOVE P,[XWD -LPSLEN,LPSTAK-1] ;GET STACK POINTER FOR LP INTERRUPT ROUTINE
MOVEI U,0 ;IDENTIFY WHICH PRINTER INTERRUPTED
; JRST LPINT ;JOIN COMMON INTERRUPT ROUTINE
;COMMON INTERRUPT ROUTINE FOR LINEPRINTERS. IT ASSUMES U CONTAINS UNIT
;OF LINEPRINTER THAT INTERRUPTED, THAT P IS SET UP, AND THAT THE ACS
;FROM BEFORE THE INTERRUPT ARE SAVED
LPINT: LOAD A,LPTCC,(U) ;GET CHARACTER COUNT
JUMPE A,LPINTA
SETZRO LPTCC,(U) ;ZERO INTERRUPT CHARACTER COUNT
MOVE B,U ;GET UNIT NUMBER FOR LPTINT
CALL LPTINT ;NOTIFY INTERRUPT ROUTINE
LPINTA: MOVE A,U ;GET UNIT NUMBER
LSH A,2 ;GET OFFSET INTO XPCW DATA TABLE
ADD A,[XJEN LPXPTB] ;MAKE APPROPRIATE XJEN INSTRUCTION FOR DISMISSING INTERRUPT
MOVEM A,LPXJEN ;REMEMBER THE INSTRUCTION FOR LATER
MOVE Q2,LCRTAB(U) ;GET -11 ADDRESS OF THIS LP'S REGISTERS
MOVX A,LPWCI+LPWDON ;CHARACTER INTERRUPT + DONE FLAG
TIOE A,LPCSRA(Q2) ;SKIP IF NOT DONE OR CHARACTER INTERRUPT
JRST PDJCOL ;PRINTER DIDN'T JUST COME ONLINE IF
;DONE IS SET OR THERE'S AN UNDEFINED CHARACTER INTERRUPT
MOVX A,7777 ;BYTE COUNTER IS 12 BITS WIDE
MOVX B,LP1OFL+LP1DVN+LP1PER+LP1MPE+LP1RPE+LP1SYE+LP1DME+LP1GOE ;CAN'T USE LP1ERR
;BECAUSE IT STICKS AFTER ERROR IS REMEDIED
TIOEB B,LPCSRB(Q2) ; WAS THERE SORT OF ERROR?
JRST [ MOVEI B,LP1OFL+LP1DVN+LP1PER+LP1MPE+LP1RPE+LP1SYE+LP1DME ;GO ERROR? OR REAL ERROR?
TIOE B,LPCSRB(Q2)
JRST NOCINT ;NOPE DO ERROR LOGGING
JRST LPGO1] ;YES JUST RESTART THE DAMN THING THIS APPEARS TO BE EXTRANEOUS ERROR
TIOE A,LPBCTR(Q2) ;SKIP IF BYTE COUNT IS 0
JRST LPGO ;NO ERROR AND BYTE COUNT NON-0, GO RESTART PRINTER
PDJCOL: LOAD A,ARROWF,(U) ;SEE IF DOING CTRL CHAR
JUMPN A,FINCTL ;YES, PREPARE TO GO BACK TO ORIG BUFF
MOVX A,LPWCI ;BIT WE WANT TO TEST
TIOE A,LPCSRA(Q2) ;DID WE JUST GET A CHARACTER INTERRUPT?
JRST LPCINT ;YES, GO HANDLE IT
NOCINT: CALL OURTLS ;GET STATUS OF THIS LINEPRINTER
MOVX A,LP1DON ;SEE IF LINEPRINTER DONE PRINTING
MOVE B,U ;LPTINT EXPECTS UNIT NUMBER IN B
TIOEB A,LPCSRA(Q2) ;TEST DONE FLAG
JRST [ SETZRO LPTFE,(U) ;ZERO COUNT OF CHARACTERS
JE LPTBL,(U),LPXIT
SETZRO LPTBL,(U)
MOVEI 1,0 ;FAKE INTERRUPT RESTART
CALL LPTINT
JRST LPXIT]
; JRST LPXIT ;DISMISS INTERRUPT
;LINEPRINTER INTERRUPT EXIT ROUTINE. RESTORES AC'S AS BEFORE INTERRUPT
;AND DISMISSES INTERRUPT...
LPXIT: MOVSI 17,LPACS ;MAKE BLT POINTER
BLT 17,17 ;RESTORE AC'S
XCT LPXJEN ;RETURN TO CALLER
;GET HERE ON CHARACTER INTERRUPT
LPCINT: RDIOB A,LPRAMD(Q2) ;GET RAM DATA FOR THIS INTERRUPT
CAIE A,"^" ;IS THIS INTERRUPT FOR A CONTROL CHARACTER
;DESIRING TO BE MADE "UPARROW-CHARACTER"
JRST NOCINT ;NO, HANDLE THIS CONDITION AS ANY OTHER ERROR
RDIO A,LPBCTR(Q2) ;GET BYTE COUNTER SO FAR FOR THIS PRINTER
STOR A,SAVBCT,(U) ;REMEMBER IT FOR LATER TO CONTINUE PRINTER
RDIO A,LPBSAD(Q2) ;GET BUS ADDRESS
STOR A,SAVBUS,(U) ;REMEMBER IT TOO
MOVE A,L11A(U) ;GET -11 ADDRESS OF LPT DATA BUFFER
WRIO A,LPBSAD(Q2) ;TELL LP20 WHERE DATA IS
MOVEI A,1
STOR A,ARROWF,(U) ;MARK THAT WE'RE DOING ARROWS
;GET THE UP-ARROW FOR THE CONTROL CHAR
CALL GETLPA ;GET BUFFER ADDRESS
MOVEI B,"^" ;WHAT YOU MEAN "WE", KIMO SABE?
DPB B,[POINT 8,(A),17] ;PUT THE ^ IN THE BUFFER
LDB C,[POINT 8,(A),9] ;GET CHARACTER THAT HASN'T BEEN PRINTED YET
STOR C,SAVCHR,(U) ;SAVE IT BECAUSE WE NEED THE BUFFER SPACE
RDIOB B,LPCBUF(Q2) ;GET CONTROL CHARACTER
TRO B,100 ;MAKE IT A PRINTING CHARACTER
ANDI B,177 ;AND OFF GARBAGE BITS
DPB B,[POINT 10,(A),9] ;MAKE ^ CHARACTER IN BUFFER & CLR B0/B1
MOVNI A,2 ;GET NEG OF # OF CHARS
WRIO A,LPBCTR(Q2) ;SET UP BYTE COUNT TO 2
LPGO1: CALL SETGOA
JRST LPXIT ;DON'T SEND STATUS FOR EACH CONTROL CHARACTER
LPGO: CALL SETGOA ;START THE LP
CALL OURTLS ;ALWAYS REPORT STATUS AFTER RESTARTING PRINTER
JRST LPXIT ;WAIT FOR TWO CHARS TO PRINT
;GET HERE TO FINISH INTERRUPTED BUFFER
FINCTL: MOVEI A,0
STOR A,ARROWF,(U) ;SAY NOT DOING CTRL CHAR
LOAD A,SAVBCT,(U)
JUMPE A,NOCINT ;QUIT IF THIS WAS THE LAST CHARACTER
WRIO A,LPBCTR(Q2) ;RESTORE ORIG BYTE COUNTER
LOAD A,SAVBUS,(U)
WRIO A,LPBSAD(Q2) ;RESTORE ORIG BUS ADDRESS
CALL GETLPA ;GET BUFFER ADDRESS
LOAD B,SAVCHR,(U) ;GET SAVED BUFFER CHARACTER
DPB B,[POINT 8,(A),9] ;RESTORE BUFFER CHARACTER
JRST LPGO1 ;START PRINTER AGAIN
; ROUTINE TO SEND A FLUSH
;THIS CAUSES LINEPRINTER TO IMMEDIATELY STOP PRINTING
FESFLO: CALL LPTRUE ;MAKE SURE PRINTER EXISTS
RET ;DOESN'T!
MOVE B,LCRTAB(U) ;GET REGISTER FOR THIS LP
MOVEI A,LPWINT+LP1IEN ;SET INTERRUPT ENABLE
WRIO A,(B) ;AND STOP DEVICE WITH LOCAL INIT
MOVEI A,LP1IEN+LP1GO ;SET IENERRUPT ENABLE
WRIO A,(B)
SETZRO LPTFE,(U) ;ZERO COUNT OF BYTES IN FE
RET ;RETURN
;SET page counter
;SKIPS IFF SUCCESFUL
FESLOP: CALL LPTRUE ;DOES LINEPRINTER EXIST?
RET ;NO, GIVE FAILURE RETURN
LOAD A,PGCTR,(U) ;GET VALUE TO BE SET
MOVE B,LCRTAB(U) ;GET BASE REGISTER
WRIO A,LPPCTR(B) ;SET THE PAGE COUNTER
RETSKP ;DONE
; ROUTINE TO SEND AN ACK
;THIS IS CALLED TO GET THE PRINTER ROLLING AGAIN AFTER IT HAS
;STOPPED DUE TO SOME ERROR.
FESACK: CALL LPTRUE ;MAKE SURE PRINTER EXISTS
RET ;DOESN'T
MOVE B,LCRTAB(U) ;GET REGISTER FOR THIS LP
MOVEI A,0
WRIO A,LPPCTR(B) ;CLEAR PAGE COUNTER IN CASE THERE WAS A PAGE COUNTER INTERRUPT
RDIO A,LPBCTR(B) ;SEE HOW MANY CHARACTERS LEFT IN BUFFER
TXNE A,7777 ;ANY CHARACTERS LEFT TO PRINT?
CALL SETGO ;YES, SET THE GO FLAG
RET ;RETURN
;ROUTINE TO LOAD VFU OR RAM DATA. ACCEPTS:
; B/ FUNCTION-CODE,,0 ;.DFLVF => LOAD VFU
; ;.DFLTR => LOAD TRANSLATION RAM
; D/ NUMBER OF 8-BIT BYTES
FESDTA: STKVAR <LVFU,N8BB>
SETOM LVFU ;FIRST ASSUME LOADING VFU
CAMN B,[.DFLTR,,0] ;LOADING RAM??
SETZM LVFU ;YES, SO NOT LOADING VFU!
MOVEM D,N8BB ;REMEMBER NUMBER OF 8-BIT BYTES
CALL LPTRUE
RET ;JUST RETURN IF PRINTER DOESN'T EXIST
CALL GETLPA ;GET BUFFER ADDRESS FOR THIS LINEPRINTER
MOVE B,LPTRLP(U) ;FIGURE OUT WHERE DATA TO BE LOADED IS
OPSTR <SKIPN>,ALTP,(U)
ADDI B,NLPBF
HRLI B,(<POINT 16,0>) ;EACH BYTE IS 8+8 BITS
MOVE C,N8BB ;LOAD UP NUMBER OF BYTES TO DIGEST
CALL CHANGE ;REARRANGE DATA THE WAY IT WOULD BE IN AN -11
MOVE B,U ;LODDON ROUTINE EXPECTS UNIT NUMBER IN B
CALL LODDON ;TELL WORLD WE'VE RECEIVED THE DATA
MOVE D,LCRTAB(U) ;GET BASE REGISTER FOR THIS LP
MOVE A,L11A(U) ;GET LPT BUFFER ADDRESS
WRIO A,LPBSAD(D) ;TELL PRINTER WHERE DATA IS
MOVN A,N8BB ;GET NEGATIVE OF NUMBER OF BYTES
WRIO A,LPBCTR(D) ;TELL PRINTER HOW MUCH DATA WE'RE SENDING
MOVX B,LP1PEN+LP1DVU+LP1IEN+LP1GO ;PARITY ENABLE, LOAD VFU, INTERRUPT ENABLE
SKIPN LVFU ;SKIP IF REALLY LOADING VFU
MOVX B,LP1PEN+LP1TM+LP1DVU+LP1IEN+LP1GO ;PARITY, TEST MODE, LOAD DVU, INTERRUPT ENABLE
CALL SETGOB ;START THE PRINTER
RET ;DONE
FESEOF: CALL OURTLS ;WHEN EOF REQUESTED, ASK FOR STATUS
RET ;RETURN
;ROUTINE TO SEND DATA TO THE LINE PRINTER TO BE PRINTED.
;PASS IT COUNT IN F OF NUMBER OF BYTES
;THIS ROUTINE SKIPS IFF SUCCESSFUL
FESNDS: STOR F,LPTCC,(U) ;SAVE COUNT OF CHARACTERS
CALL LPTRUE
RET ;FAILURE RETURN IF PRINTER DOESN'T EXIST
MOVE D,LCRTAB(U) ;GET -11 BASE ADDRESS FOR HARDWARE LP REGISTERS
CALL GETLPA ;GET BUFFER ADDRESS FOR THIS PRINTER
MOVE B,LPTCCW(U) ;GET POINTER TO DATA BEING SENT
LOAD C,LPTCC,(U) ;GET NUMBER OF CHARACTERS BEING SENT
CALL SHUFFL ;PUT BYTES IN -11 FORMAT
MOVE D,LCRTAB(U) ;GET -11 BASE ADDRESS FOR HARDWARE LP REGISTERS
MOVEI A,1000 ;ARBITRARY LARGE NUMBER OF PAGES
LOAD B,PGENB,(U) ;GET INFORMATION ABOUT PAGING
CAIN B,0 ;DOES USER WANT TO STOP AFTER CERTAIN NUMBER OF PAGES?
WRIO A,LPPCTR(D) ;NO, SO PUT IN LARGE NUMBER SO PRINTER WON'T STOP
MOVE A,L11A(U) ;GET -11 ADDRESS OF LPT DATA BUFFER
WRIO A,LPBSAD(D) ;TELL LP20 WHERE DATA IS
LOAD A,LPTCC,(U) ;GET NUMBER OF BYTES BEING SENT
MOVNS A ;NEGATE IT
WRIO A,LPBCTR(D) ;TELL LP20 HOW MANY
CALL SETGO ;START THE PRINTER
LOAD A,LPTCC,(U) ;SET NUMBER OF CHARACTERS SENT
RETSKP ;ALL DONE
;ROUTINE TO START THE PRINTER.
SETGO: MOVX B,LP1IEN+LP1GO ;INTERRUPT ENABLE + GO
SETGOB: LOAD A,LPXBTS,(U) ;GET PDP-11 EXTENDED ADDRESS BITS
STOR A,LP1A17+LP1A16,B ;SET HIGH ORDER ADDRESS BITS IN WORD BEING WRITTEN TO PRINTER
MOVE A,LCRTAB(U) ;GET REGISTER ADDRESS FOR THIS PRINTER
WRIOB B,LPCSRA(A) ;START THE PRINTER
RET
SETGOA: CALL CLRERR ;CLEAR ALL ERRORS
MOVX B,LP1IEN+LP1GO ;SET GO
MOVE A,LCRTAB(U) ;GET DEVICE ADDRESS
BSIOB B,LPCSRA(A) ;START DEVICE
RET ;RETURN
;ROUTINE TO CALL BEFORE SENDING DATA TO PRINTER. IT DOES THE
;APPROPRIATE ERROR CLEARING.
CLRERR: MOVX A,LPWERR ;GET BIT BEING TESTED
MOVX B,LPWRSE+LP1IEN ;GET BIT BEING SET
MOVE D,LCRTAB(U) ;GET REGISTER FOR THIS PRINTER
TION A,LPCSRA(D) ;SKIP IF ERROR
RET ;NO ERROR, SO JUST RETURN
WRIO B,LPCSRA(D) ;THERE'S AN ERROR, SO CLEAR IT
MOVX B,LP1IEN ;RESET INTERRUPT ENABLE
WRIO B,LPCSRA(D)
RDIO A,LPBCTR(D) ;COPY BYTE COUNTER TO ITSELF
WRIO A,LPBCTR(D) ;SINCE ERROR RESET SETS DONE (WHICH WOULD CAUSE PREMATURE INTERRUPT)
RET ;DONE
;ROUTINE TO RETURN LINEPRINTER BUFFER ADDRESS IN A FOR LINEPRINTER
;UNIT NUMBER IN U.
GETLPA: MOVE A,U ;SEE WHICH LINEPRINTER WE'RE GETTING BUFFER FOR
IMULI A,NLPBF ;MAKE CORRECT OFFSET INTO BUFFER SPACE
ADDI A,LPBUF ;ADD BASE ADDRESS TO MAKE CORRECT WORD ADDRESS
RET ;DONE
;WHEN SENDING RAM OR VFU DATA TO PRINTER, IT IS INITIALLY PACKED
;IN PDP-10 WORDS IN THE FORMAT BYTE(16)WORD,WORD,WORD...
;THE LP20 WANTS IT IN THE FORMAT BYTE(2)0(16)WORD(2)0(16)WORD...
;THE FOLLOWING ROUTINE CREATES THE SECOND FORMAT GIVEN THE FIRST.
;ACCEPTS:
; A/ ADDRESS TO RECIEVE SHUFFLED BYTES
; B/ ILDB POINTER TO CONTIGUOUS BYTES
; C/ NUMBER OF BYTES TO DO
CHANGE: SAVEAC <Q2> ;SAVE AN AC
HRLI A,(<POINT 18,0>) ;MAKE BYTE POINTER TO HALFWORDS
ASH C,-1 ;DIVIDE BYTES BY 2 TO GET NUMBER OF -11 WORDS
JUMPE C,R ;RETURN IF NONE
CHAN1: ILDB Q2,B ;GET SOME DATA
IDPB Q2,A ;STORE IT
SOJG C,CHAN1 ;LOOP
RET ;RETURN
;ROUTINE TO CHANGE CONTIGUOUS BYTES IN -10 FORMAT TO SHUFFLED BYTES
;IN -11 FORMAT.
;ACCEPTS:
; A/ ADDRESS TO RECIEVE SHUFFLED BYTES
; B/ ILDB POINTER TO CONTIGUOUS BYTES
; C/ NUMBER OF BYTES TO DO
;RETURNS: +1
SHUFFL: PUSH P,Q2 ;SAVE A REGISTER
SHUF1: SOJL C,SHUF2 ;DONE QUIT
ILDB Q2,B ;GET FIRST CHARACTER
SOJL C,SHUF3 ;DONE AFTER 1 CHARACTER
ILDB D,B ;GET NEXT CHARACTER
LSH D,^D8 ;SHIFT INTO POSITION
IOR D,Q2 ;BUT CHARACTERS TOGETHER
HRLZM D,(A) ;STORE CHARACTERS
SOJL C,SHUF2 ;QUIT
ILDB Q2,B ;GET ANOTHER CHARACTER
SOJL C,SHUF4 ;QUIT
ILDB D,B ;GET LAST CHARACTER
LSH D,^D8 ;PUT INTO POSITION
IOR D,Q2 ;PUT TOGETHER
HRRM D,(A) ;STORE CHARACTER
AOJA A,SHUF1 ;NEXT WORD
SHUF2: POP P,Q2 ;RESTORE REGISTER
RET ;RETURN
SHUF3: HRLZM Q2,(A) ;STORE CHARACTER
JRST SHUF2 ;QUIT
SHUF4: HRRM Q2,(A) ;STORE CHARACTER
JRST SHUF2
;AS ASCII /ABCDE/ TO THE NEW FORM BYTE(1)0,0(7)B,A(1)0,0(7)D,C(1)0,0(7)E
;THIS IS DONE BECAUSE FOR DMA DEVICES (DIRECT MEMORY ACCESS) THAT
;THINK THEY'RE LOOKING AT AN -11 AND NOT A -10, SO WE MUST SHUFFLE THE
;DATA SO THEY DON'T FIND OUT THE TRUTH.
;ROUTINE TO ASK FOR THE LPT STATUS
;ROUTINE TO GET LPT STATUS. ON THE KL, THE -11 SUPPLIED THE STATUS
;TO THE -10 AS PACKED BYTES, WHICH THE LPTTLS ROUTINE UNPACKS. WE'LL
;CALL LPTTLS TOO, BUT WE'LL FIRST PACK THE BYTES SO THAT LPTTLS WON'T
;KNOW THAT WE'RE NOT AN -11 SENDING THE DATA.
NSIZE==26 ;NUMBER OF 8-BIT BYTES IN DEVICE DEPENTENT STATUS
;
; THE STATUS BLOCK IS IN THE FOLLOWING FORMAT:
;
; PDP11 WORD NUMBERS
;
; WORD 0 STATUS WORD 0 (DV.XXX)
; WORD 1 STATUS WORD 1 (DD.XXX)
; WORD 2 (HIGH 8 BITS) # BYTES OF DEVICE DEPENDENT INFO
; (LOW BYTE) # BYTES OF DEVICE REGISTERS (ALWAYS 20)
; WORD 3 (LOW BYTE) ACCUMULATED CHECKSUM (HIGH BYTE)RETRY COUNT (NOT ALL IMPL)
; LP20 DEVICE REGISTERS
; WORD 4 LPCSRA
; WORD 5 LPCSRB
; WORD 6 LPBSAD
; WORD 7 LPBCTR
; WORD 10 LPPCTR
; WORD 11 LPRAMD
; WORD 12 LPCBUF/LPCCTR
; WORD 13 LPTDAT/LPCKSM
OURTLS: SAVEPQ ;SAVE REGISTERS
HRRZ A,U ;GET UNIT NUMBER
IMULI A,LPERSZ ;POINT TO CORRECT BLOCK
ADD A,[POINT 8,LPERBF] ;POINT TO BUFFER
MOVE P6,A ;SAVE BUFFER POINTER
MOVE P5,A
MOVEI B,0 ;SET "DEVICE HUNG" AND "ERROR FROM -11" BITS TO 0
IDPB B,P5 ;STORE THOSE BITS
MOVEI Q2,0 ;START WITH 0'S FOR SECOND BYTE
CALL LPTRUE ;MAKE SURE PRINTER EXISTS
TXO Q2,.DVFNX+.DVFOL ;NO, SET BIT THAT SAYS SO,
;ALSO OFF LINE, OP INTERVENTION REQUIRED
MOVE B,Q2
MOVE D,LCRTAB(U) ;GET REGISTER BASE ADDRESS
SETZB Q3,P3 ;FIRST ASSUME THE REGISTERS ARE 0
TXNE B,.DVFNX ;PRINTER EXIST?
JRST OURTL1 ;NO, SO DON'T REFERENCE HARDWARE!
RDIO Q3,LPCSRA(D) ;GET STANDARD STATUS BITS
RDIO P3,LPCSRB(D) ;SPECIAL BITS
OURTL1: TXNN Q3,LPWOL ;IS PRINTER ON-LINE?
TXO B,.DVFOL ;NO, OFF, SO SAY SO
TXNN Q3,LPWPZR ;IF PAGE COUNTER REACHED 0, THAT'S AN ERROR
TXNE P3,LP1PER+LP1MPE+LP1RPE+LP1SYE+LP1DME+LP1GOE ;PARITY ERROR, MEMORY PARITY ERROR, RAM PARITY ERROR, MASTER SYNC ERROR DEMAND ERROR, GOERROR
TXOA B,.DVFHE ;HARD ERROR ON ANY OF THESE CONDITIONS
TXNE Q2,.DVFNX ;CHECK FOR END OF FILE IF NO ERRORAND EXISTS
JRST NOTEOF ;EOF NOT POSSIBLE IF THERE'S AN ERROR
MOVEI A,7777 ;CHECK FOR COUNTER 0
TION A,LPBCTR(D) ;IS COUNTER 0? (ALL CHARACTERS BEEN PRINTED?)
TXO B,.DVFEF ;YES, SET EOF BIT
NOTEOF: IDPB B,P5 ;STORE VALUE OF REST OF STANDARD STATUS BITS
MOVEI B,0 ;FIRST WORD OF LPT STATUS IS ALL 0
IDPB B,P5
TXNE Q3,LPWPZR ;DID PAGE COUNTER REACH 0?
TXO B,MO%LPC ;YES
TXNE Q3,LPWCI ;UNDEFINED CHARACTER INTERRUPT?
TXO B,MO%LCI ;YES
TXNE P3,LPWDVN ;IS VFU ALRIGHT?
TXO B,MO%LVF ;NO
TXNE P3,LPWOVF ;DO WE HAVE AN OPTICAL VFU?
TXO B,MO%LVU ;YES
TXNE P3,LPWRPE ;WAS THERE A RAM PARITY ERROR?
TXO B,MO%RPE ;YES
IDPB B,P5 ;STORE LPT STATUS BYTE
MOVEI B,2 ;NUMBER OF DEVICE-DEPENDENT INFO
IDPB B,P5
MOVEI B,20 ;NUMBER OF DEVICE REGISTER BYTES
IDPB B,P5
TXNE Q2,.DVFNX ;CHECK FOR EXISTANT DEVICE
JRST LPNEXA ;DON'T READ REGISTERS
MOVEI A,0 ;NO RETRY
IDPB A,P5
RDIOB A,LPCKSM(D) ;GET CHECKSUM
IDPB A,P5 ;STORE CHECKSUM
IBP P5 ;MUST GET TO NEXT WORD HERE
HRLI P5,(<POINT 16,0>) ;SET UP FOR DEVICE REGISTERS
MOVEI A,10 ;NUMBER OF REGISTERS TO DUMP
LPDVDL: RDIO B,(D) ;READ A REGISTER
IDPB B,P5 ;STORE IN BUFFER
ADDI D,2 ;LOOK AT NEXT REGISTER
SOJG A,LPDVDL ;DO UNTIL ALL DONE
TXNN Q2,.DVFHE ;CHECK FOR HARDERR
JRST LPNEXD ;NO SYSERR REQUIRED
MOVEI A,NSIZE+FE%LEN ;GET LENGTH OF BUFFER NEEDED
MOVEI B,NSIZE+FE%SIZ
CALL ALCSEB ;ALLOCATE BA BUFFER
JRST LPNEXD ;NO BUFFER FORGET IT
SETZM FE%DTE+SEBDAT(A) ;SET NO DTE
MOVEI B,.FELPT ;GET THE DEVICE CODE
HRLI B,0(U) ;SET THE UNIT NUMBER
MOVEM B,FE%DEV+SEBDAT(A)
MOVNI D,NSIZE ;GET THE SIZE
HRLM D,FE%PTR+SEBDAT(A) ;SAVE COUNT OF WORDS
MOVEI C,NSIZE ;GET SIZE
MOVE D,P6 ;GET POINTER TO BUFFER
MOVE B,[POINT 8,FE%INF+SEBDAT(A)] ;POINTER TO DEVICE DATA
MOVEM C,FE%BYT+SEBDAT(A)
SYELP: ILDB P5,D ;GET BUFFER CHARACTERS
IDPB P5,B ;STORE CHARACTERS
SOJG C,SYELP
MOVE B,[-2,,[
SEBPTR 0,SBTEVC,SEC%FE
SEBPTR 0,SBTFNA,LPTSER]]
MOVE Q2,A ;SAVE POINTER TO ERROR BUFFER
CALL SEBCPY
JFCL ;FORGET IT IF ERROR
MOVE A,Q2 ;RESTORE BUFFER POINTER
CALL QUESEB ;QUEUE ERROR
LPNEXD: CALL CLRERR ;CLEAR ERRORS
LPNEXA: MOVE B,U ;LPTTLS EXPECTS UNIT IN B
MOVE D,P6 ;POINTER TO BEGINNING OF BUFFER IN D
MOVEI C,NSIZE ;NUMBER OF BYTES IN C
CALLRET LPTTLS ;GO MULL OVER STATUS AND RETURN
;
; ROUTINE TO CHECK FOR INTERRUPT ENABLE ON THE LP20
;
LP20IE: CALL LPTRUE ;CHECK TO SEE IF LINEPRINTER EXISTS
RET ;NOPE -- JUST RETURN
MOVEI A,LP1IEN ;GET INTERRUPT ENABLE FLAG
TIOE A,@LCRTAB(U) ;CHECK TO SEE IF IT IS SET
RET ;YES -- ALL OK
BUG(CHK,LP2IEN,<LINEPRINTER LOST INTERRUPT ENABLE>,U)
BSIO A,@LCRTAB(U) ;SET INTERRUPT ENABLE AND HOPE
RET ;RETURN
;ROUTINE CALLED BY SYSER RO DETERMINE OWING PROCESS AND
;COMPLETE THE SYSERR BLOCK
;
;
LPTSER: SETZ B ;SET UNIT (ONLY 1 FOR NOW)
JE LPOPN,(B),[ ;OPENED?
MOVNI C,-1 ;SAY UNASSIGNED
JRST LPFKS] ;STORE IT
LOAD B,LPFRK,(B) ;GET ID OF OWNER
HLRZ C,FKJOB(B) ;FIND FORK
HRLI C,0(B) ;UNIT
MOVE B,JOBDIR(C) ;DIRECTORY
HRLI B,USRLH ;SET UP USER NUMBER
MOVEM B,FE%DIR+SEBDAT(A) ;STORE DIR NUMBER
MOVE B,JOBPNM(C) ;GET NAME
MOVEM B,FE%NAM+SEBDAT(A)
LPFKS: MOVEM C,FE%FJB+SEBDAT(A)
MOVEI B,FE%INF ;START OF ERROR WORDS
HRRM B,FE%PTR+SEBDAT(A)
SETZM FE%ID+SEBDAT(A)
RET ;RESTURN
TNXEND
END