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