Added version 10 of basic.
[retro-software/dec/tops10/v4.5.git] / src / schedb.mac
1 IFE FTDISK+FTRC10+2,<\r
2 TITLE   SCHEDB - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(BURROUGHS DISK)\r
3 >\r
4 IFE FTDISK+FTRC10+1,<\r
5 TITLE   SCHEDD - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(DATA PRODUCTS DISK)\r
6 >\r
7 SUBTTL  CLKCSW R,KRASIN/AF/TH/RCC  TS  02 JUNE 69  V421\r
8 XP VSCHED,421\r
9                 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
10 \r
11 \r
12 INTERNAL        FTRC10  ;THIS SOURCE FILE MAY BE ASSEMBLED TO USE EITHER THE\r
13                 ; NEW PDP-10 DISK (MODEL RC-10) OR THE OLD PDP-6 DISK (DATA\r
14                 ; PRODUCTS DISK FILE) FOR SWAPPING.\r
15 \r
16 IFN     FTRC10, <\r
17 ENTRY   RCXSKD  ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM\r
18 RCXSKD:         ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.\r
19 INTERNAL        XCKCSW\r
20 >\r
21 IFE     FTRC10, <\r
22 ENTRY   XCKCSW\r
23 >\r
24 \r
25 \r
26 EXTERNAL JOB,JBTSTS\r
27 EXTERNAL JBTQ,PJBSTS\r
28 EXTERNAL PJBSTS,TIMEF,MJOBN\r
29 \r
30 INTERNAL NXTJOB,FTSWAP\r
31 \r
32 ;ACCUMULATOR DEFINITIONS ---\r
33 QJ=DEVDAT       ;QJOB WORD\r
34 SW=TAC1         ;STATUS WORD\r
35 J=ITEM          ;JOB NO.\r
36 \r
37 ;INITIALIZE SCHEDULER  (CALLED FROM SYSINI BEFORE ALL OTHER\r
38 ;       DEVICES ARE INITIALIZED)\r
39 \r
40 INTERNAL NXTINI\r
41 \r
42 XCKCSW:\r
43 NXTINI: MOVEI TAC,MAXQ          ;MAX. NO. OF QUEUES\r
44         SETZM AVALTB(TAC)       ;CLEAR SHARABLE DEVICE AVAIL. FLAGS\r
45         SETOM REQTAB(TAC)       ;SET SHARABLE DEVICE REQUEST COUNT\r
46                                 ; TO -,  I.E. NO JOB WAITING OR\r
47                                 ; USING DEVICE OTHER THAN INITIALIZATION\r
48         SOJGE TAC,.-2           \r
49         SETZM QJOB              ;CLEAR NO. OF JOBS NEEDING REQUEING\r
50         SETZM XJOB              ;CLEAR NO. OF JOBS NEEDING EXPANDING\r
51         SETZM JOBQUE            ;CLEAR JOB NO. TO BE REQUEUED\r
52         POPJ PDP,\r
53 \r
54 \f,NXTJOB DECREMENTS CURRENT JOB'S QUANT. AND PROTECT\r
55 ,TIMES AND REQUEUES IT IF QUANT. TIME GONE TO 0\r
56 ,SERVINCES ANY JOB REQUEING REQUESTED AT OTHER PRIORITY\r
57 ,LEVELS THEN CALLS SHUFFLER,SWAPPER AND SCHEDULAR.\r
58 ,MAKES NO ASSUMPTIONS RE. ACS\r
59 ,RETURSN NEXT JOB TO RUN IN J.\r
60 \r
61 \r
62 EXTERNAL JBTSWP,POTLST\r
63 \r
64 NXTJOB: SKIPN TIMEF             ;CLOCK TIC?\r
65         JRST NXTJB1             ;NO\r
66         MOVSI J,MJOBN           ;YES\r
67         MOVSI SW,-1             ;DECREMENT IN CORE PROTECT TIME\r
68         MOVSI DAT,SWP\r
69         TDNE DAT,JBTSTS(J)\r
70         JRST .+3\r
71         SKIPL JBTSWP(J)\r
72         ADDM SW,JBTSWP(J)\r
73         AOBJN J,.-4\r
74 \r
75 NXTJB1: SKIPN J,JOB             ;CURRENT JOB NO., IS IT NULL JOB?\r
76         JRST CKJB1              ;YES,GO SEE IF OTHER JOBS NEED RESCHEDULING\r
77         MOVEI QJ,0              ;GET READY IN CASE CURRENT JOB UNRUNNABLE\r
78         HLRZ SW,JBTSTS(J)       ;GET JOB STATUS BITS AND CODES\r
79         TRZ SW,RUNMSK+CMWB              ;MASK OUT DO NOT CARE BITS\r
80         CAIE SW,RUNABLE         ;IS CURRENT JOB RUNABLE?\r
81         JRST CKJB3              ;NO. REQUEU CURRENT JOB\r
82         SKIPN TIMEF             ;NO. IS THIS A TIME INTERRUPT?\r
83         JRST CKJB1              ;NO.\r
84 \r
85         SOS SW,JBTSTS(J)        ;DECREMENT QUANT. TIME\r
86         TRNE SW,-1              ;HAS TIME GONE TO 0?\r
87         JRST CKJB1              ;NO\r
88         MOVEI DAT,QTIME         ;YES---REQUEUE AND RESET QUANT. TIME\r
89         MOVE TAC,JOBQUE\r
90         PUSHJ PDP,QXFER\r
91 \fCKJB1: SKIPG   QJ,QJOB         ;SET QJ NON ZERO IF ANY REQUEUING TO DO\r
92         JRST    CKJB5           ;NO REQUEUEING NECESSARY\r
93         MOVEI   J,JOBMAX        ;START WITH HIGHEST JOB NUMBER ASSIGNED\r
94 CKJB2:  MOVSI   SW,JRQ          ;JOB NEEDS REQUEUEING BIT\r
95         TDNN    SW,JBTSTS(J)    ;THIS JOB?\r
96         SOJG    J,.-1           ;NO, KEEP LOOKING\r
97         JUMPLE  J,CKJB5         ;YES,LOOKED AT ALL JOBS?\r
98                                 ; (MAY NOT FIND A KJOBED JOB IF HIGHEST\r
99                                 ; GO DECR, COUNT QJOB ANYWAY)\r
100         ANDCAM  SW,JBTSTS(J)    ;NO,MARK THIS JOB AS DONE\r
101 CKJB3:  MOVE SW,JBTSTS(J)       ;JOB STATUS WORD\r
102         MOVEI DAT,QCMW          ;ASSUME COMMAND WAIT\r
103         TLNN SW,CMWB            ;IS JOB IN COMMAND WAIT?\r
104         JRST CKJB9              ;NO.\r
105         TLNE SW,SWP+JXPN                ;YES, IS JOB ON DISK, OR TRYING TO EXPAND?\r
106         JRST CKJB4A             ;YES. PUT JOB IN COMMAND WAIT Q\r
107 CKJB9:  JUMPGE SW,CKJB4         ;NO,WAIT STATUS CODE DETERMINES NEW Q\r
108         LDB SW,PJBSTS           ;YES, GET QUEUE CODE.\r
109         CAIN    SW,WSQ          ;*** EXPERIMENTAL ***\r
110         JRST    CKJB10          ;*** EXPERIMENTAL ***\r
111         CAIN SW,TIOWQ           ;CURRENT JOB GOING INTO TTY IO WAIT?\r
112         HRROS JBTSWP(J)         ;YES, SET IN CORE PROTECT TIME TO -1,\r
113                                 ; SO HE CAN BE SWAPPED IMMEDIATELY IF SOMEONE\r
114                                 ; ELSE WANTS TO BE SWAPPED IN\r
115 CKJB4B: SKIPA DAT,QBITS(SW)     ;GET ADDRESS OF TRANSFER TABLE\r
116 CKJB4:  MOVEI DAT,QSTOP         ;IF RUN BIT WAS OFF\r
117 CKJB4A: PUSHJ PDP,QXFER         ;REQUEUE THE JOB\r
118         JUMPE QJ,SCHED          ;IF FROM NXTJOB GO DIRECTLY TO SCHED\r
119                                 ; I.E, CURRENT JOB NO LONGER RUNNABLE(IOW)\r
120                                 ; BUT JRQ WASN'T SET SO DON'T DECR QJOB\r
121         SOSLE   QJ,QJOB         ;ANY MORE JOBS TO REQUEUE?\r
122         SOJG    J,CKJB2         ;YES,BUT LOOK AT EACH JOB ONLY ONCE PER CLOCK TICK\r
123 \r
124 CKJB5:  MOVEI QJ,AVLNUM         ;CK AVAL FLAGS FOR SHAR. DEVS.\r
125 CKJB6:  SKIPN AVALTB(QJ)        ;FLAG=0?\r
126         SOJG QJ,CKJB6           ;YES - TRY NEXT ONE\r
127         JUMPLE QJ,CKJB7         ;NO - OR FINISHED?\r
128         HLR J,AVLQTB(QJ)        ;NO--GET 1ST JOB IN Q\r
129 CKJB6A: HRRE J,JBTQ(J)\r
130         JUMPLE J,CKJB8          ;FINISHED Q? WAIT TILL SWAPPER BRINGS IN JOB\r
131         MOVE DAT,JBTSTS(J)      ;IS JOB IN CORE?\r
132         TLNE DAT,SWP\r
133         JRST CKJB6A             ;NO, LOOK AT NEXT JOB IN THIS QUEUE\r
134                                 ; TO SEE IF IN CORE.\r
135         HRRZ DAT,AVLQTB(QJ)     ;NO--GET TRANS. TABLE ADDRESS\r
136         SETZM AVALTB(QJ)        ;CLEAR AVAL FLAG\r
137         CAIL QJ,MINQ            ;LESS THAN MIN, SHARABLE DEV. Q?\r
138         PUSHJ PDP,QXFER         ;REQUEUE THE JOB AND PUT IT IN\r
139                                 ; PROCESSOR Q SO SCHEDULER WILL RUN IT\r
140 CKJB8:  SOJG QJ,CKJB6           ;CONTINUE IF ANY MORE FLAGS TO LOOK AT\r
141 \fCKJB7:                         ;NONE--GO SHUFFLE AND SWAP\r
142 IFE FTSWAP,<    EXTERNAL CHKSHF\r
143         PUSHJ PDP,CHKSHF\r
144 >\r
145 IFN FTSWAP,<\r
146         PUSHJ PDP,SWAP>\r
147 \r
148 ;SCHEDULAR--SEARCH THRU QUEUES ACCORDING TO SSCAN TABLE\r
149 ;FOR 1ST JOB IN CORE--RETURN ITS NO. IN J\r
150 \r
151 SCHED:  SETZM POTLST            ;CLEAR POTENTIALLY LOST TIME FLAG\r
152         MOVEI DAT,SSCAN         ;ADDRESS OF SCAN TABLE\r
153         JSP TAC,QSCAN           ;BEGIN SCAN\r
154         JRST SCHD1              ;NO MORE JOBS--RETURN NULLJOB\r
155         SETOM POTLST            ;SET POTENTIALLY LOST TIME FLAG FOR CLOCK1\r
156         MOVE QJ,JBTSTS(J)       ;IS THIS JOB SWAPPED OUT\r
157         TLNE QJ,SWP+SHF+JXPN    ;MONITOR WAITING FOR I/O TO STOP,OR JOB EXPANDING CORE?\r
158         JRST (TAC1)             ;YES--CONTINUE SCAN,JOB CANNOT BE RUN\r
159 \r
160         HLREM TAC1,JOBQUE       ;YES--SAVE ITS Q\r
161         MOVSI QJ,WTMASK         ;CLEAR WAIT CODE\r
162         ANDCAM QJ,JBTSTS(J)\r
163         SETZM POTLST            ;CLEAR POTENTIALLY LOST TIME AS A USER IS TO BE RUN\r
164         POPJ PDP,               ;RETURN\r
165 SCHD1:  SETZ J,                 ;RETURN NULL JOB\r
166         POPJ PDP,\r
167 \r
168 \r
169 \r
170 ;TEMPORARY EXPERIMENTAL SCHEDULING CHANGE TO PERMIT TTY-I/O-WAIT-SATISFIED JOBS ON\r
171 ; THE DISK TO DISPLACE I/O BOUND JOBS IN CORE.... R.CLEMENTS/D.PLUMER 9 MAY 68\r
172 CKJB10: SKIPE   INFLG\r
173         SKIPL   JBTSWP(J)\r
174         JRST    CKJB4B\r
175         MOVEI   DAT,CKJBT\r
176         JRST    CKJB4A\r
177 CKJBT:  EXP     EQFIX\r
178         XWD     QQTTY,-PQ2      ;MAKE JOB(LPT) COMPLETE WITH CPU BOUND JOBS\r
179 INFLG:  0       ;NON-ZERO MEANS AT LEAST ONE JOB ON DISK WAITING TO COME IN.\r
180 \fSUBTTL OCSS R. KRASIN/AF TS3.17 22 MAR 68 V000\r
181 \r
182 ,THIS ROUTINE MUST BE ASSEMBLED WITH THE CONFIGURATION\r
183 ,TYPE TO DEFINE NUMBER OF JOBS\r
184 ,THIS SECTION CONTAINS 2 ROUTINES FOR Q MANIPULATION\r
185 ,AND NECESSARY TABLES FOR SPECIFING OPERATIONS PERFORMED\r
186 ,BY THEM.\r
187 \r
188 EXTERNAL IMGIN,JBTSTS,JBTADR,PJBSTS\r
189 INTERNAL QXFER,QSCAN,FTSWAP,FTDISK\r
190 \r
191 ,STORAGE:\r
192 ,EACH Q IS A RING STRUCTURED, FORWARD AND BACKWARD\r
193 ,LINKED SRING LIST. THE "FIRST" LINK IN A Q IS\r
194 ,A Q-HEADER POINTING TO THE FIRST AND LAST MEMBERS OF THE Q.\r
195 ,A NULL Q HAS ONE LINK--THE Q-HEADER ITSELF.  THE LINKS MAKING\r
196 ,UP THE OS ARE CONTAINED IN A TABLE (JBTQ) WITH NEGATIVE\r
197 ,INDICIES (ADDRESSES LESS THAN JBTQ) USED FOR Q-HEADERS AND\r
198 ,POSITIVE INDICIES USED FOR MEMBERS (JOBS). THUS ONLY ONE WORD\r
199 ,PER LINK IS NECESSARY--ITS ADDRESS RELATIVE TO JBTQ GIVES THE\r
200 ,JOB NO. (OR Q NU, IF NEGATIVE) WHICH IT REPRESENTS WHILE\r
201 ,ITS CONTENTS CONTAINS THE LINKING POINTERS, THESE\r
202 ,POINTERS ARE ALSO INDICIES RELATIVE TO JBTQ RATHER THAN\r
203 ,ABSOLUTE ADDRESSES--RH(LINK)=FORWARD POINTER;\r
204 ,LH(LINK)=BACKWARD POINTER.\r
205 ,A JOB IS ASSUMED TO BE IN NO MORE THAN ONE Q AT A TIME, AND\r
206 ,THE NULL JOB (JOB 0) DOES NOT APPEAR IN THE QS (I.E. JBTQ\r
207 ,ITSELF IS THE Q-HEADER FOR Q 0).\r
208 \r
209 ,ROUTINES:\r
210 ,BOTH ROUTINES ARE "TABLE DRIVEN" IN THE SENSE THAT THE\r
211 ,CALLING ROUTINE PROVIDES THE ADDRESS OF A TABLE WHICH\r
212 ,DEFINES THE SPECIFIC OPERATIONS TO BE PERFORMED.\r
213 \f\r
214 ;QUEUE INITIALIZATION\r
215 ;PUT ALL JOBS IN NULL QUEUE(JOB NO. NOT ASSIGNED)\r
216 ;CALLED ON RESTART AT LOC 143\r
217 \r
218 INTERNAL QINI\r
219 EXTERNAL CPOPJ,JOBMAX,MXQUE,JBTQ\r
220 EXTERNAL JBTQP1 ;EQUALS JBTQ+1\r
221 EXTERNAL JBTQM1 ;EQUALS JBTQ-1\r
222 EXTERNAL JBTQMN ;EQUALS JBTQ-NULQ\r
223 \r
224 QINI:   MOVNI TAC,MXQUE         ;MAKE ALL QUEUE HEADERS POINT TO THEMSELVES\r
225         HRL TAC,TAC             ;BACKWARD POINTERS TOO\r
226         MOVEM TAC,JBTQ(TAC)\r
227         AOBJN TAC,.-1\r
228         MOVEI TAC,-NULQ         ;PUT JOBS ALL IN NULQ QUEUE\r
229         MOVSM TAC,JBTQP1        ;BACK POINTER FOR JOB 1\r
230         MOVEI ITEM,JOBMAX       ;MAX. JOB NO.\r
231         MOVEM TAC,JBTQ(ITEM)    ;FOR. POINTER OF JOBMAX JOB NO.\r
232         HRLM ITEM,JBTQMN        ;SET NULQ HEADER TO POINT TO JOB1\r
233         MOVEI TAC,1             ;AND JOBMAX\r
234         HRRM TAC,JBTQMN ;FORWARD POINTER\r
235 QINI1:  HRRM ITEM,JBTQM1(ITEM)  ;JOB I-1 POINT TO JOB I\r
236         SETZM JBTQ\r
237         SOJLE ITEM,CPOPJ        ;FINISHED?\r
238         HRLM ITEM,JBTQP1(ITEM)  ;BACK POINTER JOB I+1 POINTS TO JOB I\r
239         JRST QINI1\r
240 \f\r
241 ,DELETES A JOB FROM ITS "SOURCE-Q", DETERMINES A "DEST-Q"\r
242 ,ACCORDING TO ONE OF 3 FUNCTIONS, AND INSERTS THE JOB AT\r
243 ,THE BEGINNING OR END OF THIS DEST-Q. IN ADDITION IT MAY\r
244 ,RESET THE JOB'S QUANTUM TIME (RH JBTSTS).\r
245 ,THE DRIVING TABLES ARE "TRANSFER TABLES":\r
246 ,\r
247 ,T.TABLE:       EXP <CODE>\r
248 ,               XWD <QUANT-TAB>,<Q-TAB>\r
249 ,\r
250 ,DEPENDING ON <CODE>, THE SECOND WORD IS EITHER DATA OR THE\r
251 ,ADDRESSES OF "CORRESPONDANCE TABLES".\r
252 ,\r
253 ,THE PREFIX OF <CODE> SPECIFIES WHETHER THE JOB IS TO BE\r
254 ,INSERTED AT THE BEGINNING OR END OF THE DEST-Q. THE SUFFIX\r
255 ,DETERMINES THE FUNCTION USED TO SELECT THE DEST-Q.\r
256 ,THE FOLLOWING ARE THE SIX CODES AND THEIR TABLE FORMATS:\r
257 \r
258 \r
259 ,DEST-Q AS A FIXED (PREDETERMINED Q:\r
260 ,BQFIX: INSERT AT BEG OF DEST-Q\r
261 ,EQFIX: INSERT AT END\r
262 ,\r
263 , THE JOB IS TRANSFERED TO THE END OF BEG, OF THE Q <Q-TAB>\r
264 , IF <QUANT-TAB> = -1, QUANT, TIME IS NOT RESET.\r
265 , IF <QUANT-TAB> .G. 0 , QUANT. TIME IS RESET TO <QUANT-TAB>.\r
266 , SINCE THIS FUNCTION IS FULLY DEFINED BY THE SECOND WORD\r
267 , ALONE, O CORRES, TABLE IS NECESSARY.\r
268 \f,DEST-Q AS A FUNCTION OF SOURCE-Q\r
269 ,BQLINK:        INSRT AT BEG OF DEST-Q\r
270 ,EQLINK:        INSERT AT END\r
271 ,\r
272 , <Q-TAB>=ADDRES OF A CORRES. TABLE "LINKING" SOURCE-QS TO\r
273 , DEST-QS,\r
274 , IF <QUANT-TAB> = -1, QUANT. TIME IS NOT RESET.\r
275 , OTHERWISE <QUANT-TAB> IS TAKEN AS THE ADDRESS OF A \r
276 , TABLE OF QUANT. TIMES CORRESPONDING TO THE Q-LINKING TABLE.\r
277 , FORMAT OF THE TABLES ARE:\r
278 ,\r
279 , <Q-TAB>:      XWD <SQ1>,<DQ1> ;1ST SOURCE-Q:DEST-Q PAIR\r
280 ,               ...\r
281 ,               XWD <SQN>,<DQN> ;NTH ...\r
282 ,               Z               ;ZERO TERMINATES TABLE\r
283 ,\r
284 , <QUANT-TAB>:  EXP <QUANT1>    ;CORRES. TO <Q-TAB>+0\r
285 ,               ...\r
286 ,               EXP <QUANTN>    ;CORRES. TO <Q-TAB>+N-1\r
287 ,               Z\r
288 ,\r
289 , UPON A CALL TO QXFER FOR THESE 2 CODES, AC T2 CONTAINES\r
290 , THE SOURCE-Q (CURRENT Q) OF THE JOB.  THE LH OF THE\r
291 , <Q-TAB> ENTRIES ARE SEARCHED FOR A MATCH.,IF FOUND, THE\r
292 , RH IS TAKEN AS THE DEST-Q AND THE QUANT. TIME IS RESET\r
293 , (IF <QUANT-TAB> NOT -1) TO THE CORRES. ENTRY IN THE \r
294 , <QUANT-TAB> TABLE.\r
295 , IF NO MATCH FOUND..NO TRANSFER TAKES PLACE.\r
296 \r
297 \r
298 ,DEST-Q AS A FUNCTION OF JOB SIZE\r
299 ,BQJSIZ INSERT AT BEG OF DEST-Q\r
300 ,EQJSIZ INSERT AT END\r
301 ,\r
302 , <Q-TAB>=ADDRESS OF A TABLE ASSOCIATING JOB SIZE\r
303 , (IN 1K BLOCKS) TO DEST-QS.\r
304 , <QUANT-TAB> HAS SAME MEANING AS FOR B-EQLINK\r
305 ,\r
306 , <Q-TAB>:      XWD <JSIZ1>,<DQ1>\r
307 ,               ...\r
308 ,               XWD <JSIZN>,<DQN>\r
309 ,               Z\r
310 ,\r
311 , <QUANT-TAB>: SIMILAR TO THAT FOR B-EQLINK\r
312 ,\r
313 , THE <JSIZ>'S MUST BE IN INCREASING ORDER.\r
314 , THE TABLE IS SEARCHED UNTIL <JSIZ> IS LESS THAN OR\r
315 , EQUAL TO THE JOB SIZE, THEN THE CORRES. <DQ> IS\r
316 , TAKEN AS THE DEST-Q. IF THE TABLE IS EXAUSTED, NO\r
317 , TRANSFER TAKES PLACE,\r
318 , QUANT, TIME IS HANDLED AS IN B-EQLINK.\r
319 \f,CALLING SEQUENCE:\r
320 ,       MOVE  J,[JOB NUMBER]\r
321 ,       MOVE T2,[CURRENT Q]     ;BQLINK AND EQLINK ONLY\r
322 ,       MOVEI TT,TRANS TABLE ADDRESS\r
323 ,       PUSHJ PDP,QXFER\r
324 ,       ...             ;RETURN\r
325 ,  ON RETURN J IS UNALTERED; LH(Q)=-1  IF QUANT, TIME OUT\r
326 ,  RESET; QUANT, TIME IF RESET;RH(Q)=DEST.Q\r
327 ,\r
328 ,ACS:\r
329 TT=DAT  ;POINTER TO TRANSFER TABLE\r
330 J=ITEM  ;JOB NO.\r
331 Q=PROG  ;DEST-Q AND QUANT. TIME ON RETURN\r
332 T1=TAC1 ;TEMP\r
333 T2=TAC  ;TEMP AND SOURCE-Q ON CALL TO B,EQLINK\r
334 \r
335 EXTERNAL ERROR\r
336 \r
337 QXFER:  MOVE Q,1(TT)            ;GET TRANSFER TABLE ADDRESS\r
338         JRST @(TT)              ;DISPATCH\r
339 \r
340 ,DEST-Q AS FUNCTION OF SOURCE-Q\r
341 QLINK:  SKIPN T1,(Q)            ;END OF TABLE?\r
342         POPJ PDP,               ;YES\r
343         HLRE T1,T1\r
344         CAME T1,T2              ;NO--SOURCE-Q=LH(TABLE ENTRY)?\r
345         AOBJP Q,QLINK           ;NO- CONTINUE SEARCH\r
346         JRST QX2\r
347 \r
348 ,DEST-Q AS FUNCTION OF JOB SIZE\r
349 QJSIZ:  HLRZ T2,JBTADR(J)       ;HIGHEST REL. LOC. OF JOB\r
350         ASH T2,-^D10            ;CONVERT TO NO. OF 1K BLOCKS - 1.\r
351         MOVSI T2,1(T2)          ;NO. OF 1K BLOKS TO LH.\r
352 QX1:    SKIPN T1,(Q)            ;END OF TABLE?\r
353         JSP DAT,ERROR\r
354         CAMLE T2,T1             ;JOBSIZE .LE. LH(TABLE ENTRY)?\r
355         AOBJP Q,QX1             ;NO--CONTINUE SEARCH, JUMP ALWAYS.\r
356 \r
357 QX2:    MOVS T2,Q               ;T2 IS ADDR. OF QUANT.TIME(IF REQUESTED)\r
358         HRRO Q,(Q)              ;RH(Q)=DEST-Q;LH=-1(NO QUANT.TIME REQ.)\r
359         SKIPL 1(TT)             ;WAS QUANT. TIME REQUESTED?\r
360         HRL Q,(T2)              ;YES--GET IT\r
361 \f\r
362 ,FIXED DEST-Q\r
363 QFIX:   MOVE T1,JBTQ(J)         ;DELETE JOB FROM SOURCE-Q\r
364         MOVS T2,T1              ;T1=FORW. LINK, T2=BACK LINK\r
365         HRRM T1,JBTQ(T2)        ;FORW, LINK PAST JOB\r
366         HRLM T2,JBTQ(T1)        ;BACK LINK PAST JOB\r
367 \r
368         SKIPGE (TT)             ;END OR BEG. OF Q?\r
369         HLR Q,JBTQ(Q)           ;END--THIS WILL LEAVE Q=IDX OF\r
370                                 ; CURRENT LAST LINK;T2=IDX OF Q-HEADER\r
371         MOVE T2,JBTQ(Q)         ;BEG--T2=IDX OF CURRENT 1ST LINK\r
372                                 ; Q=IDX OF Q-HEADER\r
373         HRRM J,JBTQ(Q)          ;INSERT JOB IN DEST-Q\r
374         HRLM J,JBTQ(T2)\r
375         HRRM T2,JBTQ(J)\r
376         HRLM Q,JBTQ(J)\r
377 \r
378         JUMPL Q,QX3             ;RETURN IF QUANT. TIME NOT REQ.\r
379         HLRM Q,JBTSTS(J)        ;SET QUANT. TIME\r
380         MOVEI TT,RNQ            ;SET JOB STATUS WAIT\r
381         DPB TT,PJBSTS           ;CODE TO RUN QUEUE (0).\r
382 QX3:    POPJ PDP,\r
383 \r
384 BQFIX=QFIX\r
385 EQFIX=QFIX+1B0\r
386 BQLINK=QLINK\r
387 EQLINK=QLINK+1B0\r
388 BQJSIZ=QJSIZ\r
389 EQJSIZ=QJSIZ+1B0\r
390 \f,SCANS THE QS RETURNING THE NUMBERS OF THE JOBS IN THE QS.\r
391 ,THE ORDER AND MANNER IN WHICH THE QS ARE SEARCHED IS\r
392 ,DETERMINED BY A "SCAN TABLE" ADDRESSED IN THE CALLING SEQ.\r
393 ,THE SCAN TABLE HAS THE FORM:\r
394 ,\r
395 ,SCANTAB:       XWD <Q1>,<CODE1>        ;SCN Q1 ACCRDING TO CODE1\r
396 ,               ...\r
397 ,               XWD <QN>,<CODEN>        ;QN ACCORDING TO CODEN\r
398 ,               Z               ;ZERO TERMINATES TABLE\r
399 ,\r
400 ,EACH Q MAY BE SCANNED IN ONE OF FOUR WAYS SPECIFIEDBY <CODE>\r
401 ,THE CODES ARE:\r
402 ,\r
403 ,QFOR   SCAN WHOLE Q FORWARD\r
404 ,QFOR1  SCAN FOR ONLY THE 1ST MEMBER (IF ANY)\r
405 ,QBAK   SCAN WHOLE Q BACKWARD\r
406 ,QBAK1  SCAN BACKWARD FOR ALL MEMBERS EXCEPT THE 1ST\r
407 ,\r
408 ,CALLING SEQ.\r
409 ,\r
410 ,       MOVEI ST,SCAN TABLE ADDRESS\r
411 ,       JSP PC,QSCAN    ;SET UP PC FOR REPEATED RETURNS\r
412 ,       ...             ;RETURN HERE WHEN NO MORE JOBS\r
413 ,       ...             ;RETURN HERE WITH NEXT JOB IN AC J\r
414 ,                       ; AND ITS Q IN LH(QR)\r
415 ,\r
416 ,       PERFORM ANY NECESSARY TESTING OF THIS JOB\r
417 ,       J,ST,PC,QR MUST BE PRESERVED\r
418 ,       \r
419 ,       JRST (QR)       ;RETURN TO QSCAN TO GET NEXT JOB\r
420 ,                       ; IF THIS ONE NOT ACCEPTABLE\r
421 ,\r
422 ,ACS:\r
423 J=ITEM  ;JOB NO.\r
424 ST=DAT  ;POINTER TO SCAN TABLE\r
425 PC=TAC  ;RETURN ADDRESS\r
426 QR=TAC1 ;ITERATED RETURN ADDRESS TO QSCAN\r
427 \fQSCAN: SKIPN QR,(ST)   ;END OF SCAN TABLE?\r
428         JRST (PC)       ;YES--RETURN TO CALL+1\r
429         HLRE J,QR       ;NO--GET NO. OF Q\r
430         JRST (QR)       ;DISPATCH\r
431 \r
432 QFOR1:  MOVEI QR,QFOR2  ;ONLY THE FIRST JOB\r
433 \r
434 QFOR:   HRRE J,JBTQ(J)  ;SCAN FORWARD ALL JOBS\r
435         JUMPG J,1(PC)   ;RETURN THIS JOB NO. CALL+2 UNLESS--\r
436 QFOR2:  AOJA ST,QSCAN   ;END OF THIS Q--GET NEXT Q\r
437 \r
438 QBAK1:  HLRE J,JBTQ(J)  ;SCAN BACKWARD ALL JOBS EXCEPT 1ST\r
439         SKIPLE JBTQ(J)  ;IS THIS THE FIRST MEMBER?\r
440         JRST 1(PC)      ;NO--RETURN CALL+2\r
441         AOJA ST,QSCAN   ;YES--GET NEXT Q\r
442 \r
443 QBAK:   HLRE J,JBTQ(J)  ;SCAN BACKWARD ALL JOBS\r
444         JUMPG J,1(PC)   ;RETURN CALL+2 WITH JOB NO. UNLESS\r
445         AOJA ST,QSCAN   ;BEG OF THIS Q--GET NEXT Q\r
446 \fINTERNAL FTCHECK,FTMONP\r
447 IFN FTCHECK+FTMONP,<\r
448 EXTERNAL AVALTB\r
449 DEFINE X(A,B),<\r
450 EXTERNAL A'AVAL\r
451 INTERNAL A'Q\r
452 A'Q=ZZ\r
453 ZZ=ZZ+1\r
454 >\r
455         ZZ=0\r
456         QUEUES\r
457         LOC=ZZ\r
458 >\r
459 IFE FTCHECK+FTMONP,<\r
460 \r
461 ;SHARABLE DEVICE JUST BECOME AVAILABLE(EXTENDED TO OTHER QUEUEW TOO)\r
462 ;APPROPRIATE ENTRY IS SET NON-ZERO WHEN SCHEDULER SHOULD LOOK\r
463 ;AT THAT QUEUE TO FIND A JOB TO RUN\r
464 ;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE)\r
465 \r
466 DEFINE X(A,B)\r
467 <INTERNAL A'AVAL,A'Q\r
468 A'Q=.-AVALTB\r
469 A'AVAL: 0\r
470 >\r
471 \r
472 INTERNAL AVALTB\r
473 \r
474 AVALTB: QUEUES  ;GENERATE THE AVAL FLAGS\r
475 LOC=.-AVALTB\r
476 >\r
477 NQUEUE=LOC              ;NO. OF QUEUES COUNTING RUN QUEUE\r
478 XP MAXQ,NQUEUE-1        ;MAX. STATE CODE WHICH HAS AN AVAL FLAG\r
479 XP MINQ,STQ             ;MINIMUM SHARABLE DEVICE QUEUE\r
480 XP AVLNUM,MAXQ          ;MAX. STATE CODE WHICH HAS AN AVAL FLAG\r
481 \r
482 ;DEFINE STATE CODES WHICH DO NOT HAVE AVAL AND REQ FLAGS\r
483 \r
484 \r
485 DEFINE X(A)\r
486 <INTERNAL A'Q\r
487 A'Q=LOC\r
488 LOC=LOC+1\r
489 >\r
490         CODES\r
491 \r
492 XP MXCODE,LOC-1 ;MAX, JOB STATE DONE\r
493 PQ1=LOC\r
494 LOC=LOC+1\r
495 PQ2=LOC\r
496 LOC=LOC+1\r
497 PQ3=LOC\r
498 LOC=LOC+1\r
499 CMQ=LOC         ;COMMAND DELAY QUEUE\r
500 \f\r
501 ;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES\r
502 ;USED BY SCHEDULER\r
503 ;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE.\r
504 ;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM\r
505 ;FOLLOWING TABLE USING NEW STATE CODE AS INDEX\r
506 \r
507 DEFINE X(A,B)\r
508 <       EXP Q'A'W\r
509 >\r
510 \r
511 INTERNAL QBITS\r
512 \r
513 QBITS:  QUEUES\r
514         CODES\r
515 \fIFN FTCHECK+FTMONP,<\r
516 DEFINE X(A,B),<\r
517 EXTERNAL A'REQ\r
518 >\r
519         QUEUES\r
520 EXTERNAL REQTAB\r
521 >\r
522 IFE FTCHECK+FTMONP,<\r
523 \r
524 ;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)\r
525 ;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARABLE DEVICE\r
526 ;WSREQ AND RNREQ ARE UNUSED\r
527 \r
528 DEFINE X(A,B)\r
529 <A'REQ: 0\r
530 INTERNAL A'REQ\r
531 >\r
532 \r
533 INTERNAL REQTAB\r
534 \r
535 REQTAB: QUEUES  ;GENERATE REQ TABLE\r
536 >\r
537 \f;CORRESPONDENCE TABLE LH=QUEUE CODE, RH=QUEUE TRANSFER TABLE ADR.\r
538 ;INDEX INTO TABLE ALSO = QUEUE CODE\r
539 ;FOR SHARABLE DEVICES ONLY\r
540 ;SCHEDULER TAKES ONE JOB WAITING FOR A SHARABLE DEVICE AND\r
541 ;PUTS IT IN THE APPROPRIATE RUN QUEUE ACCORDING TO \r
542 ;QUEUE TRANSFER TABLE AS SPECIFIED BELOW BY THE JOB WAIT\r
543 ;STATE CODE.\r
544 \r
545 DEFINE X(A,B)\r
546 <       XWD -A'Q,Q'A'S\r
547 >\r
548 \r
549 QRNS=0  ;NO CORRESPONDENCE TABLES FO THESE QUEUE\r
550 QWSS=0\r
551 QTSS=0\r
552 \r
553 INTERNAL AVLQTB\r
554 \r
555 AVLQTB: QUEUES\r
556 \fIFN FTCHECK+FTMONP,<\r
557 EXTERNAL QJOB,JOBQUE    ;JOBQUE WILL CAUSE LOAD OF PROPER SCHDAT\r
558                         ; DEPENDING ON FTRC10 IN SCHDAT\r
559 IFN FTSWAP,<\r
560 EXTERNAL XJOB\r
561 >>\r
562 IFE FTCHECK+FTMONP,<\r
563 \r
564 \r
565 INTERNAL JOBQUE\r
566 JOBQUE: 0       ;JOBS TO BE REQUEUED ON CLOCK INTERRUPT\r
567 \r
568 INTERNAL QJOB\r
569 QJOB:   Z       ;NUMBER OF JOBS NEEDING Q TRANSFERS AT OTHER THAN CLOCK LEVEL\r
570 \r
571 IFN FTSWAP,<\r
572 XJOB:   Z       ;NUMBER OF JOBS NEEDING CORE EXPANSION BY SWAPOUT-IN\r
573 INTERNAL XJOB\r
574 >\r
575 >\r
576 \fINTERNAL QSTOP,QTIME,SSCAN,QCMW\r
577 \r
578 BQFIX=QFIX      ;BEGINNING OF QUEUES FIXED QUEUE DISCIPLINE\r
579 EQFIX=QFIX+1B0  ;END OF QUEUES " " "\r
580 BQLINK=QLINK\r
581 EQLINK=QLINK+1B0\r
582 BQJSIZ=QJSIZ\r
583 EQJSIZ=QJSIZ+1B0\r
584 DEFINE TTAB(FCTN,QUEUE,QUANT)\r
585 <               EXP FCTN\r
586                 XWD QUANT,-QUEUE\r
587 >\r
588 DEFINE PTTAB(FCTN,QUEUE,QUANT)\r
589 <               EXP FCTN\r
590                 XWD QUANT,QUEUE\r
591 >\r
592 \r
593 QNULW:  TTAB EQFIX,NULQ,-1      ;NULL QUEUE JOB NO. NOT ASSIGNED\r
594 QSTOP:QSTOPW:   TTAB EQFIX,STOPQ,-1     ;UNRUNABLE JOBS TO END OF STOPQ\r
595 QCMW:   TTAB EQFIX,CMQ,-1               ;COMMAND WAIT TILL JOB IN CORE\r
596 QRNW:   PTTAB EQJSIZ,QSTAB,QQSTAB       ;JUST RUNABLE JOBS\r
597         ;WHICH ARE NOT IN SOME WAIT STATE BELOW,ENTER PROCESSOR\r
598         ;QS AT END AND GET QUANT. TIME ACCORDING TO THEIR SIZE\r
599 \r
600 QWSW:   TTAB BQFIX,PQ1,QQTTY    ;IO WAIT SAT.(EXCEPT TTY)\r
601         ;ENTER FRONT OF PROCESSOR QS AND GET QUANT, TIME\r
602         ;ACCORDING TO JOB SIZE\r
603 QTSW:   TTAB BQFIX,PQ1,QQTTY    ;TTY IO WAIT SATISFIED(ENTER FRONT OF PQ11)\r
604 \r
605 QIOWW:  TTAB EQFIX,IOWQ,-1      ;IOW(EXDEPT TTY) HELD IN IOWQ\r
606 QTIOWW: TTAB EQFIX,TIOWQ,-1     ;TTY IOW HELD IN TIOWQ\r
607 QAUW:   TTAB EQFIX,AUQ,-1,\r
608 QMQW:   TTAB EQFIX,MQQ,-1       ;MON. Q(DISK) WAIT\r
609 QDAW:   TTAB EQFIX,DAQ,-1       ;DEV. ALLOC.(DISK)\r
610 QDCW:   TTAB EQFIX,DCQ,-1       ;DATA CONTROL WAIT\r
611 QSTW:   TTAB EQFIX,STQ,-1       ;SYST TAPE\r
612 QDTW:   TTAB EQFIX,DTQ,-1       ;DEC TAPE\r
613 QMTW:   TTAB EQFIX,MTQ,-1       ;MAG TAPE\r
614 QSLPW:  TTAB EQFIX,SLPQ,-1      ;SLEEP UUO\r
615 \f;TRANSLATION TABLE FROM WAIT STATE TO SATISFIED STATE\r
616 ;DO NOT RESET QUANTUM RUN TIME\r
617 \r
618 QQSD=-1\r
619 \r
620 QMQS:   TTAB BQFIX,PQ1,QQSD     ;START MON. Q(DISK) AT PQ1\r
621 QDAS:   TTAB BQFIX,PQ1,QQSD     ;DEV. ALLOC.(DISK)...\r
622 QDCS:   TTAB BQFIX,PQ1,QQSD     ;DATA CONTROL...\r
623 QSTS:   TTAB BQFIX,PQ1,QQSD     ;SYST TAPE\r
624 QDTS:   TTAB BQFIX,PQ1,QQSD     ;DEC TAPE\r
625 QMTS:   TTAB BQFIX,PQ1,QQSD     ;MAG TAPE\r
626 QAUS:   TTAB BQFIX,PQ1,QQSD     ;ALTER UFD\r
627 QTIME:  PTTAB EQLINK,QTTAB,QQSTAB       ;MOVE JOB TO LOWER Q\r
628         ;WHEN QUANT. TIME EXCEEDED AND RESET QUANT. TIME\r
629 \f,ENTER PROCESSOR QS ACCORDING TO JOB SIZE\r
630 QSTAB:  XWD 4,-PQ1      ;PQ1 IF     SIZE .LE. 4K\r
631         XWD ^D16,-PQ2   ;PQ2 IF  4K .L. SIZE .LE. 16K\r
632         XWD ^D256,-PQ3  ;PQ3 IF 16 .L. SIZE\r
633         Z\r
634 \r
635 ,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME\r
636 QTTAB:  XWD -PQ1,-PQ2\r
637         XWD -PQ2,-PQ3\r
638         XWD -PQ3,-PQ2           ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS\r
639         Z\r
640 \r
641 ,QUANTUM TABLES\r
642 \r
643 QQSD=6  ;TENTH SEC. INITIAL QUANT. FOR SHAR. DEV. WAITERS\r
644 QQTTY=6 ;TENTH SEC. INITIAL QUANT. FOR TTY IOWS\r
645 \r
646 , QUANT. TIMES ACCORDING TO PROCESSOR Q:\r
647 \r
648 INTERNAL RNQUNT\r
649 \r
650 RNQUNT:\r
651 QQSTAB: EXP ^D30        ;PQ1: ONE HALF SECOND\r
652         EXP 2*^D60      ;PQ2: TWO SECONDS\r
653         EXP 2*^D60      ;PQ3: TWO SECONDS\r
654         Z\r
655 \fIFN FTSWAP,<\r
656 INTERNAL ISCAN,QSCAN\r
657 ISCAN:  ;SCAN FOR INPUT\r
658         XWD -CMQ,QFOR   ;MONITOR COMMAND WHICH NEEDS CORE IMAGE IN CORE\r
659         XWD -MQQ,QFOR1  ;LOOK FOR 1ST JOBS IN SHAR. DEV QUEUES\r
660         XWD -DAQ,QFOR1\r
661         XWD -AUQ,QFOR1\r
662         XWD -DCQ,QFOR1\r
663         XWD -MTQ,QFOR1\r
664         XWD -STQ,QFOR1\r
665         XWD -DTQ,QFOR1\r
666 SSCAN:  XWD -PQ1,QFOR   ;SCAN PROCESSOR AS SCHEDULER DOES\r
667         XWD -PQ2,QFOR\r
668         XWD -PQ3,QFOR\r
669         Z               ;PATCH SPACE\r
670         Z\r
671         Z               ;FINAL ZERO TO FLAG END\r
672 \r
673 OSCAN:  ;SCAN FOR OUTPUT\r
674         XWD -STOPQ,QFOR ;UNRUNABLE JOBS FIRST\r
675         XWD     -SLPQ,QFOR\r
676         XWD -DTQ,QBAK1  ;ANY SHAR. DEV.WAITERS MORE THAN 1 DEEP\r
677         XWD -STQ,QBAK1\r
678         XWD -MTQ,QBAK1\r
679         XWD -DCQ,QBAK1\r
680         XWD -AUQ,QBAK1\r
681         XWD -DAQ,QBAK1\r
682         XWD -MQQ,QBAK1\r
683         XWD -TIOWQ,QFOR         ;TTY IOW\r
684         XWD -PQ3,QBAK\r
685         XWD -DTQ,QFOR1\r
686         XWD -STQ,QFOR1\r
687         XWD -MTQ,QFOR1          ;NOW SCAN FIRST JOB IN QUEUES\r
688         XWD -DCQ,QFOR1\r
689         XWD -AUQ,QFOR1\r
690         XWD -DAQ,QFOR1\r
691         XWD -MQQ,QFOR1\r
692         XWD -PQ2,QBAK\r
693         XWD -PQ1,QBAK\r
694         Z                       ;PATCH SPACE\r
695         Z\r
696         Z                       ;FINAL ZERO TO FLAG END\r
697 >\r
698 \r
699 \fSUBTTL SWAP R. KRASIN/AF TS4.34  03 FEB 69  V406\r
700 \r
701 ,SWAPPER CALLED EVERY CLOCK TIC.\r
702 ,SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL\r
703 ,TICS TO RUN TO COMPLETON, SEVERAL FLAGS(FINISH,FIT,FORCE\r
704 ;ARE USED TO "REMEMBER" PREVIOUS STATES.\r
705 ,THE BASIC ALOGRITHM:\r
706 ;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB?\r
707 ;  YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS)\r
708 ;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH?\r
709 ;  YES--RETURN AND DO NOTHING\r
710 ;IS SWAPPER STILL BUSY?\r
711 ;  YES--RETURN AND DO NOTHING\r
712 ,SCAN QS FOR 1ST JOB OUT OF CORE.\r
713 , IF NONE-RETURN\r
714 ;A:\r
715 , IF ONE--WILL LOW(HIGH) SEG FIT IN LARGEST HOLE IN CORE?\r
716 ,   YES--START INPUT AND RETURN\r
717 ,   NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE LOW(HIGH) SEG?\r
718 ;       YES--CALL CORE SHUFFLER\r
719 ;         IS SHUFFLER WAITING FOR IO TO STOP?\r
720 ;           YES--RETURN AND DO NOTHING\r
721 ;           NO--GO TO A:\r
722 ,    NO--"REMEMBER" THIS JOB FROM INPUT AND LOOK FOR OUTPUT:\r
723 ,ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN?\r
724 , YES--OUTPUT ONE AND RETURN\r
725 , NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME\r
726 ,               (SET ON INPUT) HAS GONE TO 0.\r
727 ,  IF NONE--RETURN\r
728 ,  IF ONE--IS IT SWAPPABLE(NO ACTIVE IO AND NOT CURRENT JOB)?\r
729 ,    YES--OUTPUT HIGH SEG(IF ANY AND NOT ON DISK) THEN LOW SEGMENT\r
730 ,    NO--SET SWP BIT(SO SCHEDULER WILL NOT RUN), IO WILL CONTINUE\r
731 ,        IN LOW SEGEMENT AS LONG AS IT CAN\r
732 ,        IO ROUTINES NO LONGER STOP IF SWP SET, JUST SHF)\r
733 \r
734 EXTERNAL JBTSTS\r
735 EXTERNAL BIGHOL,CORTAL,ANYDEV,JBTADR,JBTSWP,KCORE1,TRYSWP\r
736 EXTERNAL IMGOUT,IMGIN,FINISH,FIT,FORCE\r
737 EXTERNAL OERROR,CORGET,JBTDAT,JOBDPG,JOBDPD,JOBPC\r
738 EXTERNAL JBTDAT,SHFWAT,CHKSHF\r
739 EXTERNAL FULCNT,ERRPNT,EXCALP,PCSTOP,PCORSZ,VIRTAL\r
740 \r
741 INTERNAL SWAP\r
742 INTERNAL XPAND,FT2REL\r
743 \r
744 T=DEVDAT\r
745 T1=TAC1\r
746 T2=TAC\r
747 J=ITEM\r
748 \r
749 ,ALL DEVICE DEPENDENT CODE MARKED WITH A "*"\r
750 \fSWAP:  SKIPE SHFWAT            ;IS CORE SHUFFLER WAITING FOR IO TO STOP\r
751                                 ; FOR SOME JOB?\r
752         PUSHJ PDP,CHKSHF        ;YES, CALL CORE SHUFFLER TO SEE IF\r
753                                 ; IO STOPPED YET\r
754         SKIPN SHFWAT            ;IS SHUFFLER STILL WAITING?\r
755         SKIPE SQREQ             ;*NO--IS SWAP SERV, ROUT. STILL BUSY WITH LAST JOB?\r
756         POPJ PDP,               ;*YES--RETURN\r
757         SETZM   INFLG           ;*** EXPERIMENTAL ***\r
758         SKIPN J,FINISH          ;NO--ANY IN/OUTPUT TO FINISH?\r
759         JRST SWP2               ;NO-\r
760         JUMPL J,FINOUT          ;YES--INPUT OR OUTPUT?\r
761         SKIPE SERA              ;INPUT, ANY INPUT ERRORS?\r
762         JRST INERR              ;YES\r
763 FININ0:         ;HERE IF NOTHING TO SWAP IN(HIGH OR LOW SEG EXPANDING FROM 0)\r
764 IFN FT2REL,<\r
765         EXTERN FININ\r
766         PUSHJ PDP,FININ ;IS THERE A HIGH SEG WHICH MUST BE SWAPPED IN?\r
767         JRST FIT1       ;YES, GO SWAP IT IN(J SET TO HIGH SEG NO.JOB # INPJOB)\r
768                         ; NO, EITHER HIGH SEG ALREADY IN FOR ANOTHER USER\r
769                         ; OR THERE IS NON, J STILL JOB NO,(IE LOW SEG)\r
770                         ; OR J IS HIGH SEG WHICH EXPANDED FROM NOTHING(XPANDH)\r
771                         ; IN WHICH CASE IT HAS NO DISK SPACE AND DIDLING ACS\r
772                         ; AND SETTING PROTECT TIME WON'T MATTER EITHER.\r
773 >\r
774         LDB T,IMGIN             ;NEW CORE SIZE\r
775         LDB T1,IMGOUT           ;OLD SIZE WHEN ON DISK\r
776         SUB T1,T                ;OLD-NEW=DECREASE\r
777                                 ; HAS USER DECREASED VIRTUAL MEMORY FROM M TO N(N OR 0)\r
778                                 ; WHILE OUT ON DISK(R,RUN,GET,KJOB) TO 140 WORDS?\r
779                                 ; CORE COMMAND ALWAYS FORCES SWAP IN BEFORE\r
780                                 ; CORE REASSIGNMENT SO NOT IN THIS CATAGORY\r
781                                 ; FRAGMENTED USER TOO HARD TO PARTIALLY RECLAIM DISK SPACE\r
782                                 ; ON REDUCTION WHICH DOES NOT GO TO 0\r
783         SKIPLE T1               ;DECREASED?\r
784         ADDM T1,VIRTAL          ;YES, NOW INCREASE VIRTUAL MEMORY AVAILABLE BY\r
785                                 ; AMOUNT OF DECREASE IN HIGH OR LOW SEG\r
786         PUSHJ PDP,ZERSWP        ;RETURN LOW SEG DISK SPACE, SET IMGOUT,IMGIN\r
787                                 ; AND SWP!SHF(JBTSTS) TO 0\r
788         LDB T,PCORSZ            ;COMPUTE AND SET IN CORE IN CORE PROTECT TIME FROM\r
789                                 ; SIZE OF JOB(1K BLOCKS-1)\r
790         IMUL T,PROT             ;ADD VARIABLE AMOUNT DEPENDING ON CORE SIZE\r
791         ADD T,PROT0             ;ADD FIXED AMOUNT INDEPENDENT OF CORE SIZE\r
792         HRLM T,JBTSWP(J)\r
793         MOVE JDAT,JBTDAT(J)     ;SETUP LOW SEG PROTECTION,RELOCATION\r
794 \fIFN JDAT-PROG,<\r
795         MOVE PROG,JBTADR(J)\r
796 >\r
797         MOVE T,JOBPC(JDAT)      ;JOB STOPPED IN EXEC MORE?\r
798         TLNE T,USRMOD           ;TEST PD FLAG\r
799         JRST SWP1               ;NO\r
800         HRRZ T,JOBDPG(JDAT)     ;YES, ADJUST PROG AND PDP IN DUMP AC AREA\r
801         SUBI T,(PROG)           ;OLD RELOC-NEW RELOC\r
802         MOVNS T                 ;NEW RELOC-OLD RELOC\r
803         ADDM T,JOBDPD(JDAT)     ;ADJUST DUMP PDP\r
804         MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG\r
805         JRST SWP1\r
806 \r
807 INERR:  SETZM FINISH            ;CLEAR FINISH FLAG SO SWAPPING CAN CONTINUE\r
808         MOVE PROG,JBTADR(J)     ;SETUP RELOC,PROTECTION FOR HIGH OR LOW SEG\r
809         IFN     PROG-JDAT,<MOVE JDAT,JBTDAT(J)>\r
810         PUSHJ PDP,KCORE1        ;RETURN CORE\r
811         JSP TAC,ERRPNT          ;PRINT ON USER CONSOLE\r
812         ASCIZ /SWAP READ ERROR/\r
813         JRST    PCSTOP          ;STOP JOB AND FORCE RESCHDULING\r
814 FINOUT: MOVNS J                 ;FINISH OUTPUT, -FINISH=JOB NO.\r
815         SKIPE SERA              ;ANY ERRORS\r
816         JRST SWPREC             ;YES, RECORD ERROR AND TRY AGAIN,\r
817                                 ; IN A DIFFERENT PLACE ON DISK\r
818         MOVE PROG,JBTADR(J)     ;XWD PROTECT,,RELOC. FOR LOW SEG\r
819 IFN PROG-JDAT,<\r
820         MOVE JDAT,JBTDAT(J)     ;JOB DATA AREA\r
821 >\r
822         PUSHJ PDP,KCORE1        ;RETURN CORE FOR LOW OR HIGH SEG JUST SWAPPED OUT\r
823                                 ; EVEN IF \r
824                                 ; ANOTHER JOB STARTED TO SHARE HIGH SEG DURING\r
825                                 ; SWAP OUT (GET) SINCE JOB IS MARKED WITH\r
826                                 ; SWP BIT ON AND CANNOT RUN UNTIL HGIH SEG IS SWAPPED BACK IN\r
827 IFN FT2REL,<\r
828         EXTERN FINOT\r
829         PUSHJ PDP,FINOT         ;IS THIS A HIGH SEG WHICH WAS JUST SWAPPED OUT?\r
830         JRST FORCEL             ;YES, J SET TO LOW SEG NO, GO TRY SWAP IT OUT\r
831                                 ; NO, THIS WAS A LOW SEG, ALL SWAPPING FOR THIS USER\r
832                                 ; IS FINISHED.\r
833 >\r
834 SWP1:   SETZM FINISH            ;CLEAR FINISH FLAG\r
835 SWP2:   SKIPE J,FORCE           ;WAITING FOR JOB TO BECOME SWAPPABLE?\r
836         JRST FORCE1             ;YES\r
837 FIT0:   SKIPE J,FIT             ;NO-- WAITING TO FIT JOB IN CORE?\r
838         JRST FIT1               ;YES\r
839 \f,SCAN FOR INPUT\r
840         MOVEI DAT,ISCAN\r
841         JSP TAC,QSCAN\r
842         JRST CHKXPN             ;NO INPUT TO DO--CK FOR EXPANDING JOBS\r
843         MOVE T,JBTSTS(J)        ;THIS JOB OUT OF CORE?\r
844         TLNN T,SWP              ;SWP ON IF HIGH SEG SWAPPED OUT FOR THIS USER\r
845                                 ; OR BOTH SEGS SWAPPED OUT\r
846 \r
847         JRST (TAC1)             ;NO--CONTINUE SCAN\r
848 \r
849 FIT1:   MOVEM J,FIT             ;REMEMBER JOB(OR HIGH SEG) TRYING TO FIT IN\r
850         LDB AC1,IMGIN           ;CORE SIZE NEEDED FOR THIS SEG(0 IF LOW SEG\r
851                                 ; OR HIGH SEG WITH UWP OFF ALREADY IN CORE)\r
852 IFE FT2REL,<\r
853         CAMLE AC1,CORTAL        ;WILL LOW SEG FIT IN FREE+DORMANT CORE?\r
854 >\r
855 IFN FT2REL,<\r
856         EXTERN FITSIZ\r
857         PUSHJ PDP,FITSIZ        ;COMPUTE AMOUNT OF CORE NEEDED TO BRING IN\r
858                                 ; 1. THIS JOBS LOW SEG AND HIGH SEG\r
859                                 ; 2. THIS JOBS LOW SEG(HIGH ALREADY IN OR NONE)\r
860                                 ; 3. THIS HIGH SEG BECAUSE LOW SEG ALREADY IN\r
861                                 ;WILL LOW SEG FIT IN FREE+DORMANT+IDLE CORE?\r
862 >\r
863         JRST SCNOUT             ;NO,WILL NOT FIT EVEN IF ALL DORMANT SEGS DELETED\r
864                                 ; AC1=TOTAL CORE NEEDED(IN K)\r
865         CAMG AC1,BIGHOL         ;YES, WILL THIS SEG FIT IN BIGGEST HOLE OF FREE CORE\r
866                                 ; WITHOUT DELETING ANY DORMANT OR IDLE SEGS?\r
867                                 ; (AC1 RESTORED TO SIZE FOR JUST THIS LOW OR HIGH SEG)\r
868 \r
869         JRST SWAPI              ;YES, GO SWAP IN THIS LOW OR HIGH SEG\r
870 IFN FT2REL,<\r
871         EXTERN FRECR1,HOLEF\r
872         SKIPN HOLEF             ;NO, ARE THERE ANY HOLES IN CORE WHICH THE SHUFFLER\r
873                                 ; COULD ELIMINATE(NOT COUNTING ONE AT TOP)?\r
874         PUSHJ PDP,FRECR1        ;NO, GO DELETE ONE DORMANT SEG IN CORE\r
875                                 ; AND ALWAYS SKIP RETURN(THERE MUST BE AT LEAST\r
876                                 ; ONE, OTHERWISE CORTAL=BIGHOL)MONITOR ERROR IF NONE\r
877 >\r
878         PUSHJ PDP,CHKSHF        ;YES, CALL CORE SHUFFLER TO MOVE ONE SEG DOWN\r
879         SKIPN SHFWAT            ;SHUFFLER WAITING FOR IO TO STOP?\r
880         JRST FIT0               ;NO, SEE IF JOB WILL FIT NOW.\r
881         POPJ PDP,               ;YES, RETURN AND WAIT TILL IO STOPS\r
882 \fEXTERN VIRTAL,SWPERC\r
883 \r
884 SWPREC: MOVE    TAC,SERA        ;ERROR FLAGS\r
885         IORM    TAC,SWPERC      ;SAVE FOR POSTERITY\r
886         LDB     TAC,IMGOUT      ;DECREASE TOTAL AMOUNT\r
887         MOVNS   TAC             ;OF VIRTUAL CORE IN THE MACHINE\r
888         ADDM    TAC,VIRTAL      ;BY THE AMOUNT BEING GIVEN UP\r
889         LDB     TAC,IMGOUT\r
890         TLO     TAC,1\r
891         ADDM    TAC,SWPERC\r
892         JRST SWAPO              ;GO TRY AGAIN\r
893 \r
894 \r
895 ;NO INPUT TO DD, CHECK FOR EXPANDING JOBS\r
896 CHKXPN: SKIPG XJOB              ;ANY JOBS TO EXPAND\r
897         POPJ PDP,               ;NO, RETURN FROM SWAPPER, NOTHING TO INPUT OR OUTPUT\r
898                                 ; YES, FALL INTO SCNOUT WHICH WILL SWAP OUT EXPANDING\r
899                                 ; JOB SINCE THERE IS ONE\r
900 ;INPUT TO DO, CHECK TO SEE IF ANY JOBS JUST HAPPEN TO WANT TO EXPAND\r
901         EXTERN HIGHJB,JBTSTS,ERROR,MAXSIZ,MAXJBN,SUMCOR\r
902 SCNOUT: SKIPG XJOB              ;ANY JOBS WAITING TO EXPAND?\r
903         JRST SCNJOB             ;NO, SCAN ALL JOBS IN PRIORITY ORDER LOOKING\r
904                                 ; FOR ONE TO SWAP OUT\r
905         MOVE J,HIGHJB           ;YES, START WITH HIGHEST JOB NUMBER ASSIGNED\r
906         MOVSI T,JXPN            ;SETUP JOB EXPANDED BIT\r
907         TDNN T,JBTSTS(J)        ;IS THIS JOB EXPANDING?\r
908         SOJG J,.-1              ;NO, KEEP LOOKING\r
909         IFN FTRCHK,<\r
910         JUMPG J,SCNOK\r
911         SETZM XJOB              ;CLEAR XJOB SO MESSAGE WILL PRINT\r
912         JSP DAT,ERROR           ;ERROR IF NONE FOUND\r
913 >\r
914 SCNOK:  SOS XJOB                ;DECREMENT COUNT OF EXPANDING JOBS\r
915         ANDCAM T,JBTSTS(J)      ;CLEAR EXPAND BIT IN JOB STATUS WORD\r
916         JRST FORCE0             ;GO TRY TO SWAP JOB OUT\r
917 \f;SCAN FOR JOB TO OUTPUT IN ORDER TO MAKE ROOM FOR JOB TO COME IN\r
918 ;SIZE(IN K) NEEDED TO GET THIS USER IN CORE IS IN AC1(FITSIZ)\r
919 ;JUST LOW SEG SIZE IF NO HIGH OR HIGH ALREADY IN, JUST HIGH IF LOW ALREADY IN,\r
920 ;OR SUM IF BOTH MUST BE SWAPPED IN\r
921 \r
922 SCNJOB: MOVE T,CORTAL           ;INITIALIZE FREE CORE COUNTER\r
923         MOVEM T,SUMCOR\r
924         SETZM MAXSIZ            ;CLEAR SIZE OF LARGEST JOB\r
925         MOVEI DAT,OSCAN         ;SCAN ALL JOBS RANKED IN PRIORITY TO BE SWAPPED OUT\r
926         JSP TAC,QSCAN\r
927         JRST NOFIT              ;NO MORE JOBS LEFT, CANNOT FIT JOB IN CORE\r
928         CAMN J,FIT              ;IS THIS JOB WE ARE TRYING TO FIND IN?\r
929         JRST(TAC1)              ;YES, GO FIND NEXT JOB TO OUTPUT\r
930         SKIPGE T,JBTSTS(J)      ;JOB RUN BIT STILL ON(JOB STILL WANT TO RUN)?>\r
931         SKIPGE JBTSWP(J)        ;YES, IS PROTECT TIME STILL LEFT?\r
932                                 ; PROTECT TIME IS DECREMENTED ONLY WHEN\r
933                                 ; A JOB IS RUNABLE, SO LOOK AT IT\r
934                                 ; ONLY IF RUN BIT STILL ON\r
935         TLNE T,NSWP+SWP         ;NO, IS THIS JOB NOT TO BE SWAPPED OR ALREADY SWAPPED?     \r
936                                 ; (DISPLAY, REAL TIME)?\r
937         JRST (TAC1)             ;YES,CONTINUE SCAN TO FIND ANOTHER\r
938         HLRZ T,JBTADR(J)        ;PICK UP SIZE OF JOB\r
939         JUMPE T,(TAC1)          ;CONTINUE SCAN IF NOT IN CORE (HIGH SEG ALREADY SWAPPED)\r
940                                 ; OUT FOR THIS USER IF NO LOW SEG)\r
941         ASH T,-12               ;CONVERT TO 1K BLOCKS\r
942         ADDI T,1\r
943 IFN FT2REL,<\r
944         EXTERN FORSIZ\r
945         PUSHJ PDP,FORSIZ        ;INCREASE SIZE(T) BY HIGH SEG IF THIS JOB\r
946                                 ; IS ONLY ONE IN CORE USING HIGH SEG(J= JOB # STILL)\r
947 >\r
948         CAMG T,MAXSIZ           ;LARGEST SO FAR?\r
949         JRST FORCE2             ;NO\r
950         MOVEM T,MAXSIZ          ;YES, SAVE SIZE\r
951         MOVEM J,MAXJBN          ;AND JOB NUMBER\r
952 FORCE2: ADDM T,SUMCOR           ;ADD TO TOTAL\r
953         CAMLE AC1,SUMCOR        ;FOUND ENOUGH CORE FOR JOB TO BE FIT IN?\r
954         JRST (TAC1)             ;NO. LOOK FOR MORE\r
955         MOVE J,MAXJBN           ;YES, SWAP OUT LARGEST\r
956 \fFORCE0:        PUSHJ PDP,TRYSWP        ;CAN THIS JOB BE STOPPED IN ORDER TO DO SWAP?\r
957         JRST (TAC1)             ;NO, NSWP OR NSHF SET(DISPLAY,REAL TIME) OR\r
958                                 ; SAVE OR GET IN PROGRESS WITH DEVICE STILL ACTIVE\r
959                                 ; LOOK FOR AN OTHER JOB TO SWAP\r
960 \r
961 IFN FT2REL,<\r
962         EXTERN FORHGH\r
963         PUSHJ PDP,FORHGH        ;IS THERE A HIGH SEG TO BE WRITTEN BEFORE\r
964                                 ; TRYING TO SWAP OUT LOW SEGMENT?\r
965                                 ; WRITE HIGH SEG IF ALL OF THE FOLLOWING ARE TRUE:\r
966                                 ; 1. JOB HAS A HIGH SEG AND\r
967                                 ; 2. IT HAS NOT BEEN SWAPPED FOR THIS USER\r
968                                 ;    (SWP=0 FOR JOB)\r
969                                 ; 3. IT IS IN CORE(NOT XPANDH)\r
970                                 ; 4. IF IN-CORE COUNT IS EXECTLY 1 MEANING\r
971                                 ;    THIS ONLY USER USING IN CORE\r
972                                 ; 5. HIGH SEG NOT ON DISK YET\r
973                                 ; 6. THIS HIGH SEG IS NOT THE SAME ONE AS JOB\r
974                                 ;    BEING FITTED IN IS GOING TO WANT\r
975                                 ; RETURN HIGH SEG NO. IN J IF YES, OTHERWISE\r
976                                 ; RETURN LOW SEG NO.\r
977                                 ; IF JOB JUST HAS LOW SEG. SHF BIT IS SET IN JBTSTS\r
978                                 ;    FOR JOB SO IO WILL STOP NEXT BUFFERE\r
979 >\r
980         MOVSI T,SWP!IFE FT2REL,<SHF> ;SET SWAPPED OUT BIT FOR LOW OR HIGH SEG\r
981         IORM T,JBTSTS(J)        ;SCHEDULER WILL NO LONGER RUN THIS JOB\r
982                                 ; SET SHF BIT IF ONE SEG SOFTWARE, SO IO WILL\r
983                                 ; STOP AFTER NEXT BUFFERFUL.\r
984 \r
985 FORCEL: MOVEM J,FORCE           ;ASSUME NOT SWAPPABLE--IS IT?\r
986 \r
987 FORCE1:\r
988 IFN JDAT-PROG,<\r
989         MOVE JDAT,JBTDAT(J)\r
990 >\r
991         SKIPN PROG,JBTADR(J)    ;LOC. IN PHYSICAL CORE, IS CORE\r
992                                 ; ASSIGNED IN MEMORY?\r
993         JRST SWAPO              ;NO, CANNOT HAVE ACTIVE DEVICES\r
994         CAME J,JOB              ;IF THIS IS CURRENT JOB, WAIT UNTIL\r
995                                 ; PROTECTED AREA IS MOVED BACK TO JOB DATA AREA\r
996         PUSHJ PDP,ANYDEV        ;ANY ACTIVE DEVICES?(2ND HALF OF ANYACT BOUT.)\r
997         POPJ PDP,               ;YES--RETURN AND WAIT FOR I/O TO STOP.\r
998 \f;SWAP OUT LOW OR HIGH SEGEMENT\r
999 \r
1000 INTERNAL FTTRACK\r
1001 \r
1002 SWAPO:\r
1003 IFN FTTRACK,<EXTERN LASOUT\r
1004         MOVEM J,LASOUT          ;SAVE LAST SWAP OUT FOR DEBUGGING ONLY\r
1005 >\r
1006         SETZM FORCE             ;CLEAR FORCE FLAG\r
1007         HLRZ T,JBTADR(J)        ;COMPUTE CORE IMAGE\r
1008         JUMPE T,SWP1            ;DONT OUTPUT IF 0 CORE(IMGOUT ALREADY SET TO 0\r
1009                                 ; WHEN CORE WAS RETURNED\r
1010 \r
1011         HRRZ T1,JBTADR(J)\r
1012         MOVNM T,T2              ;*SAVE COUNT FOR CALL TO SQOUT\r
1013         ASH T,-^D10             ;CONVERT TO 1K BLOCKS\r
1014         ADDI T,1\r
1015         DPB T,IMGOUT            ;RECORD AS OUT IMAGE\r
1016         HRLI T1,-1(T2)          ;*BUILD AND SAVE IOWD FOR SQOUT\r
1017         PUSH PDP,T1             ;*\r
1018         LDB DAT,IMGIN           ;HAS SIZE OF CORE NEEDED WHEN NEXT SWAPPED IN\r
1019         SKIPN DAT               ;ALREADY BEEN SET(XPAND)\r
1020         DPB T,IMGIN             ;NO, SO SET TO # 1K BLOCKS OF CORE NEEDED\r
1021         MOVE DAT,T              ;*CONVERT CORE IMAGE TO 128 WD BLOCKS\r
1022         PUSHJ PDP,GXSAT         ;*GET DEVICE STORAGE\r
1023         JRST FULL               ;*NONE AVAILABLE\r
1024         HRLM TAC,JBTSWP(J)      ;*SAVE DEVICE ADDRESS\r
1025 OUTP2:  MOVNM J,FINISH          ;DISK SWAP SPACE ASSIGNED, NOW SET FINISH FLAG\r
1026                                 ; SO THAT SWAPPER WILL KNOW WHICH SEG FINISHED\r
1027                                 ; WHEN IO COMPLETED(SQREQ BECOMES ZERO)\r
1028         POP PDP,TAC1            ;*GET IOWD\r
1029         JRST SQOUT              ;*START OUTPUT AND RETURN\r
1030 \r
1031 NOFIT:  SETZM FIT               ;FORGET ABOUT FITTING IN A JOB ON DISK\r
1032         SETOM   INFLG           ;*** EXPERIMENTAL *** MARK DESIRE TO INPUT\r
1033         POPJ PDP,               ;ALL JOBS IN CORE RE HIGHER PRIORITY.\r
1034 \f;COME HERE WHEN THE AMOUNT OF SPACE NEEDED ON THE DISK\r
1035 ;IS NOT AVAILABLE IN ONE CONTIGUOUS BLOCK\r
1036 \r
1037         EXTERN GETFCR\r
1038 \r
1039 FULL:   HRLM    DAT,AC3         ;SAVE DAT (LARGEST AVAILABLE HOLE)\r
1040         PUSHJ   PDP,FULCOR      ;GET 4 FREE CORE LOCS\r
1041         HLRZ    DAT,AC3         ;RESTORE DAT\r
1042         MOVE    AC3,TAC1        ;LOC OF 1ST FREE CELL\r
1043         HRLI    AC3,-4          ;4 LOCS\r
1044         TRO     TAC1,FRGSEG     ;LIGHT FRAGMENTED BIT\r
1045         HRLM    TAC1,JBTSWP(ITEM) ;SAVE LOC OF TABLE IN JBTSWP\r
1046 FULL1:  PUSH    PDP,DAT         ;SAVE AMOUNT OF SPACE BEING REQUESTED\r
1047 FULL1A: PUSHJ   PDP,GXSAT       ;GET SOME SWAPPING SPACE\r
1048         JRST    FULL2           ;CANT HAVE THAT MUCH\r
1049         HRRM    TAC,(AC3)       ;SAVE LOC OF THE DISK SPACE\r
1050         POP     PDP,DAT         ;RESTORE AMT GOTTEN\r
1051         HRLM    DAT,(AC3)       ;SAVE AMOUNT IN TABLE\r
1052         SUB     T,DAT           ;AMOUNT STILL NEEDED\r
1053         JUMPE   T,FULSET        ;THROUGH IF NEED 0 K NOW\r
1054         PUSHJ   PDP,BMPAC3      ;STEP TO NEXT TABLE LOCATION\r
1055         MOVE    DAT,T           ;TRY TO GET ALL WE NEED NOW IN 1 CHUNK\r
1056 FULL1B: MOVE DAT,T      ;RESET AMOUNT OF SPACE NEEDED\r
1057 \r
1058 ;COME HERE WHEN CANT GET THE CHUNK REQUESTED\r
1059 FULL2:  MOVEM   DAT,(PDP)       ;DAT HAS LARGEST CHUNK AVAILABLE\r
1060         JUMPG   DAT,FULL1A      ;GO GET THAT AMOUNT\r
1061 IFN FT2REL,<\r
1062         EXTERN FRESWP\r
1063         PUSHJ PDP,FRESWP        ;TRY TO DELETE AN UNUSED HIGH SEG FROM DISK\r
1064         JRST FULL1B             ;FOUND ONE, TRY AGAIN, J PRESERVED\r
1065                                 ; NONE FOUND, PRINT MONITOR ERROR\r
1066 >\r
1067 \f       EXTERN CERROR\r
1068 \r
1069         POP     PDP,TAC         ;WHAT? NONE LEFT?\r
1070         POP     PDP,TAC         ;SET PDP TO RIGHT VALUE\r
1071         JSP     DAT,CERROR      ;ERROR IN MONITOR AT .....\r
1072 \r
1073 ;HERE WHEN THE TOTAL AMOUNT OF SPACE NEEDED HAS BEEN OBTAINED\r
1074 FULSET: PUSHJ   PDP,BMPAC3      ;STEP TO NEXT (LAST) TABLE LOCATION\r
1075         HLRZ    TAC,JBTSWP(ITEM) ;LOC OF TABLE OF FRAGMENTS\r
1076         JRST    OUTP2           ;GO START OUTPUT\r
1077 \r
1078 ;HERE TO GET 4 LOCS OF FREE CORE\r
1079 FULCOR: PUSH    PDP,ITEM        ;GETFCR USES ITEM\r
1080         PUSHJ   PDP,GETFCR      ;GET 4 CELLS\r
1081         JRST IPOPJ              ;RETORE ITEM AND RETURN\r
1082 \r
1083 ;STEP AC3 TO NEXT LOC OF TABLE BEING BUILT\r
1084 BMPAC3: AOBJN   AC3,CPOPJ       ;OK IF MORE LOCS OF TABLE\r
1085         PUSHJ   PDP,FULCOR      ;GET 4 MORE LOCS\r
1086         HRLI    AC3,-4\r
1087         CAIN    TAC1,(AC3)      ;ARE THEY CONTIGUOUS?\r
1088         POPJ    PDP,            ;YES. RETURN\r
1089         MOVE    TAC,-1(AC3)     ;NO. CONVERT LAST GOOD LOC\r
1090         HRROM   TAC1,-1(AC3)    ;TO A POINTER TO NEXT PART OF TABLE\r
1091         MOVEM   TAC,(TAC1)      ;STORE GOOD DATA IN 1ST WD OF NEW PART\r
1092 \r
1093         HRR     AC3,TAC1        ;NEW TABLE LOC\r
1094         AOBJN   AC3,CPOPJ       ;COUNT WORD AND RETURN\r
1095 \f;SWAP IN A JOB OR HIGH SEGMENT\r
1096 \r
1097 SWAPI:\r
1098 \r
1099 IFN FTTRACK,<EXTERN LASIN\r
1100         MOVEM J,LASIN           ;SAVE LAST SWAP IN FOR DEBUGGING ONLY\r
1101 >\r
1102 \r
1103         MOVEM J,FINISH          ;SET FINISH FLAG TO INPUT\r
1104         SETZM FIT               ;CLEAR FIT FLAG\r
1105         LDB TAC,IMGIN           ;SIZE OF CORE TO BE ASSIGNED WHEN SWAPPED IN (INK)\r
1106         LSH TAC,^D10            ;CONVERT TO HIGHEST ADR\r
1107         SUBI TAC,1              ;-1 FOR CALL TO CORGET\r
1108         SKIPE PROG,JBTADR(J)    ;IS (LOW)SEG ALREADY IN CORE?\r
1109         JRST FININ0             ;YES, POSSIBLE IF THIS IS LOW SET AND ONLY\r
1110                                 ; HIGH SEG WAS SWAPPED OUT.\r
1111         PUSHJ PDP,CORGET        ;NO, GET CORE FOR LOW OR HIGH SEG\r
1112         JSP DAT,OERROR          ;NOT AVAILABLE-SHOULD NEVER HAPPEN(TELL OPER)\r
1113 \r
1114 IFN FT2REL,<EXTERN FITHGH\r
1115         PUSHJ PDP,FITHGH        ;INCREASE INCORE COUNT FOR THIS JOB'S HIGH SEG.\r
1116 >\r
1117         LDB T,IMGOUT            ;GET OUTPUT IMAGE\r
1118         JUMPE T,FININ0          ;DONT INPUT IF OUT IMAGE IS 0\r
1119         LDB TAC1,IMGIN  ;IS SIZE OF CORE SMALLER THAN DISK SPACE?\r
1120         CAMGE TAC1,T            ;WELL?\r
1121         MOVE T,TAC1             ;YES, ONLY INPUT SMALLER AMOUNT(R,RUN,GET,KJOB)\r
1122         LSH T,^D18+^D10         ;*BUILD IOWD FOR SQIN\r
1123         MOVN TAC1,T             ;*\r
1124         HRR TAC1,JBTADR(J)      ;*\r
1125         HLRZ TAC,JBTSWP(J)      ;*GET DEVICE ADDRESS\r
1126         JRST SQIN               ;*START INPUT\r
1127 \f;ROUTINE TO CHANGE DISK SWAPPING SPACE ALLOCATION(OR SET TO 0)\r
1128 ;DIFFERS FROM ZERSWP IN THAT VIRTUAL TALLY FOR SYSTEM IS ALSO CHANGED\r
1129 ;CALLED FROM CORE0\r
1130 ;CALL:  MOVE ITE,JOB OR HIGH SEG NO.\r
1131 ;       MOVE TAC,#1K BLOCKS TO BE NEW ASSIGNMENT\r
1132 ;       PUSHJ PDP,CHGSWP\r
1133 ;       ALWAYS RETURN\r
1134 ;CALLED ONLY FORM VIRTUAL+PHYSICAL CORE ROUTINE CORE0\r
1135 \r
1136 INTERN CHGSWP\r
1137 EXTERN JBTSTS,IMGIN,IMGOUT,JBTSWP,VIRTAL,IPOPJ\r
1138 \r
1139 CHGSWP: LDB TAC1,IMGIN          ;SIZE WHEN SEG NEXT SWAPPED IN\r
1140         JUMPE TAC,CHG1          ;IS ZERO BEING ASKED FOR?\r
1141         LSH TAC,-12             ;NO, COVNERT TO 1K BLOCKS\r
1142         ADDI TAC,1              ;BUT DO NOT ATTEMPT TO RETURN DISK SPACE\r
1143                                 ; SINCE IT MIGHT BE FRAGMENTED(SWAPPER WILL\r
1144                                 ; RETURN ALL OF DISK SPACE ON NEXT SWAPIN)\r
1145                                 ; HAPPENS ONLY ON R,RUN,GET,KJOB\r
1146         DPB TAC,IMGIN           ;STORE NEW SIZE WHEN NEXT SWAPPED IN\r
1147         PUSH PDP,ITEM           ;SAVE AN AC\r
1148         LDB ITEM,IMGOUT         ;GET OLD DISK SIZE OF THIS USER(USES ITEM)\r
1149         CAMGE TAC1,ITEM         ;IS OLD IN-CORE SIZE BIGGER?\r
1150         MOVE TAC1,ITEM          ;NO, USE DISK SIZE AS USER'S OLD VIRTUAL CORE\r
1151         CAMGE TAC,ITEM          ;IS NEW IN-CORE SIZE BIGGER?\r
1152         MOVE TAC,ITEM           ;NO, USE DISK SIZE AS USER NEW\r
1153                                 ; VIRTUAL CORE\r
1154         SUB TAC1,TAC            ;DECREASE OF USER VIRT, CORE=OLD-NEW\r
1155         ADDM TAC1,VIRTAL        ;USER'S DECREASE=SYSTEM'S INCREASE OF VIRTUAL\r
1156                                 ;CORE\r
1157         JRST IPOPJ              ;RESTORE ITEM AND RETURN\r
1158 \f;ROUTINE TO RETURN ALL OF DISK SPACE FOR A LOW OR HIGH SEG\r
1159 ;THIS IS A PHYSICAL DEALLOCATION ONLY AND HAS NO EFFECT ON A SEGMENTS\r
1160 ;VIRTUAL CORE ASSIGNMENT\r
1161 ;CALL:  MOVE ITEM,JOB NO. OR HIGH SEG NO.\r
1162 ;       PUSHJ PDP,ZERSWP\r
1163 ;CALLED FROM SEGCON IN MANY PLACES(5)\r
1164 ;AND FININ0 HERE IN SWAP\r
1165 \r
1166         INTERN ZERSWP\r
1167 \r
1168 ZERSWP: TDZA TAC,TAC            ;REQUEST O SPACE ON DISK AND ALWAYS SKIP\r
1169 CHG1:   ADDM TAC1,VIRTAL        ;INCREASE SIZE OF VIRTUAL CORE AVAILABLE IN SYSTEM\r
1170                                 ; AND THEN RETURN ALL OF DISK SPACE(CHGSWP)\r
1171         MOVSI TAC1,SWP!SHF      ;CLEAR SWAPPED OUT BIT IN JOB OR SEG\r
1172         ANDCAM TAC1,JBTSTS(ITEM);STATUS WORD(SHF SET IF IO WAS TO BE STOPPED\r
1173                                 ; FOR SWAP OR CORE SHUFFLE\r
1174 \r
1175         PUSH PDP,DAT            ;SAVE TTY OUTPUT BYTE POINTER(COMMAND DECODER)\r
1176         LDB DAT,IMGOUT          ;*SIZE ON DISK(1K BLOCKS)\r
1177         JUMPE DAT,CHG3          ;DID SEG HAVE ANY DISK SPACE?\r
1178         HLRZ TAC,JBTSWP(ITEM)   ;*YES, LOGICAL DISK BLOCK+FRGSEG BIT\r
1179         PUSHJ PDP,FXSAT         ;*FREE THE DISK BLOCKS NO LONGER NEEDED\r
1180 CHG3:   POP PDP,DAT             ;RESTORE TTY OUTPUT BYTE POINTER\r
1181         MOVEI TAC,0             ;0 IS NEW DISK ASSIGNMENT\r
1182         DPB TAC,IMGOUT          ;SET DISK ASSIGNEMENT TO 0\r
1183         DPB TAC,IMGIN           ;SET NEW CORE IMAGE BLOCK SIZE WHEN NEXT SWAPPED IN\r
1184                                 ; HERE FROM CHGSWP IF NOT ASKING FOR 0\r
1185         POPJ PDP,               ;RETURN\r
1186 \f       EXTERN PROT0,PROT       ;PROT AND PROT0 OCCUR IN COMMON\r
1187 \r
1188 IFE     FTRC10, <\r
1189 XP ICPRT1,3+1*3                 ;PROTECT TIME IN CLOCK TICS=\r
1190 XP ICPROT,^D10                  ;((JOBSIZE/1K)*+PROT0)*PROT\r
1191                                 ; PROT0=3,PROT=4 PRODUCT PROTECT TIMES ROUGHLY\r
1192                                 ; EQUAL TO 270 DISK SWAP(1-WAY) TIMES.\r
1193 >\r
1194 IFN     FTRC10, <\r
1195 ;SIMILAR IN-CORE PROTECT TIME PARAMETERS FOR FAASTER RD-10 DISK......\r
1196 XP ICPRT1,3+1*3                 ;ZERO CORE PLUS K MULTIPLIER\r
1197 XP ICPROT,3                     ;MULTIPLY BY K-1 OF LOW SEG\r
1198 >\r
1199 \f;XPAND SETS CONDITIONS TO GET MORE CORE FRO A JOB BY SWAPPING IN OUT\r
1200 ,THEM BACK IN TO DESIRED AMOUNT.\r
1201 ,JOBS POSITION IN QS NOT AFFECTED.\r
1202 ;CALLED ONLY FROM CORE COMMAND\r
1203 ;ASSUMES CALL FOR CURRENT JOB IF EXPANDING HIGH SEG,IE ASSUME AT UUO LEVEL\r
1204 ;THIS IS TRUE SINCE THERE IS NO CORE COMMAND WHICH CAN EXPAND HIGH SEG\r
1205 ,CALL:  MOVE ITEM,[JOB NO.]\r
1206 ;       MOVE TAC,[HIGHEST LEGAL ADDRESS DESIRED]\r
1207 ;       PUSHJ PDP,XPAND\r
1208 ;       RETURN, TAC DESTROYED\r
1209 \r
1210 XPAND:  LSH TAC,-12             ;CONVERT HIGHEST DESIRED ADDRESS\r
1211         ADDI TAC,1              ;TO 1K BLOCKS\r
1212         DPB TAC,IMGIN           ;STORE, SO SWAPPER WILL KNOW HOW MUCH CORE\r
1213                                 ; TO REQUEST WHEN NEXT SWAPPED IN\r
1214 \r
1215 ;ROUTINE TO FLAG JOB TO BE STOPPED AND SWAPPED OUT\r
1216 ;BECAUSE IT HAS JUST BEEN CONNECTED TO A HIGH SHARABLE SEG WHICH IS ON DISK\r
1217 ;OR ON ITW WAY IN OR OUT.  THE SIZE OF THE HIGH SEG IS UNCHANGED\r
1218 ;THE JOB MUST BE STOPPED UNTIL HIGH SEG SWAPPED IN JUS AS IF JOB HAS\r
1219 ;EXPANDED HIGH SEG(MUST BE CALLED FROM UUO LEVEL FOR CURRENT JOB IF HIGH SEG)\r
1220 ;CALL:  MOVE ITEM,HIGH SEG NUMBER\r
1221 ;       PUSHJ PDP,XPANDH\r
1222 \r
1223         INTERN XPANDH\r
1224         EXTERN IPOPJ\r
1225 \r
1226 XPANDH:\r
1227 IFN FT2REL,<\r
1228         PUSH PDP,ITEM           ;SAVE JOB NUMBER\r
1229         CAILE ITEM,JOBMAX       ;IS THIS A LOW OR HIGH SEG?\r
1230         MOVE ITEM,JOB           ;HIGH,SO GET JOB NO.(MUST BE CURRENT JOB)\r
1231 >\r
1232         MOVSI TAC1,JXPN         ;SET THIS JOB EXPANDING BIT SO IT WILL NOT BE RUN\r
1233         TDNN TAC1,JBTSTS(ITEM)  ;IS IT ALREADY SET FOR THIS JOB?(UNLIKELY)\r
1234         AOS XJOB                ;NO, INCREMENT COUNT ONLY ONCE FOR EACH JOB EXPANDING\r
1235         IORM TAC1,JBTSTS(ITEM)  ;AND SET JOB EXPANDING BIT\r
1236 IFE FT2REL,<\r
1237         POPJ PDP,               ;RETURN\r
1238 >\r
1239 IFN FT2REL,<\r
1240         JRST IPOPJ              ;RESTORE JOB OR HIGH SEG NUMBER (ITEM) AND RETURN\r
1241 >\r
1242 \fSUBTTL SWPSER R.KRASIN/AF TS4.34  03 FEB 69    V406\r
1243 \r
1244 INTERNAL SQIN,SQOUT,SQGO,SQGO1\r
1245 INTERNAL FTSWAP\r
1246 EXTERNAL DFBUSY,DFRED,DFWRT,CPOPJ,JOBDAC,MJOBCK,CHECK,JBTCHK\r
1247 \r
1248 ;PUT A REQUEST IN THE SWAPPER QUEUE. ENTER AT SQIN FOR\r
1249 ;       INPUT, SWOUT FOR OUTPUT\r
1250 ;CALL:  MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.(IE IOWD+1)\r
1251 ;       HRRZ TAC,DISK BLOCK NO.\r
1252 ;       PUSHJ PDP,SQIN/SQOUT\r
1253 ;       RETURN HERE ALWAYS\r
1254 ;       CONTENTS OF TAC,TAC1 LOST\r
1255 \r
1256 SQIN:   TLO TAC,400000          ;SET READ INDICATOR\r
1257 SQOUT:  MOVEM TAC,SERA          ;STORE THE BLOCK NUMBER\r
1258         MOVEM TAC1,SQREQ        ;STORE THE IOWD\r
1259         MOVEM TAC1,ESQREQ       ;SAVE IN CASE OF DISK ERROR ON FRAGMENTED JOB\r
1260         MOVNI TAC,1             ;IS THE DEVICE BUSY?\r
1261         EXCH TAC,DFBUSY \r
1262         JUMPN TAC,CPOPJ         ;YES IF JUMP\r
1263 \r
1264 \r
1265 ERATRY=3        ;NO. OF TIMES TO READ AND WRITE ON ERRORS\r
1266 \r
1267 ;START UP DEVICE WITH SWAPPING REQUEST. THIS ROUTINE\r
1268 ;IS CALLED FROM DISK INTERRUPT SERVICE, AS WELL AS FROM ABOVE.\r
1269 ;IF A SWAPPER REQUEST IS WAITING(SQREQ WILL BE NON-ZERO)\r
1270 \r
1271 SQGO:   MOVEI TAC1,ERATRY\r
1272         MOVEM TAC1,SERACT\r
1273         MOVSI TAC,400000\r
1274         TDNE TAC,SERA           ;WRITE?\r
1275         JRST SQGO1              ;NO\r
1276         HRRZ TAC,SQREQ\r
1277         ADDI TAC,JOBDAC\r
1278         HRLI TAC,MJOBCK\r
1279         PUSHJ PDP,CHECK\r
1280         MOVM    TAC,FINISH\r
1281         MOVEM   TAC1,JBTCHK(TAC)\r
1282 \fSQGO1: SETZM   SQLEN           ;ZERO AMOUNT TRANSFERRED SO FAR\r
1283         MOVE TAC1,SQREQ         ;*PUT IOWD INTO TAC1\r
1284         MOVSI TAC,200000        ;*SET "SWAPPER I/O GOING" FLAG ON\r
1285         ORB TAC,SERA    ;*\r
1286         TRZN    TAC,FRGSEG      ;*FRAGMENTED?\r
1287         JRST    SQGO2           ;*NO, READ IN ENTIRE (OR PART) OF SEG\r
1288 \r
1289         EXTERN CLCOR1\r
1290 \r
1291 FRAGIO: PUSH    PDP,DAT\r
1292         MOVN    DAT,SQLEN       ;AMOUNT PREVIOUSLY TRANSFERRED\r
1293         SUB     TAC1,DAT        ;INCREASE CORE ADDRESS BY WORDCOUNT PREVIOUS\r
1294 FRGIO1: HLRE    DAT,(TAC)       ;NO OF K IN THIS  DISK CHUNCK\r
1295         HRR     TAC,(TAC)       ;SWAPPING ADDRESS FOR THIS DISK CHUNK\r
1296         JUMPGE  DAT,FRGIO2      ;POINTER TO NEW CORE LIST IF NEG.\r
1297         MOVEI DAT,77777         ;CLEAR OUT ADR(15 BITS)\r
1298         ANDCAM DAT,SERA\r
1299         ORM TAC,SERA            ;INSERT NEW ADDRESS\r
1300         JRST FRGIO1\r
1301 \r
1302 FRGIO2: LSH     DAT,12          ;CONVERT FROM K TO WORDS\r
1303         ADDM DAT,SQLEN          ;ADD TO PREVIOUSLY TRANSFERRED AMOUNT\r
1304         MOVNS DAT               ;-N WORDS\r
1305         HRLM    DAT,TAC1        ;IOWD IN TAC1\r
1306         HRLO DAT,DAT            ;-NO. OF WRDS FOR THIS DISK TRANSFER TO TH\r
1307         CAMG DAT,SQREQ          ;COMPARE WITH - NO. WORDS FOR REST OF SEG\r
1308         HLL TAC1,SQREQ          ;SWAPPER ONLY WANTS TO READ A PORTION OF SEG\r
1309                                 ; NOT ALL OF IT(R,RUN,GET,KJOB COMMAND)\r
1310         MOVNS DAT               ;+NO. OF WORDS FOR THIS NEXT TRANSFER\r
1311         ADDI DAT,777777\r
1312         ADDM DAT,SQREQ          ;UPDATE LH OF IOWD FOR ENTIRE SEG, SO IT HAS\r
1313                                 ; -NO. OF WORDS LEFT AFTER THIS TRANSFER IS DONE\r
1314         POP     PDP,DAT\r
1315 SQGO2:  TLZ TAC,377777          ;*CLEAR POSSIBLE TRASH IN LH.\r
1316         ROT TAC,BLKSPK          ;*RE-POSITION DISK LOGICAL BLOCK NUMBER.\r
1317         TRZE TAC,4              ;*TEST AND CLEAR READ/WRITE BIT.\r
1318         SOJA TAC1,DFRED         ;*YES\r
1319         SOJA TAC1,DFWRT         ;*NO, WRITE.\r
1320 \f;SERVICE A SWAPPING INTERRUPT\r
1321 EXTERNAL DINT4B,CKSMCT\r
1322 INTERNAL SWPINT\r
1323 \r
1324 SWPINT: TRNE IOS,IODTER!IODERR!IOIMPM\r
1325         JRST SWPERR             ;ERRORS\r
1326         TRZE TAC,FRGSEG ;*FRAGMENTED?\r
1327         SKIPL TAC1,SQREQ        ;*YES, MORE IOWD TO GO?\r
1328         JRST DINT8B             ;NO, ALL DONE SWAP IN OR OUT\r
1329         AOS SERA                ;YES, FRAGMENTED AND MORE TO GO\r
1330         SKIPE 1(TAC)            ;IS THIS THE END OF SWAP COMMAND LIST?\r
1331         AOJA TAC,FRAGIO         ;NO, BO DO NEXT PIECE OF FRAGMENTED SEG\r
1332 \r
1333 DINT8B: TLNN TAC,400000         ;*INPUT?\r
1334         JRST DINT8A             ;*NO\r
1335         HRRZ TAC,SQREQ\r
1336         ADDI TAC,JOBDAC\r
1337         HRLI TAC,MJOBCK\r
1338         PUSHJ PDP,CHECK\r
1339         MOVM TAC,FINISH\r
1340         CAME TAC1,JBTCHK(TAC)\r
1341         JRST SWPER1\r
1342 DINT8A: HRRZM IOS,SERA\r
1343         SETZM SQREQ\r
1344         JRST DINT4B\r
1345 \r
1346 SWPER1: MOVSI TAC,100\r
1347         ADDM TAC,CKSMCT\r
1348         TRO IOS,IODTER\r
1349 SWPERR: MOVM TAC, FINISH        ;*RESET SERA IN CASE OF FRAGMENTED JOB\r
1350         HLRZ TAC, JBTSWP(TAC)   ;*SWAP LOC (DISK ADR OR TABLE ADR)\r
1351         HRRM TAC, SERA          ;*RESTORE SERA\r
1352         MOVE TAC,ESQREQ         ;RESTORE ESQREQ IN CASE OF FRAGMENTED JOB\r
1353         MOVEM TAC,SQREQ\r
1354         SOSLE SERACT            ;*TRIED ENOUGH?\r
1355         JRST SQGO1              ;*NO, TRY AGAIN\r
1356         JRST DINT8A             ;*YES, TOUGH.\r
1357 \fIFE    FTRC10, <\r
1358 ;SWPSER LOGIC FOR THE OLD PDP-6 (DATA PRODUCTS) DISK FILE ---\r
1359 \r
1360 ;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED\r
1361 ;AT CLOCK LEVEL.\r
1362 ;CALL:  MOVEI DAT,NO. OF 1K BLOCKS DESIRED\r
1363 ;       PUSHJ PDP,GXSAT\r
1364 ;       ERROR EXIT      (DISK IS FULL)\r
1365 ;       NORMAL EXIT     ;C(TAC) = BLOCK NO.\r
1366 \r
1367 ;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST.\r
1368 \r
1369 INTERNAL GXSAT\r
1370 EXTERNAL GETBIT,IPOPJ1\r
1371 \r
1372 GXSAT:  MOVE AC1,XSAT1          ;SAVE AC1, SET IT TO TABLE LOC.\r
1373         MOVE AC2,XSAT2  ;\r
1374         LSH DAT,CONVMD          ;CONVERT TO 128 WORD DISK BLOCKS\r
1375         PUSH PDP,ITEM           ;SAVE C(ITEM)\r
1376         MOVE ITEM,DAT           ;GETBIT EXPECTS PARAMETER IN ITEM\r
1377         PUSHJ PDP,GETBIT        ;FIND A HOLE BIG ENOUGH\r
1378         JRST IPOPJ              ;NONE, RESTORE ITEM AND ERROR RETURN\r
1379         MOVEI TAC,-1(TAC1)\r
1380         CAIL TAC,BLOCKS         ;IS IT ON DISK 17?\r
1381         ADDI TAC,DIFF           ;YES\r
1382         LSH TAC,-CONVMD         ;CARRY DISK ADDRESS SHIFTED TO FIT IN JBTSWP.\r
1383         JRST IPOPJ1             ;SKIP RETURN AND RESTORE JOB NUMBER(ITEM)\r
1384 \r
1385 ;FREE UP A SERIES OF BLOCKS ON THE SWAPPING DEVICE. CALLED\r
1386 ;AT CLOCK LEVEL\r
1387 ;CALL:  MOVEI DAT,NO. OF 1K BLOCKS TO FREE\r
1388 ;       MOVE TAC,BLOCK NO. OF FIRST DISK BLCOK TO FREE\r
1389 ;       PUSHJ PDP,FXSTAT\r
1390 ;       ALWAYS RETURN HERE\r
1391 \r
1392 ;CONTENTS OF ACS TAC,TAC1 WILL BE LOST.\r
1393 \r
1394 INTERNAL FXSAT\r
1395 EXTERNAL CLRBIT,IPOPJ\r
1396 \r
1397 FXSAT:  LSH TAC,CONVMD          ;RESTORE SHIFTED DISK ADDRESS.\r
1398         CAIL TAC,HISWAP         ;ON DISK 17?\r
1399         SUBI TAC,DIFF           ;YES\r
1400         LSH DAT,CONVMD          ;CONVERT TO 128 WORD DISK BLOCKS\r
1401         MOVE AC1,XSAT1          ;SET UP AC1 WITH POINTER TO SAT BLOCK\r
1402         MOVE AC2,XSAT2          ;AC2 TOO\r
1403         PUSH PDP,ITEM           ;SAVE C(ITEM)\r
1404         MOVE ITEM,DAT           ;CLRBIT EXPECTS PARAMETER IN DAT\r
1405         PUSHJ PDP,CLRBIT\r
1406         JRST IPOPJ              ;RETURN, AND RESTORE ITEM\r
1407 \r
1408 ;INITIALIZE SWAPPER DISK STORAGE TABLE\r
1409 INTERNAL SWPINI\r
1410 \r
1411 SWPINI: MOVE TAC,XSAT2\r
1412         MOVEM TAC,XSAT31\r
1413         MOVSI TAC,1B18\r
1414         MOVEM TAC,XSAT3\r
1415         SETZM XSAT4\r
1416         MOVE TAC,XSAT4P\r
1417         BLT TAC,XSAT61\r
1418         MOVE TAC,XSAT7\r
1419         MOVEM TAC,XSAT5\r
1420         MOVE TAC,XSAT8\r
1421         MOVEM TAC,XSAT6\r
1422         POPJ PDP,\r
1423 \r
1424 IFN FTCHECK+FTMONP,<\r
1425 EXTERNAL SQREQ,SERA,SERACT,XSAT1,XSAT2,XSAT3,XSAT4,XSAT5,XSAT6,XSAT7\r
1426 EXTERNAL XSAT8,SWPSIZ,HISWAP,DIFF,CONVMD,BLOCKS,XSAT31,XSAT4P,XSAT61\r
1427 >\r
1428 IFE FTCHECK+FTMONP,<\r
1429 \r
1430 ;DATA AND STORAGE AREA FOR SWAPPING. ON THE 270 DISK, DISKS\r
1431 ;       0 & 17 ARE USED FOR SWAPPING, ECH DISK CONTAINING\r
1432 ;       5400 (OCTAL) RECORDS\r
1433 \r
1434 INTERNAL        SQREQ,SERA,SERACT\r
1435 SQREQ:  Z                       ;C(LH)=NEG. OF SIZE OF READ/WRITE\r
1436                                 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE\r
1437 ESQREQ: Z                       ;COPY OF SQREQ, IN CASE OF\r
1438                                 ; ERROR IN FRAGMENTED JOB\r
1439 SERA:   Z                       ;SIGN IS 1 IF A READ\r
1440                                 ; C(RH)=BLOCK NUMBER BEFORE READING.\r
1441                                 ;  ERROR BITS AFTER READING.\r
1442 SERACT: 0                       ;COUNT FOR ERRORS\r
1443 SQLEN:  0                       ;AMOUNT TRANSFERRED SO FAR - FRAG SEG\r
1444 \r
1445 XSAT1:  EXP XSAT3-1             ;POINTER USED BY GETBIT,CLRBIT\r
1446 XSAT2:  XWD -SWPSIZ,XSAT4       ;POINTER TO BIT TABLE\r
1447 XSAT3:  XWD 400000,             ;2-WORD TABLE ALTERED BY GETBIT,CLRBIT\r
1448         XWD -SWPSIZ,XSAT4\r
1449 \r
1450                                 ; BIT TABLE FOR SWAPPING ALLOCATION\r
1451 XP BLOCKS,5400                  ;NUMBER OF RECORDS/DISK PLATE\r
1452         W1=BLOCKS/^D36          ;NUMBER OF ZERO WORDS AT TOP OF TABLE\r
1453         E1=BLOCKS-W1*^D36       ;LEADING ZERO IN W1+1ST WORD\r
1454         EX=BLOCKS+E1-^D35\r
1455         W2=EX/^D36              ;ZERO WORDS AT BOTTOM OF TABLE\r
1456         E2=EX-W2*^D36           ;LEADING ZEROES IN W1+W2+2ND WORD\r
1457 \r
1458 XP XSAT31,XSAT3+1\r
1459 XSAT4:  BLOCK W1\r
1460 XSAT5:  BLOCK W2+1\r
1461 XSAT6:  BLOCK 1\r
1462         REPEAT 1,<\r
1463                 IFE E1,<X=1B0>\r
1464                 IFN E1,<X=1\r
1465                 REPEAT ^D35-E1,<X=X*2>>\r
1466                 IFE E2,<Z=-1>\r
1467                 IFN E2,<Z=0\r
1468                 Y=1\r
1469                 REPEAT ^D36-E2,<Z=Z+Y\r
1470                 Y=Y*2>\r
1471                 >>\r
1472 XP XSAT61,XSAT6-1\r
1473 XSAT7:  EXP X\r
1474 XSAT8:  EXP Z\r
1475 \r
1476 SWPSIZ=XSAT6-XSAT4+1            ;SIZE OF TABLE\r
1477 HISWAP=17*BLOCKS                ;LOGICAL BLOCK NUMBER OF FIRST\r
1478                                 ; BLOCK ON DISK\r
1479 DIFF=HISWAP-BLOCKS-1\r
1480 XP CONVMD,3     ;CONVERSION FROM 1K CORE BLOCKS TO 128 WORD\r
1481                 ;DISC BLOCKS(SHIFT COUNT)\r
1482 \r
1483 XP BLKSPK,CONVMD                ;NO. OF BLOCKS PER K, SAME AS CONVMD\r
1484 XSAT4P: XWD XSAT4,XSAT4+1\r
1485 >\r
1486 >       ;END OF SWPSER LOGIC FOR THE OLD PDP-6 DISK.\r
1487 \fIFN    FTRC10, <\r
1488 ;SWPSER LOGIC FOR THE NEW PDP-10 (MODEL RC-10) DISK ---\r
1489 \r
1490 INTERNAL        GXSAT,FXSAT,SWPINI\r
1491 EXTERNAL        GETBIT,CLRBIT\r
1492 EXTERNAL        LBHIGH,IPOPJ,IPOPJ1\r
1493 \r
1494 \r
1495 ;SUBROUTINE "GXSAT" IS CALLED TO FIND A SERIES OF CONSECUTIVE FREE BLOCKS ON\r
1496 ; THE DISK TO SWAP SOME JOB OUT ONTO.  IT IS CALLED AT CLOCK LEVEL.\r
1497 \r
1498 ;CALLING SEQUENCE ---\r
1499 ;       PUSHJ   PDP,GXSAT\r
1500 ;       ERROR EXIT --- THE DISK IS FULL, NO SWAPPING SPACE AVAILABLE.\r
1501 ;       NORMAL EXIT\r
1502 ;ENTRY CONDITIONS ---\r
1503 ;       C(DAT) = NUMBER OF 1K BLOCKS OF DISK STORAGE NEEDED.\r
1504 ;EXIT CONDITIONS ---\r
1505 ;       C(TAC) = LOGICAL BLOCK NUMBER (DIVIDED BY 8) OF THE FIRST DISK BLOCK IN\r
1506 ;                 THE SERIES OF CONSECUTIVE BLOCKS WHICH SATISFY THIS REQUEST.\r
1507 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.\r
1508 \r
1509 GXSAT:  PUSH    PDP,ITEM        ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".\r
1510         MOVE    ITEM,DAT\r
1511         MOVEI   AC1,SWPENT      ;SET UP ENTRY CONDITIONS FOR THE "GETBIT" SUBROUTINE.\r
1512         MOVE    AC2,SWPENT\r
1513         PUSHJ   PDP,GETBIT\r
1514         JRST    IPOPJ           ;NO ROOM IN THE SWAPPING PART OF THE DISK.\r
1515         ADDI    TAC1,-1(ITEM)   ;ROOM FOUND--COMPUTE LOGICAL BLOCK NUMBER OF THIS\r
1516         CAMLE   TAC1,MAXSWP     ;FIRST BLOCK IN A SERIOES OF CONSECUTIVE FREE DISK\r
1517         MOVEM   TAC1,MAXSWP     ;BLOCKS.  THE "SWPTAB" TABLE SEARCHED HAS ONE BIT\r
1518         LSH     TAC1,BLKSPK     ;FOR EACH 1K OF SWAPPING DISK SPACE. BUT IS STORED\r
1519         SUB     TAC1,LBHIGH     ;BACKWARDS (1ST BIT OF SWPTAB = LAST  1K OF DISK).\r
1520         MOVM    TAC,TAC1        ;ALSO UPDATE "MAXSWP" IF PREVIOUS MAXIMUM EXCEEDED.\r
1521         LSH TAC,-BLKSPK         ;COMPRESS DISK ADDRESS TO 17 BITS FOR LH OF JBTSWP\r
1522         AOJA TAC,IPOPJ1         ;ADD 1 TO TAC AND RESTORE ITEM AND SKIP RETURN\r
1523 \f;SUBROUTINE "FXSAT" IS CALLED TO RETURN A SERIES OF CONSECUTIVE DISK BLOCKS TO\r
1524 ; THE FREE STORAGE POOL. THUS MAKING THEM AVAILABLE FOR RE-USE IN HANDLING\r
1525 ; FUTURE SWAPPING REQUESTS. IT IS CALLED AT CLOCK LEVEL.\r
1526 \r
1527 ;CALLING SEQUENCE ---\r
1528 ;       PUSHJ   PDP,FXSAT\r
1529 ;       NORMAL EXIT\r
1530 ;ENTRY CONDITIONS ---\r
1531 ;       C(TAC) = LOGICAL BLOCK NUMBER OF THE FIRST DISK BLOCK IN THE\r
1532 ;               SERIES WHICH IS TO BE MADE AVAILABLE.\r
1533 ;       C(DAT) = NUMBER OF CONSECUTIVE 1K BLOCKS OF DISK SPACE WHICH\r
1534 ;               ARETO BE MADE AVAILABLE.\r
1535 ;EXIT CONDITIONS ---\r
1536 ;       THE REQUESTED BITS IN THE SWAPPING SPACE AVAILABILITY TABLE\r
1537 ;               (NAMELY, SWPTAB) HAVE BEEN CLEARED TO ZERO.\r
1538 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.\r
1539 \r
1540 FXSAT:  TRZN    TAC,FRGSEG      ;FRAGMENTED?\r
1541         JRST    FXSAT1          ;NO. DO IN REGULAR WAY\r
1542 FRAGBK: HRRZ    AC3,TAC         ;YES. LOC OF TABLE IN AC3\r
1543 FRGBK1: HRRZ    TAC,(AC3)       ;LOC OF NEXT DISK ADDRESS\r
1544         HLRE    DAT,(AC3)       ;NUMBER OF K\r
1545         JUMPLE  DAT,FRGBK2      ;GIVE UP FREE CORE IF NOT REAL ADDRESS\r
1546         PUSHJ   PDP,FXSAT1      ;GIVE UP THE DISK SPACE FOR THIS PART\r
1547         AOBJP   AC3,FRGBK1      ;COUNT WORD OF TABLE, GET NEXT\r
1548 FRGBK2: HRRZ    TAC,AC3         ;LOC OF TABLE\r
1549         PUSH    PDP,ITEM\r
1550         HLRZ    ITEM,AC3        ;NUMBER OF WDS IN TABLE\r
1551         SUB     TAC,ITEM        ;POINT TAC TO 1ST WORD OF BLOCK\r
1552         LSH     ITEM,-2         ;4 WDS PER BIT\r
1553         AOS     ITEM\r
1554         PUSHJ   PDP,CLCOR1      ;GIVE UP FREE CORE\r
1555         POP     PDP,ITEM\r
1556         SKIPE   TAC,(AC3)       ;END OF TABLE?\r
1557         JRST    FRAGBK          ;NO, GO CHASSE NEXT PART\r
1558         POPJ    PDP,            ;YES, DONE\r
1559 \r
1560 FXSAT1: PUSH    PDP,ITEM        ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".\r
1561         MOVE    ITEM,DAT\r
1562         LSH TAC,BLKSPK          ;REGENERATE THREE LOW ORDER 0 BITS IN DISK ADDRESS.\r
1563         SUB     TAC,LBHIGH      ;PREPARE TO CLEAR BITS IN THE SWAPPING\r
1564         MOVMS   TAC             ; AVAILABLITY TABLE BY TRANSFORMING THE LOGICAL\r
1565         ADDI    TAC,1           ; BLOCK NUMBER TO AN EQUIVALENT BIT NUMBER IN THIS\r
1566         MOVNI   AC1,BLKSPK      ; TABLE (WHICH IS STORED IN REVERSE ORDER AND HAS\r
1567         LSH     TAC,(AC1)       ; ONE BIT PER 1K OF SWAPPING SPACE ON THE DISK).\r
1568         SUB     TAC,DAT\r
1569         MOVEI   AC1,SWPENT\r
1570         MOVE    AC2,SWPENT      ;SET UP ENTRY CONDITIONS FOR THE "CLRBIT" SUBROUTINE.\r
1571 FXSATC: PUSHJ   PDP,CLRBIT      ;THE "CLRBIT" SUBROUTINE IN "DSKSER" ACTUALLY DOES\r
1572                                 ; THE WORK OF CLEARING THE BITS.\r
1573         JRST IPOPJ              ;RESTORE ITEM AND RETURN\r
1574 \r
1575 \f\r
1576 ;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT\r
1577 ; SYSTEM INITIALIZATION TIME.\r
1578 \r
1579         EXTERN VIRTAL,SWPHGH\r
1580 \r
1581 SWPINI: MOVE TAC,LBHIGH         ;SET HIGHEST LOGICAL BLOCK\r
1582         MOVEM TAC,SWPHGH        ;FOR SWAPPING IN COMMON\r
1583         MOVNI   TAC,1           ;SET ENTIRE TABLE TO ONES, I.E., MARK EVERYTHING\r
1584         MOVE    TAC1,SWPENT     ; AS BEING UNAVAILABLE FOR SWAPPING.\r
1585         MOVEM   TAC,(TAC1)\r
1586         AOBJN   TAC1,.-1\r
1587         MOVEI   AC1,SWPENT      ;THEN USE THE "CLRBIT" ROUTINE TO CLEAR OUT AS MANY\r
1588         MOVE    AC2,SWPENT      ; BITS AT THE FRONT OF THE TABLE AS THERE ARE 1K DISK\r
1589         MOVE    ITEM,K4SWAP     ; AREAS ALLOCATED FOR SWAPPING USE.  THE PARAMETER\r
1590         MOVEM ITEM,VIRTAL       ;TOTAL AMOUNT OF VIRTUAL CORE ALLOWED\r
1591                                 ; IS JUS EQUAL TO AMOUNT OF SWAPPING SPACE\r
1592                                 ; EVEN IF USER CAN NOT HAVE ALL OF PHYSICAL USER CORE\r
1593 \f       MOVEI   TAC,0           ; "K4SWAP" IS SET UP DURING DISK REFRESHING, AND\r
1594                                 ; RECALLED FROM THE DISK AT EACH SYSTEM-INITIALIZE.\r
1595         JRST    CLRBIT          ;IN LIEU OF "PUSHJ CLRBIT" FOLLOWED BY "POPJ".\r
1596 \fIFN FTCHECK+FTMONP,<\r
1597 EXTERNAL        RCXSDT  ;DUMMY GLOBAL SYMBOL TO PERMIT THE SYSTEM BUILDER TO\r
1598                         ; RETRIEVE THE CORRECT BINARY COPY OF "SCHDAT".\r
1599 EXTERNAL        SQREQ,SERA,SERACT\r
1600 EXTERNAL        LBHIGH,BLKSPK,MAX2SWP,SWPENT,SWPTAB,MAXSWP\r
1601 >\r
1602 \r
1603 IFE FTCHECK+FTMONP,<\r
1604 ;DATA ASSOCIATED WITH THE SWPSER LOGIC FOR THE NEW PDP-10 DISK ---\r
1605 \r
1606         INTERN  MXK2SWP,CONVMD,BLKSPK,SWPTAB,MAXSWP\r
1607         EXTERN K4SWAP\r
1608 ;THE ABOVE ARE REFERENCED OR INITIALIZED BY THE "ONCE" ROUTINE.\r
1609 \r
1610 ;C(LOWSWP)=LOWEST LOGICAL BLOCK NUMBER TO BE USED FOR SWAPPING\r
1611 ;DETERMINED BY ONCE ONLY REFRESH DIALOG\r
1612 ;C(K4SWAP)=MAX. NO. OF K DISK WORDS ALLOCATED FRO SWAPPING, ALS\r
1613 ;DETERMINED BY ONCE ONLY REFRESH DIALOG\r
1614 MAXSWP: 0       ;MAX. NO. OF K FROM TOP TO LOWEST JOB\r
1615                         ; USED SINCE SYSTEM BEGAN\r
1616 ;C(MAXSWP)=MAX. NO. OF K EVER ASSIGNED COUNTING FROM TOP DOWN TO\r
1617 ;LOWEST EXCURSION, INCLUDING HOLS. WHEN = C(K4SWAP), THEN FREAGMENTATION HAD\r
1618 ;HAPPENED SOMETIME DURING THE PAST\r
1619 BLKSPK=3        ;SHIFT FACTOR TO CONVERT K OF CORE TO DISK BLOCKS, I.E.,\r
1620                 ; EIGHT DISK BLOCKS PER K OF CORE.\r
1621 CONVMD=BLKSPK   ;ONLY FOR CONSISTENCY WITH OLDER PDP-6 ROUTINE.\r
1622 MXK2SWP=^D1000  ;MASIMUM NUMBER OF 1K DISK BLOCKS WHICH MIGHT BE ALLOCATED\r
1623                 ; FOR SWAPPING (UPPER BOUND ON THE VALUE OF K4SWAP  WHICH\r
1624                 ; MAY BE REQUESTED AT DISK REFRESH TIME). (ONE MILLION WORDS\r
1625                 ; FOR SWAPPING SEEMS LIKE A NON-RESTRICTIVE ARBITRARY LIMIT.)\r
1626 SWPSIZ=MXK2SWP/^D36+1   ;SIZE OF SWPTAB ALLOCATION TABLE.\r
1627 \r
1628 SWPENT: XWD     -SWPSIZ,SWPTAB  ;THREE WORD POINTER TABLE\r
1629         XWD     400000,0        ; REQUIRED BY THE "GETBIT" AND\r
1630         XWD     -SWPSIZ,SWPTAB  ; "CLRBIT" SUBROUTINES.\r
1631 \r
1632 SWPTAB: BLOCK   SWPSIZ  ;SWAPPING SPACE AVAILABILITY TABLE.\r
1633 \r
1634 ;DATA CARRIED OVER FROM THE COMMON PART OF OLD AND NEW SWPSER ROUTINES ---\r
1635 INTERNAL        SQREQ,SERA,SERACT,ESQREQ\r
1636 SQREQ:  Z                       ;C(LH)=NEG. OF SIZE OF READ/WRITE\r
1637                                 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE\r
1638 ESQREQ: Z                       ;COPY OF SQREQ, IN CASE OF SWAP ERROR IN FRAGMENTED JOB\r
1639 SERA:   Z                       ;SIGN IS 1 IF A READ\r
1640                                 ; C(RH)=BLOCK NUMBER BEFORE READING.\r
1641                                 ;  ERROR BITS AFTER READING.\r
1642 SERACT: 0                       ;COUNT FOR ERRORS\r
1643 SQLEN:  0                       ;AMOUNT TRANSFERRED SO FAR FOR FRAGMENTED JOB\r
1644 >\r
1645 >       ;END OF SWPSER LOGIC FOR THE NEW PDP-10 DISK.\r
1646 \fSCHEND:        END\r