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