1 TITLE LPTSER - LINE PRINTER SERVICE ROUTINE FOR MULTIPLE LINE PRINTERS - V405
\r
2 SUBTTL T. W. MCMANUS /TNM TS 20 MAY 69
\r
3 XP VLPTSR,405 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP
\r
5 ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN COMMON:
\r
7 EXTERNAL CPOPJ1, PION, PIOFF
\r
9 ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN CLOCK1:
\r
11 EXTERNAL SETIOD, WAIT1
\r
13 ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN ERRCON:
\r
15 EXTERNAL HNGSTP, ILLINP
\r
17 ;THE FOLLOWING EXTERNAL SYMBOLS ARE DEFINED IN UUCON:
\r
19 EXTERNAL ADVBFE, IOSET, OUT, SETACT, STOIOS
\r
22 ;THE FOLLOWING SYMBOLS ARE REFERENCED OUTSIDE OF LPTSER:
\r
24 INTERN LPTINT, LPTNXT, LPTECM, LPTDON, LPTDSP
\r
28 \f;LINE PRINTER CONTROL REGISTER MNEMONIC DEFINITIONS
\r
30 LPTCLR=1B25 ;CLEAR LINE PRINTER BUFFER
\r
31 LPTLOV=1B26 ;LINE OVERFLOW FLAG (PDP-6 ONLY)
\r
32 LPTERR=1B27 ;ERROR FLAG
\r
33 LPTBSY=1B28 ;BUSY FLAG
\r
34 LPTDON=1B29 ;DONE FLAG
\r
35 LPTECM=7B32 ;ERROR CHANNEL MASK
\r
36 LPTDCM=7B35 ;DONE CHANNEL MASK
\r
37 LPTBDM=LPTBSY+LPTDON ;BUSY/DONE FLAG MASK
\r
40 ;LINE PRINTER DEVICE DEPENDANT I/O STATUS MNEMONIC DEFINITIONS
\r
42 LPTEND=Z(1B10) ;CLOSE UUO HAS BEEN DONE
\r
43 LPTSYN=Z(1B11) ;CREF AFTER CLOSE UUO HAS BEEN SENT
\r
46 ;LINE PRINTER DEVICE DATA BLOCK ADDRESSING MNEMNIC DEFINITIONS
\r
48 LPTCON=-4 ;RH = SKIP CHAIN MASK REGISTER
\r
49 LPTPTR= 7 ;BLOCK OUTPUT POINTER
\r
50 LPTCH= 11 ;INTERRUPT CHANNEL ASSIGNMENTS
\r
51 LPTSVE=12 ;DDB ROUTINE TO SAVE AC'S
\r
52 LPTEX1=16 ;DDB EXIT ROUTINE IF AC'S NOT SAVED
\r
53 LPTSV2=20 ;TEMP. SAVE LOCN. FOR TAC
\r
54 LPTECH=21 ;CONSZ LP?,LPTECM
\r
55 LPTDNE=22 ;CONSO LP?,LPTDON
\r
56 LPTCSO=23 ;CONSO LP?,(TAC)
\r
57 LPTCSZ=24 ;CONSZ LP?,(TAC)
\r
58 LPTCNI=25 ;CONI LP?,TAC
\r
59 LPTCNO=26 ;CONO LP?,(TAC)
\r
60 LPTDTO=27 ;DATAO LP?,(TAC)
\r
61 LPTBKO=30 ;BLKO LP?,LP?PTR
\r
64 ;LINE PRINTER SERVICE DISPATCH TABLE
\r
66 JRST LPTINI ;INITIALIZE
\r
67 JRST LPTHNG ;HUNG DEVICE ERROR
\r
68 LPTDSP: JRST LPTREL ;RELEASE
\r
72 \f;LINE PRINTER INITIALIZATION, HUNG DEVICE AND RELEASE CODE
\r
74 ;LPTINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM
\r
75 ;IOGO IN SYSINI WITH THE DDB ADDRESS IN DEVDAT
\r
77 ;LPTHNG IS CALLED FROM DEVCHK IN UUOCON (IOCSS) WITH
\r
78 ;THE DDB ADDRESS IN DEVDAT WHENEVER A LINE PRINTER
\r
79 ;HUNG DEVICE COUNT IS DECREMENTED TO ZERO
\r
81 ;LPTREL IS CALLED FROM RELEA1 IN UUOCON WITH THE DDB
\r
82 ;ADDRESS IN DEVDAT WHENEVER A RELEASE UUO IS EXECUTED
\r
85 ;EACH OF THE ABOVE ROUTINE MUST:
\r
87 ; 1. CLEAR THE SPECIFIED LINE PRINTER
\r
88 ; 2. DEASSIGN BOTH THE ERROR AND DONE INTERRUPT
\r
89 ; CHANNELS FOR THE LINE PRINTER
\r
90 ; 3. CLEAR THE SKIP CHAIN INTERRUPT MASK FLAGS
\r
91 ; FOR THAT LINE PRINTER
\r
93 ;NOTE: THE LPTINI CODE FORCES IOGO IN SYSINI TO INVOKE
\r
94 ; LPTINI FOR EACH LINE PRINTER ON THE SYSTEM RATHER
\r
95 ; THAN FOR THE NORMAL CASE WHERE IT INVOKES THE
\r
96 ; INITIALIZATION CODE ONCE FOR EACH DISPATCH TABLE.
\r
98 ; THEREFORE, THE CORRECT OPERATION OF THE LPTINI CODE
\r
99 ; IS DEPENDANT UPON THE IOGO CODE WHICH SHOULD BE:
\r
101 ; PUSHJ PDP,DINI(AC3)
\r
106 SOS (PDP) ;COUNTERACT SKIP RETURN
\r
107 LPTINI: MOVEI TAC,LPTCLR ;CLEAR THE LINE PRINTER
\r
109 HLLZS LPTCON(DEVDAT) ;CLEAR SKIP CHAIN MASK FLAGS
\r
110 JRST CPOPJ1 ;SKIP RETURN IF ENTERED AT LPTINI
\r
111 ; TO FORCE CALL FOR EACH LPT
\r
114 ;LINE PRINTER CLOSE UUO ROUTINE
\r
116 LPTCLS: TLO IOS,LPTEND ;TURN ON THE END FLAG
\r
117 TLZ IOS,LPTSYN ;TURN OFF SYNCHRONIZATION FLAG
\r
118 MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS IN THE DDB
\r
119 JRST OUT ; AND RETURN TO UUOCON
\r
120 \f;LINE PRINTER OUTPUT UUO ROUTINE
\r
122 LPTOUT: SETZ TAC, ;CLEAR ALL POSSIBLE
\r
123 XCT LPTCNO(DEVDAT) ; LINE PRINTER FLAGS
\r
124 MOVEI TAC,LPTERR ;SET MASK FOR ERROR FLAG
\r
125 XCT LPTCSO(DEVDAT) ;SKIP IF ERROR FLAG IS ON
\r
126 JRST .+3 ; LPT IS NOT OFF, NOT ON LOCAL
\r
127 PUSHJ PDP,HNGSTP ;STOP JOB AND PRINT REMINDER
\r
128 JRST LPTOUT ;TRY AGAIN WHEN USER TYPES "CONT"
\r
129 TLNE IOS,IOBEG ;IS THIS FIRST OUTPUT SINCE INIT?
\r
131 PUSHJ PDP,LPTSET ; NO, SET UP BLKO POINTER
\r
132 LPTGO: PUSHJ PDP,SETACT ;SET I/O ACTIVE BIT, STORE IOS
\r
133 ; AND SET HUNG DEVICE COUNT
\r
134 MOVE TAC,LPTCH(DEVDAT) ;GET CHANNEL ASSIGNMENTS FROM DDB
\r
135 TLNE IOS,IOBEG ;IS THIS FIRST OUTPUT SINCE INIT?
\r
136 IORI TAC,LPTCLR+LPTDON ;SET LPTCLR IF IOBEG:=1, ELSE
\r
137 XORI TAC,LPTDON ; SET LPTDON
\r
138 HRLI TAC,LPTLOV+LPTERR+LPTDON ;GET SKIP CHAIN MASK FLAGS
\r
139 CONO PI,PIOFF ;TURN OFF PI TO PREVENT IMM. INT.
\r
140 XCT LPTCNO(DEVDAT) ;SEND CONDITIONS OUT TO LPT
\r
141 HLRM TAC,LPTCON(DEVDAT) ;SAVE SKIP CHAIN MASK FLAGS
\r
142 CONO PI,PION ;REENABLE ALL INTERRUTPS
\r
143 POPJ PDP, ; AND RETURN TO UUOCON
\r
145 LPTNEW: TLO IOS,IO ;SET I/O DIRECTION TO OUTPUT
\r
146 SETZM LPTPTR(DEVDAT) ;CLEAR BLKO POINTER
\r
147 JRST LPTGO ;RETURN TO MAINSTREAM
\r
148 \f;LINE PRINTER INTERRUPT SERVICE ROUTINE
\r
150 LPTINT: XCT LPTECH(DEVDAT) ;SKIP IF NO ERROR CHANNEL ASSIGNED
\r
151 XCT LPTDNE(DEVDAT) ;SKIP IF DONE FLAG IS UP
\r
152 JRST LPTER1 ; BRANCH TO ERROR SERVICE ROUTINE
\r
153 SKIPL LPTPTR(DEVDAT) ;BLKO COUNT TO 0 ON PREV. INTERRUPT
\r
154 JRST LPTSVE(DEVDAT) ; YES, GO SAVE ORIGINAL AC'S
\r
155 XCT LPTBKO(DEVDAT) ; NO, SEND NEXT WORD FOR PRINTING
\r
156 JRST LPTEX1(DEVDAT) ;LAST WORD SENT BUT INTERRUPT PENDING
\r
157 JRST LPTEX1(DEVDAT) ;GO RESTORE DEVDAT AND RETURN
\r
159 LPTNXT: ;ENTER HERE AFTER DDB ROUTINE SAVE
\r
160 ; ORIGINAL AC'S IN PROPER CHANNEL
\r
161 ; SAVE AREA AND SETS UP DEVDAT
\r
162 ; TO POINT TO DDB AGAIN
\r
164 PUSHJ PDP,IOSET ;SET AC PROG:= JOB AREA ADDRESS AND
\r
165 ; AC IOS:= DEVIOS IN THE DDB
\r
166 TLZE IOS,IOBEG ;FIRST BUFFER SINCE INIT?
\r
167 JRST LPTBG1 ; YES, GO OUTPUT A CRFF
\r
168 PUSHJ PDP,ADVBFE ; NO, ADVANCE TO NEXT BUFFER
\r
169 JRST LPTOFF ;CANNOT ADVANCE, BUFFER UNAVAILABLE
\r
170 PUSHJ PDP,LPTSET ;SET UP NEW BLKO POINTER
\r
171 LPTWCK: TLZE IOS,IOW ;IS JOB WAITING FOR I/O COMPLETION?
\r
172 PUSHJ PDP,SETIOD ; YES, ARRANGE FOR JOB TO RUN AGAIN
\r
173 LPTEX2: JRST STOIOS ;SAVE IOS, RESET HUNG DEVICE COUNT
\r
174 ; AND DISMISS INTERRUPT
\r
176 LPTOFF: TLNN IOS,LPTEND ;SKIP IF CLOSE HAS BEEN DONE
\r
177 JRST LPTOF1 ; GO TURN PRINTER OFF UNTIL NEXT OUTPUT
\r
178 TLON IOS,LPTSYN ;HAS FINAL CRFF BEEN OUTPUT?
\r
179 JRST LPTBG2 ; NO, SO GO DO IT
\r
180 TLZ IOS,LPTEND ; YES, SO CLEAR END FLAG
\r
181 LPTOF1: TRZ IOS,IOACT ;CLEAR I/O ACTIVE BIT
\r
182 SETZ TAC, ;CLEAR TAC AND
\r
183 XCT LPTCNO(DEVDAT) ; TURN LPT OFF
\r
184 HLLZS LPTCON(DEVDAT) ;CLEAR SKIP CHAIN MASK FLAGS
\r
185 JRST LPTWCK ; AND BRANCH
\r
187 LPTBG1: PUSHJ PDP,LPTSET ;SET UP INITIAL BLKO POINTER *****
\r
188 LPTBG2: MOVEI TAC,[EXP 15B6+14B13] ;SEND OUT A CRFF
\r
190 JRST LPTEX2 ;GO DISMISS ITERRUPT
\r
191 \f;LINE PRINTER ERROR HANDLING ROUTINE
\r
193 LPTER1: MOVEM TAC,LPTSV2(DEVDAT) ;SAVE TAC IN DDB
\r
194 MOVEI TAC,LPTLOV ;GET LINE OVERFLOW ERROR MASK
\r
195 XCT LPTCSO(DEVDAT) ;SKIP IF LINE OVERFLOW FLAG IS ON
\r
196 JRST LPTER2 ; GO CHECK IF PREVIOUS ERROR OCCURRED
\r
197 MOVN TAC,[EXP 100001] ;DECREMENT BLK0 POINTER
\r
198 ADDM TAC,LPTPTR(DEVDAT)
\r
199 MOVE TAC,[EXP 15B6+12B13] ;PRINT CRLF
\r
203 LPTER2: XCT LPTECH(DEVDAT) ;SKIP IF ERROR INTERRUPT NOT ASSIGNED
\r
204 JRST LPTER5 ; ERROR CONDITION DETECTED
\r
205 MOVE TAC,LPTCH(DEVDAT) ;GET INTERRUPT CHANNEL ASSIGNMENTS
\r
206 ANDI TAC,LPTDCM ;MASK OUT ERROR CHANNEL
\r
207 IORI TAC,LPTBSY ;SET THE BUSY FLAG
\r
208 XCT LPTCNO(DEVDAT) ;SEND IT OUT TO THE LPT
\r
209 MOVEI TAC,LPTLOV+LPTERR+LPTDON ;ENABLE FOR ALL INTERRUPTS
\r
210 LPTER3: HRRM TAC,LPTCON(DEVDAT) ;SAVE SKIP CHAIN MASK FLAGS
\r
211 LPTER4: MOVE TAC,LPTSV2(DEVDAT) ;RESTORE SAVED ACCUMULATOR
\r
212 JRST LPTEX1(DEVDAT) ; AND GO DISMISS INTERRUPT
\r
214 LPTER5: MOVE TAC,LPTCH(DEVDAT) ;GET INTERRUPT CHANNEL ASSIGNMENTS
\r
215 ANDI TAC,LPTDCM ;MASK OUT ERROR CHANNEL ASSIGNMENT
\r
216 IORI TAC,LPTBSY ;SET BUSY FLAG
\r
217 XCT LPTCNO(DEVDAT) ;SEND IT OUT TO THE LPT
\r
218 MOVEI TAC,LPTDON ;ENABLE FOR DONE FLAG ONLY
\r
220 \f;LINE PRINTER BLKO POINTER SETUP ROUTINE
\r
222 LPTSET: MOVEI TAC,@DEVOAD(DEVDAT) ;GET ABS. ADDR. OF CURRENT BUFFER
\r
223 MOVN TAC1,1(TAC) ;GET NEGATIVE WORD COUNT
\r
224 HRL TAC,TAC1 ;COMBINE NEG. WORD COUNT AND ADDR,
\r
225 AOJ TAC, ;INCREMENT BUFFER ADDRESS TO FORM
\r
226 MOVEM TAC,LPTPTR(DEVDAT) ; LPTPTR:= -(WORD COUNT),(BUFF, ADDR, +1)
\r
227 POPJ PDP, ; AND RETURN
\r