Added base source
[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 CKJR3              ;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,QJDB         ;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,JBQ          ;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 CK,JB4A            ;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,TIOWD           ;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 QINT\r
215 EXTERNAL CPOPJ,JOBMAX,MXQUE,JBTQ\r
216 EXTERNAL JBTQP1 ;EQUALS JBTQ+1\r
217 EXTERNAL JBTCM1 ;EQUALS JBTQ-1\r
218 EXTERNAL JBTOMN ;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,EQLINE\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=QLINE+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 \f;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES\r
487 ;USED BY SCHEDULER\r
488 ;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE.\r
489 ;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM\r
490 ;FOLLOWING TABLE USING NEW STATE CODE AS INDEX\r
491 \r
492 DEFINE X(A,B)\r
493 <       EXP Q'A'W\r
494 >\r
495 \r
496 INTERNAL QBITS\r
497 \r
498 QBITS:  QUEUES\r
499 \fIFN FTCHECK+FTMONP,<\r
500 DEFINE X(A,B),<\r
501 EXTERNAL A'RFQ\r
502 >\r
503         QUEUES\r
504 EXTERNAL REQTAB\r
505 >\r
506 IFE FTCHECK+FTMONP,<\r
507 \r
508 ;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)\r
509 ;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARABLE DEVICE\r
510 ;WSREQ AND RNREQ ARE UNUSED\r
511 \r
512 DEFINE X(A,B)\r
513 <A'REQ: 0\r
514 INTERNAL A'REQ\r
515 >\r
516 \r
517 INTERNAL REQTAB\r
518 \r
519 REQTAB: QUEUES  ;GENERATE REQ TABLE\r
520 >\r
521 \f;CORRESPONDENCE TABLE LH=QUEUE CODE, RH=QUEUE TRANSFER TABLE ADR.\r
522 ;INDEX INTO TABLE ALSO = QUEUE CODE\r
523 ;FOR SHARABLE DEVICES ONLY\r
524 ;SCHEDULER TAKES ONE JOB WAITING FOR A SHARABLE DEVICE AND\r
525 ;PUTS IT IN THE APPROPRIATE RUN QUEUE ACCORDING TO \r
526 ;QUEUE TRANSFER TABLE AS SPECIFIED BELOW BY THE JOB WAIT\r
527 ;STATE CODE.\r
528 \r
529 DEFINE X(A,B)\r
530 <       XWD -A'Q,Q'A'S\r
531 >\r
532 \r
533 QRNS=0  ;NO CORRESPONDENCE TABLES FO THESE QUEUE\r
534 QWSS=0\r
535 QTSS=0\r
536 \r
537 INTERNAL AVLQTB\r
538 \r
539 AVLQTB: QUEUES\r
540 \fIFN FTCHECK+FTMONP,<\r
541 EXTERNAL QJOB,JOBQUE    ;JOBQUE WILL CAUSE LOAD OF PROPER SCHDAT\r
542                         ; DEPENDING ON FTRC10 IN SCHDAT\r
543 IFN FTSWAP,<\r
544 EXTERNAL XJOB\r
545 >>\r
546 IFE FTCHECK+FTMONP,<\r
547 \r
548 INTERNAL JOBQUE\r
549 JOBQUE: 0       ;JOBS TO BE REQUEUED ON CLOCK INTERRUPT\r
550 \r
551 INTERNAL QJOB\r
552 QJOB:   Z       ;NUMBER OF JOBS NEEDING Q TRANSFERS AT OTHER THAN CLOCK LEVEL\r
553 \r
554 IFN FTSWAP,<\r
555 XJOB:   Z       ;NUMBER OF JOBS NEEDING CORE EXPANSION BY SWAPOUT-IN\r
556 INTERNAL XJOB\r
557 >\r
558 >\r
559 \fINTERNAL QSTOP,QTIME,SSCAN,QCMW\r
560 \r
561 BQFIX=QFIX      ;BEGINNING OF QUEUES FIXED QUEUE DISCIPLINE\r
562 EQFIX=QFIX+1B0  ;END OF QUEUES " " "\r
563 BQLINK=QLINK\r
564 EQLINK=QLINK+1B0\r
565 BQJSIZ=QJSIZ\r
566 EQJSIZ=QJSIZ+1B0\r
567 DEFINE TTAB(FCTN,QUEUE,QUANT)\r
568 <               EXP FCTN\r
569                 XWD QUANT,-QUEUE\r
570 >\r
571 DEFINE PTTAB(FCTN,QUEUE,QUANT)\r
572 <               EXP FCTN\r
573                 XWD QUANT,QUEUE\r
574 >\r
575 \r
576 QNULW:  TTAB EQFIX,NULQ,-1      ;NULL QUEUE JOB NO. NOT ASSIGNED\r
577 QSTOP:QSTOPW:   TTAB EQFIX,STOPQ,-1     ;UNRUNABLE JOBS TO END OF STOPQ\r
578 QCMW:   TTAB EQFIX,CMQ,-1               ;COMMAND WAIT TILL JOB IN CORE\r
579 QRNW:   PTTAB EQJSIZ,QSTAB,QQSTAB       ;JUST RUNABLE JOBS\r
580         ;WHICH ARE NOT IN SOME WAIT STATE BELOW,ENTER PROCESSOR\r
581         ;QS AT END AND GET QUANT. TIME ACCORDING TO THEIR SIZE\r
582 \r
583 QWSW:   TTAB BQFIX,PQ1,QQTTY    ;IO WAIT SAT.(EXCEPT TTY)\r
584         ;ENTER FRONT OF PROCESSOR QS AND GET QUANT, TIME\r
585         ;ACCORDING TO JOB SIZE\r
586 QTSW:   TTAB BQFIX,PQ,QQTTY     ;TTY IO WAIT SATISFIED(ENTER FRONT OF PQ1)\r
587 \r
588 QIOWW:  TTAB EQFIX,IOWQ,-1      ;IOW(EXDEPT TTY) HELD IN IOWQ\r
589 QTIOWW: TTAB EQFIX,TIOWQ,-1     ;TTY IOW HELD IN TIOWQ\r
590 QAUW:   TTAB EQFIX,AUQ,-1,\r
591 QMQW:   TTAB EQFIX,MQQ,-1       ;MON. Q(DISK) WAIT\r
592 QDAW:   TTAB EQFIX,DAQ,-1       ;DEV. ALLOC.(DISK)\r
593 QDCW:   TTAB EQFIX,DCQ,-1       ;DATA CONTROL WAIT\r
594 QSTW:   TTAB EQFIX,STQ,-1       ;SYST TAPE\r
595 QDTW:   TTAB EQFIX,DTQ,-1       ;DEC TAPE\r
596 QMTW:   TTAB EQFIX,MTQ,-1       ;MAG TAPE\r
597 QSLPW:  TTAB EQFIX,SLPQ,-1      ;SLEEP UUO\r
598 \f;TRANSLATION TABLE FROM WAIT STATE TO SATISFIED STATE\r
599 ;DO NOT RESET QUANTUM RUN TIME\r
600 \r
601 QQSD=-1\r
602 \r
603 QMSQ:   TTAB BQFIX,PQ1,QQSD     ;START MON. Q(DISK) AT PQ1\r
604 QDAS:   TTAB BQFIX,PQ1,QQSD     ;DEV. ALLOC.(DISK)...\r
605 QDCS:   TTAB BQFIX,PQ1,QQSD     ;DATA CONTROL...\r
606 QSTS:   TTAB BQFIX,PQ1,QQSD     ;SYST TAPE\r
607 QDTS:   TTAB BQFIX,PQ1,QQSD     ;DEC TAPE\r
608 QMTS:   TTAB BQFIX,PQ1,QQSD     ;MAG TAPE\r
609 QAUS:   TTAB BQFIX,PQ1,QQSD     ;ALTER UFD\r
610 QTIME   PTTAB EQLINK,QTTAB,QQSTAB       ;MOVE JOB TO LOWER Q\r
611         ;WHEN QUANT. TIME EXCEEDED AND RESET QUANT. TIME\r
612 \f,ENTER PROCESSOR QS ACCORDING TO JOB SIZE\r
613 QSTAB:  XWD 4,-PQ1      ;PQ1 IF     SIZE .LE. 4K\r
614         XWD ^D16,-PQ2   ;PQ2 IF  4K .L. SIZE .LE. 16K\r
615         XWD ^D256,-PQ3  ;PQ3 IF 16 .L. SIZE\r
616 \r
617 ,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME\r
618 QQTAB:  XWD -PQ1,-PQ2\r
619         XWD -PQ2,-PQ3\r
620         XWD -PQ3,-PQ2           ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS\r
621         Z\r
622 \r
623 ,QUANTUM TABLES\r
624 \r
625 QQSD=6  ;TENTH SEC. INITIAL QUANT. FOR SHAR. DEV. WAITERS\r
626 QQTTY=6 ;TENTH SEC. INITIAL QUANT. FOR TTY IOWS\r
627 \r
628 , QUANT. TIMES ACCORDING TO PROCESSOR Q:\r
629 \r
630 INTERNAL RNQUNT\r
631 \r
632 RNQUNT:\r
633 QQSTAB: EXP ^D30        ;PQ1: ONE HALF SECOND\r
634         EXP 2*^D60      ;PQ2: TWO SECONDS\r
635         EXP 2*^D60      ;PQ3: TWO SECONDS\r
636         Z\r
637 \fIFN FTSWAP,<\r
638 INTERNAL ISCAN,QSCAN\r
639 ISCAN:  ;SCAN FOR INPUT\r
640         XWD -CWM,QFOR   ;MONITOR COMMAND WHICH NEEDS CORE IMAGE IN CORE\r
641         XWD -MQQ,QFOR1  ;LOOK FOR 1ST JOBS IN SHAR. DEV QUEUES\r
642         XWD -DAQ,QFOR1\r
643         XWD -AUQ,QFOR1\r
644         XWD -DCQ,QFOR1\r
645         XWD -MTQ,QFOR1\r
646         XWD -STQ,QFOR1\r
647         XWD -DTQ,QFOR1\r
648 SSCAN:  XWD -PQ1,QFOR   ;SCAN PROCESSOR AS SCHEDULER DOES\r
649         XWD -PQ2,QFOR\r
650         XWD -PQ3,QFOR\r
651         Z               ;PATCH SPACE\r
652         Z\r
653         Z               ;FINAL ZERO TO FLAG END\r
654 \r
655 QSCAN:  ;SCAN FOR OUTPUT\r
656         XWD -STOPQ,QFOR ;UNRUNABLE JOBS FIRST\r
657         XWD     -SLPQ,QFOR\r
658         XWD -DTQ,QBAK1  ;ANY SHAR. DEV.WAITERS MORE THAN 1 DEEP\r
659         XWD -STQ,QBAK1\r
660         XWD -MTQ,QBAK1\r
661         XWD -DCQ,QBAK1\r
662         XWD -AUQ,QBAK1\r
663         XWD -DAQ,QBAK1\r
664         XWD -MQQ,QBAK1\r
665         XWD -TIOWQ,QFOR         ;TTY IOW\r
666         XWD -PQ3,QBAK\r
667         XWD -DTQ,QFOR1\r
668         XWD -STQ,QFOR1\r
669         XWD -MTQ,QFOR1          ;NOW SCAN FIRST JOB IN QUEUES\r
670         XWD -DCQ,QFOR1\r
671         XWD -AUQ,QFOR1\r
672         XWD -DAQ,QFOR1\r
673         XWD -MQQ,QFOR1\r
674         XWD -PQ2,QBAK\r
675         XWD -PQ1,QBAK\r
676         Z                       ;PATCH SPACE\r
677         Z\r
678         Z                       ;FINAL ZERO TO FLAG END\r
679 >\r
680 \fSUBTTL SWAP R. KRASIN/AF TS4.34  03 FEB 69  V406\r
681 \r
682 ,SWAPPER CALLED EVERY CLOCK TIC.\r
683 ,SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL\r
684 ,TICS TO RUN TO COMPLETON, SEVERAL FLAGS(FINISH,FIT,FORCE\r
685 ;ARE USED TO "REMEMBER" PREVIOUS STATES.\r
686 ,THE BASIC ALOGRITHM:\r
687 ;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB?\r
688 ;  YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS)\r
689 ;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH?\r
690 ;  YES--RETURN AND DO NOTHING\r
691 ;IS SWAPPER STILL BUSY?\r
692 ;  YES--RETURN AND DO NOTHING\r
693 ,SCAN QS FOR 1ST JOB OUT OF CORE.\r
694 , IF NONE-RETURN\r
695 ;A:\r
696 , IF ONE--WILL LOW(HIGH) SEG FIT IN LARGEST HOLE IN CORE?\r
697 ,   YES--START INPUT AND RETURN\r
698 ,   NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE LOW(HIGH) SEG?\r
699 \r
700 ;       YES--CALL CORE SHUFFLER\r
701 ;         IS SHUFFLER WAITING FOR IO TO STOP?\r
702 ;           YES--RETURN AND DO NOTHING\r
703 ;           NO--GO TO A:\r
704 ,    NO--"REMEMBER" THIS JOB FROM INPUT AND LOOK FOR OUTPUT:\r
705 ,ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN?\r
706 , YES--OUTPUT ONE AND RETURN\r
707 , NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME\r
708 ,               (SET ON INPUT) HAS GONE TO 0.\r
709 ,  IF NONE--RETURN\r
710 ,  IF ONE--IS IT SWAPPABLE(NO ACTIVE IO AND NOT CURRENT JOB)?\r
711 ,    YES--OUTPUT HIGH SEG(IF ANY AND NOT ON DISK) THEN LOW SEGMENT\r
712 ,    NO--SET SWP BIT(SO SCHEDULER WILL NOT RUN), IO WILL CONTINUE\r
713 ,        IN LOW SEGEMENT AS LONG AS IT CAN\r
714 ,        IO ROUTINES NO LONGER STOP IF SWP SET, JUST SHF)\r
715 \r
716 EXTERNAL JBTSTS\r
717 EXTERNAL BIGHOL,CORTAL,ANYDEV,JBTADR,JBTSWP,KCORE1,TRYSWP\r
718 EXTERNAL IMGOUT,IMGIN,FINISH,FIT,FORCE\r
719 EXTERNAL OERROR,CORGET,JBTDAT,JOBDPG,JOBDPD,JOBPC\r
720 EXTERNAL JBTDAT,SHFWAT,CHKSHF\r
721 EXTERNAL FULCNT,ERRPNT,EXCALP,PCSTOP,PCORSZ,VIRTAL\r
722 \r
723 INTERNAL SWAP\r
724 INTERNAL XPAND,FT2REL\r
725 \r
726 T=DEVDAT\r
727 T1=TAC1\r
728 T2=TAC\r
729 J=ITEM\r
730 \r
731 ,ALL DEVICE DEPENDENT CODE MARKED WITH A "*"\r
732 \fSWAP:  SKIPE SHWAT             ;IS CORE SHUFFLER WAITING FOR IO TO STOP\r
733                                 ; FOR SOME JOB?\r
734         PUSHJ PDP,CHKSHF        ;YES, CALL CORE SHUFFLER TO SEE IF\r
735                                 ; IO STOPPED YET\r
736         SKIPN SHFWAT            ;IS SHUFFLER STILL WAITING?\r
737         SKIPE SQREQ             ;*NO--IS SWAP SERV, ROUT. STILL BUSY WITH LAST JOB?\r
738         POPJ PDP,               ;*YES--RETURN\r
739         SETZM   INFLG           ;*** EXPERIMENTAL ***\r
740         SKIPN J,FINISH          ;NO--ANY IN/OUTPUT TO FINISH?\r
741         JRST SWP2               ;NO-\r
742         JUMPL J,FINOUT          ;YES--INPUT OR OUTPUT?\r
743         SKIPE SERA              ;INPUT, ANY INPUT ERRORS?\r
744         JRST INERR              ;YES\r
745 FININ0:         ;HERE IF NOTHING TO SWAP IN(HIGH OR LOW SEG EXPANDING FROM 0)\r
746 IFN FT2REL,<\r
747         EXTERN FININ\r
748         PUSHJ PDP,FININ ;IS THERE A HIGH SEG WHICH MUST BE SWAPPED IN?\r
749         JRST FIT1       ;YES, GO SWAP IT IN(J SET TO HIGH SEG NO.JOB # INPJOB)\r
750                         ; NO, EITHER HIGH SEG ALREADY IN FOR ANOTHER USER\r
751                         ; OR THERE IS NON, J STILL JOB NO,(IE LOW SEG)\r
752                         ; OR J IS HIGH SEG WHICH EXPANDED FROM NOTHING(XPANDH)\r
753                         ; IN WHICH CASE IT HAS NO DISK SPACE AND DIDLING ACS\r
754                         ; AND SETTING PROTECT TIME WON'T MATTER EITHER.\r
755 >\r
756         LDB T,IMGIN             ;NEW CORE SIZE\r
757         LDB T1,IMGOUT           ;OLD SIZE WHEN ON DISK\r
758         SUB T1,T                ;OLD-NEW=DECREASE\r
759                                 ; HAS USER DECREASED VIRTUAL MEMORY FROM M TO N(N OR 0)\r
760                                 ; WHILE OUT ON DISK(R,RUN,GET,KJOB) TO 140 WORDS?\r
761                                 ; CORE COMMAND ALWAYS FORCES SWAP IN BEFORE\r
762                                 ; CORE REASSIGNMENT SO NOT IN THIS CATAGORY\r
763                                 ; FRAGMENTED USER TOO HARD TO PARTIALLY RECLAIM DISK SPACE\r
764                                 ; ON REDUCTION WHICH DOES NOT GO TO 0\r
765         SKIPLE T1               ;DECREASED?\r
766         ADDM T1,VIRTAL          ;YES, NOW INCREASE VIRTUAL MEMORY AVAILABLE BY\r
767                                 ; AMOUNT OF DECREASE IN HIGH OR LOW SEG\r
768         PUSHJ PDP,ZERSWP        ;RETURN LOW SEG DISK SPACE, SET IMGOUT,IMGIN\r
769                                 ; AND SWP!SHF(JBTSTS) TO 0\r
770         LDB T,PCORSZ            ;COMPUTE AND SET IN CORE IN CORE PROTECT TIME FROM\r
771                                 ; SIZE OF JOB(1K BLOCKS-1)\r
772         IMUL T,PROT             ;ADD VARIABLE AMOUNT DEPENDING ON CORE SIZE\r
773         ADD T,PROT0             ;ADD FIXED AMOUNT INDEPENDENT OF CORE SIZE\r
774         HRLM T,JBTSWP(J)\r
775         MOVE JDAT,JBTDAT(J)     ;SETUP LOW SEG PROTECTION,RELOCATION\r
776 \fIFN JDAT-PROG,<\r
777         MOVE PROG,JBTADR(J)\r
778 >\r
779         MOVE T,JOBPC(JDAT)      ;JOB STOPPED IN EXEC MORE?\r
780         TLNE T,USRMOD           ;TEST PD FLAG\r
781         JRST SWP1               ;NO\r
782         HRRZ T,JOBDPG(JDAT)     ;YES, ADJUST PROG AND PDP IN DUMP AC AREA\r
783         SUBI T,(PROG)           ;OLD RELOC-NEW RELOC\r
784         MOVNS T                 ;NEW RELOC-OLD RELOC\r
785         ADDM T,JOBDPD(JDAT)     ;ADJUST DUMP PDP\r
786         MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG\r
787         JRST SWP1\r
788 \r
789 INERR:  SETZM FINISH            ;CLEAR FINISH FLAG SO SWAPPING CAN CONTINUE\r
790         MOVE PROG,JBTADR(J)     ;SETUP RELOC,PROTECTION FOR HIGH OR LOW SEG\r
791         IFN     PROG-JDAT,<MOVE JDAT,JBTDAT(J)>\r
792         PUSHJ PDP,KCORE1        ;RETURN CORE\r
793         JSP TAC,ERRPNT          ;PRINT ON USER CONSOLE\r
794         ASCIZ /SWAP READ ERROR/\r
795         JRST    PCSTOP          ;STOP JOB AND FORCE RESCHDULING\r
796 FINOUT: MOVNS J                 ;FINISH OUTPUT, -FINISH=JOB NO.\r
797         SKIPE SERA              ;ANY ERRORS\r
798         JRST SWPREC             ;YES, RECORD ERROR AND TRY AGAIN,\r
799                                 ; IN A DIFFERENT PLACE ON DISK\r
800         MOVE PROG,JBTADR(J)     ;XWD PROTECT,,RELOC. FOR LOW SEG\r
801 IFN PROG-JDAT,<\r
802         MOVE JDAT,JBTDAT(J)     ;JOB DATA AREA\r
803 >\r
804         PUSHJ PDP,KCORE1        ;RETURN CORE FOR LOW OR HIGH SEG JUST SWAPPED OUT\r
805                                 ; EVEN IF \r
806                                 ; ANOTHER JOB STARTED TO SHARE HIGH SEG DURING\r
807                                 ; SWAP OUT (GET) SINCE JOB IS MARKED WITH\r
808                                 ; SWP BIT ON AND CANNOT RUN UNTIL HGIH SEG IS SWAPPED BACK IN\r
809 IFN FT2REL,<\r
810         EXTERN FINOT\r
811         PUSHJ PDP,FINOT         ;IS THIS A HIGH SEG WHICH WAS JUST SWAPPED OUT?\r
812                                 ;YES, J SET TO LOW SEG NO, GO TRY SWAP IT OUT\r
813                                 ; NO, THIS WAS A LOW SEG, ALL SWAPPING FOR THIS USER\r
814                                 ; IS FINISHED.\r
815 >\r
816 SWP1:   SETZM FINISH            ;CLEAR FINISH FLAG\r
817 SWP2:   SKIPE J,FORCE           ;WAITING FOR JOB TO BECOME SWAPPABLE?\r
818         JRST FORCE1             ;YES\r
819 FIT0:   SKIPE J,FIT             ;NO-- WAITING TO FIT JOB IN CORE?\r
820         JRST FIT1               ;YES\r
821 \f,SCAN FOR INPUT\r
822         MOVEI DAT,ISCAN\r
823         JSP TAC,QSCAN\r
824         JRST CHKXPN             ;NO INPUT TO DO--CK FOR EXPANDING JOBS\r
825         MOVE T,JBTSTS(J)        ;THIS JOB OUT OF CORE?\r
826         TLNN T,SWP              ;SWP ON IF HIGH SEG SWAPPED OUT FOR THIS USER\r
827                                 ; OR BOTH SEGS SWAPPED OUT\r
828 \r
829         JRST (TAC1)             ;NO--CONTINUE SCAN\r
830 \r
831 FIT1:   MOVEM J,FIT             ;REMEMBER JOB(OR HIGH SEG) TRYING TO FIT IN\r
832         LDB AC1,IMGIN           ;CORE SIZE NEEDED FOR THIS SEG(0 IF LOW SEG\r
833                                 ; OR HIGH SEG WITH UWP OFF ALREADY IN CORE)\r
834 IFE FT2REL,<\r
835         CAMLE AC1,CORTAL        ;WILL LOW SEG FIT IN FREE+DORMANT CORE?\r
836 >\r
837 IFN FT2REL,<\r
838         EXTERN FITSIZ\r
839         PUSHJ PDP,FITSIZ        ;COMPUTE AMOUNT OF CORE NEEDED TO BRING IN\r
840                                 ; 1. THIS JOBS LOW SEG AND HIGH SEG\r
841                                 ; 2. THIS JOBS LOW SEG(HIGH ALREADY IN OR NONE)\r
842                                 ; 3. THIS HIGH SEG BECAUSE LOW SEG ALREADY IN\r
843                                 ;WILL LOW SEG FIT IN FREE+DORMANT+IDLE CORE?\r
844 >\r
845         JRST SCNOUT             ;NO,WILL NOT FIT EVEN IF ALL DORMANT SEGS DELETED\r
846                                 ; AC1=TOTAL CORE NEEDED(IN K)\r
847         CAMG AC1,BIGHOL         ;YES, WILL THIS SEG FIT IN BIGGEST HOLE OF FREE CORE\r
848                                 ; WITHOUT DELETING ANY DORMANT OR IDLE SEGS?\r
849                                 ; (AC1 RESTORED TO SIZE FOR JUST THIS LOW OR HIGH SEG)\r
850 \r
851         JRST SWAPI              ;YES, GO SWAP IN THIS LOW OR HIGH SEG\r
852 IFN FT2REL,<\r
853         EXTERN FRECR1,HOLEF\r
854         SKIPN HOLEF             ;NO, ARE THERE ANY HOLES IN CORE WHICH THE SHUFFLER\r
855                                 ; COULD ELIMINATE(NOT COUNTING ONE AT TOP)?\r
856         PUSHJ PDP,FRECR1        ;NO, GO DELETE ONE DORMANT SEG IN CORE\r
857                                 ; AND ALWAYS SKIP RETURN(THERE MUST BE AT LEAST\r
858                                 ; ONE, OTHERWISE CORTAL=BIGHOL)MONITOR ERROR IF NONE\r
859 >\r
860         PUSHJ PDP,CHKSHF        ;YES, CALL CORE SHUFFLER TO MOVE ONE SEG DOWN\r
861         SKIPN SHFWAT            ;SHUFFLER WAITING FOR IO TO STOP?\r
862         JRST FIT0               ;NO, SEE IF JOB WILL FIT NOW.\r
863         POPJ PDP,               ;YES, RETURN AND WAIT TILL IO STOPS\r
864 \fEXTERN VIRTAL,SWPERC\r
865 \r
866 SWPREC: MOVE    TAC,SERA        ;ERROR FLAGS\r
867         IORM    TAC,SWPERC      ;SAVE FOR POSTERITY\r
868         LDB     TAC,IMGOUT      ;DECREASE TOTAL AMOUNT\r
869         MOVNS   TAC             ;OF VIRTUAL CORE IN THE MACHINE\r
870         ADDM    TAC,VIRTAL      ;BY THE AMOUNT BEING GIVEN UP\r
871         LDB     TAC,IMGOUT\r
872         TLO     TAC,1\r
873         ADDM    TAC,SWPERC\r
874         JRST    SWAPO           ;GO TRY AGAIN\r
875 \r
876 ;NO INPUT TO DD, CHECK FOR EXPANDING JOBS\r
877 CHKXPN: SKIPG XJOB              ;ANY JOBS TO EXPAND\r
878         POPJ PDP,               ;NO, RETURN FROM SWAPPER, NOTHING TO INPUT OR OUTPUT\r
879                                 ; YES, FALL INTO SCNOUT WHICH WILL SWAP OUT EXPANDING\r
880                                 ; JOB SINCE THERE IS ONE\r
881 ;INPUT TO DO, CHECK TO SEE IF ANY JOBS JUST HAPPEN TO WANT TO EXPAND\r
882 \r
883         EXTERN HIGHJB,JBTSTS,ERROR,MAXSIZ,MAXJBN,SUMCOR\r
884 SCNOUT: SKIPG XJOB              ;ANY JOBS WAITING TO EXPAND?\r
885         JRST SCNJOB             ;NO, SCAN ALL JOBS IN PRIORITY ORDER LOOKING\r
886                                 ; FOR ONE TO SWAP OUT\r
887         MOVE J,HIGHJB           ;YES, START WITH HIGHEST JOB NUMBER ASSIGNED\r
888         MOVSI T,JXPN            ;SETUP JOB EXPANDED BIT\r
889         TDDN T,JBTSTS(J)        ;IS THIS JOB EXPANDING?\r
890         SOJG J,.-1              ;NO, KEEP LOOKING\r
891         IFN FTRCHK,<\r
892         JUMPG J,SCNOK           ;CLEAR XJOB SO MESSAGE WILL PRINT\r
893         JSP DAT,ERROR           ;ERROR IF NONE FOUND\r
894 >\r
895 SCNOK:  SOS XJOB                ;DECREMENT COUNT OF EXPANDING JOBS\r
896         ANDCAM T,JBTSTS(J)      ;CLEAR EXPAND BIT IN JOB STATUS WORD\r
897         JRST FORCE0             ;GO TRY TO SWAP JOB OUT\r
898 \f;SCAN FOR JOB TO OUTPUT IN ORDER TO MAKE ROOM FOR JOB TO COME IN\r
899 ;SIZE(IN K) NEEDED TO GET THIS USER IN CORE IS IN AC1(FITSIZ)\r
900 ;JUST LOW SEG SIZE IF NO HIGH OR HIGH ALREADY IN, JUST HIGH IF LOW ALREADY IN,\r
901 ;OR SUM IF BOTH MUST BE SWAPPED IN\r
902 \r
903 SCNJOB: MOVE T,CORTAL           ;INITIALIZE FREE CORE COUNTER\r
904         MOVEM T,SUMCOR\r
905         SETZM MAXSIZ            ;CLEAR SIZE OF LARGEST JOB\r
906         MOVEI DAT,OSCAN         ;SCAN ALL JOBS RANKED IN PRIORITY TO BE SWAPPED OUT\r
907         JSP TAC,QSCAN\r
908         JRST NOFIT              ;NO MORE JOBS LEFT, CANNOT FIT JOB IN CORE\r
909         CAMN J,FIT              ;IS THIS JOB WE ARE TRYING TO FIND IN?\r
910         JRST(TAC1)              ;YES, GO FIND NEXT JOB TO OUTPUT\r
911         SKIPGE T,JBTSTS(J)      ;JOB RUN BIT STILL ON(JOB STILL WANT TO RUN)?>\r
912         SKIPGE JBTSWP(J)        ;YES, IS PROTECT TIME STILL LEFT?\r
913                                 ; PROTECT TIME IS DECREMENTED ONLY WHEN\r
914                                 ; A JOB IS RUNABLE, SO LOOK AT IT\r
915                                 ; ONLY IF RUN BIT STILL ON\r
916         TLNE T,NSWP+SWP         ;NO, IS THIS JOB NOT TO BE SWAPPED OR ALREADY SWAPPED?\r
917                                 ; (DISPLAY, REAL TIME)?\r
918         JRST (TAC1)             ;YES,CONTINUE SCAN TO FIND ANOTHER\r
919         HLRZ T,JBTADR(J)        ;PICK UP SIZE OF JOB\r
920         JUMPE T,(TAC1)  `       ;CONTINUE SCAN IF NOT IN CORE (HIGH SEG ALREADY SWAPPED\r
921                                 ; OUT FOR THIS USER IF NO LOW SEG)\r
922         ASH T,-12               ;CONVERT TO 1K BLOCKS\r
923         ADDI T,1\r
924 IFN FT2REL,<\r
925         EXTERN FORSIZ\r
926         PUSHJ PDP,FORSIZ        ;INCREASE SIZE(T) BY HIGH SEG IF THIS JOB\r
927                                 ; IS ONLY ONE IN CORE USING HIGH SEG(J= JOB # STILL)\r
928 >\r
929         CAMG T,MAXSIZ           ;LARGEST SO FAR?\r
930         JRST FORCE2             ;NO\r
931         MOVEM T,MAXSIZ          ;YES, SAVE SIZE\r
932         MOVEM J,MAXJBN          ;AND JOB NUMBER\r
933 FORCE2: ADDM T,SUMCOR           ;ADD TO TOTAL\r
934         CAMLE AC1,SUMCOR        ;FOUND ENOUGH CORE FOR JOB TO BE FIT IN?\r
935         JRST (TAC1)             ;NO. LOOK FOR MORE\r
936         MOVE J,MAXJBN           ;YES, SWAP OUT LARGEST\r
937 \fFORCE0:        PUSHJ PDP,TRYSWP        ;CAN THIS JOB BE STOPPED IN ORDER TO DO SWAP?\r
938         JRST (TAC1)             ;NO, NSWP OR NSHF SET(DISPLAY,REAL TIME) OR\r
939                                 ; SAVE OR GET IN PROGRESS WITH DEVICE STILL ACTIVE\r
940                                 ; LOOK FOR AN OTHER JOB TO SWAP\r
941 \r
942 IFN FT2REL,<\r
943         EXTERN FORHGH\r
944         PUSHJ PDP,FORHGH        ;IS THERE A HIGH SEG TO BE WRITTEN BEFORE\r
945                                 ; TRYING TO SWAP OUT LOW SEGMENT?\r
946                                 ; WRITE HIGH SEG IF ALL OF THE FOLLOWING ARE TRUE:\r
947                                 ; 1. JOB HAS A HIGH SEG AND\r
948                                 ; 2. IT HAS NOT BEEN SWAPPED FOR THIS USER\r
949                                 ;    (SWP=0 FOR JOB)\r
950                                 ; 3. IT IS IN CORE(NOT XPANDH)\r
951                                 ; 4. IF IN-CORE COUNT IS EXECTLY 1 MEANING\r
952                                 ;    THIS ONLY USER USING IN CORE\r
953                                 ; 5. HIGH SEG NOT ON DISK YET\r
954                                 ; 6. THIS HIGH SEG IS NOT THE SAME ONE AS JOB\r
955                                 ;    BEING FITTED IN IS GOING TO WANT\r
956 \r
957                                 ; RETURN HIGH SEG NO. IN J IF YES, OTHERWISE\r
958                                 ; RETURN LOW SEG NO.\r
959                                 ; IF JOB JUST HAS LOW SEG. SHF BIT IS SET IN JBTSTS\r
960                                 ;    FOR JOB SO IO WILL STOP NEXT BUFFERE\r
961 >\r
962         MOVSI T,SWP!IFE FT2REL,<SHF> ;SET SWAPPED OUT BIT FOR LOW OR HIGH SEG\r
963         IORM T,JBTSTS(J)        ;SCHEDULER WILL NO LONGER RUN THIS JOB\r
964                                 ; SET SHF BIT IF ONE SEG SOFTWARE, SO IO WILL\r
965                                 ; STOP AFTER NEXT BUFFERFUL.\r
966 \r
967 FORCEL: MOVEM J,FORCE           ;ASSUME NOT SWAPPABLE--IS IT?\r
968 \r
969 FORCE1:\r
970 IFN JDAT-PROG,<\r
971         MOVE JDAT,JBTDAT(J)\r
972 >\r
973         SKIPN PROG,JBTADR(J)    ;LOC. IN PHYSICAL CORE, IS CORE\r
974                                 ; ASSIGNED IN MEMORY?\r
975         JRST SWAPO              ;NO, CANNOT HAVE ACTIVE DEVICES\r
976         CAME J,JOB              ;IF THIS IS CURRENT JOB, WAIT UNTIL\r
977                                 ; PROTECTED AREA IS MOVED BACK TO JOB DATA AREA\r
978         PUSHJ PDP,ANYDEV        ;ANY ACTIVE DEVICES?(2ND HALF OF ANYACT BOUT.)\r
979         POPJ PDP,               ;YES--RETURN AND WAIT FOR I/O TO STOP.\r
980 \f;SWAP OUT LOW OR HIGH SEGEMENT\r
981 \r
982 INTERNAL FTTRACK\r
983 \r
984 SWAPD:\r
985 IFN FTTRACK,<EXTERN LASOUT\r
986         MOVEM J,LASOUT          ;SAVE LAST SWAP OUT FOR DEBUGGING ONLY\r
987 >\r
988         SETZM FORCE             ;CLEAR FORCE FLAG\r
989         HLRZ T,JBTADTR(J)       ;COMPUTE CORE IMAGE\r
990         JUMPE T,SWP1            ;DONT OUTPUT IF 0 CORE(IMGOUT ALREADY SET TO 0\r
991                                 ; WHEN CORE WAS RETURNED\r
992 \r
993         HRRZ T1,JBTADR(J)\r
994         MOVNM T,T2              ;*SAVE COUNT FOR CALL TO SQOUT\r
995         ASH T,-^D10             ;CONVERT TO 1K BLOCKS\r
996         ADDI T,1\r
997         DPB T,IMGOUT            ;RECORD AS OUT IMAGE\r
998         HRLI T1,-1(T2)          ;*BUILD AND SAVE IOWD FOR SQOUT\r
999         PUSH PDP,T1             ;*\r
1000         LDB DAT,IMGIN           ;HAS SIZE OF CORE NEEDED WHEN NEXT SWAPPED IN\r
1001         SKIPN DAT               ;ALREADY BEEN SET(XPAND)\r
1002         DPB T,IMGIN             ;NO, SO SET TO # 1K BLOCKS OF CORE NEEDED\r
1003         MOVE DAT,T              ;*CONVERT CORE IMAGE TO 128 WD BLOCKS\r
1004         PUSHJ PDP,GXSAT         ;*GET DEVICE STORAGE\r
1005         JRST FULL               ;*NONE AVAILABLE\r
1006         HRLM TAC,JBTSWP(J)      ;*SAVE DEVICE ADDRESS\r
1007 OUTP2:  MOVNM J,FINISH          ;DISK SWAP SPACE ASSIGNED, NOW SET FINISH FLAG\r
1008                                 ; SO THAT SWAPPER WILL KNOW WHICH SEG FINISHED\r
1009                                 ; WHEN IO COMPLETED(SQREQ BECOMES ZERO)\r
1010         POP PDP,TAC1            ;*GET IOWD\r
1011         JRST SQOUT              ;*START OUTPUT AND RETURN\r
1012 \r
1013 NOFIT:  SETZM FIT               ;FORGET ABOUT FITTING IN A JOB ON DISK\r
1014         SETOM   INFLG           ;*** EXPERIMENTAL *** MARK DESIRE TO INPUT\r
1015         POPJ PDP,               ;ALL JOBS IN CORE RE HIGHER PRIORITY.\r
1016 \f;COME HERE WHEN THE AMOUNT OF SPACE NEEDED ON THE DISK\r
1017 ;IS NOT AVAILABLE IN ONE CONTIGUOUS BLOCK\r
1018 \r
1019         EXTERN GETFOR\r
1020 \r
1021 FULL:   HRLM    DAT,AC3         ;SAVE DAT (LARGEST AVAILABLE HOLE)\r
1022         PUSHJ   PDP,FULCOR      ;GET 4 FREE CORE LOCS\r
1023         HLRZ    DAT,AC3         ;RESTORE DAT\r
1024         MOVE    AC3,TAC1        ;LOC OF 1ST FREE CELL\r
1025         HRLI    AC3,-4          ;4 LOCS\r
1026         TRO     TAC1,FRGSEG     ;LIGHT FRAGMENTED BIT\r
1027         HRLM    TAC1,JBTSWP(ITEM) ;SAVE LOC OF TABLE IN JBTSWP\r
1028 FULL1:  PUSH    PDP,DAT         ;SAVE AMOUNT OF SPACE BEING REQUESTED\r
1029 FULL1A: PUSHJ   PDP,GXSAT       ;GET SOME SWAPPING SPACE\r
1030         JRST    FULL2           ;CANT HAVE THAT MUCH\r
1031         HRRM    TAC,(AC3)       ;SAVE LOC OF THE DISK SPACE\r
1032         POP     PDP,DAT         ;RESTORE AMT GOTTEN\r
1033         HRLM    DAT,(AC3)       ;SAVE AMOUNT IN TABLE\r
1034         SUB     T,DAT           ;AMOUNT STILL NEEDED\r
1035 \r
1036         JUMPE   T,FULSET        ;THROUGH IF NEED 0 K NOW\r
1037         PUSHJ   PDP,BMPAC3      ;STEP TO NEXT TABLE LOCATION\r
1038         MOVE    DAT,T           ;TRY TO GET ALL WE NEED NOW IN 1 CHUNK\r
1039 FULL1B: MOVE DAT,T      ;RESET AMOUNT OF SPACE NEEDED\r
1040 \r
1041 ;COME HERE WHEN CANT GET THE CHUNK REQUESTED\r
1042 FULL2:  MOVEM   DAT,(PDP)       ;DAT HAS LARGEST CHUNK AVAILABLE\r
1043         JUMPG   DAT,FULL1A      ;GO GET THAT AMOUNT\r
1044 IFN FT2REL,<\r
1045         EXTERN FRESWP\r
1046         PUSHJ PDP,FRESWP        ;TRY TO DELETE AN UNUSED HIGH SEG FROM DISK\r
1047         JRST FULL1B             ;FOUND ONE, TRY AGAIN, J PRESERVED\r
1048                                 ; NONE FOUND, PRINT MONITOR ERROR\r
1049 >\r
1050 \f       EXTERN CERROR\r
1051 \r
1052         POP     PDP,TAC         ;WHAT? NONE LEFT?\r
1053         POP     PDP,TAC         ;SET PDP TO RIGHT VALUE\r
1054         JSP     DAT,CERROR      ;ERROR IN MONITOR AT .....\r
1055 \r
1056 ;HERE WHEN THE TOTAL AMOUNT OF SPACE NEEDED HAS BEEN OBTAINED\r
1057 FULSET: PUSHJ   PDP,BMPAC3      ;STEP TO NEXT (LAST) TABLE LOCATION\r
1058         HLRZ    TAC,JBTSWP(ITEM) ;LOC OF TABLE OF FRAGMENTS\r
1059         JRST    OUTP2           ;GO START OUTPUT\r
1060 \r
1061 ;HERE TO GET 4 LOCS OF FREE CORE\r
1062 FULCOR: PUSH    PDP,ITEM        ;GETFOR USES ITEM\r
1063         PUSHJ   PDP,GETFOR      ;GET 4 CELLS\r
1064         JRST IPOPJ              ;RETORE ITEM AND RETURN\r
1065 \r
1066 ;STEP AC3 TO NEXT LOC OF TABLE BEING BUILT\r
1067 BMPAC3: AOBJN   AC3,CPOPJ       ;OK IF MORE LOCS OF TABLE\r
1068         PUSHJ   PDP,FULCOR      ;GET 4 MORE LOCS\r
1069         HRLI    AC3,-4\r
1070         CAIN    TAC1,(AC3)      ;ARE THEY CONTIGUOUS?\r
1071         POPJ    PDP,            ;YES. RETURN\r
1072         MOVE    TAC,-1(AC3)     ;NO. CONVERT LAST GOOD LOC\r
1073         HRROM   TAC1,-1(AC3)    ;TO A POINTER TO NEXT PART OF TABLE\r
1074         MOVEM   TAC,(TAC1)      ;STORE GOOD DATA IN 1ST WD OF NEW PART\r
1075 \r
1076         HRR     AC3,TAC1        ;NEW TABLE LOC\r
1077         AOBJN   AC3,CPOPJ       ;COUNT WORD AND RETURN\r
1078 \f;SWAP IN A JOB OR HIGH SEGMENT\r
1079 \r
1080 SWAPI:\r
1081 \r
1082 IFN FTTRACK,<EXTERN LASIN\r
1083         MOVEM J,LASIN           ;SAVE LAST SWAP IN FOR DEBUGGING ONLY\r
1084 >\r
1085 \r
1086         MOVEM J,FINISH          ;SET FINISH FLAG TO INPUT\r
1087         SETZM FIT               ;CLEAR FIT FLAG\r
1088         LDB TAC,IMGIN           ;SIZE OF CORE TO BE ASSIGNED WHEN SWAPPED IN (INK)\r
1089         LSH TAC,^D10            ;CONVERT TO HIGHEST ADR\r
1090         SUBI TAC,1              ;-1 FOR CALL TO CORGET\r
1091         SKIPE PROG,JBTADR(J)    ;IS (LOW)SEG ALREADY IN CORE?\r
1092         JRST FININ0             ;YES, POSSIBLE IF THIS IS LOW SET AND ONLY\r
1093                                 ; HIGH SEG WAS SWAPPED OUT.\r
1094         PUSHJ PDP,CORGET        ;NO, GET CORE FOR LOW OR HIGH SEG\r
1095         JSP DAT,OERROR          ;NOT AVAILABLE-SHOULD NEVER HAPPEN(TELL OPER)\r
1096 \r
1097 IFN FT2REL,<EXTERN FITHGH\r
1098         PUSHJ PDP,FITHGH        ;INCREASE INCORE COUNT FOR THIS JOB'S HIGH SEG.\r
1099 >\r
1100         LDB T,IMGOUT            ;GET OUTPUT IMAGE\r
1101         JUMPE T,FININ0          ;DONT INPUT IF OUT IMAGE IS 0\r
1102         LDB TAC1,IMGIN  ;IS SIZE OF CORE SMALLER THAN DISK SPACE?\r
1103         CAMGE TAC1,T            ;WELL?\r
1104         MOVE T,TAC1             ;YES, ONLY INPUT SMALLER AMOUNT(R,RUN,GET,KJOB)\r
1105         LSH T,^D18+^D10         ;*BUILD IOWD FOR SQIN\r
1106         MOVN TAC1,T             ;*\r
1107         HRR TAC1,JBTADR(J)      ;*\r
1108         HLRZ TAC,JBTSWP(J)      ;*GET DEVICE ADDRESS\r
1109         JRST SQIN               ;*START INPUT\r
1110 \f;ROUTINE TO CHANGE DISK SWAPPING SPACE ALLOCATION(OR SET TO 0)\r
1111 ;DIFFERS FROM ZERSWP IN THAT VIRTUAL TALLY FOR SYSTEM IS ALSO CHANGED\r
1112 ;CALLED FROM CORE0\r
1113 ;CALL:  MOVE ITE,JOB OR HIGH SEG NO.\r
1114 ;       MOVE TAC,#1K BLOCKS TO BE NEW ASSIGNMENT\r
1115 ;       PUSHJ PDP,CHGSWP\r
1116 ;       ALWAYS RETURN\r
1117 ;CALLED ONLY FORM VIRTUAL+PHYSICAL CORE ROUTINE CORE0\r
1118 \r
1119 INTERN CHGSWP\r
1120 EXTERN JBTSTS,IMGIN,IMGOUT,JBTSWP,VIRTAL,IPOPJ\r
1121 \r
1122 CHGSWP: LDB TAC1,IMGIN          ;SIZE WHEN SEG NEXT SWAPPED IN\r
1123         JUMPE TAC,CHG1          ;IS ZERO BEING ASKED FOR?\r
1124         LSH TAC,-12             ;NO, COVNERT TO 1K BLOCKS\r
1125         ADDI TAC,1              ;BUT DO NOT ATTEMPT TO RETURN DISK SPACE\r
1126                                 ; SINCE IT MIGHT BE FRAGMENTED(SWAPPER WILL\r
1127                                 ; RETURN ALL OF DISK SPACE ON NEXT SWAPIN)\r
1128                                 ; HAPPENS ONLY ON R,RUN,GET,KJOB\r
1129         DPB TAC,IMGIN           ;STORE NEW SIZE WHEN NEXT SWAPPED IN\r
1130         PUSH PDP,ITEM           ;SAVE AN AC\r
1131         LDB ITEM,IMGOUT         ;GET OLD DISK SIZE OF THIS USER(USES ITEM)\r
1132         CAMGE TAC1,ITEM         ;IS OLD IN-CORE SIZE BIGGER?\r
1133         MOVE TAC1,ITEM          ;NO, USE DISK SIZE AS USER'S OLD VIRTUAL CORE\r
1134         CAMGE TAC,ITEM          ;IS NEW IN-CORE SIZE BIGGER?\r
1135         MOVE TAC,ITEM           ;NO, USE DISK SIZE AS USER NEW\r
1136                                 ; VIRTUAL CORE\r
1137         SUB TAC1,TAC            ;DECREASE OF USER VIRT, CORE=OLD-NEW\r
1138         ADDM TAC1,VIRTAL        ;USER'S DECREASE=SYSTEM'S INCREASE OF VIRTUAL\r
1139                                 ;CORE\r
1140         JRST IPOPJ              ;RESTORE ITEM AND RETURN\r
1141 \f;ROUTINE TO RETURN ALL OF DISK SPACE FOR A LOW OR HIGH SEG\r
1142 ;THIS IS A PHYSICAL DEALLOCATION ONLY AND HAS NO EFFECT ON A SEGMENTS\r
1143 ;VIRTUAL CORE ASSIGNMENT\r
1144 ;CALL:  MOVE ITEM,JOB NO. OR HIGH SEG NO.\r
1145 ;       PUSHJ PDP,ZERSWP\r
1146 ;CALLED FROM SEGCON IN MANY PLACES(5)\r
1147 ;AND FININ0 HERE IN SWAP\r
1148 \r
1149         INTERN ZERSWP\r
1150 \r
1151 ZERSWPL TDZA TAC,TAC            ;REQUEST O SPACE ON DISK AND ALWAYS SKIP\r
1152 CHG1:   ADDM TAC1,VIRTAL        ;INCREASE SIZE OF VIRTUAL CORE AVAILABLE IN SYSTEM\r
1153                                 ; AND THEN RETURN ALL OF DISK SPACE(CHGSWP)\r
1154         MOVSI TAC1,SWP!SHF      ;CLEAR SWAPPED OUT BIT IN JOB OR SEG\r
1155         ANDCAM TAC1,JBTSTS(ITEM);STATUS WORD(SHF SET IF IO WAS TO BE STOPPED\r
1156                                 ; FOR SWAP OR CORE SHUFFLE\r
1157 \r
1158         PUSH PDP,DAT            ;SAVE TTY OUTPUT BYTE POINTER(COMMAND DECODER)\r
1159         LDB DAT,IMGOUT          ;*SIZE ON DISK(1K BLOCKS)\r
1160 \r
1161         JUMPE DAT,CHG3          ;DID SEG HAVE ANY DISK SPACE?\r
1162         HLRZ TAC,JBTSWP(ITEM)   ;*YES, LOGICAL DISK BLOCK+FRGSEG BIT\r
1163         PUSHJ PDP,FXSAT         ;*FREE THE DISK BLOCKS NO LONGER NEEDED\r
1164 CHG3:   POP PDP,DAT             ;RESTORE TTY OUTPUT BYTE POINTER\r
1165         MOVEI TAC,0             ;0 IS NEW DISK ASSIGNMENT\r
1166         DPB TAC,IMGOUT          ;SET DISK ASSIGNEMENT TO 0\r
1167         DPB TAC,IMGIN           ;SET NEW CORE IMAGE BLOCK SIZE WHEN NEXT SWAPPED IN\r
1168                                 ; HERE FROM CHGSWP IF NOT ASKING FOR 0\r
1169         POPJ PDP,               ;RETURN\r
1170 \f       EXTERN PROT0,PROT       ;PROT AND PROT0 OCCUR IN COMMON\r
1171 \r
1172 IFE     FTRC10, <\r
1173 XP ICPRT1,3+1*3                 ;PROTECT TIME IN CLOCK TICS=\r
1174 XP ICPROT,^D10                  ;((JOBSIZE/1K)*+PROT0)*PROT\r
1175                                 ; PROT0=3,PROT=4 PRODUCT PROTECT TIMES ROUGHLY\r
1176                                 ; EQUAL TO 270 DISK SWAP(1-WAY) TIMES.\r
1177 >\r
1178 IFN     FTRC10, <\r
1179 ;SIMILAR IN-CORE PROTECT TIME PARAMETERS FOR FAASTER RD-10 DISK......\r
1180 XP ICPRT1,3+1*3                 ;ZERO CORE PLUS K MULTIPLIER\r
1181 XP ICPROT,3                     ;MULTIPLY BY K-1 OF LOW SEG\r
1182 >\r
1183 \f;XPAND SETS CONDITIONS TO GET MORE CORE FRO A JOB BY SWAPPING IN OUT\r
1184 ,THEM BACK IN TO DESIRED AMOUNT.\r
1185 ,JOBS POSITION IN QS NOT AFFECTED.\r
1186 ;CALLED ONLY FROM CORE COMMAND\r
1187 ;ASSUMES CALL FOR CURRENT JOB IF EXPANDING HIGH SEG,IE ASSUME AT UUO LEVEL\r
1188 ;THIS IS TRUE SINCE THERE IS NO CORE COMMAND WHICH CAN EXPAND HIGH SEG\r
1189 ,CALL:  MOVE ITEM,[JOB NO.]\r
1190 ;       MOVE TAC,[HIGHEST LEGAL ADDRESS DESIRED]\r
1191 ;       PUSHJ PDP,XPAND\r
1192 ;       RETURN, TAC DESTROYED\r
1193 \r
1194 XPAND:  LSH TAC,-12             ;CONVERT HIGHEST DESIRED ADDRESS\r
1195         ADDI TAC,1              ;TO 1K BLOCKS\r
1196         DPB TAC,IMGIN           ;STORE, SO SWAPPER WILL KNOW HOW MUCH CORE\r
1197                                 ; TO REQUEST WHEN NEXT SWAPPED IN\r
1198 \r
1199 ;ROUTINE TO FLAG JOB TO BE STOPPED AND SWAPPED OUT\r
1200 ;BECAUSE IT HAS JUST BEEN CONNECTED TO A HIGH SHARABLE SEG WHICH IS ON DISK\r
1201 ;OR ON ITW WAY IN OR OUT.  THE SIZE OF THE HIGH SEG IS UNCHANGED\r
1202 \r
1203 ;THE JOB MUST BE STOPPED UNTIL HIGH SEG SWAPPED IN JUS AS IF JOB HAS\r
1204 ;EXPANDED HIGH SEG(MUST BE CALLED FROM UUO LEVEL FOR CURRENT JOB IF HIGH SEG)\r
1205 ;CALL:  MOVE ITEM,HIGH SEG NUMBER\r
1206 ;       PUSHJ PDP,XPANDH\r
1207 \r
1208         INTERN XPANDH\r
1209         EXTERN IPOPJ\r
1210 \r
1211 XPANDH:\r
1212 IFN FT2REL,<\r
1213         PUSH PDP,ITEM           ;SAVE JOB NUMBER\r
1214         CAILE ITEM,JOBMAX       ;IS THIS A LOW OR HIGH SEG?\r
1215         MOVE ITEM,JOB           ;HIGH,SO GET JOB NO.(MUST BE CURRENT JOB)\r
1216 >\r
1217         MOVSI TAC1,JXPN         ;SET THIS JOB EXPANDING BIT SO IT WILL NOT BE RUN\r
1218         TDNN TAC1,JBTSTS(ITEM)  ;IS IT ALREADY SET FOR THIS JOB?(UNLIKELY)\r
1219         AOS XJOB                ;NO, INCREMENT COUNT ONLY ONCE FOR EACH JOB EXPANDING\r
1220         IORM TAC1,JBTSTS(ITEM)  ;AND SET JOB EXPANDING BIT\r
1221 IFE FT2REL,<\r
1222         POPJ PDP,               ;RETURN\r
1223 >\r
1224 IFN FT2REL,<\r
1225         JRST IPOPJ              ;RESTORE JOB OR HIGH SEG NUMBER (ITEM) AND RETURN\r
1226 >\r
1227 \fSUBTTL SWPSER R.KRASIN/AF TS4.34  03 FEB 69    V406\r
1228 \r
1229 INTERNAL SQIN,SQOUT,SQGO,SQGO1\r
1230 INTERNAL FTSWAP\r
1231 EXTERNAL DFBUSY,DFRED,DFWRT,CPOPJ,JOBDAC,MJOBCK,CHECK,JBTCHK\r
1232 \r
1233 ;PUT A REQUEST IN THE SWAPPER QUEUE. ENTER AT SQIN FOR\r
1234 ;       INPUT, SWOUT FOR OUTPUT\r
1235 ;CALL:  MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.(IE IOWD+1)\r
1236 ;       HRRZ TAC,DISK BLOCK NO.\r
1237 ;       PUSHJ PDP,SQIN/SQOUT\r
1238 ;       RETURN HERE ALWAYS\r
1239 ;       CONTENTS OF TAC,TAC1 LOST\r
1240 \r
1241 SQIN:   TLO TAC,400000          ;SET READ INDICATOR\r
1242 SQOUT:  MOVEM TAC,SERA          ;STORE THE BLOCK NUMBER\r
1243         MOVEM TAC1,SQREQ        ;STORE THE IOWD\r
1244         MOVEM TAC1,ESQREQ       ;SAVE IN CASE OF DISK ERROR ON FRAGMENTED JOB\r
1245         MOVNI TAC,1             ;IS THE DEVICE BUSY?\r
1246         EXCH TAC,DFBUSY \r
1247         JUMPN TAC,CPOPJ         ;YES IF JUMP\r
1248 \r
1249 ERATRY=3        ;NO. OF TIMES TO READ AND WRITE ON ERRORS\r
1250 \r
1251 ;START UP DEVICE WITH SWAPPING REQUEST. THIS ROUTINE\r
1252 ;IS CALLED FROM DISK INTERRUPT SERVICE, AS WELL AS FROM ABOVE.\r
1253 ;IF A SWAPPER REQUEST IS WAITING(SQREQ WILL BE NON-ZERO)\r
1254 \r
1255 SQGO:   MOVEI TAC1,ERATRY\r
1256         MOVEM TAC1,SERACT\r
1257         MOVSI TAC,400000\r
1258         TDNE TAC,SERA           ;WRITE?\r
1259         JRST SQGO1              ;NO\r
1260         HRRZ TAC,SQREQ\r
1261         ADDI TAC,JOBDAC\r
1262         HRLI TAC,MJOBCK\r
1263         PUSHJ PDP,CHECK\r
1264         MOVM    TAC,FINISH\r
1265         MOVEM   TAC1,JBTCHK(TAC)\r
1266 \fSQGO1: SETZM   SQLEN           ;ZERO AMOUNT TRANSFERRED SO FAR\r
1267         MOVE TAC1,SQREQ         ;*PUT IOWD INTO TAC1\r
1268         MOVSI TAC,200000        ;*SET "SWAPPER I/O GOING" FLAG ON\r
1269         ORB TAC,SETA    ;*\r
1270         TRZN    TAC,FRGSEG      ;*FRAGMENTED?\r
1271         JRST    SQGO2           ;*NO, READ IN ENTIRE (OR PART) OF SEG\r
1272 \r
1273         EXTERN CLCOR1\r
1274 \r
1275 FRAGIO: PUSH    PDP,DAT\r
1276         MOVN    DAT,SQLEN       ;AMOUNT PREVIOUSLY TRANSFERRED\r
1277         SUB     TAC1,DAT        ;INCREASE CORE ADDRESS BY WORDCOUNT PREVIOUS\r
1278 FRGIO1: HLRE    DAT,(TAC)       ;NO OF K IN THIS  DISK CHUNCK\r
1279         HRR     TAC,(TAC)       ;SWAPPING ADDRESS FOR THIS DISK CHUNK\r
1280         JUMPGE  DAT,FRGIO2      ;POINTER TO NEW CORE LIST IF NEG.\r
1281         MOVEI DAT,77777         ;CLEAR OUT ADR(15 BITS)\r
1282         ANDCAM DAT,SERA\r
1283         ORM TAC,SERA            ;INSERT NEW ADDRESS\r
1284         JRST FRGIO1\r
1285 \r
1286 \r
1287 FRGIO2: LSH     DAT,12          ;CONVERT FROM K TO WORDS\r
1288         ADDM DAT,SQLEN          ;ADD TO PREVIOUSLY TRANSFERRED AMOUNT\r
1289         MOVNS DAT               ;-N WORDS\r
1290         HRLM    DAT,TAC1        ;IOWD IN TAC1\r
1291         HRLO DAT,DAT            ;-NO. OF WRDS FOR THIS DISK TRANSFER TO TH\r
1292         CAMG DAT,SQREQ          ;COMPARE WITH - NO. WORDS FOR REST OF SEG\r
1293         HLL TAC1,SQREQ          ;SWAPPER ONLY WANTS TO READ A PORTION OF SEG\r
1294                                 ; NOT ALL OF IT(R,RUN,GET,KJOB COMMAND)\r
1295         MOVNS DAT               ;+NO. OF WORDS FOR THIS NEXT TRANSFER\r
1296         ADDI DAT,777777\r
1297         ADDM DAT,SQREQ          ;UPDATE LH OF IOWD FOR ENTIRE SEG, SO IT HAS\r
1298                                 ; -NO. OF WORDS LEFT AFTER THIS TRANSFER IS DONE\r
1299         POP     PDP,DAT\r
1300 SQGO2:  TLZ TAC,377777          ;*CLEAR POSSIBLE TRASH IN LH.\r
1301         ROT TAC,BLKSPK          ;*RE-POSITION DISK LOGICAL BLOCK NUMBER.\r
1302         TRZE TAC,4              ;*TEST AND CLEAR READ/WRITE BIT.\r
1303         SOJA TAC1,DFRED         ;*YES\r
1304         SOJA TAC1,DFWRT         ;*NO, WRITE.\r
1305 \f;SERVICE A SWAPPING INTERRUPT\r
1306 EXTERNAL DINT4B,CKSMCT\r
1307 INTERNAL SWPINT\r
1308 \r
1309 SWPINT: TRNE IOS,IODTER!IODERR!IOIMPM\r
1310         JRST SWPERR             ;ERRORS\r
1311         TRZE TAC,FRGSEG ;*FRAGMENTED?\r
1312         SKIPL TAC1,SQREQ        ;*YES, MORE IOWD TO GO?\r
1313         JRST DINT8B             ;NO, ALL DONE SWAP IN OR OUT\r
1314         AOS SERA                ;YES, FRAGMENTED AND MORE TO GO\r
1315         SKIPE 1(TAC)            ;IS THIS THE END OF SWAP COMMAND LIST?\r
1316         AOJA TAC,FRAGIO         ;NO, BO DO NEXT PIECE OF FRAGMENTED SEG\r
1317 \r
1318 DINT8B: TLNN TAC,400000         ;*INPUT?\r
1319         JRST DINT8A             ;*NO\r
1320         HRRZ TAC,SQREQ\r
1321         ADDI TAC,JOBDAC\r
1322         HRLI TAC,MJOBCK\r
1323         PUSHJ PDP,CHECK\r
1324         MOVM TAC,FINISH\r
1325         CAME TAC1,JBTCHK(TAC)\r
1326         JRST SWPER1\r
1327 DINT8A: HRRZM IOS,SERA\r
1328         SETZM SQREQ\r
1329         JRST DINT4B\r
1330 \r
1331 SWPER1; MOVSI TAC,100\r
1332         ADDM TAC,CKSMCT\r
1333         TRO IOS,IODTER\r
1334 SWPERR: MOVM TAC, FINISH        ;*RESET SERA IN CASE OF FRAGMENTED JOB\r
1335         HLRZ TAC, JBTSWP(TAC)   ;*SWAP LOC (DISK ADR OR TABLE ADR)\r
1336         HRRM TAC, SERA          ;*RESTORE SERA\r
1337         MOVE TAC,ESQREQ         ;RESTORE ESQREQ IN CASE OF FRAGMENTED JOB\r
1338         MOVEM TAC,SQREQ\r
1339         SOSLE SERACT            ;*TRIED ENOUGH?\r
1340         JRST SQGO1              ;*NO, TRY AGAIN\r
1341         JRST DINT8A             ;*YES, TOUGH.\r
1342 \fIFE    FTRC10, <\r
1343 ;SWPSER LOGIC FOR THE OLD PDP-6 (DATA PRODUCTS) DISK FILE ---\r
1344 \r
1345 ;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED\r
1346 ;AT CLOCK LEVEL.\r
1347 ;CALL:  MOVEI DAT,NO. OF 1K BLOCKS DESIRED\r
1348 ;       PUSHJ PDP,GXSAT\r
1349 ;       ERROR EXIT      (DISK IS FULL)\r
1350 ;       NORMAL EXIT     ;C(TAC) = BLOCK NO.\r
1351 \r
1352 ;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST.\r
1353 \r
1354 INTERNAL GXSAT\r
1355 EXTERNAL GETBIT,IPOPJ1\r
1356 \r
1357 GXSAT:  MOVE AC1,XSAT1          ;SAVE AC1, SET IT TO TABLE LOC.\r
1358         MOVE AC2,XSAT2  ;\r
1359         LSH DAT,CONVMD          ;CONVERT TO 128 WORD DISK BLOCKS\r
1360         PUSH PDP,ITEM           ;SAVE C(ITEM)\r
1361         \r
1362         MOVE ITEM,DAT           ;GETBIT EXPECTS PARAMETER IN ITEM\r
1363         PUSHJ PDP,GETBIT        ;FIND A HOLE BIG ENOUGH\r
1364         JRST IPOPJ              ;NONE, RESTORE ITEM AND ERROR RETURN\r
1365         MOVEI TAC,-1(TAC1)\r
1366         CAIL TAC,BLOCKS         ;IS IT ON DISK 17?\r
1367         ADDI TAC,DIFF           ;YES\r
1368         LSH TAC,-CONVMD         ;CARRY DISK ADDRESS SHIFTED TO FIT IN JBTSWP.\r
1369         JRST IPOPJ1             ;SKIP RETURN AND RESTORE JOB NUMBER(ITEM)\r
1370 \r
1371 ;FREE UP A SERIES OF BLOCKS ON THE SWAPPING DEVICE. CALLED\r
1372 ;AT CLOCK LEVEL\r
1373 ;CALL:  MOVEI DAT,NO. OF 1K BLOCKS TO FREE\r
1374 ;       MOVE TAC,BLOCK NO. OF FIRST DISK BLCOK TO FREE\r
1375 ;       PUSHJ PDP,FXSTAT\r
1376 ;       ALWAYS RETURN HERE\r
1377 \r
1378 ;CONTENTS OF ACS TAC,TAC1 WILL BE LOST.\r
1379 \r
1380 INTERNAL FXSAT\r
1381 EXTERNAL CLRBIT,IPOPJ\r
1382 \r
1383 FXSAT:  LSH TAC,CONVMD          ;RESTORE SHIFTED DISK ADDRESS.\r
1384         CAIL TAC,HISWAP         ;ON DISK 17?\r
1385         SUBI TAC,DIFF           ;YES\r
1386         LSH DAT,CONVMD          ;CONVERT TO 128 WORD DISK BLOCKS\r
1387         MOVE AC1,XSAT1          ;SET UP AC1 WITH POINTER TO SAT BLOCK\r
1388         MOVE AC2,XSAT2          ;AC2 TOO\r
1389         PUSH PDP,ITEM           ;SAVE C(ITEM)\r
1390         MOVE ITEM,DAT           ;CLRBIT EXPECTS PARAMETER IN DAT\r
1391         PUSHJ PDP,CLRBIT\r
1392         JRST IPOPJ              ;RETURN, AND RESTORE ITEM\r
1393 \r
1394 ;INITIALIZE SWAPPER DISK STORAGE TABLE\r
1395 \r
1396 INTERNAL SWPINI\r
1397 \r
1398 SWPINI: MOVE TAC,XSAT2\r
1399         MOVEM TAC,XSAT31\r
1400         MOVSI TAC,1B18\r
1401         MOVEM TAC,XSAT3\r
1402         SETZM XSAT4\r
1403         MOVE TAC,XSAT4P\r
1404         BLT TAC,XSAT61\r
1405         MOVE TAC,XSAT7\r
1406         MOVEM TAC,XSAT5\r
1407         MOVE TAC,XSAT8\r
1408         MOVEM TAC,XSAT6\r
1409         POPJ PDPD,\r
1410 \r
1411 IFN FTCHECK+FTMONP,<\r
1412 EXTERNAL SQREQ,SERA,SERACT,XSAT1,XSAT2,XSAT3,XSAT4,XSAT5,XSAT6,XSAT7\r
1413 EXTERNAL XSAT8,SWPSIZ,HISWAP,DIFF,CONVMD,BLOCKS,XSAT31,XSAT4P,XSAT61\r
1414 >\r
1415 IFE FTCHECK+FTMONP,<\r
1416 \r
1417 ;DATA AND STORAGE AREA FOR SWAPPING. ON THE 270 DISK, DISKS\r
1418 ;       0 & 17 ARE USED FOR SWAPPING, ECH DISK CONTAINING\r
1419 ;       5400 (OCTAL) RECORDS\r
1420 \r
1421 INTERNAL        SQREQ,SERA,SERACT\r
1422 SQREQ:  Z                       ;C(LH)=NEG. OF SIZE OF READ/WRITE\r
1423                                 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE\r
1424 ESQREQ: Z                       ;COPY OF SQREQ, IN CASE OF\r
1425                                 ; ERROR IN FRAGMENTED JOB\r
1426 SERA:   Z                       ;SIGN IS 1 IF A READ\r
1427                                 ; C(RH)=BLOCK NUMBER BEFORE READING.\r
1428                                 ;  ERROR BITS AFTER READING.\r
1429 SELACT: 0                       ;COUNT FOR ERRORS\r
1430 SQLEN:  0                       ;AMOUNT TRANSFERRED SO FAR - FRAG SEG\r
1431 \r
1432 XSAT1:  EXP XSAT3-1             ;POINTER USED BY GETBIT,CLRBIT\r
1433 XSAT2:  XWD -SWPSIZ,XSAT4       ;POINTER TO BIT TABLE\r
1434 XSAT3:  XWD 400000,             ;2-WORD TABLE ALTERED BY GETBIT,CLRBIT\r
1435         XWD -SWPSIZ,XSAT4\r
1436 \r
1437                                 ; BIT TABLE FOR SWAPPING ALLOCATION\r
1438 XP BLOCKS,5400                  ;NUMBER OF RECORDS/DISK PLATE\r
1439         W1=BLOCKS/^D36          ;NUMBER OF ZERO WORDS AT TOP OF TABLE\r
1440         E1=BLOCKS-W1*^D36       ;LEADING ZERO IN W1+1ST WORD\r
1441         EX=BLOCKS+E1-^D35\r
1442         W2=EX/^D36              ;ZERO WORDS AT BOTTOM OF TABLE\r
1443         E2=EX-W2*^D36           ;LEADING ZEROES IN W1+W2+2ND WORD\r
1444 \r
1445 XP XSAT31,XSAT3+1\r
1446 XSAT4:  BLOCK W1\r
1447 XSAT5:  BLOCK W2+1\r
1448 XSAT6:  BLOCK 1\r
1449         REPEAT 1,<\r
1450                 IFE E1,<X=1B0>\r
1451                 IFN E1,<X1\r
1452                 REPEAT ^D35-E1,<X=X*2>>\r
1453                 IFE E2,<Z=-1>\r
1454                 IFN E2,<Z=0\r
1455                 X=1\r
1456                 REPEAT ^D36-E2,<Z=Z+Y\r
1457                 Y=Y*2>\r
1458                 >>\r
1459 XP XSAT61,XSAT6-1\r
1460 XSAT7:  EXP X\r
1461 XSAT8:  EXP Z\r
1462 \r
1463 SWPSIZ=XSAT6-XSAT4+1            ;SIZE OF TABLE\r
1464 HISWAP=17*BLOCKS                ;LOGICAL BLOCK NUMBER OF FIRST\r
1465                                 ; BLOCK ON DISK\r
1466 DIFF=HISWAP-BLOCKS-1\r
1467 \r
1468 XP CONVMD,3     ;CONVERSION FROM 1K CORE BLOCKS TO 128 WORD\r
1469                 ;DISC BLOCKS(SHIFT COUNT)\r
1470 \r
1471 XP BLKSPK,CONVMD                ;NO. OF BLOCKS PER K, SAME AS CONVMD\r
1472 XSAT4P: XWD XSAT4,XSAT4+1\r
1473 >\r
1474 >       ;END OF SWPSER LOGIC FOR THE OLD PDP-6 DISK.\r
1475 \fIFN    FTRC10, <\r
1476 ;SWPSER LOGIC FOR THE NEW PDP-10 (MODEL RC-10) DISK ---\r
1477 \r
1478 INTERNAL        GXSAT,FXSAT,SWPINI\r
1479 EXTERNAL        GETBIT,CLRBIT\r
1480 EXTERNAL        LBHIGH,IPOPJ,IPOPJ1\r
1481 \r
1482 \r
1483 ;SUBROUTINE "GXSAT" IS CALLED TO FIND A SERIES OF CONSECUTIVE FREE BLOCKS ON\r
1484 ; THE DISK TO SWAP SOME JOB OUT ONTO.  IT IS CALLED AT CLOCK LEVEL.\r
1485 \r
1486 ;CALLING SEQUENCE ---\r
1487 ;       PUSHJ   PDP,GXSAT\r
1488 ;       ERROR EXIT --- THE DISK IS FULL, NO SWAPPING SPACE AVAILABLE.\r
1489 ;       NORMAL EXIT\r
1490 ;ENTRY CONDITIONS ---\r
1491 ;       C(DAT) = NUMBER OF 1K BLOCKS OF DISK STORAGE NEEDED.\r
1492 ;EXIT CONDITIONS ---\r
1493 ;       C(TAC) = LOGICAL BLOCK NUMBER (DIVIDED BY 8) OF THE FIRST DISK BLOCK IN\r
1494 ;                 THE SERIES OF CONSECUTIVE BLOCKS WHICH SATISFY THIS REQUEST.\r
1495 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.\r
1496 \r
1497 GXSAT:  PUSH    PDP,ITEM        ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".\r
1498         MOVE    ITEM,DAT\r
1499         MOVEI   AC1,SWPENT      ;SET UP ENTRY CONDITIONS FOR THE "GETBIT" SUBROUTINE.\r
1500         MOVE    AC2,SWPENT\r
1501         PUSHJ   PDP,GETBIT\r
1502         JRST    IPOPJ           ;NO ROOM IN THE SWAPPING PART OF THE DISK.\r
1503         ADDI    TAC1,-1(ITEM)   ;ROOM FOUND--COMPUTE LOGICAL BLOCK NUMBER OF THIS\r
1504         CAMLE   TAC1,MAXSWP     ;FIRST BLOCK IN A SERIOES OF CONSECUTIVE FREE DISK\r
1505         MOVEM   TAC1,MAXSWP     ;BLOCKS.  THE "SWPTAB" TABLE SEARCHED HAS ONE BIT\r
1506         LSH     TAC1,BLKSPK     ;FOR EACH 1K OF SWAPPING DISK SPACE. BUT IS STORED\r
1507         SUB     TAC1,LBHIGH     ;BACKWARDS (1ST BIT OF SWPTAB = LAST  1K OF DISK).\r
1508         MOVM    TAC,TAC1        ;ALSO UPDATE "MAXSWP" IF PREVIOUS MAXIMUM EXCEEDED.\r
1509         LSH TAC,-BLKSPK         ;COMPRESS DISK ADDRESS TO 17 BITS FOR LH OF JBTSWP\r
1510         AOJA TAC,IPOPJ1         ;ADD 1 TO TAC AND RESTORE ITEM AND SKIP RETURN\r
1511 \f;SUBROUTINE "FXSAT" IS CALLED TO RETURN A SERIES OF CONSECUTIVE DISK BLOCKS TO\r
1512 ; THE FREE STORAGE POOL. THUS MAKING THEM AVAILABLE FOR RE-USE IN HANDLING\r
1513 ; FUTURE SWAPPING REQUESTS. IT IS CALLED AT CLOCK LEVEL.\r
1514 \r
1515 ;CALLING SEQUENCE ---\r
1516 ;       PUSHJ   PDP,FXSAT\r
1517 ;       NORMAL EXIT\r
1518 ;ENTRY CONDITIONS ---\r
1519 ;       C(TAC) = LOGICAL BLOCK NUMBER OF THE FIRST DISK BLOCK IN THE\r
1520 ;               SERIES WHICH IS TO BE MADE AVAILABLE.\r
1521 ;       C(DAT) = NUMBER OF CONSECUTIVE 1K BLOCKS OF DISK SPACE WHICH\r
1522 ;               ARETO BE MADE AVAILABLE.\r
1523 ;EXIT CONDITIONS ---\r
1524 ;       THE REQUESTED BITS IN THE SWAPPING SPACE AVAILABILITY TABLE\r
1525 ;               (NAMELY, SWPTAB) HAVE BEEN CLEARED TO ZERO.\r
1526 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.\r
1527 \r
1528 FXSAT:  TRZN    TAC,FRGSEG      ;FRAGMENTED?\r
1529         JRST    FXSAT1          ;NO. DO IN REGULAR WAY\r
1530 \r
1531 FRAGRK: HRRZ    AC3,TAC         ;YES. LOC OF TABLE IN AC3\r
1532 FRGBK1: HRRZ    TAC,(AC3)       ;LOC OF NEXT DISK ADDRESS\r
1533         HLRE    DAT,(AC3)       ;NUMBER OF K\r
1534         JUMPLE  DAT,FRGBK2      ;GIVE UP FREE CORE IF NOT REAL ADDRESS\r
1535         PUSHJ   PDP,FXSAT1      ;GIVE UP THE DISK SPACE FOR THIS PART\r
1536         AOBJP   AC3,FRGBK1      ;COUNT WORD OF TABLE, GET NEXT\r
1537 FRGBK2: HRRZ    TAC,AC3         ;LOC OF TABLE\r
1538         PUSH    PDP,ITEM\r
1539         HLRZ    ITEM,AC3        ;NUMBER OF WDS IN TABLE\r
1540         SUB     TAC,ITEM        ;POINT TAC TO 1ST WORD OF BLOCK\r
1541         LSH     ITEM,-2         ;4 WDS PER BIT\r
1542         AOS     ITEM\r
1543         PUSHJ   PDP,CLCOR1      ;GIVE UP FREE CORE\r
1544         POP     PDP,ITEM\r
1545         SKIPE   TAC,(AC3)       ;END OF TABLE?\r
1546         JRST    FRAGBK          ;NO, GO CHASSE NEXT PART\r
1547         POPJ    PDP,            ;YES, DONE\r
1548 \r
1549 FXSAT1: PUSH    PDP,ITEM        ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".\r
1550         MOVE    ITEM,DAT\r
1551         LSH TAC,BLKSPK          ;REGENERATE THREE LOW ORDER 0 BITS IN DISK ADDRESS.\r
1552         SUB     TAC,LBHIGH      ;PREPARE TO CLEAR BITS IN THE SWAPPING\r
1553         MOVMS   TAC             ; AVAILABLITY TABLE BY TRANSFORMING THE LOGICAL\r
1554         ADDI    TAC,1           ; BLOCK NUMBER TO AN EQUIVALENT BIT NUMBER IN THIS\r
1555         MOVNI   AC1,BLKSPK      ; TABLE (WHICH IS STORED IN REVERSE ORDER AND HAS\r
1556         LSH     TAC,(AC1)       ; ONE BIT PER 1K OF SWAPPING SPACE ON THE DISK).\r
1557         SUB     TAC,DAT\r
1558         MOVEI   AC1,SWPENT\r
1559         MOVE    AC2,SWPENT      ;SET UP ENTRY CONDITIONS FOR THE "CLRBIT" SUBROUTINE.\r
1560 FXSATC: PUSHJ   PDP,CLRBIT      ;THE "CLRBIT" SUBROUTINE IN "DSKSER" ACTUALLY DOES\r
1561                                 ; THE WORK OF CLEARING THE BITS.\r
1562         JRST IPOPJ              ;RESTORE ITEM AND RETURN\r
1563 ;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT\r
1564 ; SYSTEM INITIALIZATION TIME.\r
1565 \r
1566         EXTERN VIRTAL,SWPHGH\r
1567 \r
1568 SWPINI: MOVE TAC,LBHIGH         ;SET HIGHEST LOGICAL BLOCK\r
1569         MOVEM TAC,SWPHGH        ;FOR SWAPPING IN COMMON\r
1570         MOVNI   TAC,1           ;SET ENTIRE TABLE TO ONES, I.E., MARK EVERYTHING\r
1571         MOVE    TAC1,SWPENT     ; AS BEING UNAVAILABLE FOR SWAPPING.\r
1572         MOVEM   TAC,(TAC1)\r
1573         AOBJN   TAC1,.-1\r
1574         MOVEI   AC1,SWPENT      ;THEN USE THE "CLRBIT" ROUTINE TO CLEAR OUT AS MANY\r
1575         MOVE    AC2,SWPENT      ; BITS AT THE FRONT OF THE TABLE AS THERE ARE 1K DISK\r
1576         MOVE    ITEM,K4SWAP     ; AREAS ALLOCATED FOR SWAPPING USE.  THE PARAMETER\r
1577         MOVEM ITEM,VIRTAL       ;TOTAL AMOUNT OF VIRTUAL CORE ALLOWED\r
1578                                 ; IS JUS EQUAL TO AMOUNT OF SWAPPING SPACE\r
1579                                 ; EVEN IF USER CAN NOT HAVE ALL OF PHYSICAL USER CORE\r
1580 \f       MOVEI   TAC,0           ; "K4SWAP" IS SET UP DURING DISK REFRESHING, AND\r
1581                                 ; RECALLED FROM THE DISK AT EACH SYSTEM-INITIALIZE.\r
1582         JRST    CLRBIT          ;IN LIEU OF "PUSHJ CLRBIT" FOLLOWED BY "POPJ".\r
1583 \fIFN FTCHECK+FTMONP,<\r
1584 EXTERNAL        RCXSDT  ;DUMMY GLOBAL SYMBOL TO PERMIT THE SYSTEM BUILDER TO\r
1585                         ; RETRIEVE THE CORRECT BINARY COPY OF "SCHDAT".\r
1586 EXTERNAL        SQREQ,SERA,SERACT\r
1587 EXTERNAL        LBHIGH,BLKSPK,MAX2SWP,SWPENT,SWPTAB,MAXSWP\r
1588 >\r
1589 \r
1590 IFE FTCHECK+FTMONP,<\r
1591 ;DATA ASSOCIATED WITH THE SWPSER LOGIC FOR THE NEW PDP-10 DISK ---\r
1592 \r
1593         INTERN  MXK2SWP,CONVMD,BLKSPK,SWAPTAB,MAXSWP\r
1594         EXTERN K4SWAP\r
1595 ;THE ABOVE ARE REFERENCED OR INITIALIZED BY THE "ONCE" ROUTINE.\r
1596 \r
1597 ;C(LOWSWP)=LOWEST LOGICAL BLOCK NUMBER TO BE USED FOR SWAPPING\r
1598 ;DETERMINED BY ONCE ONLY REFRESH DIALOG\r
1599 ;C(K4SWAP)=MAX. NO. OF K DISK WORDS ALLOCATED FRO SWAPPING, ALS\r
1600 ;DETERMINED BY ONCE ONLY REFRESH DIALOG\r
1601 MAXSWP: 0       ;MAX. NO. OF K FROM TOP TO LOWEST JOB\r
1602                         ; USED SINCE SYSTEM BEGAN\r
1603 ;C(MAXSWP)=MAX. NO. OF K EVER ASSIGNED COUNTING FROM TOP DOWN TO\r
1604 ;LOWEST EXCURSION, INCLUDING HOLS. WHEN = C(K4SWAP), THEN FREAGMENTATION HAD\r
1605 ;HAPPENED SOMETIME DURING THE PAST\r
1606 BLKSPK=3        ;SHIFT FACTOR TO CONVERT K OF CORE TO DISK BLOCKS, I.E.,\r
1607                 ; EIGHT DISK BLOCKS PER K OF CORE.\r
1608 CONVMD=BLKSPK   ;ONLY FOR CONSISTENCY WITH OLDER PDP-6 ROUTINE.\r
1609 MXK2SWP=^D1000  ;MASIMUM NUMBER OF 1K DISK BLOCKS WHICH MIGHT BE ALLOCATED\r
1610                 ; FOR SWAPPING (UPPER BOUND ON THE VALUE OF K4SWAP  WHICH\r
1611                 ; MAY BE REQUESTED AT DISK REFRESH TIME). (ONE MILLION WORDS\r
1612                 ; FOR SWAPPING SEEMS LIKE A NON-RESTRICTIVE ARBITRARY LIMIT.)\r
1613 SWPSIZ=MXK2SWP/.^D36+1  ;SIZE OF SWPTAB ALLOCATION TABLE.\r
1614 \r
1615 SWPENT: XWD     -SWPSIZ,SWPTAB  ;THREE WORD POINTER TABLE\r
1616         XWD     400000,0        ; REQUIRED BY THE "GETBIT" AND\r
1617         XWD     -SWPSIZ,SWPTAB  ; "CLRBIT" SUBROUTINES.\r
1618 \r
1619 SWPTAB: BLOCK   SWPSIZ  ;SWAPPING SPACE AVAILABILITY TABLE.\r
1620 \r
1621 ;DATA CARRIED OVER FROM THE COMMON PART OF OLD AND NEW SWPSER ROUTINES ---\r
1622 INTERNAL        SQREQ,SERA,SERACT,ESQREQ\r
1623 SQREQ:  Z                       ;C(LH)=NEG. OF SIZE OF READ/WRITE\r
1624                                 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE\r
1625 ESQREQ: Z                       ;COPY OF SQREQ, IN CASE OF SWAP ERROR IN FRAGMENTED JOB\r
1626 SERA:   Z                       ;SIGN IS 1 IF A READ\r
1627                                 ; C(RH)=BLOCK NUMBER BEFORE READING.\r
1628                                 ;  ERROR BITS AFTER READING.\r
1629 SELACT: 0                       ;COUNT FOR ERRORS\r
1630 SQLEN:  0                       ;AMOUNT TRANSFERRED SO FAR FOR FRAGMENTED JOB\r
1631 >\r
1632 >       ;END OF SWPSER LOGIC FOR THE NEW PDP-10 DISK.\r
1633 \fSCHEND:        END\r