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
14 EXTERNAL TIME,TIMEF,CLKFLG,REQCLK,APRCHL,APRPC,UPTIME
\r
15 EXTERNAL JOBDAT,JOBTPC,JOBCNI,JOBAPR,APRERR,SCHEDF
\r
17 EXTERNAL APRILM,COMMAN,CONMES,DEVCHK,DEVSRC,ERROR,INLMES
\r
18 EXTERNAL RELEA9,CRSHWD,CRASHX
\r
20 INTERNAL FTTTYSER ;THIS ROUTINE MAY BE ASSEMBLED TO WORD EITHER
\r
21 ; THE OLD SCNSER OR THE NEW TTYSER.
\r
23 INTERNAL FTCHECK,FTMONP
\r
25 IFN FTCHECK+FTMONP,<
\r
26 EXTERNAL DATA,APRCON,APRIN1,CLKS17,DAMESS,UUO0,CLOCK
\r
29 IFE FTCHECK+FTMONP,<
\r
32 APRCON: 231000 ;MONITOR ENABLED CPU FLAGS
\r
33 APRIN1: 0 ;USER ENABLED CPU FLAGS
\r
34 CLKS17: 0 ;PLACE TO SAVE AC17 ON CLOCK INTERRUPT
\r
35 DAMESS: ASCIZ /-JAN-/
\r
37 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 APRER ;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
80 ;OTHER APR INTERRUPTS BESIDES CLOCK
\r
82 APRER: EXCH TAC,APRCHL ;SAVE TAC, GET PC
\r
83 TLNE TAC,USRMOD ;IS PC IN USER MODE?
\r
84 CONSO APR,@APRIN1 ;YES, IS USER ENABLED FOR THIS ERROR
\r
85 JRST APRER2 ;NO, PRINT ERROR MESSAGE AND STOP JOB
\r
86 APRER4: EXCH JDAT,JOBDAT ;YES, SAVE JDAT, GET CURRENT JOB DATA AREA ADR.
\r
87 MOVEM TAC,JOBTPC(JDAT) ;STORE PC IN JOB DATA AREA
\r
89 CONI APR,JOBCNI(JDAT) ;STORE APR IN JOB DATA AREA
\r
90 HLLZS JOBENB(JDAT) ;CLEAR SOFTWARE FLAGS SO THAT USER MUST DO
\r
91 ; ANOTHER APRENB UUO IN ORDER TO ENABLE TRAPS
\r
92 SETZM APRIN1 ;ALSO CLEAR USER APR CONSO FLAGS
\r
93 HRRI TAC,231000 ;AND SET MONITOR TO LOOK ONLY FOR
\r
94 HRRM TAC,APRCON ;PD OVF,ILM,NXM, AND CLOCK
\r
95 HRR TAC,JOBAPR(JDAT) ;GET USER LOC TO TRAP TO
\r
96 EXCH JDAT,JOBDAT ;RESTORE JDAT,JOBDAT
\r
97 CONO APR,440+APRCHN ;DISBALE FOV, AROVF IN CASE ON
\r
98 ;SO USER MUST REENABLE WITH SETAPR UUO
\r
100 APRER3: TLZ TAC,440000 ;CLEAR FOV (PC CHANGE ON PDP-6) AND AR OVF FLAGS
\r
101 ; SO INTERRUPT MAY BE DISMISSED
\r
102 EXCH TAC,APRCHL ;RESTORE TAC & APRCHL
\r
103 CONO APR,430110+APRCHN ;CLEAR ALL ERROR FLAGS WHICH CAN CAUSE INTERRUPTS
\r
104 ; EXCEPT CLOCK FLAG(ELSE LOSE TIME OF DAY)
\r
105 JEN @APRCHL ;DISMISS INTERRUPT
\r
107 APRER2: CONSO APR,NXM!ILM!POV! ;DOES EXEC CARE?
\r
108 JRST APRER3 ;NO. IGNORE EXEC OVERFLOW (MUST BE FOV OR AROVF
\r
109 MOVEM TAC,APRPC ;STORE ERROR PC FOR CLK CHANNEL
\r
110 CONI APR,APRERR ;STORE ERROR FLAGS
\r
111 ; (ALSO USED AS ERROR FLAG)
\r
112 SETOM CLKFLG ;SET FLAG FOR CLK INTERRUPT
\r
113 SETOM SCHEDF ;FLAG THAT RESCHEDULING IS NEEDED
\r
114 ; (EVEN THROUGH PC MAY BE IN EXEC MODE)
\r
115 CONO PI,REQCLK ;REQUEST INTERRUPT IN CLK CHANNEL
\r
116 CONSZ APR,ILM ;WAS ERROR ILLEGAL MEMORY(FROM USER)?
\r
117 HRRI TAC,0 ;YES,CLEAR RH OF PC,SO A SECOND ILM INTERRUPT
\r
118 ; WILL NOT OCCUR IF THIS IS A WILD(AND A PDP-10)
\r
120 CONSZ PI,003400 ;ARE ANY PI'S IN PROGRESS OF LOWER PRIORITY THAN APR?
\r
121 ; (PDP-10 BITS ONLY)
\r
122 HALT .+1 ;YES, HALT SO CONTINUE WILL TRY TO RECOVER
\r
124 JRST APRER3 ;NO,MUST BE UUO LEVEL(OR USER MODE AND
\r
125 ; MEMORY DROPPED OUT)
\r
127 SUBTTL CLOCK - LOW PRIORITY CLOCK SERVICE(CLK)
\r
129 ;THIS ROUTINE RUNS ON THE LOWEST PRIORITY PI CHANNEL AND AT UUO LEVEL
\r
130 ;TO CAUSE AN INTERRUPT ON CLK CHANNEL:
\r
131 ; SETOM CLKFLG ;FLAG THAT INTERRUPT HAS BEEN REQUESTED
\r
132 ; CONO PI,CLKREQ ;REQUEST PI INTERRUPT ON LOWEST PI CHANNEL
\r
133 ;THE FOLLOWING OTHER FLAGS MUST ALSO BE SET
\r
134 ;APRERR-APR DETECTED ERROR IN CURRENT JOB
\r
135 ;SCHEDF-RESCHEDULING MUST TAKE PLACE(EVEN THROUGH PC IN EXEC MODE)
\r
136 ;TIMEF-APR CLOCK HAS TICKED ON HIGH PRIORITY CHANNEL
\r
137 ;SEE APRSER AND RUNCSS TO SEE HOW THIS ROUTINE IS CALLED
\r
139 ;CLK SERVICE PERFORMS THE FOLLOWING ON A REGULAR BASIS:
\r
140 ;PROCESSES CLOCK QUEUE REQUESTS
\r
141 ;CALLS CONSOLE MONITOR COMMAND DECODER
\r
142 ;CALLS CORE SHUFFLER
\r
143 ;THEN CALLS SCHEDULER
\r
144 ;IF THE CURRENT JOB IS IN EXEC MODE THE ABOVE 4 TASKS ARE
\r
145 ;DELAYED UNTIL THE CURRENT JOB ENTERS A STOPPABLE STATE: I.E., UNTIL
\r
147 ; 1. JOB STARTS TO WAIT FOR A BUSY SHARABLE DEVICE
\r
148 ; 2. JOB STARTS TO WAIT FOR A IO TO COMPLETE
\r
149 ; 3. CONTROL ABOUT TO RETURN TO USER MODE
\r
150 ;THEN CLK SERVICE IS ENTERED AT THE UU0 LEVEL
\r
157 ;THE CLOCK REQUEST QUEUE PROVIDES THE REST OF THE MONITOR
\r
158 ;WITH THE ABILITY TO BE TRAPPED TO AFTER A NUMBER OF CLOCK TICKS
\r
161 ;TO MAKE A REQUEST:
\r
163 ; IDPB AC,CLOCK ;STORE CLOCK REQUEST IN QUEUE
\r
164 ; CONO PI,PION ;TURN PI BACK ON
\r
165 ;C(AC)=XWD ADDRESS,NO. OF CLOCK TICKS*DATA*10000
\r
166 ;WHERE DATA IS 6 BITS OF INFO NEEDED WHEN TIME RUNS OUT
\r
167 ;CLK SERVICE WILL PUSHJ PDP,ADR
\r
168 ;WHEN TIME RUNS OUT WITH DATA RIGHT JUSTIFIED IN AC TAC
\r
169 ;ALL ACS ARE FREE TO USE WHEN CALL IS MADE
\r
172 EXTERNAL CIPWTM1,PION,PIOFF
\r
174 CLKINI: MOVEI TAC,CIPWTM1 ;SETUP CLOCK QUEUE BYTE POINTER
\r
175 HRRM TAC,CLOCK ;LH NEVER CHANGES(36 BIT BYTE)
\r
178 ;HERE AT UUO LEVEL WHEN JOB GOES INTO IO WAIT OR SHARABLE DEVICE WAIT
\r
179 ;CALL: PUSHJ PDP,WSCHED
\r
180 ; RETURN HERE WHEN RUNABLE AGAIN
\r
183 EXTERNAL JOBD14,JOBDAC,USRPC,JOBD16,NULPDL
\r
185 WSCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA
\r
186 MOVEI AC3,JOBDAC(JDAT) ;SAVE ACS 0-16 IN DUMP ACS
\r
187 BLT AC3,JOBD16(JDAT) ;IN CURRENT JOB DATA AREA
\r
188 MOVEI PDP,NULPDL ;NULL JOB PD LIST
\r
189 HRLI PDP,MJOBP1 ; OTHERWISE GET PD OUF
\r
191 JRST RSCHED ;GO RESCHEDULE
\r
193 ;HERE AT UUO LEVEL WHEN CURRENT JOB RETURNS TO USER MODE
\r
194 ;FROM A UUO CALL AND EITHER:
\r
195 ; 1. CURRENT JOB TYPED CONTROL C WHILE IN EXEC MODE
\r
196 ; 2. CLOCK FLAG WENT OFF WHILE CURRENT JOB WAS
\r
199 ;CALL: PUSHJ PDP,USCHED ;FROM UUOCON(UUO HANDLER RETURN TO USER)
\r
200 ; RETURN HERE WHEN RUNABLE
\r
203 EXTERNAL JOBDPG,JOBDPD,USRPC
\r
205 USCHED: POP PDP,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA
\r
206 MOVEM PROG,JOBDPG(PROG) ;SAVE PROG IN DUMP AC AREA
\r
207 MOVEM PDP,JOBDPD(PROG) ;SAVE PDP
\r
208 JRST RSCHED ;GO RESCHEDULE
\r
210 ;HERE AT CLK INTERRUPT LEVEL
\r
214 EXTERNAL CLKFLG,JOBD17,CLKCHL,SCHEDF,JOBADR,JOBD16,JOBDAC
\r
215 EXTERNAL JOBD15,JOBPD1,MJOBP1,APRERR,NULDAT,NULPDL
\r
217 CLKINT: SKIPN CLKFLG ;CLK INTERRUPT REQUEST?
\r
218 JRST CLKINT ;NO, CHECK OTHER DEVICES
\r
219 MOVEM 17,CLKS17 ;SAVE AC 17
\r
220 MOVE 17,CLKCHL ;IS CURRENT JOB IN USER MODE?
\r
222 SKIPE SCHEDF ;NO, IS THIS A FORSCED RESCHEDULING INTERRUPT?
\r
223 JRST SAVPC ;YES, IT IS OK TO RESCHEDULE NOW
\r
224 MOVE 17,CLKS17 ;NO, LEAVE TIMEF SET AND DISMISS INT.
\r
227 SAVPC: MOVEM 17,USRPC ;SAVE PC IN PROTECTED PART OF SYSTEM DATA
\r
229 ; STORAGE FOR CURRENT JOB
\r
230 CLKERR: SKIPN 17,JOBDAT ;CURRENT JOB DATA AREA, IS THERE ONE?
\r
231 MOVEI 17,NULDAT ;NO, MUST BE NULL JOB OR CORE 0
\r
232 ; RUNS AT UUO LEVEL,REQUESTS CLK INT. TO STOP
\r
233 MOVEM 16,JOBD16(17) ;SAVE AC 16 IN DUMP AC PART OF JOB DATA AREA
\r
234 MOVEI 16,JOBDAC(17) ;SOURCE=0,DESTINATION=DUMP AC 0
\r
235 BLT 16,JOBD15(17) ;SAVE ACS 0-15 JUST BELOW AC 16
\r
236 MOVE TAC,CLKS17 ;NOW SAVE 17 IN JOB DATA AREA
\r
237 MOVEM TAC,JOBD17(17) ;ALONE WITH OTHER ACS
\r
238 MOVEI PDP,NULPDL ;SET UP PUSH DOWN LIST IN NULL JOB DATA
\r
239 ; AREA IN LOWER CORE
\r
240 HRLI PDP,MJOBP1 ;-LENGTH+1(LEAVE ROOM FOR UUO PC)
\r
241 SKIPE TAC,APRERR ;IT THIS AN ERROR INTERRUPT?
\r
242 PUSHJ PDP,APRILM ;YES, GO PROCESS ERROR, APRILM WILL CLEAR APRERR
\r
245 EXTERNAL COMCNT,NXTJOB,HNGTIM,POTLST,LSTWRD
\r
246 EXTERNAL TIMEF,APRERR,CLKFLG,SCHEDF,JDB,PMONTB
\r
248 RSCHED: SKIPN TIMEF ;HAS CLOCK GONE OFF SINCE LAST CALL?
\r
249 JRST CIP6 ;NO, JUST RESCHEDULE
\r
253 EXTERNAL TIME,MIDNIT,THSDAT,MONTAB
\r
256 EXTERNAL RTIME,TTIME,JOB
\r
257 SKIPN ITEM,JOB ;WAS LAST JOB NULL JOB?
\r
258 SKIPN POTLST ;YES-WAS IT A LOST TICK?
\r
259 JRST INCTIM ;NO-PROCEED NORMALLY
\r
260 AOS LSTWRD ;YES-INCREMENT LOST TIME COUNT
\r
261 SETZM POTLST ;AND CLEAR LOST TICK INDICATION
\r
262 INCTIM: AOS RTIME(ITEM) ;INCR, CURRENT JOB INCREMENTAL RUN TIME
\r
263 AOS TTIME(ITEM) ;INCR, CURRENT JOB TOTAL RUN TIME
\r
266 EXTERN USRREL,JBTKCT
\r
267 LDB TAC,[POINT 8,USRREL,25] ;GET NO. OF 1K BLOCKS-1FOR CURRENT USER
\r
268 ADDI TAC,1 ;MAKE IT NO. OF 1K BLOCKS
\r
269 ADDM TAC,JBTKCT(ITEM) ;ADD IN ACCUMULATED CORE RUNNING TIME PRODUCT
\r
270 ; (KILO-CORE TICKS)
\r
274 PUSHJ PDP,CHGHGH ;CHARGE USER FOR HIGH SEGMENT IF HE HAS ONE
\r
280 CAMGE TAC1,MIDNIT ;GONE PAST MIDNITE?
\r
282 CIP3: SETZB IOS,TIME ;YES, RESET TIME OF DAY
\r
283 AOS TAC,THSDAT ;UPDATE DAY
\r
287 CAMGE TAC,TAC1 ;END OF MONTH?
\r
290 ;PROCESS TIMING REQUESTS STORED IN QUEUE
\r
292 CIP2: HRRZ STOR,CLOCK ;GET END OF LIST
\r
293 CIP4: CAIN STOR,CIPWTM1 ;END YET?
\r
295 SOS TAC1, (STOR) ;DECREMENT TIMING REQUEST
\r
296 TRNE TAC1, 7777 ;TIME EXPIRED YET
\r
297 SOJA STOR, CIP4 ;NO, CONTINUE SCAN
\r
298 CONO PI, PIOFF ;YES, MOVE LAST ITEM IN LIST TO THIS
\r
303 LDB TAC, [POINT 6, TAC1, 23] ;GET 6 BIT DATA ITEM
\r
304 MOVSS TAC1 ;SETUP DISPATCH ADDRESS
\r
305 PUSH PDP, STOR ;SAVE ONLY VALUABLE AC
\r
306 PUSHJ PDP, (TAC1) ;AND DISPATCH TO TIMING REQUEST ROUTINE
\r
308 SOJA STOR, CIP4 ;GO BACK FOR MORE REQUESTS
\r
310 CIP5: SOSG HNGTIM ;DECREMENT HUNG ID DEVICE
\r
311 PUSHJ PDP,DEVCHK ;GO CHECK FOR HUNG ID DEVICES
\r
312 SKIPE COMCNT ;ANY COMMANDS TO PROCESS?
\r
313 PUSHJ PDP,COMMAND ;YES, CALL COMMAND DECODER
\r
314 CIP6: PUSHJ PDP,NXTJOB ;CALL SCHEDULER
\r
315 SETZM CLKFLG ;CLEAR CLK INTERRUPT FLAG
\r
316 ; SET ON ALL FORCED CLK INTERRUPTS
\r
317 SETZM TIMEF ;CLEAR TIME0 (1 JIFFY) INTERRUPT FLAG,
\r
318 SETZM SCHEDF ;CLEAR FORCED SCHEDULING FLAG
\r
319 CAMN ITEM,JOB ;IS NEXT JOB SAME AS LAST ONE?
\r
320 JRST CIP8 ;YES, JUST RESTORE ACS AND DISMISS
\r
322 ;DIFFERENT JOB. SAVE SOFTWARE STATE(HARDWARE ALREADY SAVED)
\r
324 EXTERNAL JOB,JOBDAT,JOBPRT,USRPRT,USRHCU,JOBJDA
\r
326 SKIPN JA,JOBDAT ;NULL JOB OR CORE 0 ON OLD JOB?
\r
327 JRST CIP7 ;YES, DO NOT SAVE SOFTWARE STATE
\r
328 MOVEI T,JOBPRT(JA) ;DEST,#FIRST LOC PROTECTED FROM USER
\r
329 HRLI T,USRPRT ;SOUR,#SYSTEM DATA STORAGE FOR CURRETN JOB
\r
330 SKIPL T1,USRHCU ;MOVE NO. OF OLD USER IO CHAN. IN USE
\r
331 CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT
\r
332 ; CLOBBER IF ADDRESS CHECKING MISSES)
\r
333 MOVEI T1,0 ;MOVE ONLY CHN 0 IF NEG, OR GR 17
\r
334 ; SAVGET SETS LH NEGATIVE DURING IO AS A FLAG
\r
335 ; SINCE IT DOES IO INTO AND OUT OF
\r
336 ; CHANNEL LOCATIONS (JOBJDA+1..,JOBJDA+17),
\r
337 ADD JA,T1 ;RELOCATE TO USER AREA
\r
338 BLT T,JOBJDA(JA) ; STOP WITH USER CHANNEL 0-1+C(USRHCU)
\r
340 ;RESTORE SOFTWARE STATE OF NEW JOB,THEN HARDWARE STATE
\r
342 INTERNAL NULJOB,NULADR
\r
343 EXTERNAL JOB,JBTDAT,JOBDAT,USRPRT,JOBPRT
\r
344 EXTERNAL JOBHCU,USRJDA,JOBENB,APRCHN,APRNUL,NULDAT,NULERR
\r
346 NULJOB: ;TRANSFER HERE FROM SYSINI WITH ITEM=0
\r
347 CIP7: MOVEM ITEM,JOB ;STORE NEW CURRENT JOB NUMBER
\r
348 NULADR: PUSHJ PDP,SETRL1 ;GO SETUP HARDWARE AND SOFTWARE RELOCATION
\r
349 ; INFORMATION FOR NEW CURRENT USER
\r
350 JUMPE ITEM,NULJB ;IS NEW JOB THE NULL JOB?
\r
353 SKIPN JA ;DOES JOB HAVE CORE ASSIGNED?
\r
354 HALT . ;NO -ELSE CLOBBER MONITOR
\r
356 MOVEI T,USRPRT ;NO, DEST,#PROTECTED AREA IN MONITOR
\r
357 HRLI T,JOBPRT(JA) ;SOURCE#FIRST PROTECT LOC. IN JB DATA AREA
\r
358 SKIPL T1,JOBHCU(JA) ;MOVE NO. OF USER IO CHAN. IN USE
\r
360 CAILE T1,17 ;MUST BE 17 OR LESS(IO MIGHT CLOBBER
\r
361 ; IF ADRRESS CHECKING MISSES
\r
362 MOVEI T1,0 ;MOVEJUST CHAN 0 IF NEG. OR GREATER THAN 17
\r
363 ; SAVEGET SETS NUG,DURING IO
\r
364 BLT T,USRJDA(T1) ;AND MOVE INTO MONITOR
\r
366 ;RESTORE HARDWARE STATE OF CURRENT JOB
\r
368 CIP8: SKIPN JA,JBTDAT(ITEM) ;JOB DATA AREA(IS THERE ONE?)
\r
369 MOVEI JA,NULDAT ;NO, MUST BE NULL JOB
\r
370 MOVSI 17,JOBDAC(JA) ;RESTORE DUMP ACS
\r
372 SKIPE APRERR ;DID AN ERROR OCCUR WHILE CLKPI IN PROGRESS
\r
373 ; (ON CLK PI OR HIGHER)
\r
374 JRST CLKERR ;YES, GO PROCESS ERROR
\r
375 SKIPN JOB ;IS THIS JOB THE NULL JOB?
\r
376 SKIPN NULERR ;YES, HAS AN ERROR OCCURED WHILE NULL JOB
\r
377 ; WAS RUNNING? IF YES, RESTORE ACS
\r
378 ; ILL UUO LOSED ACS
\r
379 JEN @USRPC ;DISMISS CHANNEL(IF INTERRUPT IN PROGRESS)
\r
382 ;RUNS IN USER MODE WITH PC=1 AND COUNTS AND AC 0
\r
384 EXTERNAL APRNUL,TIME,THSDAT,MIDNIT,NULERR
\r
387 IFN FTCHECK,<EXTERNAL MONPRTR,MONSUM,CHECK
\r
393 SETZB 0,NULERR ;CLEAR AC 0 USED FOR USUAL MONITORING
\r
395 ; CLEAR FLAG SAYING ERROR IN NULL JOB
\r
396 ; OF NULL TIME INTERVAL
\r
397 ; LOC JOBDAT (LOCATION OF NULL JOB DATA AREA) TO 0
\r
398 ; AS A FLAG (ONLY DUMP ACS USED IN NULL JOB DATA AREA)
\r
400 ; IF ANY ERRORS (APRERR NON-ZERO) OCCURRED
\r
401 ; WHILE CLK IN PROGRESS
\r
402 ; CATCH THEM NEXT CLK INTERRUPT
\r
403 MOVE 1,[AOJA 0,1] ;INSTR. TO AC1
\r
404 JRST 11,1 ;DISMISS IF INTERUPT IN PROGRESS.
\r
406 ;ROUTINE TO SET HARDWARE AND SOFTWARE RELOCATION INFORMATION FOR CURRENT USER
\r
408 ; CLOCK ROUTINE WHEN NEW USER IS DIRRERENT FROM OLD USER
\r
409 ; CORE ROUTINE WHEN CORE REASSIGNED FOR CURRENT USER
\r
415 ;CALL: STORE RELOCATION AND PROTECTION FOR LOW SEQ IN JOBADR(JOB NUMBER)
\r
416 ; STORE LENGTH-1 AND ABS ORIGIN FOR HIGH SEG IN JBTADR(HIGH SEG NO)
\r
417 ; (MOVE ITEM,JOB NUMBER - IF CALLING SETRL1)
\r
418 ; PUSHJ PDP,SETREL OR SETRL1
\r
419 ; ALWAYS RETURN, C(ITEM)=JOB NUMBER, C(PROG)=XWD PROT,RELOC, FOR LOW SEG
\r
422 EXTERN JOB,JBTADR,JOBADR,USRREL,JBTDAT,JOBDAT,JOBREL,KT10A
\r
424 SETREL: MOVE ITEM,JOB ;CURRENT JOB NUMBER
\r
426 SETRL1: MOVE PROG,JBTADR(ITEM) ;XWD PROTECTION,RELOCATION FOR LOW SEG
\r
427 MOVEM PROG,JOBADR ;SAVE TO MAKE UUO HANDLER FASTER
\r
428 HLRZM PROG,USRREL ;SAVE PROTECTION FOR ADDRESS CHECKING
\r
429 ; (HIGHEST LEGAL REL ADDRES FOR CURRENT USER IN LOW SET)
\r
431 MOVE JA,JBTDAT(ITEM) ;LOC OF JOB DATA AREA
\r
432 MOVEM JA,JOBDAT ;SAVE IT TOO FOR UUO HANDLER
\r
434 JUMPE PROG,SETHRD ;IF 0 (NULL JOB OR JOB DOING CORE 0 OR KJOB)
\r
435 ; DO NOT STORE IN JOB DATA AREA (SINCE IT WILL BE
\r
436 ; IN EXEC LOWER CORE. ALSO DO NOT STORE
\r
437 ; IN LOC 33, SO CAN SEE LAST REAL USER TO RUN
\r
439 HLRZM PROG,JOBREL(JA) ;SET PROTECTION IN USER JOB DATA AREA
\r
440 ; FOR HIM TO LOOK AT
\r
443 PUSHJ PDP,SETHGH ;SET UP FOR HIGH SEG, IF USER HAS ONE
\r
444 ; PROG SETUP FOR DATAO
\r
447 TLZ PROG,1777 ;CLEAR OUT PROTECTION FOR HIGH SEG
\r
448 ; JUST IN CASE THIS IS A 2 REG. MACHINE(EVEN THOGH
\r
449 ; SOFTWARE CANNOT HANDLE 2 SEGS)
\r
451 MOVEM PROG,KT10A ;STORE IN LOWER CORE SO IT CAN BE FOUND OUT
\r
452 ; USING SWITCHES WHAT IS IN SECOND REGISTER
\r
453 ; OPTION DOES NOT COME WITH PANEL LIGHTS
\r
454 ; SO NOT STORE 0 FOR NULL JOB SO CAN SEE
\r
455 ; LAST JOB TO RUN IN LOC 33
\r
457 SETHRD: DATAO APR,PROG ;SET APR HARDWARE FOR RELOCATION AND PROTECTION
\r
458 ; FOR LOW(AND HIGH SEGS)
\r
459 SKIPN PROG,JOBADR ;RESTORE PROG TO XWD PROT,RELOC FOR JUST LOW SEG
\r
461 TDZA TAC,TAC ;NO, MUST BE NULL JOB OR CORE0 OR KJOB
\r
462 ; SET FOR NO SPECIAL INTERRUTPS TO USER
\r
463 MOVE TAC,JOBENB(JA) ;USER APR CONSO FLAGS (THE ONES HE WANTS TO HANDLE
\r
464 ; FALL INTO SETAPR ROUTINE
\r
466 ;ROUTINE TO ENABLE/DISABLE APR FOR TRAPPING TO USER AND EXEC
\r
467 ;CALL: MOVE TAC, APR, CONSO FLAGS FOR USER TRAPPING
\r
469 ; RETUNRN WITH APR RESET AND INTERRUPT LOCATION CONS'S SET
\r
474 SETAPR: ANDI TAC,231010+APRFOV ;MASK OUT ALL BUT PD OVF, ILL MEM, NXM,
\r
475 ; CLOCK, FOV(ONLY PDP-10), AND AROVF CONSO FLAGS
\r
476 ; FOV=PC CHANGE ON PDP-6 WHICH IS NEVER ALLOWED
\r
477 ; UNDER TIME SHARING BECAUSE IT TRAPS MONITOR TOO
\r
478 HRLS TAC ;PRESERVE USER BITS IN LH
\r
479 TRO TAC,231000 ;MAKE SURE MONITOR ALWAYS LOOKING FOR
\r
480 ; PD OVF, IL;M, NXM, CLOCK FLAGS
\r
481 MOVE TAC1,TAC ;DUPLICATE BITS IN TAC1 FOR CONO TO APR
\r
482 XORI TAC1,110 ;COMPLEMENT FOV(PDP-10 ONLY) AND AROV FLAGS
\r
483 ADDI TAC1, 330 ;SET DISABLE OR ENABLE FOR EACH
\r
484 ANDI TAC1,660 ;MASK OUT ALL BUT DISABLE/ENABLE
\r
485 ; BITS FOR FOV(PDP-10 ONLY) AND AROVF
\r
486 CONO PI,PIOFF ;DISABLE PI'S SO NO INTS. MAY OCCUR WHILE
\r
487 ;CHANGING HARDWARE & SOFTWARE STATE FOR
\r
489 HLRM TAC,APRIN1 ;STORE USER BITS
\r
490 HRRM TAC,APRCON ;STORE EXEC BITS
\r
491 CONO APR,APRCHN(TAC1) ;ENABLE OR DISABLE APR FOR
\r
492 ; FOV(PDP-10 ONLY) AND AR OVF SEPARATELY
\r
493 CONO PI,PION ;ENABLE PI'S AGAIN
\r
496 SUBTTL RUNCSS - RUN CONTROL(STATRING AND STOPPING OF JOBS)
\r
498 ;RUN CONTROL IS A COLLECTION OF ROUTINES WHICH
\r
499 ;SET AND CLEAR BITS IN THE JOB STATUS WORDS OF
\r
500 ;ALL JOBS SO THAT THE SCHEDULER WILL START AND STOP
\r
503 ;COMMON ERROR STOPPING ROUTINES
\r
504 ;CALLED AT ANY LEVEL(UUO,CLK, OR INTERRUPT)
\r
505 ;CALL: MOVE ITEM,JOB CAUSING ERROR OR BEING STOPPED
\r
506 ; MOVE DEVDAT,ADDRESS OF THAT JOB TTYP DEVICE DATA BLOCK
\r
507 ; MOVE DAT,BYTE POINTER TO LAST CHAR, ALEADY MOVED
\r
508 ; :TO TTY OUTPUT BUFFER
\r
509 ; PUSHJ PDP,KSTOP,PHOLD,HOLD,OR ESTOP
\r
510 ; NEVER RETURN IF CALLED AT UUO LEVEL
\r
512 ;ROUTINE TO STOP JONB AFTER KJOB COMMAND
\r
513 ;CALLED AT UUO LEVEL IF JOB HAD CORE,CLK LEVEL IF NOT
\r
518 KSTOP: MOVSI TAC,JNA+JLOG+JACCT ;CLEAR JOB NUMBER ASSIGNED AND LOGGED IN BITS
\r
519 ANDCAM TAC,JBTSTS(ITEM)
\r
522 SETZM PRJPRG(ITEM) ;CLEAR PROJECT-PROGRAMMER NUMBER WHEN JOB LOGS OUT
\r
524 ; IF THIS IS THE LARGEST JOB IN USE,FIND NEXT
\r
525 ; HIGHEST AND SET HIGHJB
\r
526 CAMGE ITEM,HIGHJB ;IS THIS THE BIGGEST JOB NUMBER ASSIGNED?
\r
527 JRST ESTOP ;NO, LEAVE HOLD
\r
528 MOVSI TAC1,JNA ;YES,JOB NUMBER ASSGINED BIT
\r
529 HRRZ TAC,ITEM ;SCAN DOWNWARD
\r
530 TDNN TAC1,JBTSTS(TAC) ;IS JNA BIT SET FOR THIS JOB?
\r
531 SOJG TAC,-1 ;NO,KEEP LOOKING,FINISHED(TRUE IF THIS THE ONLY JOB
\r
532 MOVEM TAC,HIGHJB ;YES,STORE NEW HIGHEST JOB NUMBER ASSIGNED
\r
533 JRST ESTOP ;GO SET ERROR BIT
\r
535 ;ROUTINE TO STOP JOB, SET ERROR BIT AND PRINT MESSAGE
\r
536 ;THEM ADD ^TC<CRLF><CRLF><PERIOD>
\r
537 ;CALL: MOVEI TAC,ADR. OF MESSAGE
\r
542 PHOLD: PUSHJ PDP,CONMES ;MOVE MESSAGE TO TTY OUTPUT BUFFER
\r
544 ;ROUTINE TO STOP JOB, SET ERROR BIT.
\r
545 ;AND ADD "^C<CRLF><CRLF><PERIOD>
\r
547 INTERNAL HOLD,HOLD1
\r
550 HOLD: PUSHJ PDP,INLMES
\r
556 HOLD1: PUSHJ PDP,TTYSTC ;MAKE SURE TTY STAYS IN MONITOR MODE
\r
557 ; AND START TTYP TYPING OUTMESSAGE
\r
560 ;ROUTINE TO STOP USER AND FLAG AS ERROR STOP
\r
562 INTERNAL ESTOP,ESTOP1
\r
563 EXTERNAL JBTSTS,STUSER,STREQ,STAVAL
\r
564 EXTERNAL SCHEDF,JOB,CPOPJ
\r
566 ESTOP: JUMPE ITEM,CPOPJ ;IS THIS ERROR IN JOB 0?
\r
567 MOVSI TAC,JACCT ;NO, CLEAR ACCOUNTING BIT(IN CASE LOGGING
\r
568 ANDCAM TAC,JBTSTS(ITEM) ;IN OR OUT0 SO USER CAN USE CONTROL C
\r
570 ESTOP1: MOVSI TAC,JERR ;SSET ERROR BIT IN JOB STATUS WORD
\r
571 IORM TAC,JBTSTS(ITEM) ;SO JOB CAN NOT CONTINUE(CONT COM.)
\r
572 CAME ITEM,STUSER ;SYSTEM TAPE USER?
\r
574 MOVSI TAC,637163 ;FIND SYS DDB
\r
575 PUSHJ PDP,DEVSRC ;SYSTEM ERROR IF NOT FOUND
\r
578 PUSHJ PDP,RELEA9 ;YES, RELEASE SYSTEM TAPE WITHOUT WAITING
\r
580 ;ROUTINE TO STOP NY JOB FROM BEING SCHEDULED
\r
582 ; MOVE ITEM, JOB NUMBER
\r
584 ; EXIT ;RETURN HERE IMMEDIATELY, IF CALLED FROM HIGHER
\r
585 ;PRIORITY PI CHANNEL THAN CLK(LOWEST), OTHERWISE WHEN JOB IS RUNABLE
\r
586 ;CALLED FROM COMMAND DECODER WHEN <CONTROL>C TYPED IN BY USER
\r
587 ;OR ON ANY ERROR MESSAGE(SFE PREVIOUS PAGE)
\r
590 EXTERNAL JBTSTS,PJBSTS,REQTAB,JOB,STUSER,MAXQ,AVALTB
\r
592 STOP1: MOVSI TAC,RUN
\r
593 CONO PI,PIOFF ;DONE AT INTERRUPT LEVEL HIGHER THEN DT LEVEL
\r
594 CAME ITEM,STUSER ;IS THIS JOB CURRENTLY USING THE SYTEM TAPE?
\r
595 TDNN TAC,JBTSTS(ITEM) ;NO, IS RUN BIT OFF IN JOB STATUS WORD
\r
597 ANDCAM TAC,JBTSTS(ITEM) ;NO, SO CLEAR IT
\r
599 LDB TAC,PJBSTS ;GET JOB WAIT QUEUE CODE(IF ANY)
\r
600 CAIG TAC,MAXQ ;DOES STATE HAVE Q ?
\r
601 SOSL REQTAB(TAC) ;YES. REDUCE IT.
\r
603 SOSGE AVALTB(TAC) ;YES REDUCE COUNT
\r
604 SETZM AVALTB(TAC) ;CLEAR AVAL FLAG IF NO ONE WAITING
\r
605 STOP1A: CONO PI,PION ;MAKE SURE PI ON
\r
606 CAME ITEM, JOB ;NO. IS THIS JONB CURRENT USER
\r
614 JRST REQUE ;SET REQUE JOB FLAG
\r
616 SKIPL TAC,JBTSTS(ITEM) ;RUN FLAG OFF?
\r
617 TLNN TAC,JERR ;YES, ERROR FLAG ON?
\r
619 SETOM SCHEDF ;YES, FORCE RESCHEDULING EVEN IF JOB IN EXEC MODE
\r
620 JRST STOP2 ;YES, MAKE CLK RESCHEDULE ANOTHER JOB
\r
622 ;ROUTINE TO REQUE JOB WHICH HAS HAD A COMMAND TYPED
\r
623 ;WHICH NEEDS CORE AND THE CORE IMAGE IS ON THE DISK.
\r
624 ;OR IS IN CORE AND HAS ACTIVE DEVICES.
\r
625 ;CALLED FROM COMMAND DECODER
\r
626 ;CALL: MOVE ITEM,JOB NO.
\r
631 DLYCOM: MOVSI TAC,CMWB ;SET COMMAND WAIT BIT
\r
633 EXCH TAC,JBTSTS(ITEM)
\r
635 IORM TAC,JBTSTS(ITEM) ;IN JOB STATUS WORD
\r
645 ;ROUTINE TO PUT JONB IN NO CORE QUEUE
\r
648 IFN FTSWAP,<INTERNAL NOCORQ
\r
651 NOCORQ: MOVEI TAC,NUL1 ;NO JOB NO. OR NO CORE QUEUE
\r
656 ;ROUTINE TO SETUP MONITOR JOB TO RUN LATER AT UUO LEVEL
\r
657 ;CALLED BY COMMANDS WHICH MAY OR MAY NOT NEED TO
\r
658 ;RUN MONITOR JOB DEPENDING ON WHETHER JOB HAS CORE(KJOB,IJOB)
\r
659 ;TTY WILL REMAIN IN MONITOR MODE
\r
660 ;JOB MUST HAVE CORE ASSIGNED
\r
661 ;CALL: MOVE ITEM, JOB NUMBER
\r
662 ; MOVEI TAC1,ADDR. OF MONITOR JOB TO BE RUN
\r
664 ;WHEN SCHEDULED TO RUN, MONITOR JOB MUST SET UP ITS OWN ACS
\r
668 MONJOB: PUSHJ PDP,MSTART ;START WITH PC IN MONITOR
\r
669 JRST SETRUN ;SET TTY TO START JOB WHEN COMMAND RESPONSE
\r
670 ; IS FINISHED AND KEEP TTY IN MONITOR MODE
\r
672 ;ROUTINE TO SETUP ACS FOR MONITOR JOB STARTING AT UUO LEVEL
\r
673 ;SETS UP ITEM, WITH JOB NO.; PROG WITH RELOCATION, AND PDP
\r
674 ;WITH PUSH DOWN LIST ADR. IN JOB DATA AREA
\r
675 ;USED BY KJOB,CORE 0,SAVE,GET,RUN,R,REASSIGN AND FINISH COMMANDS
\r
676 ;CALL: MOVEI TAC1,MONITOR JOB START ADDRESS
\r
678 ; RETURN WITH ACS PDP,PROG,JDAT, AND ITEM SETUP
\r
681 EXTERNAL JOB,JBTADR,MJOBPD,JOBPDL,TTYFNU,JBTDAT
\r
683 MONSTR: MOVE ITEM,JOB ;CURRENT JOB NUMBER
\r
684 MOVE JDAT,JBTDAT(ITEM) ;ADR. OF JOB DATA AREA
\r
686 MOVE PROG,JBTADDR(ITEM) ;JOB RELOCATION
\r
688 MOVSI PDP,MJOBPD ;MINUS LENGTH OF SYSTEM PD LIST
\r
689 HRRI PDP,JOBPDL(JDAT) ;FIRST LOC.-1 OF PD LIST
\r
690 PUSH PDP,TAC1 ;SAVE STOP ADDRESS
\r
691 JRST (TAC) ;RETURN AND DO MONITOR JOB
\r
692 ; WITH TT DDB,OUTPUT BYTE POINTER, AND JOB NO.
\r
694 ;ROUTINE TO SET JOB STATE TO BE SCHEDULED TO RUN
\r
695 ;WITH SPECIFIED STARTING ADDRESS INCLUDING PC FLAGS
\r
696 ;CALLED ONLY WHEN JOB IN CORE AND AFTER JOB HAS BEEN
\r
697 ;SAFELY STOPPED IN ONE OF 3 STATES:
\r
698 ;1) PC IN USER MODE
\r
699 ;2) JOB IN A WAIT FOR SHARABLE DEVICE, OR IO WAIT
\r
700 ;3) JOB JUST ABOUT TO RETURN TO USER MODE FROM A UUO CALL
\r
701 ;CALL: MOVE TAC1,STARTING PC
\r
702 ; MOVE ITEM, JOB NUMBER
\r
703 ; MOVE JDAT,ADR. OF JOB DATA AREA WHICH MUST BE IN CORE
\r
704 ; PUSHJ PDP,USTART(PC TO USER MODE),MSTART(PC TO MONITOR MODE)
\r
705 ; RETURN HERE IMMEDIATELY
\r
707 INTERNAL MSTART,USTART
\r
708 EXTERNAL JOBPC,JOBDAC,JOBD17,TTYSET,JOBOPC,JOBPD1
\r
710 USTART: MOVE TAC,JOBPC(JDAT) ;GET OLD PC
\r
711 TLNE TAC,USRMOD ;IS IT IN USER MODE TOO?
\r
712 JRST USTRT1 ;YES, DUMP ACS AND PC FLAGS ARE ALREADY HIS
\r
714 MOVEI TAC,JOBDAC(JDAT) ;NO. MOVE USERS(UUO) ACS TO DUMP ACS
\r
715 HRL TAC,JDAT ;SOURCE=REL, 0,DEST,=JOBDAC IN JOB DATA AREA
\r
716 BLT TAC,JOBD17(JDAT) ;MOVE ALL ACS
\r
717 MOVE TAC,JOBPD1(JDAT) ;UUO PC HAS LAST PC
\r
718 HRRI TAC,-1(TAC) ;SUBTRACT 1 FROM RIGHT HALF AND
\r
719 ; PRESERVE LH PC FLAGS
\r
720 ; (RH=0 ON HALT 0 OR FIRST START)
\r
721 USTRT1: MOVEM TAC,JOBOPC(JDAT) ;STORE OLD PC FOR USER TO LOOK AT
\r
722 HLL TAC1,TAC ;PRESERVE USER APR FLAGS
\r
723 TLO TAC1,USRMOD ;MAKE SURE NEW PC IN USER MODE
\r
724 TLZ TAC1,37 ;MAKE SURE NO INDIRECT BITS OR INDEX FIELD
\r
726 MSTART: MOVEM TAC1,JOBPC(JDAT) ;STORE NEW PC
\r
727 MOVSI TAC,JERR+WTMASK
\r
728 ANDCAM TAC,JBTSTS(ITEM) ;CLEAR ERROR AND WAIT STATUS BITS
\r
729 ;SET TTY STATE TO INITAL COND.
\r
730 ; TTYUSR OR TTYURC SHOULD BE CALLED
\r
731 ; TO INDICATE WHETHER TTY TO USER OR EXEC MODE
\r
732 ; AND THAT JOB IS TO RUN(RUN BIT =1) WHEN
\r
733 ; MONITOR COMMAND RESPONSE FINISHES.
\r
736 ;ROUTINE TO SET JOB STATUS RUN BIT(RUN)
\r
737 ;CALLED BY SCANNER SERVICE WHEN TTY MONITOR COMMAND
\r
738 ;RESPONSE FINISHES, THIS ACTION IS ENABLED BY CALLING
\r
739 ;TTYUSR. OR TTYURC IN SCNSER
\r
740 ;CALL: MOVE ITEM,JOB NUMBER
\r
744 EXTERNAL JBTSTS,PJBSTS,REQTAB,AVALTB,RNQUNT
\r
747 SETRUN: LDB TAC,PJBSTS ;GET JOB STATUS WAIT QUEUE CODE
\r
748 CAILE TAC,MAXQ ;DOES JOB STATUS CODE HAVE A QUEUE?
\r
750 AOSLE REQTAB(TAC) ;ADD TO REQUEST COUNT
\r
751 JRST SETR1 ;OTHERS WAITING?
\r
752 AOSG AVALTB(TAC) ;MAKE AVAILABLE
\r
753 SETOM AVALTB(TAC) ;FLAG AS JUST AVAILABLE, BECAUSE
\r
754 ; NO JONB WAS USING DEVICE. SCHEDULER
\r
755 ; WILL SCAN THIS QUEUE
\r
756 SETR1: MOVSI TAC,RUN ;SET RUN BIT IN JOB STATUS WORD
\r
757 IORM TAC,JBTSTS(ITEM)
\r
758 SETR2: MOVE TAC,RNQUNT ;SET QUANTUM TIME TO RUN QUEUE QUANTUM
\r
759 HRRM TAC,JBTSTS(ITEM) ;RUN QUEUE QUANTUM
\r
763 JRST NULTST ;GO SEE IF NULL JOB IS RUNNING
\r
767 EXTERNAL QJOB,JBTSTS
\r
769 REQUE: MOVSI TAC,JRQ ;MARK JOB TO BE REQUEUED WITH JRQ BIT
\r
770 TDNN TAC,JBTSTS(ITEM) ;INCREMENT COUNT ONLY ONCE FOR EACH JOB
\r
771 AOS QJOB ;INCREMENT COUNT OF NO. OF JOBS WAITING TO BE REUEUED
\r
773 IORM TAC,JBTSTS(ITEM) ;SET REQUE BIT FOR SCHEDULER
\r
778 ;ROUTINE TO PUT A JOB TO SLEEP AND WAKE UP AGAIN LATER
\r
779 ;CALLED AFTER CLOCK QUEUE REQUEST PUT IN BY UUO ROUTINE
\r
785 EXTERNAL JBTSTS,SLPQ
\r
787 SETSLP: MOVSI TAC,CLKR ;FLAG THAT A CLOCK REQUEST HAS BEEN PUT IN
\r
788 IORM TAC,JBTSTS(ITEM) ;SO ONLY ONE PER JOB
\r
789 MOVEI AC1,SLPQ ;SLEEP STATE CODE
\r
790 JRST SETSTT ;SET STATUS AND RESCHEDULE
\r
792 ;HERE AT CLOCK LEVEL WHEN CLOCK REQUEST TIMES OUT FOR SLEEP
\r
797 EXTERNAL PJSTS,RNQ,SLPQ
\r
799 WAKE: MOVEI TAC1,RNQ ;RUN QUEUE CODE
\r
800 MOVE ITEM,TAC ;JOB NO.
\r
801 MOVSI TAC,CLKR ;CLEAR CLOCK REQUEST BIT FOR THIS JOB
\r
802 ANDCAM TAC,JBTSTS(ITEM) ;SO IT CAN PUT ANOTHER ONE IN
\r
803 LDB TAC,PJBSTS ;GET QUEUE CODE
\r
804 CAIE TAC,SLPQ ;IS JOB STILL SLEEPING?
\r
805 POPJ PDP, ;NO, RETURN TO CLOCK ROUTINE
\r
806 DPB TAC1,PJBSTS ;YES, STORE RUN QUEUE CODE
\r
807 ; (CONTROL C, START CAN GET JOB OUT SLEEP)
\r
811 ;ROUTINE TO GET DATA CONTROL AND ANOTHER SHARABLE DEVICE
\r
812 ;JOB NEVER GETS ONE DEVICE AND WAITS FOR SECOND, SINCE TYPING
\r
813 ;CONTROL C WOULD NEVER FINISH WITH FIRST DEVICE
\r
814 ;CALL PUSHJ PDP,GETDCXX
\r
815 ; AOSE XXREQ ;REQUEST COUNT FOR OTHER DEVICE
\r
816 ; RETURN WHEN BOTH AVAILABLE
\r
818 INTERNAL GETDCDT,GETDCMT
\r
819 EXTERNAL DCREQ,REQTAB,AVALTB,DCAVAL,CPOPJ1
\r
822 XCT @(PDP) ;INCREASE SHARABLE DEVICE REQ. COUNT
\r
823 GETWT: PUSHJ PDP,DVWAT1 ;NOT AVAIL., GO WAIT FOR IT
\r
824 AOSN DCREQ ;IS DATA CONTROL AVAILABLE?
\r
825 JRST CPOPJ1 ;YES, RETURN BOTH AVAILABLE
\r
826 MOVE AC1,@(PDP) ;DATA CONTROL NOT AVAILABLE
\r
828 SOSL REQTAB(AC1) ;REDUCE REQ. COUNT FOR OTHER
\r
830 SETOM AVALTB(AC1) ;SET AVAILABLE IF OTHER JOBS WAITING
\r
831 JFCL DCREQ ;ARGUMENT FOR DCQAIT
\r
832 PUSHJ PDP,DCWAIT ;WAIT FOR DATA CONTROL FREE
\r
833 MOVE AC1,@(PDP) ;INCREMENT REQ. COUNT
\r
834 AOSN @AC1 ;NOW IS SHARABLE DEVICE FREE?
\r
836 SOSL DCREQ ;NO, REDUCE DATA CONTROL REQUEST
\r
837 SETOM DCAVAL ;SET AVAIL., SOME OTHER JOB WAITING FOR IT
\r
838 JRST GETWT ;TRY AGAIN
\r
840 ;ROUTINE TO WAIT FOR A SHARABLE DEVICE
\r
841 ;CALLED AT UUO LEVEL ONLY BY DEVICE SERVICE ROUTINES
\r
842 ;CALL: AOSLE XXREQ ;ADD 1 TO SHARABLE DEVICE REQUEST COUNT
\r
843 ; ;IS DEVICE AVAILABLE?
\r
844 ; PUSHJ PDP,XXWAIT ;NO, PUT JOB IN WAIT QUEUE
\r
845 ; RETURN WHEN DEVICE AVAILABLE
\r
847 ;INITIALLY THE REQUEST COUNT IS -N, WHERE N IS THE
\r
848 ;NUMBER OF JOBS WHICH CAN USE THE SHARABLE DEVICE AT THE SAME TIME
\r
849 ;A REQUEST COUNT OF 0 MEANS THE MAXIMUM NO. OF JOBS ARE
\r
850 ;USING THE DEVICE, A POSITIVE NUMBER IS THE
\r
851 ;NUMBER OF JOBS WAITING IN THE SHARABLE DEVICE WAIT QUEUE
\r
854 INTERNAL MTWAIT,STWAIT,DTWAIT,DCWAIT,DAWAIT,MQWAIT,AUWAIT
\r
855 EXTERNAL JOB,REQTAB
\r
857 MTWAIT:DTWAIT:DCWAIT:STWAIT:DAWAIT:MQWAIT:AUWAIT:
\r
859 DVWAIT: MOVE AC1,(PDP) ;GET ADR. OF CALLER
\r
860 MOVE AC1,-2(AC1) ;GEET AOSLE XXREQ INSTRUCTION
\r
862 DVWAT1: MOVE AC1,@-1(PDP) ;GET ADR. OF CALLER OF THIS ROUTINE
\r
863 SUBI AC1,REQTAB ;COMPUTE WAIT-STATE QUEUE CODE
\r
864 SETSTT: MOVE AC3,JOB ;CURRENT JOB NO.
\r
865 DPB AC1,PJBS1 ;STORE IN JOB STATUS WORD
\r
866 JRST WSCHED ;GO SCHEDULE ANOTHER AND RETURN TO CALLER
\r
867 ; WHEN SHARABLE DEVICE BECOMES AVAILABLE
\r
868 ; SEE CLOCK AND CLKCSS
\r
870 PJBS1: POINT JWSIZ,JBTSTS(AC3),JWPOS ;BYTE POINTER TO JOB STATUS
\r
871 ; WORD WAIT QUEUE CODE
\r
873 ;ROUTINE TO SET JOB TO RUN AFTER IT HAS BEEN STOPPED
\r
874 ;BECAUSE IT HAD TO WAIT FOR IO TO COMPLETE FOR SOME DEVICE
\r
875 ;EACH SERVICE ROUTINE WILL AT INTERRUPT LEVEL
\r
876 ;CHECK EACH TIME IT FINISHED A TASK(RUNFFERFUL)
\r
877 ;TO SEE IF THE JOB USING THE DEVICE HAS
\r
878 ;PREVIOUSLY CAUGHT UP WITH DEVICE AND HAS BEEN STOPPED
\r
879 ;CALL: MOVE DEVDAT,ADR, OF DEVICE DATA BLOCK
\r
880 ; MOVE IOS,DEVIOS(DEVDAT) ;GET DEVICE IO STATUS WORD FROM DDB
\r
881 ; TLZE IOS,IOW ;IS JOB AN IO WAIT FOR THIS DEVICE?
\r
882 ; PUSHJ PDP,SETIOD ;YES, GO FLAG JOB TO START UP AGAIN
\r
884 ;SETS THE JOB QUEUE WAIT CODE TO WSQ IN JOB STATUS WORD,
\r
885 ;THE SCHEDULER THEN SEES THAT THIS JOB HAS ITS
\r
886 ;IO WAIT SATISFIED AND IS WAITING TO BE RUN AGAIN
\r
888 INTERNAL SETIOD,STTIOD
\r
889 EXTERNAL WSQ,WSAVAL,TSQ,TSAVAL,JOB,PJOBN
\r
891 PJBS2: POINT JWSIZ,JBTSTS(TAC),JWPOS ;BYTE POINTER TO JOB STATUS
\r
893 STTIOD: MOVEI TAC1,TSQ ;SET TTY IO WAIT SATISFIED QUEUE CODE
\r
896 SETIOD: MOVEI TAC1,WSQ ;REQUE TO WAIT SATISFIED Q
\r
897 AOS WSAVAL ;INCR, NO, OF JOBS WITH IO WAIT
\r
898 ; SATISFIED, NON-ZERO WSAVAL WILL
\r
899 ; CAUSE SCHED, TO SCAN FOR IO
\r
900 SETIO1: LDB TAC,PJOBN
\r
901 DPB TAC1,PJBS2 ;IN JOB STATUS WORD
\r
907 MOVSI TAC1,JRQ ;SET JOB TO BE REQUEUED AT NEXT CLOCK TICK
\r
908 TDNN TAC1,JBTSTS(TAC) ;IS REQUE BIT ALREADY ON?
\r
909 AOS QJOB ;NO, INCREMENT COUNT ONCE FOR EACH JOB
\r
910 IORM TAC1,JBTSTS(TAC) ;SET REQUEUEING BIT FOR SCHEDULER
\r
912 NULTST: SKIPE JOB ;IS NULL JOB RUNNING?
\r
913 POPJ PDP, ;NO LET OTHER JOB RUN TILL SCHEDULER IS TRAPPED TO
\r
915 ;ROUTINE TO CAUSE CLK TO ROUTINE TO RESCHEDULE
\r
916 ;CALLED AT ANY LEVEL
\r
917 ;CALL: PUSHJ PDP,STOP2
\r
918 ; RETURN IMMEDIATELY EXCEPT IF AT UUO LEVEL
\r
919 ; IF AT UUO LEVEL, RETURN WHEN JOB IS RUNABLE AGAIN
\r
922 EXTERNAL PICLK,CLKFLG
\r
924 STOP2: CONO PI,PIOFF ;PREVENT CLOCK INTERRUPT DURING STOP2 CODE
\r
925 SETOM CLKFLG ;SET FLAG TO INDICATE CLK INTERRUPT
\r
926 ; EVEN THOUGH CLK INTERRUTP IS NOT A ATIME INTERRUPT
\r
927 CONO PI,PICLK ;TURN PI BACK ON AND REQUESST INTERRUPT TO
\r
928 ; CLK PI CHANNEL(LOWEST PRIORITY CHANNEL)
\r
929 POPJ PDP, ;INTERRUPT IMMEDIATELY IF AT UUO LEVEL
\r
931 ;ROUTINE TO WAIT TILL DEVICE CATCHES UP WITH USER AND BECOMES INCTIVE
\r
934 , EXIT ALWAYS RETURN HERE
\r
936 ,IF DEVICE IS INACTIVBE (IOACT=0), RETURNS TO EXIT, OTHERWISE, SETS
\r
937 ,IOW:=1 AND ENTERS WAIT UNLESS IOCT BECOMES ZERO BEFORE THE
\r
938 ,JUMP IS MADE, IN WHICH CASE IT SETS IOW:=0 AND RETURNS TO EXIT,
\r
939 ,ON LEAVING THE WIAT STATE, RETURNS TO EXIT.
\r
940 ,THIS ROUTINE PREVENTS THE STATE IOACT=0 AND IOW=1 FROM OCCURING
\r
943 , EXIT ALWAYS RETURNS HERE
\r
944 ,SETS IOW:=1 AND ENTERS WAIT ROUTINE. RETURNS TO EXIT WHEN IOACT=0
\r
948 WAIT1: MOVE IOS,DEVIOS(DEVDAT)
\r
949 TRNN IOS, IOACT ;IS DEVICE ACTIVE? (IOACT=1?)
\r
951 PUSHJ PDP,WSYNC ;WAIT
\r
954 ;WSYNC IS CALLED TO WAIT UNTIL SETIOD IS CALLED BY INTERRUPT SERVICE ROUTINE
\r
955 ;IE UNTIL CURRENT BUFFER ACTIVITY IS COMPLETE
\r
956 ;CALLED ONLY FROM UUO LEVEL
\r
957 ;CALL: MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK
\r
959 ; RETURN IMMEDIATELY IF DEVICE IS INACTIVE
\r
960 ; RETURN WHEN DEVICE FINISHES NEXT BUFFER IF IT IS ACTIVE
\r
963 EXTERNAL IOWQ,TIOWQ,PION,PIOFF
\r
965 WSYNC: MOVSI IOS,IOW ;SETUP DEVICE IO WAIT BIT
\r
966 MOVEI AC1,IOWQ ;IO WAIT STATE CODE
\r
967 MOVE AC3,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS
\r
968 TLNE AC3,DVTTY ;IS THIS DEVICE A TTY?
\r
969 MOVEI AC1,TIOWQ ;YES, SET TTY WAIT STATE CODE
\r
970 MOVE AC3,JOB ;CURRENT JOB NO.
\r
972 MOVEI AC2,IOACT ;DEVICE ACTIVE BIT
\r
973 CONO PI, PIOFF ;TURN PI OFF
\r
974 TDNN AC2,DEVIOS(DEVDAT) ;IS THE DEVICE ACTIVE?
\r
976 IORM IOS,DEVIOS(DEVDAT) ;YES, SET DEVICE IO-WAIT BIT
\r
977 ; AND SETUP IOS FOR RETURN WHEN WAIT SATISFIED
\r
978 DPB AC1,PJBS1 ;SET JOB WAIT STATE CODE
\r
979 ; IN JOB STATUS WORD
\r
980 CONO PI, PION ;TURN PI ON
\r
981 PUSHJ PDP,WSCHED ;CALL SCHEDULER TO FIN ANOTHER JOB TO RUN
\r
982 ; RETURN WHEN NEXT BUFFERFUL IS FINISHED
\r
983 ; WITH ACS 0-14 OCTAL RESTORED
\r
984 ; RETURN WHEN IO-WAIT FINISHED
\r
985 WSYNC1: CONO PI, PION
\r
986 ANDCAB IOS, DEVIOS(DEVDAT) ;CLEAR DEVIVCE IO-WAIT BIT
\r