eff0f894fe85a4121de3cd43f274200be63829f9
[retro-software/dec/tops10/v4.5.git] / src / clock1.mac
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
3 XP VCLOCK1,412\r
4                 ; PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
5 \r
6         ENTRY CLOCK1    ;ALWAYS LOAD CLOCK1 IF LIBRARY SEARCH\r
7 CLOCK1:\r
8 \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
13 \r
14 EXTERNAL TIME,TIMEF,CLKFLG,REQCLK,APRCHL,APRPC,UPTIME\r
15 EXTERNAL JOBDAT,JOBTPC,JOBCNI,JOBAPR,APRERR,SCHEDF\r
16 \r
17 EXTERNAL APRILM,COMMAN,CONMES,DEVCHK,DEVSRC,ERROR,INLMES\r
18 EXTERNAL RELEA9,CRSHWD,CRASHX\r
19 \r
20 INTERNAL        FTTTYSER        ;THIS ROUTINE MAY BE ASSEMBLED TO WORD  EITHER\r
21                                 ; THE OLD SCNSER OR THE NEW TTYSER.\r
22 \r
23 INTERNAL FTCHECK,FTMONP\r
24 \r
25 IFN FTCHECK+FTMONP,<\r
26 EXTERNAL DATA,APRCON,APRIN1,CLKS17,DAMESS,UUO0,CLOCK\r
27 INTERNAL UUO1\r
28 >\r
29 IFE FTCHECK+FTMONP,<\r
30         INTERN CLOCK,DAMESS\r
31         EXTERN CIPWTM\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
36 \r
37 CLOCK:  POINT 36,CIPWTM,35      ;BYTE POINTER TO CLOCK REQ QUEUE\r
38 >\r
39 \f\r
40         INTERN APRINT\r
41 \r
42 APRINT: JRST APRPAR             ;ALWAYS CHECK APR AND PI DEVICES\r
43         JRST .                  ;CHECK OTHER DEVICES\r
44 \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
51                                 ; ON CONTINUE\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
71 \r
72 ;HERE ON CLOCK FLAG AND IT OR SOME OTHER FLAG IS ON WHICH USERS WANTS\r
73 \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\r
80 ;OTHER APR INTERRUPTS BESIDES CLOCK\r
81 \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
88 \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
99 \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
106 \f\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
119 IFN FTHALT,<\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
123 >\r
124         JRST    APRER3          ;NO,MUST BE UUO LEVEL(OR USER MODE AND\r
125                                 ; MEMORY DROPPED OUT)\r
126 \f\r
127 SUBTTL  CLOCK - LOW PRIORITY CLOCK SERVICE(CLK)\r
128 \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
138 \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
146 \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
151 \r
152 STOR=DAT\r
153 T=TAC\r
154 T1=TAC1\r
155 JA=JDAT\r
156 \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
159 ;HAVE OCCURRED\r
160 \r
161 ;TO MAKE A REQUEST:\r
162 ;       CONO PI,PIOFF\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
170 \r
171 INTERNAL CLKINI\r
172 EXTERNAL CIPWTM1,PION,PIOFF\r
173 \r
174 CLKINI: MOVEI TAC,CIPWTM1       ;SETUP CLOCK QUEUE BYTE POINTER\r
175         HRRM TAC,CLOCK          ;LH NEVER CHANGES(36 BIT BYTE)\r
176         POPJ PDP,\r
177 \f\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
181 \r
182 INTERNAL WSCHED\r
183 EXTERNAL JOBD14,JOBDAC,USRPC,JOBD16,NULPDL\r
184 \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
190 \r
191         JRST RSCHED             ;GO RESCHEDULE\r
192 \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
197 ;               IN EXEC MODE\r
198 \r
199 ;CALL:  PUSHJ PDP,USCHED        ;FROM UUOCON(UUO HANDLER RETURN TO USER)\r
200 ;       RETURN HERE WHEN RUNABLE\r
201 \r
202 INTERNAL USCHED\r
203 EXTERNAL JOBDPG,JOBDPD,USRPC\r
204 \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
209 \f\r
210 ;HERE AT CLK INTERRUPT LEVEL\r
211 \r
212 INTERNAL CLKINT\r
213 INTERNAL FTTIME\r
214 EXTERNAL CLKFLG,JOBD17,CLKCHL,SCHEDF,JOBADR,JOBD16,JOBDAC\r
215 EXTERNAL JOBD15,JOBPD1,MJOBP1,APRERR,NULDAT,NULPDL\r
216 \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
221         TLNN 17,USRMOD\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
225         JEN @CLKCHL\r
226 \r
227 SAVPC:  MOVEM 17,USRPC          ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\r
228 \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
243                                 ; FLAG IMMEDIATELY\r
244 \f\r
245 EXTERNAL COMCNT,NXTJOB,HNGTIM,POTLST,LSTWRD\r
246 EXTERNAL TIMEF,APRERR,CLKFLG,SCHEDF,JDB,PMONTB\r
247 \r
248 RSCHED: SKIPN TIMEF     ;HAS CLOCK GONE OFF SINCE LAST CALL?\r
249         JRST CIP6       ;NO, JUST RESCHEDULE\r
250 \r
251 ;TIME ACCOUNTING\r
252 \r
253 EXTERNAL TIME,MIDNIT,THSDAT,MONTAB\r
254 \r
255 IFN FTTIME,<\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
264 >\r
265 IFN FTKCT,<\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
271 \r
272 IFN FT2REL,<\r
273         EXTERN CHGHGH\r
274         PUSHJ PDP,CHGHGH        ;CHARGE USER FOR HIGH SEGMENT IF HE HAS ONE\r
275 >\r
276 >\r
277 ;MIDNITE CHECK\r
278 \r
279         MOVE TAC1,TIME\r
280         CAMGE TAC1,MIDNIT       ;GONE PAST MIDNITE?\r
281         JRST CIP2               ;NO\r
282 CIP3:   SETZB IOS,TIME          ;YES, RESET TIME OF DAY\r
283         AOS TAC,THSDAT          ;UPDATE DAY\r
284         IDIVI TAC,^D31\r
285         DIVI IOS,^D12           ;NO.\r
286         LDB TAC,PMONTB\r
287         CAMGE TAC,TAC1          ;END OF MONTH?\r
288         JRST CIP3               ;YES.\r
289 \f\r
290 ;PROCESS TIMING REQUESTS STORED IN QUEUE\r
291 \r
292 CIP2:   HRRZ STOR,CLOCK         ;GET END OF LIST\r
293 CIP4:   CAIN STOR,CIPWTM1       ;END YET?\r
294         JRST CIP5               ;YES\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
299         MOVE TAC, @CLOCK\r
300         SOS CLOCK\r
301         MOVEM TAC, (STOR)\r
302         CONI PI,PION\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
307         POP PDP, STOR\r
308         SOJA STOR, CIP4         ;GO BACK FOR MORE REQUESTS\r
309 \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
321 \f\r
322 ;DIFFERENT JOB. SAVE SOFTWARE STATE(HARDWARE ALREADY SAVED)\r
323 \r
324 EXTERNAL JOB,JOBDAT,JOBPRT,USRPRT,USRHCU,JOBJDA\r
325 \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
339 \f\r
340 ;RESTORE SOFTWARE STATE OF NEW JOB,THEN HARDWARE STATE\r
341 \r
342 INTERNAL NULJOB,NULADR\r
343 EXTERNAL JOB,JBTDAT,JOBDAT,USRPRT,JOBPRT\r
344 EXTERNAL JOBHCU,USRJDA,JOBENB,APRCHN,APRNUL,NULDAT,NULERR\r
345 \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
351 \r
352 IFN FTHALT,<\r
353         SKIPN JA                ;DOES JOB HAVE CORE ASSIGNED?\r
354         HALT .                  ;NO -ELSE CLOBBER MONITOR\r
355 >\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
359         \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
365 \r
366 ;RESTORE HARDWARE STATE OF CURRENT JOB\r
367 \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
371         BLT 17,17\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
380 \r
381 ;THE NULL JOB\r
382 ;RUNS IN USER MODE WITH PC=1 AND COUNTS AND AC 0\r
383 \r
384 EXTERNAL APRNUL,TIME,THSDAT,MIDNIT,NULERR\r
385 \r
386 NULJB:\r
387 IFN FTCHECK,<EXTERNAL MONPRTR,MONSUM,CHECK\r
388         MOVE TAC,MONPTR\r
389         PUSHJ PDP,CHECK\r
390         CAME TAC1,MONSUM\r
391         HALT .+1\r
392 >\r
393         SETZB 0,NULERR  ;CLEAR AC 0 USED FOR USUAL MONITORING\r
394 \f\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
399 \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
405 \f\r
406 ;ROUTINE TO SET HARDWARE AND SOFTWARE RELOCATION INFORMATION FOR CURRENT USER\r
407 ;CALLED FROM:\r
408 ;       CLOCK ROUTINE WHEN NEW USER IS DIRRERENT FROM OLD USER\r
409 ;       CORE ROUTINE WHEN CORE REASSIGNED FOR CURRENT USER\r
410 ;       CORE UUO\r
411 ;       REMAP UUO\r
412 ;       CALL RESET UUO\r
413 ;       CALL SETUWP UUO\r
414 \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
420 \r
421         INTERN SETREL\r
422         EXTERN JOB,JBTADR,JOBADR,USRREL,JBTDAT,JOBDAT,JOBREL,KT10A\r
423 \r
424 SETREL: MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
425 \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
430 IFN JDAT-PROG,<\r
431         MOVE JA,JBTDAT(ITEM)    ;LOC OF JOB DATA AREA\r
432         MOVEM JA,JOBDAT         ;SAVE IT TOO FOR UUO HANDLER\r
433 >\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
438 \r
439         HLRZM PROG,JOBREL(JA)   ;SET PROTECTION IN USER JOB DATA AREA\r
440                                 ; FOR HIM TO LOOK AT\r
441 IFN FT2REL,<\r
442         EXTERN SETHGH\r
443         PUSHJ PDP,SETHGH        ;SET UP FOR HIGH SEG, IF USER HAS ONE\r
444                                 ; PROG SETUP FOR DATAO\r
445 >\r
446 IFE FT2REL,<\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
450 >\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
456 \f\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
460                                 ; (IS THERE ONE)?\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
465 \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
468 ;       PUSHJ PDP,SETAPR\r
469 ;       RETUNRN WITH APR RESET AND INTERRUPT LOCATION CONS'S SET\r
470 \r
471         INTERN SETAPR\r
472         EXTERN APRFOV\r
473 \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
488                                 ;APR TRAPPING\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
494         POPJ PDP,\r
495 \f\r
496 SUBTTL  RUNCSS - RUN CONTROL(STATRING AND STOPPING OF JOBS)\r
497 \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
501 ;THEM ACCORDINGLY\r
502 \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
511 \r
512 ;ROUTINE TO STOP JONB AFTER KJOB COMMAND\r
513 ;CALLED AT UUO LEVEL IF JOB HAD CORE,CLK LEVEL IF NOT\r
514 \r
515 INTERNAL KSTOP\r
516 EXTERNAL HIGHJB\r
517 \r
518 KSTOP:  MOVSI TAC,JNA+JLOG+JACCT        ;CLEAR JOB NUMBER ASSIGNED AND LOGGED IN BITS\r
519         ANDCAM TAC,JBTSTS(ITEM)\r
520 IFN FTLOGIN,<\r
521 EXTERN PRJPRG\r
522         SETZM PRJPRG(ITEM)      ;CLEAR PROJECT-PROGRAMMER NUMBER WHEN JOB LOGS OUT\r
523 >\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
534 \f\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
538 ;       PUSHJ PDP,PHOLD\r
539 \r
540         INTERN PHOLD\r
541 \r
542 PHOLD:  PUSHJ PDP,CONMES        ;MOVE MESSAGE TO TTY OUTPUT BUFFER\r
543                                 ; FALL INTO HOLD\r
544 ;ROUTINE TO STOP JOB, SET ERROR BIT.\r
545 ;AND ADD "^C<CRLF><CRLF><PERIOD>\r
546 \r
547 INTERNAL HOLD,HOLD1\r
548 EXTERNAL TTYSTC\r
549 \r
550 HOLD:   PUSHJ PDP,INLMES\r
551         ASCIZ /\r
552 ^C\r
553 \r
554 ./\r
555 \r
556 HOLD1:  PUSHJ PDP,TTYSTC        ;MAKE SURE TTY STAYS IN MONITOR MODE\r
557                                 ; AND START TTYP TYPING OUTMESSAGE\r
558                                 ; FALL INTO ESTOP\r
559 \f\r
560 ;ROUTINE TO STOP USER AND FLAG AS ERROR STOP\r
561 \r
562 INTERNAL ESTOP,ESTOP1\r
563 EXTERNAL JBTSTS,STUSER,STREQ,STAVAL\r
564 EXTERNAL SCHEDF,JOB,CPOPJ\r
565 \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
569                                 ; TO RECOVER\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
573         JRST STOP1              ;NO\r
574         MOVSI TAC,637163        ;FIND SYS DDB\r
575         PUSHJ PDP,DEVSRC        ;SYSTEM ERROR IF NOT FOUND\r
576         JSP DAT,ERROR\r
577 \r
578         PUSHJ PDP,RELEA9        ;YES, RELEASE SYSTEM TAPE WITHOUT WAITING\r
579 \f\r
580 ;ROUTINE TO STOP NY JOB FROM BEING SCHEDULED\r
581 ;CALL:\r
582 ;       MOVE ITEM, JOB NUMBER\r
583 ;       PUSHJ PDP, STOP1\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
588 \r
589 INTERNAL STOP1\r
590 EXTERNAL JBTSTS,PJBSTS,REQTAB,JOB,STUSER,MAXQ,AVALTB\r
591 \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
596         JRST STOP1A             ;YES\r
597         ANDCAM TAC,JBTSTS(ITEM) ;NO, SO CLEAR IT\r
598         CONO PI,PION\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
602         JRST STOP1A             ;NO\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
607 \r
608 INTERNAL FTSWAP\r
609 \r
610 IFE FTSWAP,<\r
611         POPJ PDP,               ;NO\r
612 >\r
613 IFN FTSWAP,<\r
614         JRST REQUE              ;SET REQUE JOB FLAG\r
615 >\r
616         SKIPL TAC,JBTSTS(ITEM)  ;RUN FLAG OFF?\r
617         TLNN    TAC,JERR        ;YES, ERROR FLAG ON?\r
618         JRST    STOP2           ;NO\r
619         SETOM   SCHEDF          ;YES, FORCE RESCHEDULING EVEN IF JOB IN EXEC MODE\r
620         JRST STOP2              ;YES, MAKE CLK RESCHEDULE ANOTHER JOB\r
621 \f\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
627         PUSHJ PDP,DLYCOM\r
628 \r
629 INTERNAL DLYCOM\r
630 \r
631 DLYCOM: MOVSI TAC,CMWB          ;SET COMMAND WAIT BIT\r
632 IFN FTSWAP,<\r
633         EXCH    TAC,JBTSTS(ITEM)\r
634 >\r
635         IORM TAC,JBTSTS(ITEM)   ;IN JOB STATUS WORD\r
636 \r
637 INTERNAL FTSWAP\r
638 IFN FTSWAP,<\r
639         TLNN    TAC,CMWB\r
640         PUSHJ   PDP,REQUE\r
641 \r
642 >\r
643                 POPJ PDP,\r
644 \r
645 ;ROUTINE TO PUT JONB IN NO CORE QUEUE\r
646 \r
647 INTERNAL FTSWAP\r
648 IFN FTSWAP,<INTERNAL NOCORQ\r
649         EXTERNAL NULQ\r
650 \r
651 NOCORQ: MOVEI TAC,NUL1          ;NO JOB NO. OR NO CORE QUEUE\r
652         DPB TAC,PJBSTS\r
653         JRST REQUE\r
654 >\r
655 \f\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
663 ;       PUSHJ PDP,MONJOB\r
664 ;WHEN SCHEDULED TO RUN, MONITOR JOB MUST SET UP ITS OWN ACS\r
665 \r
666 INTERNAL MONJOB\r
667 \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
671 \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
677 ;       JSP TAC,MONSTR\r
678 ;       RETURN WITH ACS PDP,PROG,JDAT, AND ITEM SETUP\r
679 \r
680 INTERNAL MONSTR\r
681 EXTERNAL JOB,JBTADR,MJOBPD,JOBPDL,TTYFNU,JBTDAT\r
682 \r
683 MONSTR: MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
684         MOVE JDAT,JBTDAT(ITEM)  ;ADR. OF JOB DATA AREA\r
685 IFN JDAT-PROG,<\r
686         MOVE PROG,JBTADDR(ITEM) ;JOB RELOCATION\r
687 >\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
693 \f\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
706 \r
707 INTERNAL MSTART,USTART\r
708 EXTERNAL JOBPC,JOBDAC,JOBD17,TTYSET,JOBOPC,JOBPD1\r
709 \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
713 \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
725         \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
734                                 ; SEE SETRUN BELOW\r
735 \f\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
741 ;       PUSHJ PDP,SETRUN\r
742 \r
743 INTERNAL SETRUN\r
744 EXTERNAL JBTSTS,PJBSTS,REQTAB,AVALTB,RNQUNT\r
745 EXTERNAL MAXQ\r
746 \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
749         JRST SETR1              ;NO\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
760 \r
761 INTERNAL FTSWAP\r
762 IFE FTSWAP,<\r
763                 JRST NULTST     ;GO SEE IF NULL JOB IS RUNNING\r
764 >\r
765 IFN FTSWAP,<\r
766         INTERNAL REQUE\r
767         EXTERNAL QJOB,JBTSTS\r
768 \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
772 \r
773         IORM TAC,JBTSTS(ITEM)   ;SET REQUE BIT FOR SCHEDULER\r
774         POPJ PDP,\r
775 \r
776 >\r
777 \f\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
780 \r
781 INTERNAL FTSLEEP\r
782 \r
783 IFN FTSLEEP,<\r
784 INTERNAL SETSLP\r
785 EXTERNAL JBTSTS,SLPQ\r
786 \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
791 \r
792 ;HERE AT CLOCK LEVEL WHEN CLOCK REQUEST TIMES OUT FOR SLEEP\r
793 ;JOB NO. IN AC TAC\r
794 \r
795 INTERNAL WAKE\r
796 \r
797 EXTERNAL PJSTS,RNQ,SLPQ\r
798 \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
808         JRST SETR2\r
809 >\r
810 \f\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
817 \r
818 INTERNAL GETDCDT,GETDCMT\r
819 EXTERNAL DCREQ,REQTAB,AVALTB,DCAVAL,CPOPJ1\r
820 \r
821 GETDCDT:GETDCMT:        \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
827         SUBI AC1,REQTAB\r
828         SOSL REQTAB(AC1)        ;REDUCE REQ. COUNT FOR OTHER\r
829                                 ; SHARABLE DEVICE.\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
835         JRST CPOPJ1             ;YES\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
839 \f\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
846 \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
852 \r
853 INTERNAL DVWAIT\r
854 INTERNAL MTWAIT,STWAIT,DTWAIT,DCWAIT,DAWAIT,MQWAIT,AUWAIT\r
855 EXTERNAL JOB,REQTAB\r
856 \r
857 MTWAIT:DTWAIT:DCWAIT:STWAIT:DAWAIT:MQWAIT:AUWAIT:\r
858 \r
859 DVWAIT: MOVE AC1,(PDP)          ;GET ADR. OF CALLER\r
860         MOVE AC1,-2(AC1)        ;GEET AOSLE XXREQ INSTRUCTION\r
861         JRST .+2\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
869 \r
870 PJBS1:  POINT JWSIZ,JBTSTS(AC3),JWPOS   ;BYTE POINTER TO JOB STATUS\r
871                                 ; WORD WAIT QUEUE CODE\r
872 \f\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
883 ;       RETURN\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
887 \r
888 INTERNAL SETIOD,STTIOD\r
889 EXTERNAL WSQ,WSAVAL,TSQ,TSAVAL,JOB,PJOBN\r
890 \r
891 PJBS2:  POINT JWSIZ,JBTSTS(TAC),JWPOS   ;BYTE POINTER TO JOB STATUS\r
892                                 ; WORD QUEUE CODE\r
893 STTIOD: MOVEI TAC1,TSQ          ;SET TTY IO WAIT SATISFIED QUEUE CODE\r
894         AOS TSAVAL\r
895         JRST SETIO1\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
902 \r
903 INTERNAL FTSWAP\r
904 IFN FTSWAP,<\r
905         EXTERN QJOB,JBTSTS\r
906         MOVSI QJOB,JBTSTS\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
911 >\r
912 NULTST: SKIPE JOB               ;IS NULL JOB RUNNING?\r
913         POPJ PDP,               ;NO LET OTHER JOB RUN TILL SCHEDULER IS TRAPPED TO\r
914 \f\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
920 \r
921 INTERNAL STOP2\r
922 EXTERNAL PICLK,CLKFLG\r
923 \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
930 \f\r
931 ;ROUTINE TO WAIT TILL DEVICE CATCHES UP WITH USER AND BECOMES INCTIVE\r
932 ,CALLING SEQUENCE\r
933 ,       PUSHJ PDP, WAIT1\r
934 ,       EXIT        ALWAYS RETURN HERE\r
935 \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
941 ,CALLING SEQUENCE\r
942 ,     PUSHJ PDP, WSYNC\r
943 ,     EXIT             ALWAYS RETURNS HERE\r
944 ,SETS IOW:=1 AND ENTERS WAIT ROUTINE. RETURNS TO EXIT WHEN IOACT=0\r
945 \r
946 INTERNAL WAIT1\r
947 \r
948 WAIT1:  MOVE IOS,DEVIOS(DEVDAT)\r
949         TRNN IOS, IOACT         ;IS DEVICE ACTIVE? (IOACT=1?)\r
950         POPJ PDP,               ;RETURN\r
951         PUSHJ PDP,WSYNC         ;WAIT\r
952         JRST WAIT1\r
953 \f\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
958 ;       PUSHJ PDP,WSYNC\r
959 ;       RETURN IMMEDIATELY IF DEVICE IS INACTIVE\r
960 ;       RETURN WHEN DEVICE FINISHES NEXT BUFFER IF IT IS ACTIVE\r
961 \r
962 INTERNAL WSYNC\r
963 EXTERNAL IOWQ,TIOWQ,PION,PIOFF\r
964 \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
971 \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
975         JRST WSYNC1             ;NO\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
987         POPJ PDP,\r
988 \r
989 CLKEND: END\r