1 TITLE CLOCK1 - CLOCK, CONTEXT SWITCHING, AND JOB STARTING AND STOP ROUTINES - V412
\r
2 SUBTTL APRINT TH/TH/CHW TS 20 MAY 69
\r
4 ; PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP
\r
6 ENTRY CLOCK1 ;ALWAYS LOAD CLOCK1 IF LIBRARY SEARCH
\r
9 ;THIS SERVICE ROUTINE RUNS ON A HIGH PRIORITY CHANNEL
\r
10 ;AND REQUESTS INTERRUPTS ON LOWER CLK CHANNEL
\r
11 ;FOR SCHEDULING JOBS AND ERROR HANDLING THAT THE USER
\r
12 ;IS NOT ENABLED TO HANDLE HIMSELF
\r
15 EXTERNAL TIME,TIMEF,CLKFLG,REQCLK,APRCHL,APRPC,UPTIME
\r
16 EXTERNAL JOBDAT,JOBTPC,JOBCNI,JOBAPR,APRERR,SCHEDF
\r
18 EXTERNAL APRILM,COMMAN,CONMES,DEVCHK,DEVSRC,ERROR,INLMES
\r
19 EXTERNAL RELEA9,CRSHWD,CRASHX
\r
21 INTERNAL FTTTYSER ;THIS ROUTINE MAY BE ASSEMBLED TO WORD EITHER
\r
22 ; THE OLD SCNSER OR THE NEW TTYSER.
\r
25 INTERNAL FTCHECK,FTMONP
\r
27 IFN FTCHECK+FTMONP,<
\r
28 EXTERNAL DATA,APRCON,APRIN1,CLKS17,DAMESS,UUO0,CLOCK
\r
31 IFE FTCHECK+FTMONP,<
\r
34 APRCON: 231000 ;MONITOR ENABLED CPU FLAGS
\r
35 APRIN1: 0 ;USER ENABLED CPU FLAGS
\r
36 CLKS17: 0 ;PLACE TO SAVE AC17 ON CLOCK INTERRUPT
\r
37 DAMESS: ASCIZ /-JAN-/
\r
38 CLOCK: POINT 36,CIPWTM,35 ;BYTE POINTER TO CLOCK REQ QUEUE
\r
42 APRINT: JRST APRPAR ;ALWAYS CHECK APR AND PI DEVICES
\r
43 JRST . ;CHECK OTHER DEVICES
\r
45 APRPCL: CONO PI,240000 ;TURN OFF MEM PAR, ERR, AND
\r
46 ; ENABLE FOR MEM PAR AND TRY AGAIN
\r
47 ; (DO NOT TURN OFF POWR FAIL AS THAT PERMANENTLY
\r
48 ; DISABLES POWR FAIL INTERRUPT)
\r
49 APRPAR: CONSZ PI,600000 ;MEM PARITY ERROR OR POWER FAILURE?
\r
50 HALT APRPCL ;YES, HALT MACHINE, CLEAR FLAGS AND TRY AGAIN
\r
52 CONSO APR,@APRCON ;INTERRUPT FOR APR?
\r
53 ; ALWAYS AT LEAST FOR CLOCK,ILM,NXM,PD OVF
\r
54 ; RH MODIFIED EACH TIME USER RUNS IN CASE HE IS
\r
55 ; ENABLED FOR PC CHANGE OR AR OVF
\r
56 JRST APRINT+1 ;NO,CHECK OTHER DEVICES ON THIS PI CHANNEL
\r
57 SKIPE CRSHWD ;IS LOC, 30 CLOBBERED?
\r
58 JRST CRASHX ;YES ~ GO SAVE AC'S & STATE OF ALL DEVS,
\r
59 CONSO APR,001000 ;YES, IS IT CLOCK?
\r
60 JRST APRER ;NO, GO CHECK ERROR FLAGS
\r
61 AOS TIME ;YES, INCREMENT TIME OF DAY
\r
62 AOS UPTIME ;UPTIME IS LOADED AS ZERO,AND IS NEVER CLEARED
\r
63 SETOM TIMEF ;FLAG THAT APR CLOCK HAS TICKED
\r
64 SETOM CLKFLG ;SET FLAG FOR CLK FORCED INTERRUPT
\r
65 CONO PI,REQCLK ;REQUEST INTERRUPT ON CLK CHANNEL
\r
66 CONSZ APR,@APRIN1 ;IS USER ENABLE FOR ANY FLAGS(INCLUDING CLOCK)
\r
67 ; RH ALSO MODIFIED EACH TIME A USER RUNS
\r
68 JRST APRER1 ;YES, GO PROCESS TRAP
\r
69 CONO APR,1000+APRCHN ;NO, CLEAR ONLY THE CLOCK FLAG
\r
70 JEN @APRCHL ;DISMISS INTERRUPT
\r
72 ;HERE ON CLOCK FLAG AND IT OR SOME OTHER FLAG IS ON WHICH USERS WANTS
\r
74 APRER1: CONO APR,1000+APRCHN ;NOW CLEAR CLOCK FLAG
\r
75 EXCH TAC,APRCHL ;SAVE TAC, GET PC
\r
76 TLNE TAC,USRMOD ;IS PC FROM USER MODE?
\r
77 JRST APRER4 ;YES, GO TRAP TO HIM
\r
78 JRST APRER2 ;NO. GO CHECK IN CASE ALSO A SERIOUS ERROR
\r
79 \f;OTHER APR INTERRUPTS BESIDES CLOCK
\r
81 APRER: EXCH TAC,APRCHL ;SAVE TAC, GET PC
\r
82 TLNE TAC,USRMOD ;IS PC IN USER MODE?
\r
83 CONSO APR,@APRIN1 ;YES, IS USER ENABLED FOR THIS ERROR
\r
84 JRST APRER2 ;NO, PRINT ERROR MESSAGE AND STOP JOB
\r
85 APRER4: EXCH JDAT,JOBDAT ;YES, SAVE JDAT, GET CURRENT JOB DATA AREA ADR.
\r
86 MOVEM TAC,JOBTPC(JDAT) ;STORE PC IN JOB DATA AREA
\r
88 CONI APR,JOBCNI(JDAT) ;STORE APR IN JOB DATA AREA
\r
89 HLLZS JOBENB(JDAT) ;CLEAR SOFTWARE FLAGS SO THAT USER MUST DO
\r
90 ; ANOTHER APRENB UUO IN ORDER TO ENABLE TRAPS
\r
91 SETZM APRIN1 ;ALSO CLEAR USER APR CONSO FLAGS
\r
92 HRRI TAC,231000 ;AND SET MONITOR TO LOOK ONLY FOR
\r
93 HRRM TAC,APRCON ;PD OVF,ILM,NXM, AND CLOCK
\r
94 HRR TAC,JOBAPR(JDAT) ;GET USER LOC TO TRAP TO
\r
95 EXCH JDAT,JOBDAT ;RESTORE JDAT,JOBDAT
\r
96 CONO APR,440+APRCHN ;DISBALE FOV, AROVF IN CASE ON
\r
97 ;SO USER MUST REENABLE WITH SETAPR UUO
\r
98 APRER3: TLZ TAC,440000 ;CLEAR FOV (PC CHANGE ON PDP-6) AND AR OVF FLAGS
\r
99 ; SO INTERRUPT MAY BE DISMISSED
\r
100 EXCH TAC,APRCHL ;RESTORE TAC & APRCHL
\r
101 CONO APR,430110+APRCHN ;CLEAR ALL ERROR FLAGS WHICH CAN CAUSE INTERRUPTS
\r
102 ; EXCEPT CLOCK FLAG(ELSE LOSE TIME OF DAY)
\r
103 JEN @APRCHL ;DISMISS INTERRUPT
\r
104 \fAPRER2: CONSO APR,NXM!ILM!POV! ;DOES EXEC CARE?
\r
105 JRST APRER3 ;NO. IGNORE EXEC OVERFLOW (MUST BE FOV OR AROVF
\r
106 MOVEM TAC,APRPC ;STORE ERROR PC FOR CLK CHANNEL
\r
107 CONI APR,APRERR ;STORE ERROR FLAGS
\r
108 ; (ALSO USED AS ERROR FLAG)
\r
109 SETOM CLKFLG ;SET FLAG FOR CLK INTERRUPT
\r
110 SETOM SCHEDF ;FLAG THAT RESCHEDULING IS NEEDED
\r
111 ; (EVEN THROUGH PC MAY BE IN EXEC MODE)
\r
112 CONO PI,REQCLK ;REQUEST INTERRUPT IN CLK CHANNEL
\r
113 CONSZ APR,ILM ;WAS ERROR ILLEGAL MEMORY(FROM USER)?
\r
114 HRRI TAC,0 ;YES,CLEAR RH OF PC,SO A SECOND ILM INTERRUPT
\r
115 ; WILL NOT OCCUR IF THIS IS A WILD(AND A PDP-10)
\r
117 CONSZ PI,003400 ;ARE ANY PI'S IN PROGRESS OF LOWER PRIORITY THAN APR?
\r
118 ; (PDP-10 BITS ONLY)
\r
119 HALT .+1 ;YES, HALT SO CONTINUE WILL TRY TO RECOVER
\r
121 JRST APRER3 ;NO,MUST BE UUO LEVEL(OR USER MODE AND
\r
122 ; MEMORY DROPPED OUT)
\r
123 \fSUBTTL CLOCK - LOW PRIORITY CLOCK SERVICE(CLK)
\r
125 ;THIS ROUTINE RUNS ON THE LOWEST PRIORITY PI CHANNEL AND AT UUO LEVEL
\r
126 ;TO CAUSE AN INTERRUPT ON CLK CHANNEL:
\r
127 ; SETOM CLKFLG ;FLAG THAT INTERRUPT HAS BEEN REQUESTED
\r
128 ; CONO PI,CLKREQ ;REQUEST PI INTERRUPT ON LOWEST PI CHANNEL
\r
129 ;THE FOLLOWING OTHER FLAGS MUST ALSO BE SET
\r
130 ;APRERR-APR DETECTED ERROR IN CURRENT JOB
\r
131 ;SCHEDF-RESCHEDULING MUST TAKE PLACE(EVEN THROUGH PC IN EXEC MODE)
\r
132 ;TIMEF-APR CLOCK HAS TICKED ON HIGH PRIORITY CHANNEL
\r
133 ;SEE APRSER AND RUNCSS TO SEE HOW THIS ROUTINE IS CALLED
\r
135 ;CLK SERVICE PERFORMS THE FOLLOWING ON A REGULAR BASIS:
\r
136 ;PROCESSES CLOCK QUEUE REQUESTS
\r
137 ;CALLS CONSOLE MONITOR COMMAND DECODER
\r
138 ;CALLS CORE SHUFFLER
\r
139 ;THEN CALLS SCHEDULER
\r
140 ;IF THE CURRENT JOB IS IN EXEC MODE THE ABOVE 4 TASKS ARE
\r
141 ;DELAYED UNTIL THE CURRENT JOB ENTERS A STOPPABLE STATE: I.E., UNTIL
\r
142 ; 1. JOB STARTS TO WAIT FOR A BUSY SHARABLE DEVICE
\r
143 ; 2. JOB STARTS TO WAIT FOR A IO TO COMPLETE
\r
144 ; 3. CONTROL ABOUT TO RETURN TO USER MODE
\r
145 ;THEN CLK SERVICE IS ENTERED AT THE UU0 LEVEL
\r
152 ;THE CLOCK REQUEST QUEUE PROVIDES THE REST OF THE MONITOR
\r
153 ;WITH THE ABILITY TO BE TRAPPED TO AFTER A NUMBER OF CLOCK TICKS
\r
156 ;TO MAKE A REQUEST:
\r
158 ; IDPB AC,CLOCK ;STORE CLOCK REQUEST IN QUEUE
\r
159 ; CONO PI,PION ;TURN PI BACK ON
\r
160 ;C(AC)=XWD ADDRESS,NO. OF CLOCK TICKS*DATA*10000
\r
161 ;WHERE DATA IS 6 BITS OF INFO NEEDED WHEN TIME RUNS OUT
\r
162 ;CLK SERVICE WILL PUSHJ PDP,ADR
\r
163 ;WHEN TIME RUNS OUT WITH DATA RIGHT JUSTIFIED IN AC TAC
\r
164 ;ALL ACS ARE FREE TO USE WHEN CALL IS MADE
\r
167 EXTERNAL CIPWTM1,PION,PIOFF
\r
169 CLKINI: MOVEI TAC,CIPWTM1 ;SETUP CLOCK QUEUE BYTE POINTER
\r
170 HRRM TAC,CLOCK ;LH NEVER CHANGES(36 BIT BYTE)
\r
173 ;HERE AT UUO LEVEL WHEN JOB GOES INTO IO WAIT OR SHARABLE DEVICE WAIT
\r
174 ;CALL: PUSHJ PDP,WSCHED
\r
175 ; RETURN HERE WHEN RUNABLE AGAIN
\r
178 EXTERNAL JOBD14,JOBDAC,USRPC,JOBD16,NULPDL
\r
180 WSCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA
\r
181 MOVEI AC3,JOBDAC(JDAT) ;SAVE ACS 0-16 IN DUMP ACS
\r
182 BLT AC3,JOBD16(JDAT) ;IN CURRENT JOB DATA AREA
\r
183 MOVEI PDP,NULPDL ;NULL JOB PD LIST
\r
184 HRLI PDP,MJOBP1 ;USED TO CALL SCHEDULER AND COMMAND DECODE
\r
185 ; OTHERWISE GET PD OUF
\r
187 JRST RSCHED ;GO RESCHEDULE
\r
190 ;HERE AT UUO LEVEL WHEN CURRENT JOB RETURNS TO USER MODE
\r
191 ;FROM A UUO CALL AND EITHER:
\r
192 ; 1. CURRENT JOB TYPED CONTROL C WHILE IN EXEC MODE
\r
193 ; 2. CLOCK FLAG WENT OFF WHILE CURRENT JOB WAS
\r
196 ;CALL: PUSHJ PDP,USCHED ;FROM UUOCON(UUO HANDLER RETURN TO USER)
\r
197 ; RETURN HERE WHEN RUNABLE
\r
200 EXTERNAL JOBDPG,JOBDPD,USRPC
\r
202 USCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA
\r
203 MOVEM PROG,JOBDPG(PROG) ;SAVE PROG IN DUMP AC AREA
\r
204 MOVEM PDP,JOBDPD(PROG) ;SAVE PDP
\r
205 JRST RSCHED ;GO RESCHEDULE
\r
207 ;HERE AT CLK INTERRUPT LEVEL
\r
211 EXTERNAL CLKFLG,JOBD17,CLKCHL,SCHEDF,JOBADR,JOBD16,JOBDAC
\r
212 EXTERNAL JOBD15,JOBPD1,MJOBP1,APRERR,NULDAT,NULPDL
\r
214 CLKINT: SKIPN CLKFLG ;CLK INTERRUPT REQUEST?
\r
215 JRST CLKINT ;NO, CHECK OTHER DEVICES
\r
216 MOVEM 17,CLKS17 ;SAVE AC 17
\r
217 MOVE 17,CLKCHL ;IS CURRENT JOB IN USER MODE?
\r
219 SKIPE SCHEDF ;NO, IS THIS A FORSCED RESCHEDULING INTERRUPT?
\r
220 JRST SAVPC ;YES, IT IS OK TO RESCHEDULE NOW
\r
221 MOVE 17,CLKS17 ;NO, LEAVE TIMEF SET AND DISMISS INT.
\r
224 SAVPC: MOVEM 17,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA
\r
225 ; STORAGE FOR CURRENT JOB
\r
226 CLKERR: SKIPN 17,JOBDAT ;CURRENT JOB DATA AREA, IS THERE ONE?
\r
227 MOVEI 17,NULDAT ;NO, MUST BE NULL JOB OR CORE 0
\r
228 ; RUNS AT UUO LEVEL,REQUESTS CLK INT. TO STOP
\r
229 MOVEM 16,JOBD16(17) ;SAVE AC 16 IN DUMP AC PART OF JOB DATA AREA
\r
230 MOVEI 16,JOBDAC(17) ;SOURCE=0,DESTINATION=DUMP AC 0
\r
231 BLT 16,JOBD15(17) ;SAVE ACS 0-15 JUST BELOW AC 16
\r
232 MOVE TAC,CLKS17 ;NOW SAVE 17 IN JOB DATA AREA
\r
233 MOVEM TAC,JOBD17(17) ;ALONE WITH OTHER ACS
\r
234 MOVEI PDP,NULPDL ;SET UP PUSH DOWN LIST IN NULL JOB DATA
\r
235 ; AREA IN LOWER CORE
\r
236 HRLI PDP,MJOBP1 ;-LENGTH+1(LEAVE ROOM FOR UUO PC)
\r
237 SKIPE TAC,APRERR ;IT THIS AN ERROR INTERRUPT?
\r
238 PUSHJ PDP,APRILM ;YES, GO PROCESS ERROR, APRILM WILL CLEAR APRERR
\r
240 \fEXTERNAL COMCNT,NXTJOB,HNGTIM,POTLST,LSTWRD
\r
241 EXTERNAL TIMEF,APRERR,CLKFLG,SCHEDF,JOB,PMONTB
\r
243 RSCHED: SKIPN TIMEF ;HAS CLOCK GONE OFF SINCE LAST CALL?
\r
244 JRST CIP6 ;NO, JUST RESCHEDULE
\r
248 EXTERNAL TIME,MIDNIT,THSDAT,MONTAB
\r
251 EXTERNAL RTIME,TTIME,JOB
\r
252 SKIPN ITEM,JOB ;WAS LAST JOB NULL JOB?
\r
253 SKIPN POTLST ;YES-WAS IT A LOST TICK?
\r
254 JRST INCTIM ;NO-PROCEED NORMALLY
\r
255 AOS LSTWRD ;YES-INCREMENT LOST TIME COUNT
\r
256 SETZM POTLST ;AND CLEAR LOST TICK INDICATION
\r
257 INCTIM: AOS RTIME(ITEM) ;INCR, CURRENT JOB INCREMENTAL RUN TIME
\r
258 AOS TTIME(ITEM) ;INCR, CURRENT JOB TOTAL RUN TIME
\r
261 EXTERN USRREL,JBTKCT
\r
262 LDB TAC,[POINT 8,USRREL,25] ;GET NO. OF 1K BLOCKS-1FOR CURRENT USER
\r
263 ADDI TAC,1 ;MAKE IT NO. OF 1K BLOCKS
\r
264 ADDM TAC,JBTKCT(ITEM) ;ADD IN ACCUMULATED CORE RUNNING TIME PRODUCT
\r
265 ; (KILO-CORE TICKS)
\r
268 PUSHJ PDP,CHGHGH ;CHARGE USER FOR HIGH SEGMENT IF HE HAS ONE
\r
274 CAMGE TAC1,MIDNIT ;GONE PAST MIDNITE?
\r
276 CIP3: SETZB IOS,TIME ;YES, RESET TIME OF DAY
\r
277 AOS TAC,THSDAT ;UPDATE DAY
\r
281 CAMGE TAC,TAC1 ;END OF MONTH?
\r
283 \f;PROCESS TIMING REQUESTS STORED IN QUEUE
\r
285 CIP2: HRRZ STOR,CLOCK ;GET END OF LIST
\r
286 CIP4: CAIN STOR,CIPWTM1 ;END YET?
\r
288 SOS TAC1, (STOR) ;DECREMENT TIMING REQUEST
\r
289 TRNE TAC1, 7777 ;TIME EXPIRED YET
\r
290 SOJA STOR, CIP4 ;NO, CONTINUE SCAN
\r
291 CONO PI, PIOFF ;YES, MOVE LAST ITEM IN LIST TO THIS
\r
296 LDB TAC, [POINT 6, TAC1, 23] ;GET 6 BIT DATA ITEM
\r
297 MOVSS TAC1 ;SETUP DISPATCH ADDRESS
\r
298 PUSH PDP, STOR ;SAVE ONLY VALUABLE AC
\r
299 PUSHJ PDP, (TAC1) ;AND DISPATCH TO TIMING REQUEST ROUTINE
\r
301 SOJA STOR, CIP4 ;GO BACK FOR MORE REQUESTS
\r
303 CIP5: SOSG HNGTIM ;DECREMENT HUNG ID DEVICE
\r
304 PUSHJ PDP,DEVCHK ;GO CHECK FOR HUNG ID DEVICES
\r
305 SKIPE COMCNT ;ANY COMMANDS TO PROCESS?
\r
306 PUSHJ PDP,COMMAND ;YES, CALL COMMAND DECODER
\r
307 CIP6: PUSHJ PDP,NXTJOB ;CALL SCHEDULER
\r
308 SETZM CLKFLG ;CLEAR CLK INTERRUPT FLAG
\r
309 ; SET ON ALL FORCED CLK INTERRUPTS
\r
310 SETZM TIMEF ;CLEAR TIME0 (1 JIFFY) INTERRUPT FLAG,
\r
311 SETZM SCHEDF ;CLEAR FORCED SCHEDULING FLAG
\r
312 CAMN ITEM,JOB ;IS NEXT JOB SAME AS LAST ONE?
\r
313 JRST CIP8 ;YES, JUST RESTORE ACS AND DISMISS
\r
314 \f;DIFFERENT JOB. SAVE SOFTWARE STATE(HARDWARE ALREADY SAVED)
\r
316 EXTERNAL JOB,JOBDAT,JOBPRT,USRPRT,USRHCU,JOBJDA
\r
318 SKIPN JA,JOBDAT ;NULL JOB OR CORE 0 ON OLD JOB?
\r
319 JRST CIP7 ;YES, DO NOT SAVE SOFTWARE STATE
\r
320 MOVEI T,JOBPRT(JA) ;DEST,#FIRST LOC PROTECTED FROM USER
\r
321 HRLI T,USRPRT ;SOUR,#SYSTEM DATA STORAGE FOR CURRETN JOB
\r
322 SKIPL T1,USRHCU ;MOVE NO. OF OLD USER IO CHAN. IN USE
\r
323 CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT
\r
324 ; CLOBBER IF ADDRESS CHECKING MISSES)
\r
325 MOVEI T1,0 ;MOVE ONLY CHN 0 IF NEG, OR GR 17
\r
326 ; SAVGET SETS LH NEGATIVE DURING IO AS A FLAG
\r
327 ; SINCE IT DOES IO INTO AND OUT OF
\r
328 ; CHANNEL LOCATIONS (JOBJDA+1..,JOBJDA+17),
\r
329 ADD JA,T1 ;RELOCATE TO USER AREA
\r
330 BLT T,JOBJDA(JA) ;MOVE TO USER JOB DATA AREA
\r
331 ; STOP WITH USER CHANNEL 0-1+C(USRHCU)
\r
332 \f;RESTORE SOFTWARE STATE OF NEW JOB,THEN HARDWARE STATE
\r
334 INTERNAL NULJOB,NULADR
\r
335 EXTERNAL JOB,JBTDAT,JOBDAT,USRPRT,JOBPRT
\r
336 EXTERNAL JOBHCU,USRJDA,JOBENB,APRCHN,APRNUL,NULDAT,NULERR
\r
338 NULJOB: ;TRANSFER HERE FROM SYSINI WITH ITEM=0
\r
339 CIP7: MOVEM ITEM,JOB ;STORE NEW CURRENT JOB NUMBER
\r
340 NULADR: PUSHJ PDP,SETRL1 ;GO SETUP HARDWARE AND SOFTWARE RELOCATION
\r
341 ; INFORMATION FOR NEW CURRENT USER
\r
342 JUMPE ITEM,NULJB ;IS NEW JOB THE NULL JOB?
\r
345 SKIPN JA ;DOES JOB HAVE CORE ASSIGNED?
\r
346 HALT . ;NO -ELSE CLOBBER MONITOR
\r
348 MOVEI T,USRPRT ;NO, DEST,#PROTECTED AREA IN MONITOR
\r
349 HRLI T,JOBPRT(JA) ;SOURCE#FIRST PROTECT LOC. IN JB DATA AREA
\r
350 SKIPL T1,JOBHCU(JA) ;MOVE NO. OF USER IO CHAN. IN USE
\r
351 CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT CLOBBER
\r
352 ; IF ADRRESS CHECKING MISSES
\r
353 MOVEI T1,0 ;MOVEJUST CHAN 0 IF NEG. OR GREATER THAN 17
\r
354 ; SAVEGET SETS NUG,DURING IO
\r
355 BLT T,USRJDA(T1) ;AND MOVE INTO MONITOR
\r
357 ;RESTORE HARDWARE STATE OF CURRENT JOB
\r
359 CIP8: SKIPN JA,JBTDAT(ITEM) ;JOB DATA AREA(IS THERE ONE?)
\r
360 MOVEI JA,NULDAT ;NO, MUST BE NULL JOB
\r
361 MOVSI 17,JOBDAC(JA) ;RESTORE DUMP ACS
\r
363 SKIPE APRERR ;DID AN ERROR OCCUR WHILE CLKPI IN PROGRESS
\r
364 ; (ON CLK PI OR HIGHER)
\r
365 JRST CLKERR ;YES, GO PROCESS ERROR
\r
366 SKIPN JOB ;IS THIS JOB THE NULL JOB?
\r
367 SKIPN NULERR ;YES, HAS AN ERROR OCCURED WHILE NULL JOB
\r
368 ; WAS RUNNING? IF YES, RESTORE ACS
\r
369 ; ILL UUO LOSED ACS
\r
370 JEN @USRPC ;DISMISS CHANNEL(IF INTERRUPT IN PROGRESS)
\r
373 ;RUNS IN USER MODE WITH PC=1 AND COUNTS AND AC 0
\r
375 EXTERNAL APRNUL,TIME,THSDAT,MIDNIT,NULERR
\r
378 IFN FTCHECK,<EXTERNAL MONPRTR,MONSUM,CHECK
\r
384 SETZB 0,NULERR ;CLEAR AC 0 USED FOR USUAL MONITORING
\r
385 ; CLEAR FLAG SAYING ERROR IN NULL JOB
\r
386 ; OF NULL TIME INTERVAL
\r
387 ; LOC JOBDAT (LOCATION OF NULL JOB DATA AREA) TO 0
\r
388 ; AS A FLAG (ONLY DUMP ACS USED IN NULL JOB DATA AREA)
\r
390 ; IF ANY ERRORS (APRERR NON-ZERO) OCCURRED
\r
391 ; WHILE CLK IN PROGRESS
\r
392 ; CATCH THEM NEXT CLK INTERRUPT
\r
393 MOVE 1,[AOJA 0,1] ;INSTR. TO AC1
\r
394 JRST 11,1 ;DISMISS IF INTERUPT IN PROGRESS.
\r
395 \f;ROUTINE TO SET HARDWARE AND SOFTWARE RELOCATION INFORMATION FOR CURRENT USER
\r
397 ; CLOCK ROUTINE WHEN NEW USER IS DIRRERENT FROM OLD USER
\r
398 ; CORE ROUTINE WHEN CORE REASSIGNED FOR CURRENT USER
\r
404 ;CALL: STORE RELOCATION AND PROTECTION FOR LOW SEQ IN JOBADR(JOB NUMBER)
\r
405 ; STORE LENGTH-1 AND ABS ORIGIN FOR HIGH SEG IN JBTADR(HIGH SEG NO)
\r
406 ; (MOVE ITEM,JOB NUMBER - IF CALLING SETRL1)
\r
407 ; PUSHJ PDP,SETREL OR SETRL1
\r
408 ; ALWAYS RETURN, C(ITEM)=JOB NUMBER, C(PROG)=XWD PROT,RELOC, FOR LOW SEG
\r
411 EXTERN JOB,JBTADR,JOBADR,USRREL,JBTDAT,JOBDAT,JOBREL,KT10A
\r
413 SETREL: MOVE ITEM,JOB ;CURRENT JOB NUMBER
\r
414 SETRL1: MOVE PROG,JBTADR(ITEM) ;XWD PROTECTION,RELOCATION FOR LOW SEG
\r
415 MOVEM PROG,JOBADR ;SAVE TO MAKE UUO HANDLER FASTER
\r
416 HLRZM PROG,USRREL ;SAVE PROTECTION FOR ADDRESS CHECKING
\r
417 ; (HIGHEST LEGAL REL ADDRES FOR CURRENT USER IN LOW SET)
\r
419 MOVE JA,JBTDAT(ITEM) ;LOC OF JOB DATA AREA
\r
420 MOVEM JA,JOBDAT ;SAVE IT TOO FOR UUO HANDLER
\r
422 JUMPE PROG,SETHRD ;IF 0 (NULL JOB OR JOB DOING CORE 0 OR KJOB)
\r
423 ; DO NOT STORE IN JOB DATA AREA (SINCE IT WILL BE
\r
424 ; IN EXEC LOWER CORE. ALSO DO NOT STORE
\r
425 ; IN LOC 33, SO CAN SEE LAST REAL USER TO RUN
\r
427 HLRZM PROG,JOBREL(JA) ;SET PROTECTION IN USER JOB DATA AREA
\r
428 ; FOR HIM TO LOOK AT
\r
431 PUSHJ PDP,SETHGH ;SET UP FOR HIGH SEG, IF USER HAS ONE
\r
432 ; PROG SETUP FOR DATAO
\r
435 TLZ PROG,1777 ;CLEAR OUT PROTECTION FOR HIGH SEG
\r
436 ; JUST IN CASE THIS IS A 2 REG. MACHINE(EVEN THOGH
\r
437 ; SOFTWARE CANNOT HANDLE 2 SEGS)
\r
439 MOVEM PROG,KT10A ;STORE IN LOWER CORE SO IT CAN BE FOUND OUT
\r
440 ; USING SWITCHES WHAT IS IN SECOND REGISTER
\r
441 ; OPTION DOES NOT COME WITH PANEL LIGHTS
\r
442 ; SO NOT STORE 0 FOR NULL JOB SO CAN SEE
\r
443 ; LAST JOB TO RUN IN LOC 33
\r
444 \fSETHRD: DATAO APR,PROG ;SET APR HARDWARE FOR RELOCATION AND PROTECTION
\r
445 ; FOR LOW(AND HIGH SEGS)
\r
446 SKIPN PROG,JOBADR ;RESTORE PROG TO XWD PROT,RELOC FOR JUST LOW SEG
\r
448 TDZA TAC,TAC ;NO, MUST BE NULL JOB OR CORE0 OR KJOB
\r
449 ; SET FOR NO SPECIAL INTERRUTPS TO USER
\r
450 MOVE TAC,JOBENB(JA) ;USER APR CONSO FLAGS (THE ONES HE WANTS TO HANDLE
\r
451 ; FALL INTO SETAPR ROUTINE
\r
454 ;ROUTINE TO ENABLE/DISABLE APR FOR TRAPPING TO USER AND EXEC
\r
455 ;CALL: MOVE TAC, APR, CONSO FLAGS FOR USER TRAPPING
\r
457 ; RETUNRN WITH APR RESET AND INTERRUPT LOCATION CONS'S SET
\r
462 SETAPR: ANDI TAC,231010+APRFOV ;MASK OUT ALL BUT PD OVF, ILL MEM, NXM,
\r
463 ; CLOCK, FOV(ONLY PDP-10), AND AROVF CONSO FLAGS
\r
464 ; FOV=PC CHANGE ON PDP-6 WHICH IS NEVER ALLOWED
\r
465 ; UNDER TIME SHARING BECAUSE IT TRAPS MONITOR TOO
\r
466 HRLS TAC ;PRESERVE USER BITS IN LH
\r
467 TRO TAC,231000 ;MAKE SURE MONITOR ALWAYS LOOKING FOR
\r
468 ; PD OVF, IL;M, NXM, CLOCK FLAGS
\r
469 MOVE TAC1,TAC ;DUPLICATE BITS IN TAC1 FOR CONO TO APR
\r
470 XORI TAC1,110 ;COMPLEMENT FOV(PDP-10 ONLY) AND AROV FLAGS
\r
471 ADDI TAC1, 330 ;SET DISABLE OR ENABLE FOR EACH
\r
472 ANDI TAC1,660 ;MASK OUT ALL BUT DISABLE/ENABLE
\r
473 ; BITS FOR FOV(PDP-10 ONLY) AND AROVF
\r
474 CONO PI,PIOFF ;DISABLE PI'S SO NO INTS. MAY OCCUR WHILE
\r
475 ;CHANGING HARDWARE & SOFTWARE STATE FOR
\r
477 HLRM TAC,APRIN1 ;STORE USER BITS
\r
478 HRRM TAC,APRCON ;STORE EXEC BITS
\r
479 CONO APR,APRCHN(TAC1) ;ENABLE OR DISABLE APR FOR
\r
480 ; FOV(PDP-10 ONLY) AND AR OVF SEPARATELY
\r
481 CONO PI,PION ;ENABLE PI'S AGAIN
\r
483 \fSUBTTL RUNCSS - RUN CONTROL(STATRING AND STOPPING OF JOBS)
\r
485 ;RUN CONTROL IS A COLLECTION OF ROUTINES WHICH
\r
486 ;SET AND CLEAR BITS IN THE JOB STATUS WORDS OF
\r
487 ;ALL JOBS SO THAT THE SCHEDULER WILL START AND STOP
\r
490 ;COMMON ERROR STOPPING ROUTINES
\r
491 ;CALLED AT ANY LEVEL(UUO,CLK, OR INTERRUPT)
\r
492 ;CALL: MOVE ITEM,JOB CAUSING ERROR OR BEING STOPPED
\r
493 ; MOVE DEVDAT,ADDRESS OF THAT JOB TTYP DEVICE DATA BLOCK
\r
494 ; MOVE DAT,BYTE POINTER TO LAST CHAR, ALEADY MOVED
\r
495 ; :TO TTY OUTPUT BUFFER
\r
496 ; PUSHJ PDP,KSTOP,PHOLD,HOLD,OR ESTOP
\r
497 ; NEVER RETURN IF CALLED AT UUO LEVEL
\r
499 ;ROUTINE TO STOP JONB AFTER KJOB COMMAND
\r
500 ;CALLED AT UUO LEVEL IF JOB HAD CORE,CLK LEVEL IF NOT
\r
505 KSTOP: MOVSI TAC,JNA+JLOG+JACCT ;CLEAR JOB NUMBER ASSIGNED AND LOGGED IN BITS
\r
506 ANDCAM TAC,JBTSTS(ITEM)
\r
510 SETZM PRJPRG(ITEM) ;CLEAR PROJECT-PROGRAMMER NUMBER WHEN JOB LOGS OUT
\r
512 ; IF THIS IS THE LARGEST JOB IN USE,FIND NEXT
\r
513 ; HIGHEST AND SET HIGHJB
\r
514 CAMGE ITEM,HIGHJB ;IS THIS THE BIGGEST JOB NUMBER ASSIGNED?
\r
515 JRST ESTOP ;NO, LEAVE HOLD
\r
516 MOVSI TAC1,JNA ;YES,JOB NUMBER ASSGINED BIT
\r
517 HRRZ TAC,ITEM ;SCAN DOWNWARD
\r
518 TDNN TAC1,JBTSTS(TAC) ;IS JNA BIT SET FOR THIS JOB?
\r
519 SOJG TAC,-1 ;NO,KEEP LOOKING,FINISHED(TRUE IF THIS THE ONLY JOB
\r
520 MOVEM TAC,HIGHJB ;YES,STORE NEW HIGHEST JOB NUMBER ASSIGNED
\r
521 JRST ESTOP ;GO SET ERROR BIT
\r
522 \f;ROUTINE TO STOP JOB, SET ERROR BIT AND PRINT MESSAGE
\r
523 ;THEM ADD ^TC<CRLF><CRLF><PERIOD>
\r
524 ;CALL: MOVEI TAC,ADR. OF MESSAGE
\r
529 PHOLD: PUSHJ PDP,CONMES ;MOVE MESSAGE TO TTY OUTPUT BUFFER
\r
531 ;ROUTINE TO STOP JOB, SET ERROR BIT.
\r
532 ;AND ADD "^C<CRLF><CRLF><PERIOD>
\r
534 INTERNAL HOLD,HOLD1
\r
537 HOLD: PUSHJ PDP,INLMES
\r
543 HOLD1: PUSHJ PDP,TTYSTC ;MAKE SURE TTY STAYS IN MONITOR MODE
\r
544 ; AND START TTYP TYPING OUTMESSAGE
\r
547 ;ROUTINE TO STOP USER AND FLAG AS ERROR STOP
\r
550 INTERNAL ESTOP,ESTOP1
\r
551 EXTERNAL JBTSTS,STUSER,STREQ,STAVAL
\r
552 EXTERNAL SCHEDF,JOB,CPOPJ
\r
554 ESTOP: JUMPE ITEM,CPOPJ ;IS THIS ERROR IN JOB 0?
\r
555 MOVSI TAC,JACCT ;NO, CLEAR ACCOUNTING BIT(IN CASE LOGGING
\r
556 ANDCAM TAC,JBTSTS(ITEM) ;IN OR OUT0 SO USER CAN USE CONTROL C
\r
558 ESTOP1: MOVSI TAC,JERR ;SSET ERROR BIT IN JOB STATUS WORD
\r
559 IORM TAC,JBTSTS(ITEM) ;SO JOB CAN NOT CONTINUE(CONT COM.)
\r
560 CAME ITEM,STUSER ;SYSTEM TAPE USER?
\r
562 MOVSI TAC,637163 ;FIND SYS DDB
\r
563 PUSHJ PDP,DEVSRC ;SYSTEM ERROR IF NOT FOUND
\r
565 PUSHJ PDP,RELEA9 ;YES, RELEASE SYSTEM TAPE WITHOUT WAITING
\r
566 \f;ROUTINE TO STOP NY JOB FROM BEING SCHEDULED
\r
568 ; MOVE ITEM, JOB NUMBER
\r
570 ; EXIT ;RETURN HERE IMMEDIATELY, IF CALLED FROM HIGHER
\r
571 ;PRIORITY PI CHANNEL THAN CLK(LOWEST), OTHERWISE WHEN JOB IS RUNABLE
\r
572 ;CALLED FROM COMMAND DECODER WHEN <CONTROL>C TYPED IN BY USER
\r
573 ;OR ON ANY ERROR MESSAGE(SFE PREVIOUS PAGE)
\r
576 EXTERNAL JBTSTS,PJBSTS,REQTAB,JOB,STUSER,MAXQ,AVALTB
\r
578 STOP1: MOVSI TAC,RUN
\r
579 CONO PI,PIOFF ;DONE AT INTERRUPT LEVEL HIGHER THEN DT LEVEL
\r
580 CAME ITEM,STUSER ;IS THIS JOB CURRENTLY USING THE SYTEM TAPE?
\r
581 TDNN TAC,JBTSTS(ITEM) ;NO, IS RUN BIT OFF IN JOB STATUS WORD
\r
583 ANDCAM TAC,JBTSTS(ITEM) ;NO, SO CLEAR IT
\r
585 LDB TAC,PJBSTS ;GET JOB WAIT QUEUE CODE(IF ANY)
\r
586 CAIG TAC,MAXQ ;DOES STATE HAVE Q ?
\r
587 SOSL REQTAB(TAC) ;YES. REDUCE IT.
\r
589 SOSGE AVALTB(TAC) ;YES REDUCE COUNT
\r
590 SETZM AVALTB(TAC) ;CLEAR AVAL FLAG IF NO ONE WAITING
\r
591 STOP1A: CONO PI,PION ;MAKE SURE PI ON
\r
592 CAME ITEM, JOB ;NO. IS THIS JONB CURRENT USER
\r
600 JRST REQUE ;SET REQUE JOB FLAG
\r
603 SKIPL TAC,JBTSTS(ITEM) ;RUN FLAG OFF?
\r
604 TLNN TAC,JERR ;YES, ERROR FLAG ON?
\r
606 SETOM SCHEDF ;YES, FORCE RESCHEDULING EVEN IF JOB IN EXEC MODE
\r
607 JRST STOP2 ;YES, MAKE CLK RESCHEDULE ANOTHER JOB
\r
608 \f;ROUTINE TO REQUE JOB WHICH HAS HAD A COMMAND TYPED
\r
609 ;WHICH NEEDS CORE AND THE CORE IMAGE IS ON THE DISK.
\r
610 ;OR IS IN CORE AND HAS ACTIVE DEVICES.
\r
611 ;CALLED FROM COMMAND DECODER
\r
612 ;CALL: MOVE ITEM,JOB NO.
\r
617 DLYCOM: MOVSI TAC,CMWB ;SET COMMAND WAIT BIT
\r
619 EXCH TAC,JBTSTS(ITEM)
\r
621 IORM TAC,JBTSTS(ITEM) ;IN JOB STATUS WORD
\r
630 ;ROUTINE TO PUT JOB IN NO CORE QUEUE
\r
634 IFN FTSWAP,<INTERNAL NOCORQ
\r
637 NOCORQ: MOVEI TAC,NULQ ;NO JOB NO. OR NO CORE QUEUE
\r
641 \f;ROUTINE TO SETUP MONITOR JOB TO RUN LATER AT UUO LEVEL
\r
642 ;CALLED BY COMMANDS WHICH MAY OR MAY NOT NEED TO
\r
643 ;RUN MONITOR JOB DEPENDING ON WHETHER JOB HAS CORE(KJOB,IJOB)
\r
644 ;TTY WILL REMAIN IN MONITOR MODE
\r
645 ;JOB MUST HAVE CORE ASSIGNED
\r
646 ;CALL: MOVE ITEM, JOB NUMBER
\r
647 ; MOVEI TAC1,ADDR. OF MONITOR JOB TO BE RUN
\r
649 ;WHEN SCHEDULED TO RUN, MONITOR JOB MUST SET UP ITS OWN ACS
\r
653 MONJOB: PUSHJ PDP,MSTART ;START WITH PC IN MONITOR
\r
654 JRST SETRUN ;SET TTY TO START JOB WHEN COMMAND RESPONSE
\r
655 ; IS FINISHED AND KEEP TTY IN MONITOR MODE
\r
658 ;ROUTINE TO SETUP ACS FOR MONITOR JOB STARTING AT UUO LEVEL
\r
659 ;SETS UP ITEM, WITH JOB NO.; PROG WITH RELOCATION, AND PDP
\r
660 ;WITH PUSH DOWN LIST ADR. IN JOB DATA AREA
\r
661 ;USED BY KJOB,CORE 0,SAVE,GET,RUN,R,REASSIGN AND FINISH COMMANDS
\r
662 ;CALL: MOVEI TAC1,MONITOR JOB START ADDRESS
\r
664 ; RETURN WITH ACS PDP,PROG,JDAT, AND ITEM SETUP
\r
667 EXTERNAL JOB,JBTADR,MJOBPD,JOBPDL,TTYFNU,JBTDAT
\r
669 MONSTR: MOVE ITEM,JOB ;CURRENT JOB NUMBER
\r
670 MOVE JDAT,JBTDAT(ITEM) ;ADR. OF JOB DATA AREA
\r
672 MOVE PROG,JBTADDR(ITEM) ;JOB RELOCATION
\r
674 MOVSI PDP,MJOBPD ;MINUS LENGTH OF SYSTEM PD LIST
\r
675 HRRI PDP,JOBPDL(JDAT) ;FIRST LOC.-1 OF PD LIST
\r
676 PUSH PDP,TAC1 ;SAVE STOP ADDRESS
\r
677 JRST (TAC) ;RETURN AND DO MONITOR JOB
\r
678 ; WITH TT DDB,OUTPUT BYTE POINTER, AND JOB NO.
\r
679 \f;ROUTINE TO SET JOB STATE TO BE SCHEDULED TO RUN
\r
680 ;WITH SPECIFIED STARTING ADDRESS INCLUDING PC FLAGS
\r
681 ;CALLED ONLY WHEN JOB IN CORE AND AFTER JOB HAS BEEN
\r
682 ;SAFELY STOPPED IN ONE OF 3 STATES:
\r
683 ;1) PC IN USER MODE
\r
684 ;2) JOB IN A WAIT FOR SHARABLE DEVICE, OR IO WAIT
\r
685 ;3) JOB JUST ABOUT TO RETURN TO USER MODE FROM A UUO CALL
\r
686 ;CALL: MOVE TAC1,STARTING PC
\r
687 ; MOVE ITEM, JOB NUMBER
\r
688 ; MOVE JDAT,ADR. OF JOB DATA AREA WHICH MUST BE IN CORE
\r
689 ; PUSHJ PDP,USTART(PC TO USER MODE),MSTART(PC TO MONITOR MODE)
\r
690 ; RETURN HERE IMMEDIATELY
\r
692 INTERNAL MSTART,USTART
\r
693 EXTERNAL JOBPC,JOBDAC,JOBD17,TTYSET,JOBOPC,JOBPD1
\r
695 USTART: MOVE TAC,JOBPC(JDAT) ;GET OLD PC
\r
696 TLNE TAC,USRMOD ;IS IT IN USER MODE TOO?
\r
697 JRST USTRT1 ;YES, DUMP ACS AND PC FLAGS ARE ALREADY HIS
\r
698 MOVEI TAC,JOBDAC(JDAT) ;NO. MOVE USERS(UUO) ACS TO DUMP ACS
\r
699 HRL TAC,JDAT ;SOURCE=REL, 0,DEST,=JOBDAC IN JOB DATA AREA
\r
700 BLT TAC,JOBD17(JDAT) ;MOVE ALL ACS
\r
701 MOVE TAC,JOBPD1(JDAT) ;UUO PC HAS LAST PC
\r
702 HRRI TAC,-1(TAC) ;SUBTRACT 1 FROM RIGHT HALF AND
\r
703 ; PRESERVE LH PC FLAGS
\r
704 ; (RH=0 ON HALT 0 OR FIRST START)
\r
705 USTRT1: MOVEM TAC,JOBOPC(JDAT) ;STORE OLD PC FOR USER TO LOOK AT
\r
706 HLL TAC1,TAC ;PRESERVE USER APR FLAGS
\r
707 TLO TAC1,USRMOD ;MAKE SURE NEW PC IN USER MODE
\r
708 TLZ TAC1,37 ;MAKE SURE NO INDIRECT BITS OR INDEX FIELD
\r
710 MSTART: MOVEM TAC1,JOBPC(JDAT) ;STORE NEW PC
\r
711 MOVSI TAC,JERR+WTMASK
\r
712 ANDCAM TAC,JBTSTS(ITEM) ;CLEAR ERROR AND WAIT STATUS BITS
\r
713 JRST TTYSET ;SET TTY STATE TO INITAL COND.
\r
714 ; TTYUSR OR TTYURC SHOULD BE CALLED
\r
715 ; TO INDICATE WHETHER TTY TO USER OR EXEC MODE
\r
716 ; AND THAT JOB IS TO RUN(RUN BIT =1) WHEN
\r
717 ; MONITOR COMMAND RESPONSE FINISHES.
\r
721 ;ROUTINE TO SET JOB STATUS RUN BIT(RUN)
\r
722 ;CALLED BY SCANNER SERVICE WHEN TTY MONITOR COMMAND
\r
723 ;RESPONSE FINISHES, THIS ACTION IS ENABLED BY CALLING
\r
724 ;TTYUSR. OR TTYURC IN SCNSER
\r
725 ;CALL: MOVE ITEM,JOB NUMBER
\r
729 EXTERNAL JBTSTS,PJBSTS,REQTAB,AVALTB,RNQUNT
\r
732 SETRUN: LDB TAC,PJBSTS ;GET JOB STATUS WAIT QUEUE CODE
\r
733 CAILE TAC,MAXQ ;DOES JOB STATUS CODE HAVE A QUEUE?
\r
735 AOSLE REQTAB(TAC) ;ADD TO REQUEST COUNT
\r
736 JRST SETR1 ;OTHERS WAITING?
\r
737 AOSG AVALTB(TAC) ;MAKE AVAILABLE
\r
738 SETOM AVALTB(TAC) ;FLAG AS JUST AVAILABLE, BECAUSE
\r
739 ; NO JONB WAS USING DEVICE. SCHEDULER
\r
740 ; WILL SCAN THIS QUEUE
\r
741 SETR1: MOVSI TAC,RUN ;SET RUN BIT IN JOB STATUS WORD
\r
742 IORM TAC,JBTSTS(ITEM)
\r
743 SETR2: MOVE TAC,RNQUNT ;SET QUANTUM TIME TO RUN QUEUE QUANTUM
\r
744 HRRM TAC,JBTSTS(ITEM) ;RUN QUEUE QUANTUM
\r
748 JRST NULTST ;GO SEE IF NULL JOB IS RUNNING
\r
752 EXTERNAL QJOB,JBTSTS
\r
754 REQUE: MOVSI TAC,JRQ ;MARK JOB TO BE REQUEUED WITH JRQ BIT
\r
755 TDNN TAC,JBTSTS(ITEM) ;INCREMENT COUNT ONLY ONCE FOR EACH JOB
\r
756 AOS QJOB ;INCREMENT COUNT OF NO. OF JOBS WAITING TO BE REUEUED
\r
758 IORM TAC,JBTSTS(ITEM) ;SET REQUE BIT FOR SCHEDULER
\r
763 ;ROUTINE TO PUT A JOB TO SLEEP AND WAKE UP AGAIN LATER
\r
764 ;CALLED AFTER CLOCK QUEUE REQUEST PUT IN BY UUO ROUTINE
\r
770 EXTERNAL JBTSTS,SLPQ
\r
772 SETSLP: MOVSI TAC,CLKR ;FLAG THAT A CLOCK REQUEST HAS BEEN PUT IN
\r
773 IORM TAC,JBTSTS(ITEM) ;SO ONLY ONE PER JOB
\r
774 MOVEI AC1,SLPQ ;SLEEP STATE CODE
\r
775 JRST SETSTT ;SET STATUS AND RESCHEDULE
\r
777 ;HERE AT CLOCK LEVEL WHEN CLOCK REQUEST TIMES OUT FOR SLEEP
\r
781 EXTERNAL PJBSTS,RNQ,SLPQ
\r
783 WAKE: MOVEI TAC1,RNQ ;RUN QUEUE CODE
\r
784 MOVE ITEM,TAC ;JOB NO.
\r
785 MOVSI TAC,CLKR ;CLEAR CLOCK REQUEST BIT FOR THIS JOB
\r
786 ANDCAM TAC,JBTSTS(ITEM) ;SO IT CAN PUT ANOTHER ONE IN
\r
787 LDB TAC,PJBSTS ;GET QUEUE CODE
\r
788 CAIE TAC,SLPQ ;IS JOB STILL SLEEPING?
\r
789 POPJ PDP, ;NO, RETURN TO CLOCK ROUTINE
\r
790 DPB TAC1,PJBSTS ;YES, STORE RUN QUEUE CODE
\r
791 ; (CONTROL C, START CAN GET JOB OUT SLEEP)
\r
794 \f;ROUTINE TO GET DATA CONTROL AND ANOTHER SHARABLE DEVICE
\r
795 ;JOB NEVER GETS ONE DEVICE AND WAITS FOR SECOND, SINCE TYPING
\r
796 ;CONTROL C WOULD NEVER FINISH WITH FIRST DEVICE
\r
797 ;CALL PUSHJ PDP,GETDCXX
\r
798 ; AOSE XXREQ ;REQUEST COUNT FOR OTHER DEVICE
\r
799 ; RETURN WHEN BOTH AVAILABLE
\r
801 INTERNAL GETDCDT,GETDCMT
\r
802 EXTERNAL DCREQ,REQTAB,AVALTB,DCAVAL,CPOPJ1
\r
805 XCT @(PDP) ;INCREASE SHARABLE DEVICE REQ. COUNT
\r
806 GETWT: PUSHJ PDP,DVWAT1 ;NOT AVAIL., GO WAIT FOR IT
\r
807 AOSN DCREQ ;IS DATA CONTROL AVAILABLE?
\r
808 JRST CPOPJ1 ;YES, RETURN BOTH AVAILABLE
\r
809 MOVE AC1,@(PDP) ;DATA CONTROL NOT AVAILABLE
\r
811 SOSL REQTAB(AC1) ;REDUCE REQ. COUNT FOR OTHER
\r
813 SETOM AVALTB(AC1) ;SET AVAILABLE IF OTHER JOBS WAITING
\r
814 JFCL DCREQ ;ARGUMENT FOR DCQAIT
\r
815 PUSHJ PDP,DCWAIT ;WAIT FOR DATA CONTROL FREE
\r
816 MOVE AC1,@(PDP) ;INCREMENT REQ. COUNT
\r
817 AOSN @AC1 ;NOW IS SHARABLE DEVICE FREE?
\r
819 SOSL DCREQ ;NO, REDUCE DATA CONTROL REQUEST
\r
820 SETOM DCAVAL ;SET AVAIL., SOME OTHER JOB WAITING FOR IT
\r
821 JRST GETWT ;TRY AGAIN
\r
823 ;ROUTINE TO WAIT FOR A SHARABLE DEVICE
\r
824 ;CALLED AT UUO LEVEL ONLY BY DEVICE SERVICE ROUTINES
\r
825 ;CALL: AOSLE XXREQ ;ADD 1 TO SHARABLE DEVICE REQUEST COUNT
\r
826 ; ;IS DEVICE AVAILABLE?
\r
827 ; PUSHJ PDP,XXWAIT ;NO, PUT JOB IN WAIT QUEUE
\r
828 ; RETURN WHEN DEVICE AVAILABLE
\r
830 ;INITIALLY THE REQUEST COUNT IS -N, WHERE N IS THE
\r
831 ;NUMBER OF JOBS WHICH CAN USE THE SHARABLE DEVICE AT THE SAME TIME
\r
832 ;A REQUEST COUNT OF 0 MEANS THE MAXIMUM NO. OF JOBS ARE
\r
833 ;USING THE DEVICE, A POSITIVE NUMBER IS THE
\r
834 ;NUMBER OF JOBS WAITING IN THE SHARABLE DEVICE WAIT QUEUE
\r
837 INTERNAL MTWAIT,STWAIT,DTWAIT,DCWAIT,DAWAIT,MQWAIT,AUWAIT
\r
838 EXTERNAL JOB,REQTAB
\r
840 MTWAIT:DTWAIT:DCWAIT:STWAIT:DAWAIT:MQWAIT:AUWAIT:
\r
841 DVWAIT: MOVE AC1,(PDP) ;GET ADR. OF CALLER
\r
842 MOVE AC1,-2(AC1) ;GEET AOSLE XXREQ INSTRUCTION
\r
844 DVWAT1: MOVE AC1,@-1(PDP) ;GET ADR. OF CALLER OF THIS ROUTINE
\r
845 SUBI AC1,REQTAB ;COMPUTE WAIT-STATE QUEUE CODE
\r
846 SETSTT: MOVE AC3,JOB ;CURRENT JOB NO.
\r
847 DPB AC1,PJBS1 ;STORE IN JOB STATUS WORD
\r
848 JRST WSCHED ;GO SCHEDULE ANOTHER AND RETURN TO CALLER
\r
849 ; WHEN SHARABLE DEVICE BECOMES AVAILABLE
\r
850 ; SEE CLOCK AND CLKCSS
\r
852 PJBS1: POINT JWSIZ,JBTSTS(AC3),JWPOS ;BYTE POINTER TO JOB STATUS
\r
853 ; WORD WAIT QUEUE CODE
\r
854 \f;ROUTINE TO SET JOB TO RUN AFTER IT HAS BEEN STOPPED
\r
855 ;BECAUSE IT HAD TO WAIT FOR IO TO COMPLETE FOR SOME DEVICE
\r
856 ;EACH SERVICE ROUTINE WILL AT INTERRUPT LEVEL
\r
857 ;CHECK EACH TIME IT FINISHED A TASK(RUNFFERFUL)
\r
858 ;TO SEE IF THE JOB USING THE DEVICE HAS
\r
859 ;PREVIOUSLY CAUGHT UP WITH DEVICE AND HAS BEEN STOPPED
\r
860 ;CALL: MOVE DEVDAT,ADR, OF DEVICE DATA BLOCK
\r
861 ; MOVE IOS,DEVIOS(DEVDAT) ;GET DEVICE IO STATUS WORD FROM DDB
\r
862 ; TLZE IOS,IOW ;IS JOB AN IO WAIT FOR THIS DEVICE?
\r
863 ; PUSHJ PDP,SETIOD ;YES, GO FLAG JOB TO START UP AGAIN
\r
865 ;SETS THE JOB QUEUE WAIT CODE TO WSQ IN JOB STATUS WORD,
\r
866 ;THE SCHEDULER THEN SEES THAT THIS JOB HAS ITS
\r
867 ;IO WAIT SATISFIED AND IS WAITING TO BE RUN AGAIN
\r
869 INTERNAL SETIOD,STTIOD
\r
870 EXTERNAL WSQ,WSAVAL,TSQ,TSAVAL,JOB,PJOBN
\r
872 PJBS2: POINT JWSIZ,JBTSTS(TAC),JWPOS ;BYTE POINTER TO JOB STATUS
\r
875 STTIOD: MOVEI TAC1,TSQ ;SET TTY IO WAIT SATISFIED QUEUE CODE
\r
878 SETIOD: MOVEI TAC1,WSQ ;REQUE TO WAIT SATISFIED Q
\r
879 AOS WSAVAL ;INCR, NO, OF JOBS WITH IO WAIT
\r
880 ; SATISFIED, NON-ZERO WSAVAL WILL
\r
881 ; CAUSE SCHED, TO SCAN FOR IO
\r
883 SETIO1: LDB TAC,PJOBN
\r
884 DPB TAC1,PJBS2 ;IN JOB STATUS WORD
\r
889 MOVSI TAC1,JRQ ;SET JOB TO BE REQUEUED AT NEXT CLOCK TICK
\r
890 TDNN TAC1,JBTSTS(TAC) ;IS REQUE BIT ALREADY ON?
\r
891 AOS QJOB ;NO, INCREMENT COUNT ONCE FOR EACH JOB
\r
892 IORM TAC1,JBTSTS(TAC) ;SET REQUEUEING BIT FOR SCHEDULER
\r
894 NULTST: SKIPE JOB ;IS NULL JOB RUNNING?
\r
895 POPJ PDP, ;NO LET OTHER JOB RUN TILL SCHEDULER IS TRAPPED TO
\r
896 \f;ROUTINE TO CAUSE CLK TO ROUTINE TO RESCHEDULE
\r
897 ;CALLED AT ANY LEVEL
\r
898 ;CALL: PUSHJ PDP,STOP2
\r
899 ; RETURN IMMEDIATELY EXCEPT IF AT UUO LEVEL
\r
900 ; IF AT UUO LEVEL, RETURN WHEN JOB IS RUNABLE AGAIN
\r
903 EXTERNAL PICLK,CLKFLG
\r
905 STOP2: CONO PI,PIOFF ;PREVENT CLOCK INTERRUPT DURING STOP2 CODE
\r
906 SETOM CLKFLG ;SET FLAG TO INDICATE CLK INTERRUPT
\r
907 ; EVEN THOUGH CLK INTERRUTP IS NOT A ATIME INTERRUPT
\r
908 CONO PI,PICLK ;TURN PI BACK ON AND REQUESST INTERRUPT TO
\r
909 ; CLK PI CHANNEL(LOWEST PRIORITY CHANNEL)
\r
910 POPJ PDP, ;INTERRUPT IMMEDIATELY IF AT UUO LEVEL
\r
911 \f;ROUTINE TO WAIT TILL DEVICE CATCHES UP WITH USER AND BECOMES INCTIVE
\r
914 , EXIT ALWAYS RETURN HERE
\r
916 ,IF DEVICE IS INACTIVBE (IOACT=0), RETURNS TO EXIT, OTHERWISE, SETS
\r
917 ,IOW:=1 AND ENTERS WAIT UNLESS IOCT BECOMES ZERO BEFORE THE
\r
918 ,JUMP IS MADE, IN WHICH CASE IT SETS IOW:=0 AND RETURNS TO EXIT,
\r
919 ,ON LEAVING THE WIAT STATE, RETURNS TO EXIT.
\r
920 ,THIS ROUTINE PREVENTS THE STATE IOACT=0 AND IOW=1 FROM OCCURING
\r
923 , EXIT ALWAYS RETURNS HERE
\r
924 ,SETS IOW:=1 AND ENTERS WAIT ROUTINE. RETURNS TO EXIT WHEN IOACT=0
\r
928 WAIT1: MOVE IOS,DEVIOS(DEVDAT)
\r
929 TRNN IOS, IOACT ;IS DEVICE ACTIVE? (IOACT=1?)
\r
931 PUSHJ PDP,WSYNC ;WAIT
\r
934 ;WSYNC IS CALLED TO WAIT UNTIL SETIOD IS CALLED BY INTERRUPT SERVICE ROUTINE
\r
935 ;IE UNTIL CURRENT BUFFER ACTIVITY IS COMPLETE
\r
936 ;CALLED ONLY FROM UUO LEVEL
\r
937 ;CALL: MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK
\r
939 ; RETURN IMMEDIATELY IF DEVICE IS INACTIVE
\r
940 ; RETURN WHEN DEVICE FINISHES NEXT BUFFER IF IT IS ACTIVE
\r
944 EXTERNAL IOWQ,TIOWQ,PION,PIOFF
\r
946 WSYNC: MOVSI IOS,IOW ;SETUP DEVICE IO WAIT BIT
\r
947 MOVEI AC1,IOWQ ;IO WAIT STATE CODE
\r
948 MOVE AC3,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS
\r
949 TLNE AC3,DVTTY ;IS THIS DEVICE A TTY?
\r
950 MOVEI AC1,TIOWQ ;YES, SET TTY WAIT STATE CODE
\r
951 MOVE AC3,JOB ;CURRENT JOB NO.
\r
952 MOVEI AC2,IOACT ;DEVICE ACTIVE BIT
\r
953 CONO PI, PIOFF ;TURN PI OFF
\r
954 TDNN AC2,DEVIOS(DEVDAT) ;IS THE DEVICE ACTIVE?
\r
956 IORM IOS,DEVIOS(DEVDAT) ;YES, SET DEVICE IO-WAIT BIT
\r
957 ; AND SETUP IOS FOR RETURN WHEN WAIT SATISFIED
\r
958 DPB AC1,PJBS1 ;SET JOB WAIT STATE CODE
\r
959 ; IN JOB STATUS WORD
\r
960 CONO PI, PION ;TURN PI ON
\r
961 PUSHJ PDP,WSCHED ;CALL SCHEDULER TO FIN ANOTHER JOB TO RUN
\r
962 ; RETURN WHEN NEXT BUFFERFUL IS FINISHED
\r
963 ; WITH ACS 0-14 OCTAL RESTORED
\r
964 ; RETURN WHEN IO-WAIT FINISHED
\r
965 WSYNC1: CONO PI, PION
\r
966 ANDCAB IOS, DEVIOS(DEVDAT) ;CLEAR DEVIVCE IO-WAIT BIT
\r