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