Added version 10 of basic.
[retro-software/dec/tops10/v4.5.git] / src / clock1.mac
1 TITLE   CLOCK1 - CLOCK, CONTEXT SWITCHING, AND JOB STARTUP 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 WORK WITH  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 CLOCK:  POINT 36,CIPWTM,35      ;BYTE POINTER TO CLOCK REQ QUEUE\r
39 >\r
40 \f       INTERN APRINT\r
41 \r
42 APRINT: JRST APRPAR             ;ALWAYS CHECK APR AND PI DEVICES\r
43         JRST .                  ;CHECK OTHER DEVICES\r
44 \r
45 APRPCL: CONO PI,240000          ;TURN OFF MEM PAR. ERR, AND\r
46                                 ; ENABLE FOR MEM PAR AND TRY AGAIN\r
47                                 ; (DO NOT TURN OFF POWR FAIL AS THAT PERMANENTLY\r
48                                 ; DISABLES POWR FAIL INTERRUPT)\r
49 APRPAR: CONSZ PI,600000         ;MEM PARITY ERROR OR POWER FAILURE?\r
50         HALT APRPCL             ;YES, HALT MACHINE, CLEAR FLAGS AND TRY AGAIN\r
51                                 ; ON CONTINUE\r
52         CONSO APR,@APRCON       ;INTERRUPT FOR APR?\r
53                                 ; ALWAYS AT LEAST FOR CLOCK,ILM,NXM,PD OVF\r
54                                 ; RH MODIFIED EACH TIME USER RUNS IN CASE HE IS\r
55                                 ; ENABLED FOR PC CHANGE OR AR OVF\r
56         JRST APRINT+1           ;NO,CHECK OTHER DEVICES ON THIS PI CHANNEL\r
57         SKIPE CRSHWD            ;IS LOC. 30 CLOBBERED?\r
58         JRST CRASHX             ;YES - GO SAVE AC'S & STATE OF ALL DEVS.\r
59         CONSO APR,001000        ;YES, IS IT CLOCK?\r
60         JRST APRER              ;NO, GO CHECK ERROR FLAGS\r
61         AOS TIME                ;YES, INCREMENT TIME OF DAY\r
62         AOS UPTIME              ;UPTIME IS LOADED AS ZERO,AND IS NEVER CLEARED\r
63         SETOM TIMEF             ;FLAG THAT APR CLOCK HAS TICKED\r
64         SETOM CLKFLG            ;SET FLAG FOR CLK FORCED INTERRUPT\r
65         CONO PI,REQCLK          ;REQUEST INTERRUPT ON CLK CHANNEL\r
66         CONSZ APR,@APRIN1       ;IS USER ENABLE FOR ANY FLAGS(INCLUDING CLOCK)\r
67                                 ; RH ALSO MODIFIED EACH TIME A USER RUNS\r
68         JRST APRER1             ;YES, GO PROCESS TRAP\r
69         CONO APR,1000+APRCHN    ;NO, CLEAR ONLY THE CLOCK FLAG\r
70         JEN @APRCHL             ;DISMISS INTERRUPT\r
71 \r
72 ;HERE ON CLOCK FLAG AND IT OR SOME OTHER FLAG IS ON WHICH USERS WANTS\r
73 \r
74 APRER1: CONO APR,1000+APRCHN    ;NOW CLEAR CLOCK FLAG\r
75         EXCH TAC,APRCHL         ;SAVE TAC, GET PC\r
76         TLNE TAC,USRMOD         ;IS PC FROM USER MODE?\r
77         JRST APRER4             ;YES, GO TRAP TO HIM\r
78         JRST APRER2             ;NO, GO CHECK IN CASE ALSO A SERIOUS ERROR\r
79 \f;OTHER APR INTERRUPTS BESIDES CLOCK\r
80 \r
81 APRER:  EXCH TAC,APRCHL         ;SAVE TAC, GET PC\r
82         TLNE TAC,USRMOD         ;IS PC IN USER MODE?\r
83         CONSO APR,@APRIN1       ;YES, IS USER ENABLED FOR THIS ERROR\r
84         JRST APRER2             ;NO, PRINT ERROR MESSAGE AND STOP JOB\r
85 APRER4: EXCH JDAT,JOBDAT        ;YES, SAVE JDAT, GET CURRENT JOB DATA AREA ADR.\r
86         MOVEM TAC,JOBTPC(JDAT)  ;STORE PC IN JOB DATA AREA\r
87 \r
88         CONI APR,JOBCNI(JDAT)   ;STORE APR IN JOB DATA AREA\r
89         HLLZS JOBENB(JDAT)      ;CLEAR SOFTWARE FLAGS SO THAT USER MUST DO\r
90                                 ; ANOTHER APRENB UUO IN ORDER TO ENABLE TRAPS\r
91         SETZM APRIN1            ;ALSO CLEAR USER APR CONSO FLAGS\r
92         HRRI TAC,231000         ;AND SET MONITOR TO LOOK ONLY FOR\r
93         HRRM TAC,APRCON         ;PD OVF,ILM,NXM, AND CLOCK\r
94         HRR TAC,JOBAPR(JDAT)    ;GET USER LOC TO TRAP TO\r
95         EXCH JDAT,JOBDAT        ;RESTORE JDAT,JOBDAT\r
96         CONO APR,440+APRCHN     ;DISABLE FOV, AROVF IN CASE ON\r
97                                 ;SO USER MUST REENABLE WITH SETAPR UUO\r
98 APRER3: TLZ     TAC,440000      ;CLEAR FOV (PC CHANGE ON PDP-6) AND AR OVF FLAGS\r
99                                 ; SO INTERRUPT MAY BE DISMISSED\r
100         EXCH    TAC,APRCHL      ;RESTORE TAC & APRCHL\r
101         CONO APR,430110+APRCHN  ;CLEAR ALL ERROR FLAGS WHICH CAN CAUSE INTERRUPTS\r
102                                 ; EXCEPT CLOCK FLAG(ELSE LOSE TIME OF DAY)\r
103         JEN @APRCHL             ;DISMISS INTERRUPT\r
104 \fAPRER2:        CONSO   APR,NXM!ILM!POV ;DOES EXEC CARE?\r
105         JRST    APRER3          ;NO. IGNORE EXEC OVERFLOW (MUST BE FOV OR AROVF)\r
106         MOVEM   TAC,APRPC       ;STORE ERROR PC FOR CLK CHANNEL\r
107         CONI APR,APRERR         ;STORE ERROR FLAGS\r
108                                 ; (ALSO USED AS ERROR FLAG)\r
109         SETOM CLKFLG            ;SET FLAG FOR CLK INTERRUPT\r
110         SETOM SCHEDF            ;FLAG THAT RESCHEDULING IS NEEDED\r
111                                 ; (EVEN THOUGH PC MAY BE IN EXEC MODE)\r
112         CONO PI,REQCLK          ;REQUEST INTERRUPT IN CLK CHANNEL\r
113         CONSZ   APR,ILM         ;WAS ERROR ILLEGAL MEMORY(FROM USER)?\r
114         HRRI    TAC,0           ;YES,CLEAR RH OF PC,SO A SECOND ILM INTERRUPT\r
115                                 ; WILL NOT OCCUR IF THIS IS A WILD PC(AND A PDP-10)\r
116 IFN FTHALT,<\r
117         CONSZ   PI,003400       ;ARE ANY PI'S IN PROGRESS OF LOWER PRIORITY THAN APR?\r
118                                 ; (PDP-10 BITS ONLY)\r
119         HALT .+1                ;YES, HALT SO CONTINUE WILL TRY TO RECOVER\r
120 >\r
121         JRST    APRER3          ;NO,MUST BE UUO LEVEL(OR USER MODE AND\r
122                                 ; MEMORY DROPPED OUT)\r
123 \fSUBTTL CLOCK - LOW PRIORITY CLOCK SERVICE(CLK)\r
124 \r
125 ;THIS ROUTINE RUNS ON THE LOWEST PRIORITY PI CHANNEL AND AT UUO LEVEL\r
126 ;TO CAUSE AN INTERRUPT ON CLK CHANNEL:\r
127 ;       SETOM CLKFLG    ;FLAG THAT INTERRUPT HAS BEEN REQUESTED\r
128 ;       CONO PI,CLKREQ  ;REQUEST PI INTERUPT ON LOWEST PI CHANNEL\r
129 ;THE FOLLOWING OTHER FLAGS MUST ALSO BE SET\r
130 ;APRERR-APR DETECTED ERROR IN CURRENT JOB\r
131 ;SCHEDF-RESCHEDULING MUST TAKE PLACE(EVEN THOUGH PC IN EXEC MODE)\r
132 ;TIMEF-APR CLOCK HAS TICKED ON HIGH PRIORITY CHANNEL\r
133 ;SEE APRSER AND RUNCSS TO SEE HOW THIS ROUTINE IS CALLED\r
134 \r
135 ;CLK SERVICE PERFORMS THE FOLLOWING ON A REGULAR BASIS:\r
136 ;PROCESSES CLOCK QUEUE REQUESTS\r
137 ;CALLS CONSOLE MONITOR COMMAND DECODER\r
138 ;CALLS CORE SHUFFLER\r
139 ;THEN CALLS SCHEDULER\r
140 ;IF THE CURRENT JOB IS IN EXEC MODE THE ABOVE 4 TASKS ARE\r
141 ;DELAYED UNTIL THE CURRENT JOB ENTERS A STOPPABLE STATE: I.E., UNTIL\r
142 ;       1. JOB STARTS TO WAIT FOR A BUSY SHARABLE DEVICE\r
143 ;       2. JOB STARTS TO WAIT FOR IO TO COMPLETE\r
144 ;       3. CONTROL ABOUT TO RETURN TO USER MODE\r
145 ;THEN CLK SERVICE IS ENTERED AT THE UUO LEVEL\r
146 \r
147 STOR=DAT\r
148 T=TAC\r
149 T1=TAC1\r
150 JA=JDAT\r
151 \r
152 ;THE CLOCK REQUEST QUEUE PROVIDES THE REST OF THE MONITOR\r
153 ;WITH THE ABILITY TO BE TRAPPED TO AFTER A NUMBER OF CLOCK TICKS\r
154 ;HAVE OCCURRED\r
155 \r
156 ;TO MAKE A REQUEST:\r
157 ;       CONO PI,PIOFF\r
158 ;       IDPB AC,CLOCK   ;STORE CLOCK REQUEST IN QUEUE\r
159 ;       CONO PI,PION    ;TURN PI BACK ON\r
160 ;C(AC)=XWD ADDRESS,NO. OF CLOCK TICKS+DATA*10000\r
161 ;WHERE DATA IS 6 BITS OF INFO NEEDED WHEN TIME RUNS OUT\r
162 ;CLK SERVICE WILL PUSHJ PDP,ADR\r
163 ;WHEN TIME RUNS OUT WITH DATA RIGHT JUSTIFIED IN AC TAC\r
164 ;ALL ACS ARE FREE TO USE WHEN CALL IS MADE\r
165 \r
166 INTERNAL CLKINI\r
167 EXTERNAL CIPWTM1,PION,PIOFF\r
168 \r
169 CLKINI: MOVEI TAC,CIPWTM1       ;SETUP CLOCK QUEUE BYTE POINTER\r
170         HRRM TAC,CLOCK          ;LH NEVER CHANGES(36 BIT BYTE)\r
171         POPJ PDP,\r
172 \f\r
173 ;HERE AT UUO LEVEL WHEN JOB GOES INTO IO WAIT OR SHARABLE DEVICE WAIT\r
174 ;CALL:  PUSHJ PDP,WSCHED\r
175 ;       RETURN HERE WHEN RUNABLE AGAIN\r
176 \r
177 INTERNAL WSCHED\r
178 EXTERNAL JOBD14,JOBDAC,USRPC,JOBD16,NULPDL\r
179 \r
180 WSCHED: POP PDP,USRPC           ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\r
181         MOVEI AC3,JOBDAC(JDAT)  ;SAVE ACS 0-16 IN DUMP ACS\r
182         BLT AC3,JOBD16(JDAT)    ;IN CURRENT JOB DATA AREA\r
183         MOVEI PDP,NULPDL        ;NULL JOB PD LIST\r
184         HRLI PDP,MJOBP1         ;USED TO CALL SCHEDULER AND COMMAND DECODER\r
185                                 ; OTHERWISE GET PD OUF\r
186 \r
187         JRST RSCHED             ;GO RESCHEDULE\r
188 \r
189 \r
190 ;HERE AT UUO LEVEL WHEN CURRENT JOB RETURNS TO USER MODE\r
191 ;FROM A UUO CALL AND EITHER:\r
192 ;       1. CURRENT JOB TYPED CONTROL C WHILE IN EXEC MODE\r
193 ;       2. CLOCK FLAG WENT OFF WHILE CURRENT JOB WAS\r
194 ;               IN EXEC MODE\r
195 \r
196 ;CALL:  PUSHJ PDP,USCHED        ;FROM UUOCON(UUO HANDLER RETURN TO USER)\r
197 ;       RETURN HERE WHEN RUNABLE\r
198 \r
199 INTERNAL USCHED\r
200 EXTERNAL JOBDPG,JOBDPD,USRPC\r
201 \r
202 USCHED: POP PDP,USRPC           ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\r
203         MOVEM PROG,JOBDPG(PROG) ;SAVE PROG IN DUMP AC AREA\r
204         MOVEM PDP,JOBDPD(PROG)  ;SAVE PDP\r
205         JRST RSCHED             ;GO RESCHEDULE\r
206 \f\r
207 ;HERE AT CLK INTERRUPT LEVEL\r
208 \r
209 INTERNAL CLKINT\r
210 INTERNAL FTTIME\r
211 EXTERNAL CLKFLG,JOBD17,CLKCHL,SCHEDF,JOBADR,JOBD16,JOBDAC\r
212 EXTERNAL JOBD15,JOBPD1,MJOBP1,APRERR,NULDAT,NULPDL\r
213 \r
214 CLKINT: SKIPN CLKFLG            ;CLK INTERRUPT REQUEST?\r
215         JRST CLKINT                     ;NO, CHECK OTHER DEVICES\r
216         MOVEM 17,CLKS17         ;SAVE AC 17\r
217         MOVE 17,CLKCHL          ;IS CURRENT JOB IN USER MODE?\r
218         TLNN 17,USRMOD\r
219         SKIPE SCHEDF            ;NO, IS THIS A FORSCED RESCHEDULING INTERRUPT?\r
220         JRST SAVPC              ;YES, IT IS OK TO RESCHEDULE NOW\r
221         MOVE 17,CLKS17          ;NO, LEAVE TIMEF SET AND DISMISS INT.\r
222         JEN @CLKCHL\r
223 \r
224 SAVPC:  MOVEM 17,USRPC          ;SAVE PC IN PROTECTED PART OF SYSTEM DATA\r
225                                 ; STORAGE FOR CURRENT JOB\r
226 CLKERR: SKIPN 17,JOBDAT         ;CURRENT JOB DATA AREA, IS THERE ONE?\r
227         MOVEI 17,NULDAT         ;NO, MUST BE NULL JOB OR CORE 0\r
228                                 ; RUNS AT UUO LEVEL,REQUESTS CLK INT. TO STOP\r
229         MOVEM 16,JOBD16(17)     ;SAVE AC 16 IN DUMP AC PART OF JOB DATA AREA\r
230         MOVEI 16,JOBDAC(17)     ;SOURCE=0,DESTINATION=DUMP AC 0\r
231         BLT 16,JOBD15(17)       ;SAVE ACS 0-15 JUST BELOW AC 16\r
232         MOVE TAC,CLKS17         ;NOW SAVE 17 IN JOB DATA AREA\r
233         MOVEM TAC,JOBD17(17)    ;ALONG WITH OTHER ACS\r
234         MOVEI PDP,NULPDL        ;SET UP PUSH DOWN LIST IN NULL JOB DATA\r
235                                 ; AREA IN LOWER CORE\r
236         HRLI PDP,MJOBP1         ;-LENGTH+1(LEAVE ROOM FOR UUO PC)\r
237         SKIPE TAC,APRERR        ;IT THIS AN ERROR INTERRUPT?\r
238         PUSHJ PDP,APRILM        ;YES, GO PROCESS ERROR,APRILM WILL CLEAR APRERR\r
239                                 ; FLAG IMMEDIATELY\r
240 \fEXTERNAL COMCNT,NXTJOB,HNGTIM,POTLST,LSTWRD\r
241 EXTERNAL TIMEF,APRERR,CLKFLG,SCHEDF,JOB,PMONTB\r
242 \r
243 RSCHED: SKIPN TIMEF     ;HAS CLOCK GONE OFF SINCE LAST CALL?\r
244         JRST CIP6       ;NO, JUST RESCHEDULE\r
245 \r
246 ;TIME ACCOUNTING\r
247 \r
248 EXTERNAL TIME,MIDNIT,THSDAT,MONTAB\r
249 \r
250 IFN FTTIME,<\r
251         EXTERNAL RTIME,TTIME,JOB\r
252         SKIPN   ITEM,JOB        ;WAS LAST JOB NULL JOB?\r
253         SKIPN   POTLST          ;YES-WAS IT A LOST TICK?\r
254         JRST    INCTIM          ;NO-PROCEED NORMALLY\r
255         AOS     LSTWRD          ;YES-INCREMENT LOST TIME COUNT\r
256         SETZM   POTLST          ;AND CLEAR LOST TICK INDICATION\r
257 INCTIM: AOS RTIME(ITEM)         ;INCR. CURRENT JOB INCREMENTAL RUN TIME\r
258         AOS TTIME(ITEM)         ;INCR. CURRENT JOB TOTAL RUN TIME\r
259 >\r
260 IFN FTKCT,<\r
261         EXTERN USRREL,JBTKCT\r
262         LDB TAC,[POINT 8,USRREL,25]     ;GET NO. OF 1K BLOCKS-1FOR CURRENT USER\r
263         ADDI TAC,1                      ;MAKE IT NO. OF 1K BLOCKS\r
264         ADDM TAC,JBTKCT(ITEM)           ;ADD IN ACCUMULATED CORE RUNNING TIME PRODUCT\r
265                                 ; (KILO-CORE TICKS)\r
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         CONO 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 IO DEVICE\r
304         PUSHJ PDP,DEVCHK        ;GO CHECK FOR HUNG IO 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 TIMED (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 NO 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 PROTECTED 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 NEG.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 OCCURRED 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 IN AC 0\r
374 \r
375 EXTERNAL APRNUL,TIME,THSDAT,MIDNIT,NULERR\r
376 \r
377 NULJB:\r
378 IFN FTCHECK,<EXTERNAL MONPTR,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 SEG 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 SETRL1: MOVE PROG,JBTADR(ITEM)  ;XWD PROTECTION,RELOCATION FOR LOW SEG\r
415         MOVEM PROG,JOBADR       ;SAVE TO MAKE UUO HANDLER FASTER\r
416         HLRZM PROG,USRREL       ;SAVE PROTECTION FOR ADDRESS CHECKING\r
417                                 ; (HIGHEST LEGAL REL ADDRES FOR CURRENT USER IN LOW SEG)\r
418 IFN JDAT-PROG,<\r
419         MOVE JA,JBTDAT(ITEM)    ;LOC OF JOB DATA AREA\r
420         MOVEM JA,JOBDAT         ;SAVE IT TOO FOR UUO HANDLER\r
421 >\r
422         JUMPE PROG,SETHRD       ;IF 0 (NULL JOB OR JOB DOING CORE 0 OR KJOB)\r
423                                 ; DO NOT STORE IN JOB DATA AREA (SINCE IT WILL BE\r
424                                 ; IN EXEC LOWER CORE.  ALSO DO NOT STORE\r
425                                 ; IN LOC 33, SO CAN SEE LAST REAL USER TO RUN\r
426 \r
427         HLRZM PROG,JOBREL(JA)   ;SET PROTECTION IN USER JOB DATA AREA\r
428                                 ; FOR HIM TO LOOK AT\r
429 IFN FT2REL,<\r
430         EXTERN SETHGH\r
431         PUSHJ PDP,SETHGH        ;SET UP FOR HIGH SEG, IF USER HAS ONE\r
432                                 ; PROG SETUP FOR DATAO\r
433 >\r
434 IFE FT2REL,<\r
435         TLZ PROG,1777           ;CLEAR OUT PROTECTION FOR HIGH SEG\r
436                                 ; JUST IN CASE THIS IS A 2 REG. MACHINE(EVEN THOGH\r
437                                 ; SOFTWARE CANNOT HANDLE 2 SEGS)\r
438 >\r
439         MOVEM PROG,KT10A        ;STORE IN LOWER CORE SO IT CAN BE FOUND OUT\r
440                                 ; USING SWITCHES WHAT IS IN SECOND REGISTER\r
441                                 ; OPTION DOES NOT COME WITH PANEL LIGHTS\r
442                                 ; SO NOT STORE 0 FOR NULL JOB SO CAN SEE\r
443                                 ; LAST JOB TO RUN IN LOC 33\r
444 \fSETHRD:        DATAO APR,PROG          ;SET APR HARDWARE FOR RELOCATION AND PROTECTION\r
445                                 ; FOR LOW(AND HIGH SEGS)\r
446         SKIPN PROG,JOBADR       ;RESTORE PROG TO XWD PROT,RELOC FOR JUST LOW SEG\r
447                                 ; (IS THERE ONE)?\r
448         TDZA TAC,TAC            ;NO, MUST BE NULL JOB OR CORE0 OR KJOB\r
449                                 ; SET FOR NO SPECIAL INTERRUPTS TO USER\r
450         MOVE TAC,JOBENB(JA)     ;USER APR CONSO FLAGS (THE ONES HE WANTS TO HANDLE\r
451                                 ; FALL INTO SETAPR ROUTINE\r
452 \r
453 \r
454 ;ROUTINE TO ENABLE/DISABLE APR FOR TRAPPING TO USER AND EXEC\r
455 ;CALL:  MOVEI TAC, APR CONSO FLAGS FOR USER TRAPPING\r
456 ;       PUSHJ POP,SETAPR\r
457 ;       RETURN WITH APR RESET AND INTERRUPT LOCATION CONSO'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, ILM, 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(STARTING 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,ADRRESS OF THAT JOB TTY DEVICE DATA BLOCK\r
494 ;       MOVE DAT,BYTE POINTER TO LAST CHAR. ALREADY 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 JOB 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 HOLE\r
516         MOVSI   TAC1,JNA        ;YES,JOB NUMBER ASSIGNED 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 ;THEN ADD ^C<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 TTY TYPING OUT MESSAGE\r
545                                 ; FALL INTO ESTOP\r
546 \f\r
547 ;ROUTINE TO STOP USER AND FLAG AS ERROR STOP\r
548 \r
549 \r
550 INTERNAL ESTOP,ESTOP1\r
551 EXTERNAL JBTSTS,STUSER,STREQ,STAVAL\r
552 EXTERNAL SCHEDF,JOB,CPOPJ\r
553 \r
554 ESTOP:  JUMPE ITEM,CPOPJ        ;IS THIS ERROR IN JOB 0?\r
555         MOVSI TAC,JACCT         ;NO, CLEAR ACCOUNTING BIT(IN CASE LOGGING\r
556         ANDCAM TAC,JBTSTS(ITEM) ;IN OR OUT) SO USER CAN USE CONTROL C\r
557                                 ; TO RECOVER\r
558 ESTOP1: MOVSI TAC,JERR          ;SET ERROR BIT IN JOB STATUS WORD\r
559         IORM TAC,JBTSTS(ITEM)   ;SO JOB CAN NOT CONTINUE(CONT COM.)\r
560         CAME ITEM,STUSER        ;SYSTEM TAPE USER?\r
561         JRST STOP1              ;NO\r
562         MOVSI TAC,637163        ;FIND SYS DDB\r
563         PUSHJ PDP,DEVSRC        ;SYSTEM ERROR IF NOT FOUND\r
564         JSP DAT,ERROR\r
565         PUSHJ PDP,RELEA9        ;YES, RELEASE SYSTEM TAPE WITHOUT WAITING\r
566 \f;ROUTINE TO STOP ANY JOB FROM BEING SCHEDULED\r
567 ;CALL:\r
568 ;       MOVE ITEM, JOB NUMBER\r
569 ;       PUSHJ PDP, STOP1\r
570 ;       EXIT    ;RETURN HERE IMMEDIATELY, IF CALLED FROM HIGHER\r
571 ;PRIORITY PI CHANNEL THAN CLK(LOWEST), OTHERWISE WHEN JOB IS RUNABLE\r
572 ;CALLED FROM COMMAND DECODER WHEN <CONTROL>C TYPED IN BY USER\r
573 ;OR ON ANY ERROR MESSAGE(SEE PREVIOUS PAGE)\r
574 \r
575 INTERNAL STOP1\r
576 EXTERNAL JBTSTS,PJBSTS,REQTAB,JOB,STUSER,MAXQ,AVALTB\r
577 \r
578 STOP1:  MOVSI TAC, RUN\r
579         CONO PI, PIOFF          ;DONE AT INTERUPT LEVEL HIGHER THAN DT LEVEL\r
580         CAME ITEM,STUSER        ;IS THIS JOB CURRENTLY USING THE SYSTEM TAPE?\r
581         TDNN TAC,JBTSTS(ITEM)   ;NO, IS RUN BIT OFF IN JOB STATUS WORD\r
582         JRST STOP1A             ;YES\r
583         ANDCAM TAC,JBTSTS(ITEM) ;NO, SO CLEAR IT\r
584         CONO PI, PION\r
585         LDB TAC,PJBSTS          ;GET JOB WAIT QUEUE CODE(IF ANY)\r
586         CAIG TAC,MAXQ           ;DOES STATE HAVE Q ?\r
587         SOSL REQTAB(TAC)        ;YES. REDUCE IT.\r
588         JRST STOP1A             ;NO\r
589         SOSGE AVALTB(TAC)       ;YES REDUCE  COUNT\r
590         SETZM AVALTB(TAC)       ;CLEAR AVAL FLAG IF NO ONE WAITING\r
591 STOP1A: CONO PI, PION           ;MAKE SURE PI ON\r
592         CAME ITEM, JOB          ;NO, IS THIS JOB CURRENT USER\r
593 \r
594 INTERNAL FTSWAP\r
595 \r
596 IFE FTSWAP,<\r
597         POPJ PDP,               ;NO\r
598 >\r
599 IFN FTSWAP,<\r
600         JRST REQUE              ;SET REQUE JOB FLAG\r
601 >\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 JOB IN NO CORE QUEUE\r
631 \r
632 \r
633 INTERNAL FTSWAP\r
634 IFN FTSWAP,<INTERNAL NOCORQ\r
635         EXTERNAL NULQ\r
636 \r
637 NOCORQ: MOVEI TAC,NULQ          ;NO JOB NO. OR NO CORE QUEUE\r
638         DPB TAC,PJBSTS\r
639         JRST REQUE\r
640 >\r
641 \f;ROUTINE TO SETUP MONITOR JOB TO RUN LATER AT UUO LEVEL\r
642 ;CALLED BY COMMANDS WHICH MAY OR MAY NOT NEED TO\r
643 ;RUN MONITOR JOB DEPENDING ON WHETHER JOB HAS CORE(KJOB,IJOB)\r
644 ;TTY WILL REMAIN IN MONITOR MODE\r
645 ;JOB MUST HAVE CORE ASSIGNED\r
646 ;CALL:  MOVE ITEM, JOB NUMBER\r
647 ;       MOVEI TAC1,ADDR. OF MONITOR JOB TO BE RUN\r
648 ;       PUSHJ PDP,MONJOB\r
649 ;WHEN SCHEDULED TO RUN, MONITOR JOB MUST SET UP ITS OWN ACS\r
650 \r
651 INTERNAL MONJOB\r
652 \r
653 MONJOB: PUSHJ PDP,MSTART        ;START WITH PC IN MONITOR\r
654         JRST SETRUN             ;SET TTY TO START JOB WHEN COMMAND RESPONSE\r
655                                 ; IS FINISHED AND KEEP TTY IN MONITOR MODE\r
656 \r
657 \r
658 ;ROUTINE TO SETUP ACS FOR MONITOR JOB STARTING AT UUO LEVEL\r
659 ;SETS UP ITEM, WITH JOB NO.; PROG WITH RELOCATION, AND PDP\r
660 ;WITH PUSH DOWN LIST ADR. IN JOB DATA AREA\r
661 ;USED BY KJOB,CORE 0,SAVE,GET,RUN,R,REASSIGN AND FINISH COMMANDS\r
662 ;CALL:  MOVEI TAC1,MONITOR JOB STOP ADDRESS\r
663 ;       JSP TAC,MONSTR\r
664 ;       RETURN WITH ACS PDP,PROG,JDAT, AND ITEM SETUP\r
665 \r
666 INTERNAL MONSTR\r
667 EXTERNAL JOB,JBTADR,MJOBPD,JOBPDL,TTYFNU,JBTDAT\r
668 \r
669 MONSTR: MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
670         MOVE JDAT,JBTDAT(ITEM)  ;ADR. OF JOB DATA AREA\r
671 IFN JDAT-PROG,<\r
672         MOVE PROG,JBTADR(ITEM)  ;JOB RELOCATION\r
673 >\r
674         MOVSI PDP,MJOBPD        ;MINUS LENGTH OF SYSTEM PD LIST\r
675         HRRI PDP,JOBPDL(JDAT)   ;FIRST LOC.-1 OF PD LIST\r
676         PUSH PDP,TAC1           ;SAVE STOP ADRRESS\r
677         JRST (TAC)              ;RETURN AND DO MONITOR JOB\r
678                                 ; WITH TTY DDB,OUTPUT BYTE POINTER, AND JOB NO.\r
679 \f;ROUTINE TO SET JOB STATE TO BE SCHEDULED TO RUN\r
680 ;WITH SPECIFIED STARTING ADDRESS INCLUDING PC FLAGS\r
681 ;CALLED ONLY WHEN JOB IN CORE AND AFTER JOB HAS BEEN\r
682 ;SAFELY STOPPED IN ONE OF 3 STATES:\r
683 ;1) PC IN USER MODE\r
684 ;2) JOB IN A WAIT FOR SHARABLE DEVICE, OR IO WAIT\r
685 ;3) JOB JUST ABOUT TO RETURN TO USER MODE FROM A UUO CALL\r
686 ;CALL:  MOVE TAC1,STARTING PC\r
687 ;       MOVE ITEM, JOB NUMBER\r
688 ;       MOVE JDAT,ADR. OF JOB DATA AREA WHICH MUST BE IN CORE\r
689 ;       PUSHJ PDP,USTART(PC TO USER MODE),MSTART(PC TO MONITOR MODE)\r
690 ;       RETURN HERE IMMEDIATELY\r
691 \r
692 INTERNAL MSTART,USTART\r
693 EXTERNAL JOBPC,JOBDAC,JOBD17,TTYSET,JOBOPC,JOBPD1\r
694 \r
695 USTART: MOVE TAC,JOBPC(JDAT)    ;GET OLD PC\r
696         TLNE TAC,USRMOD         ;IS IT IN USER MODE TOO?\r
697         JRST USTRT1             ;YES, DUMP ACS AND PC FLAGS ARE ALREADY HIS\r
698         MOVEI TAC,JOBDAC(JDAT)  ;NO, MOVE USERS(UUO) ACS TO DUMP ACS\r
699         HRL TAC,JDAT            ;SOURCE=REL. 0,DEST.=JOBDAC IN JOB DATA AREA\r
700         BLT TAC,JOBD17(JDAT)    ;MOVE ALL ACS\r
701         MOVE TAC,JOBPD1(JDAT)   ;UUO PC HAS LAST PC\r
702         HRRI TAC,-1(TAC)        ;SUBTRACT 1 FROM RIGHT HALF AND\r
703                                 ; PRESERVE LH PC FLAGS.\r
704                                 ; (RH=0 ON HALT 0 OR FIRST START)\r
705 USTRT1: MOVEM TAC,JOBOPC(JDAT)  ;STORE OLD PC FOR USER TO LOOK AT\r
706         HLL TAC1,TAC            ;PRESERVE USER APR FLAGS\r
707         TLO TAC1,USRMOD         ;MAKE SURE NEW PC IN USER MODE\r
708         TLZ TAC1,37             ;MAKE SURE NO INDIRECT BITS OR INDEX FIELD\r
709 \r
710 MSTART: MOVEM TAC1,JOBPC(JDAT)  ;STORE NEW PC\r
711         MOVSI TAC,JERR+WTMASK\r
712         ANDCAM TAC,JBTSTS(ITEM) ;CLEAR ERROR AND WAIT STATUS BITS\r
713         JRST TTYSET             ;SET TTY STATE TO INITIAL COND.\r
714                                 ; TTYUSR OR TTYURC SHOULD BE CALLED\r
715                                 ; TO INDICATE WHETHER TTY TO USER OR EXEC MODE\r
716                                 ; AND THAT JOB IS TO RUN(RUN BIT =1) WHEN\r
717                                 ; MONITOR COMMAND RESPONSE FINISHES.\r
718                                 ; SEE SETRUN BELOW\r
719 \f\r
720 \r
721 ;ROUTINE TO SET JOB STATUS RUN BIT(RUN)\r
722 ;CALLED BY SCANNER SERVICE WHEN TTY MONITOR COMMAND\r
723 ;RESPONSE FINISHES.  THIS ACTION IS ENABLED BY CALLING\r
724 ;TTYUSR, OR TTYURC IN SCNSER\r
725 ;CALL:  MOVE ITEM,JOB NUMBER\r
726 ;       PUSHJ PDP,SETRUN\r
727 \r
728 INTERNAL SETRUN\r
729 EXTERNAL JBTSTS,PJBSTS,REQTAB,AVALTB,RNQUNT\r
730 EXTERNAL MAXQ\r
731 \r
732 SETRUN: LDB TAC,PJBSTS          ;GET JOB STATUS WAIT QUEUE CODE\r
733         CAILE TAC,MAXQ          ;DOES JOB STATUS CODE HAVE A QUEUE?\r
734         JRST SETR1              ;NO\r
735         AOSLE REQTAB(TAC)       ;ADD TO REQUEST COUNT\r
736         JRST SETR1              ;OTHERS WAITING?\r
737         AOSG AVALTB(TAC)        ;MAKE AVAILABLE\r
738         SETOM AVALTB(TAC)       ;FLAG AS JUST AVAILABLE, BECAUSE\r
739                                 ; NO JOB WAS USING DEVICE. SCHEDULER\r
740                                 ; WILL SCAN THIS QUEUE\r
741 SETR1:  MOVSI TAC,RUN           ;SET RUN BIT IN JOB STATUS WORD\r
742         IORM TAC,JBTSTS(ITEM)   \r
743 SETR2:  MOVE TAC,RNQUNT         ;SET QUANTUM TIME TO RUN QUEUE QUANTUM\r
744         HRRM TAC,JBTSTS(ITEM)   ;RUN QUEUE QUANTUM\r
745 \r
746 INTERNAL FTSWAP\r
747 IFE FTSWAP,<\r
748                 JRST NULTST     ;GO SEE IF NULL JOB IS RUNNING\r
749 >\r
750 IFN FTSWAP,<\r
751         INTERNAL REQUE\r
752         EXTERNAL QJOB,JBTSTS\r
753 \r
754 REQUE:  MOVSI TAC,JRQ           ;MARK JOB TO BE REQUEUED WITH JRQ BIT\r
755         TDNN TAC,JBTSTS(ITEM)   ;INCREMENT COUNT ONLY ONCE FOR EACH JOB\r
756         AOS QJOB                ;INCREMENT COUNT OF NO. OF JOBS WAITING TO BE REQUEUED\r
757         IORM TAC,JBTSTS(ITEM)   ;SET REQUE BIT FOR SCHEDULER\r
758         POPJ PDP,\r
759 \r
760 >\r
761 \f\r
762 ;ROUTINE TO PUT A JOB TO SLEEP AND WAKE UP AGAIN LATER\r
763 ;CALLED AFTER CLOCK QUEUE REQUEST PUT IN BY UUO ROUTINE\r
764 \r
765 INTERNAL FTSLEEP\r
766 \r
767 IFN FTSLEEP,<\r
768 INTERNAL SETSLP\r
769 EXTERNAL JBTSTS,SLPQ\r
770 \r
771 SETSLP: MOVSI TAC,CLKR          ;FLAG THAT A CLOCK REQUEST HAS BEEN PUT IN\r
772         IORM TAC,JBTSTS(ITEM)   ;SO ONLY ONE PER JOB\r
773         MOVEI AC1,SLPQ          ;SLEEP STATE CODE\r
774         JRST SETSTT             ;SET STATUS AND RESCHEDULE\r
775 \r
776 ;HERE AT CLOCK LEVEL WHEN CLOCK REQUEST TIMES OUT FOR SLEEP\r
777 ;JOB NO. IN AC TAC\r
778 \r
779 INTERNAL WAKE\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 OF 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 DCWAIT\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\r
822 ;ROUTINE TO WAIT FOR A SHARABLE DEVICE\r
823 ;CALLED AT UUO LEVEL ONLY BY DEVICE SERVICE ROUTINES\r
824 ;CALL:  AOSLE XXREQ             ;ADD 1 TO SHARABLE DEVICE REQUEST COUNT\r
825 ;                               ;IS DEVICE AVAILABLE?\r
826 ;       PUSHJ PDP,XXWAIT        ;NO, PUT JOB IN WAIT QUEUE\r
827 ;       RETURN WHEN DEVICE AVAILABLE\r
828 \r
829 ;INITIALLY THE REQUEST COUNT IS -N, WHERE N IS THE\r
830 ;NUMBER OF JOBS WHICH CAN USE THE SHARABLE DEVICE AT THE SAME TIME\r
831 ;A REQUEST COUNT OF 0 MEANS THE MAXIMUM NO. OF JOBS ARE\r
832 ;USING THE DEVICE, A POSITIVE NUMBER IS THE\r
833 ;NUMBER OF JOBS WAITING IN THE SHARABLE DEVICE WAIT QUEUE\r
834 \r
835 INTERNAL DVWAIT\r
836 INTERNAL MTWAIT,STWAIT,DTWAIT,DCWAIT,DAWAIT,MQWAIT,AUWAIT\r
837 EXTERNAL JOB,REQTAB\r
838 \r
839 MTWAIT:DTWAIT:DCWAIT:STWAIT:DAWAIT:MQWAIT:AUWAIT:\r
840 DVWAIT: MOVE AC1,(PDP)          ;GET ADR. OF CALLER\r
841         MOVE AC1,-2(AC1)        ;GET 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 AT INTERRUPT LEVEL\r
856 ;CHECK EACH TIME IT FINISHED A TASK(BUFFERFUL)\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 IN 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 \r
874 STTIOD: MOVEI TAC1,TSQ          ;SET TTY IO WAIT SATISFIED QUEUE CODE\r
875         AOS TSAVAL\r
876         JRST SETID1\r
877 SETIOD: MOVEI TAC1,WSQ          ;REQUE TO WAIT SATISFIED Q\r
878         AOS WSAVAL              ;INCR. NO. OF JOBS WITH IO WAIT\r
879                                 ; SATISFIED. NON-ZERO WSAVAL WILL\r
880                                 ; CAUSE SCHED. TO SCAN FOR IO\r
881                                 ; SATISFIED JOB.\r
882 SETID1: LDB TAC,PJOBN\r
883         DPB TAC1,PJBS2          ;IN JOB STATUS WORD\r
884 \r
885 INTERNAL FTSWAP\r
886 IFN FTSWAP,<\r
887         EXTERN QJOB,JBTSTS\r
888         MOVSI TAC1,JRQ          ;SET JOB TO BE REQUEUED AT NEXT CLOCK TICK\r
889         TDNN TAC1,JBTSTS(TAC)   ;IS REQUE BIT ALREADY ON?\r
890         AOS QJOB                ;NO, INCREMENT COUNT ONCE FOR EACH JOB\r
891         IORM TAC1,JBTSTS(TAC)   ;SET REQUEUEING BIT FOR SCHEDULER\r
892 >\r
893 NULTST: SKIPE JOB               ;IS NULL JOB RUNNING?\r
894         POPJ PDP,               ;NO LET OTHER JOB RUN TILL SCHEDULER IS TRAPPPED TO\r
895 \f;ROUTINE TO CAUSE CLK ROUTINE TO RESCHEDULE\r
896 ;CALLED AT ANY LEVEL\r
897 ;CALL:  PUSHJ PDP,STOP2\r
898 ;       RETURN IMMEDIATELY EXCEPT IF AT UUO LEVEL\r
899 ;       IF AT UUO LEVEL, RETURN WHEN JOB IS RUNABLE AGAIN\r
900 \r
901 INTERNAL STOP2\r
902 EXTERNAL PICLK,CLKFLG\r
903 \r
904 STOP2:  CONO PI,PIOFF   ;PREVENT CLOCK INTERRUPT DURING STOP2 CODE\r
905         SETOM CLKFLG    ;SET FLAG TO INDICATE CLK INTERRUPT\r
906                         ; EVEN THOUGH CLK INTERRUPT IS NOT A TIME INTERRUPT\r
907         CONO PI,PICLK   ;TURN PI BACK ON AND REQUEST INTERRUPT TO\r
908                         ; CLK PI CHANNEL(LOWEST PRIORITY CHANNEL)\r
909         POPJ PDP,       ;INTERRUPT IMMEDIATELY IF AT UUO LEVEL\r
910 \f;ROUTINE TO WAIT TILL DEVICE CATCHES UP WITH USER AND BECOMES INACTIVE\r
911 ,CALLING SEQUENCE\r
912 ,       PUSHJ PDP, WAIT1\r
913 ,       EXIT        ALWAYS RETURNS HERE\r
914 \r
915 ,IF THE DEVICE IS INACTIVE (IOACT=0), RETURNS TO EXIT. OTHERWISE. SETS\r
916 ,IOW:=1 AND ENTERS WAIT UNLESS IOACT BECOMES ZERO BEFORE THE\r
917 ,JUMP IS MADE, IN WHICH CASE IT SETS IOW:=0 AND RETURNS TO EXIT.\r
918 ,ON LEAVING THE WAIT STATE, RETURNS TO EXIT.\r
919 ,THIS ROUTINE PREVENTS THE STATE IOACT=0 AND IOW=1 FROM OCCURING\r
920 ,CALLING SEQUENCE\r
921 ,     PUSHJ PDP, WSYNC\r
922 ,     EXIT             ALWAYS RETURNS HERE\r
923 ,SETS IOW:=1 AND ENTERS WAIT ROUTINE. RETURNS TO EXIT WHEN IOACT=0.\r
924 \r
925 INTERNAL WAIT1\r
926 \r
927 WAIT1:  MOVE IOS,DEVIOS(DEVDAT)\r
928         TRNN IOS, IOACT         ;IS DEVICE ACTIVE? (IOACT=1?)\r
929         POPJ PDP,               ;RETURN\r
930         PUSHJ PDP,WSYNC         ;WAIT\r
931         JRST WAIT1\r
932 \f\r
933 ;WSYNC IS CALLED TO WAIT UNTIL SETIOD IS CALLED BY INTERRUPT SERVICE ROUTINE\r
934 ;IE  UNTIL CURRENT BUFFER ACTIVITY IS COMPLETED\r
935 ;CALLED ONLY FROM UUO LEVEL\r
936 ;CALL:  MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK\r
937 ;       PUSHJ PDP,WSYNC\r
938 ;       RETURN IMMEDIATELY IF DEVICE IS INACTIVE\r
939 ;       RETURN WHEN DEVICE FINISHES NEXT BUFFER IF IT IS ACTIVE\r
940 \r
941 \r
942 INTERNAL WSYNC\r
943 EXTERNAL IOWQ,TIOWQ,PION,PIOFF\r
944 \r
945 WSYNC:  MOVSI IOS,IOW           ;SETUP DEVICE IO WAIT BIT\r
946         MOVEI AC1,IOWQ          ;IO WAIT STATE CODE\r
947         MOVE AC3,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\r
948         TLNE AC3,DVTTY          ;IS THIS DEVICE A TTY?\r
949         MOVEI AC1,TIOWQ         ;YES, SET TTY WAIT STATE CODE\r
950         MOVE AC3,JOB            ;CURRENT JOB NO.\r
951         MOVEI AC2,IOACT         ;DEVICE ACTIVE BIT\r
952         CONO PI, PIOFF          ;TURN PI OFF\r
953         TDNN AC2,DEVIOS(DEVDAT) ;IS THE DEVICE ACTIVE?\r
954         JRST WSYNC1             ;NO\r
955         IORM IOS,DEVIOS(DEVDAT) ;YES, SET DEVICE IO-WAIT BIT\r
956                                 ; AND SETUP IOS FOR RETURN WHEN WAIT SATISFIED\r
957         DPB AC1,PJBS1           ;SET JOB WAIT STATE CODE\r
958                                 ; IN JOB STATUS WORD\r
959         CONO PI, PION           ;TURN PI ON\r
960         PUSHJ PDP,WSCHED        ;CALL SCHEDULER TO FIN ANOTHER JOB TO RUN\r
961                                 ; RETURN WHEN NEXT BUFFERFUL IS FINISHED\r
962                                 ; WITH ACS 0-14 OCTAL RESTORED\r
963                                 ; RETURN WHEN IO-WAIT FINISHED\r
964 WSYNC1: CONO PI, PION\r
965         ANDCAB IOS, DEVIOS(DEVDAT)      ;CLEAR DEVICE IO-WAIT BIT\r
966         POPJ PDP,\r
967 \r
968 \r
969 CLKEND: END\r