1 IFE FTDISK+FTRC10+2,<
\r
2 TITLE SCHEDB - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(BURROUGHS DISK)
\r
4 IFE FTDISK+FTRC10+1,<
\r
5 TITLE SCHEDD - SCHEDULING ALGORITHM FOR SWAPPING SYSTEM(10/50)(DATA PRODUCTS DISK)
\r
7 SUBTTL CLKCSW R,KRASIN/AF/TH/RCC TS 02 JUNE 69 V421
\r
9 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP
\r
12 INTERNAL FTRC10 ;THIS SOURCE FILE MAY BE ASSEMBLED TO USE EITHER THE
\r
13 ; NEW PDP-10 DISK (MODEL RC-10) OR THE OLD PDP-6 DISK (DATA
\r
14 ; PRODUCTS DISK FILE) FOR SWAPPING.
\r
17 ENTRY RCXSKD ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM
\r
18 RCXSKD: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.
\r
27 EXTERNAL JBTQ,PJBSTS
\r
28 EXTERNAL PJBSTS,TIMEF,MJOBN
\r
30 INTERNAL NXTJOB,FTSWAP
\r
32 ;ACCUMULATOR DEFINITIONS ---
\r
33 QJ=DEVDAT ;QJOB WORD
\r
34 SW=TAC1 ;STATUS WORD
\r
37 ;INITIALIZE SCHEDULER (CALLED FROM SYSINI BEFORE ALL OTHER
\r
38 ; DEVICES ARE INITIALIZED)
\r
43 NXTINI: MOVEI TAC,MAXQ ;MAX. NO. OF QUEUES
\r
44 SETZM AVALTB(TAC) ;CLEAR SHARABLE DEVICE AVAIL. FLAGS
\r
45 SETOM REQTAB(TAC) ;SET SHARABLE DEVICE REQUEST COUNT
\r
46 ; TO -, I.E. NO JOB WAITING OR
\r
47 ; USING DEVICE OTHER THAN INITIALIZATION
\r
49 SETZM QJOB ;CLEAR NO. OF JOBS NEEDING REQUEING
\r
50 SETZM XJOB ;CLEAR NO. OF JOBS NEEDING EXPANDING
\r
51 SETZM JOBQUE ;CLEAR JOB NO. TO BE REQUEUED
\r
54 \f,NXTJOB DECREMENTS CURRENT JOB'S QUANT. AND PROTECT
\r
55 ,TIMES AND REQUEUES IT IF QUANT. TIME GONE TO 0
\r
56 ,SERVINCES ANY JOB REQUEING REQUESTED AT OTHER PRIORITY
\r
57 ,LEVELS THEN CALLS SHUFFLER,SWAPPER AND SCHEDULAR.
\r
58 ,MAKES NO ASSUMPTIONS RE. ACS
\r
59 ,RETURSN NEXT JOB TO RUN IN J.
\r
62 EXTERNAL JBTSWP,POTLST
\r
64 NXTJOB: SKIPN TIMEF ;CLOCK TIC?
\r
67 MOVSI SW,-1 ;DECREMENT IN CORE PROTECT TIME
\r
75 NXTJB1: SKIPN J,JOB ;CURRENT JOB NO., IS IT NULL JOB?
\r
76 JRST CKJB1 ;YES,GO SEE IF OTHER JOBS NEED RESCHEDULING
\r
77 MOVEI QJ,0 ;GET READY IN CASE CURRENT JOB UNRUNNABLE
\r
78 HLRZ SW,JBTSTS(J) ;GET JOB STATUS BITS AND CODES
\r
79 TRZ SW,RUNMSK+CMWB ;MASK OUT DO NOT CARE BITS
\r
80 CAIE SW,RUNABLE ;IS CURRENT JOB RUNABLE?
\r
81 JRST CKJB3 ;NO. REQUEU CURRENT JOB
\r
82 SKIPN TIMEF ;NO. IS THIS A TIME INTERRUPT?
\r
85 SOS SW,JBTSTS(J) ;DECREMENT QUANT. TIME
\r
86 TRNE SW,-1 ;HAS TIME GONE TO 0?
\r
88 MOVEI DAT,QTIME ;YES---REQUEUE AND RESET QUANT. TIME
\r
91 \fCKJB1: SKIPG QJ,QJOB ;SET QJ NON ZERO IF ANY REQUEUING TO DO
\r
92 JRST CKJB5 ;NO REQUEUEING NECESSARY
\r
93 MOVEI J,JOBMAX ;START WITH HIGHEST JOB NUMBER ASSIGNED
\r
94 CKJB2: MOVSI SW,JRQ ;JOB NEEDS REQUEUEING BIT
\r
95 TDNN SW,JBTSTS(J) ;THIS JOB?
\r
96 SOJG J,.-1 ;NO, KEEP LOOKING
\r
97 JUMPLE J,CKJB5 ;YES,LOOKED AT ALL JOBS?
\r
98 ; (MAY NOT FIND A KJOBED JOB IF HIGHEST
\r
99 ; GO DECR, COUNT QJOB ANYWAY)
\r
100 ANDCAM SW,JBTSTS(J) ;NO,MARK THIS JOB AS DONE
\r
101 CKJB3: MOVE SW,JBTSTS(J) ;JOB STATUS WORD
\r
102 MOVEI DAT,QCMW ;ASSUME COMMAND WAIT
\r
103 TLNN SW,CMWB ;IS JOB IN COMMAND WAIT?
\r
105 TLNE SW,SWP+JXPN ;YES, IS JOB ON DISK, OR TRYING TO EXPAND?
\r
106 JRST CKJB4A ;YES. PUT JOB IN COMMAND WAIT Q
\r
107 CKJB9: JUMPGE SW,CKJB4 ;NO,WAIT STATUS CODE DETERMINES NEW Q
\r
108 LDB SW,PJBSTS ;YES, GET QUEUE CODE.
\r
109 CAIN SW,WSQ ;*** EXPERIMENTAL ***
\r
110 JRST CKJB10 ;*** EXPERIMENTAL ***
\r
111 CAIN SW,TIOWQ ;CURRENT JOB GOING INTO TTY IO WAIT?
\r
112 HRROS JBTSWP(J) ;YES, SET IN CORE PROTECT TIME TO -1,
\r
113 ; SO HE CAN BE SWAPPED IMMEDIATELY IF SOMEONE
\r
114 ; ELSE WANTS TO BE SWAPPED IN
\r
115 CKJB4B: SKIPA DAT,QBITS(SW) ;GET ADDRESS OF TRANSFER TABLE
\r
116 CKJB4: MOVEI DAT,QSTOP ;IF RUN BIT WAS OFF
\r
117 CKJB4A: PUSHJ PDP,QXFER ;REQUEUE THE JOB
\r
118 JUMPE QJ,SCHED ;IF FROM NXTJOB GO DIRECTLY TO SCHED
\r
119 ; I.E, CURRENT JOB NO LONGER RUNNABLE(IOW)
\r
120 ; BUT JRQ WASN'T SET SO DON'T DECR QJOB
\r
121 SOSLE QJ,QJOB ;ANY MORE JOBS TO REQUEUE?
\r
122 SOJG J,CKJB2 ;YES,BUT LOOK AT EACH JOB ONLY ONCE PER CLOCK TICK
\r
124 CKJB5: MOVEI QJ,AVLNUM ;CK AVAL FLAGS FOR SHAR. DEVS.
\r
125 CKJB6: SKIPN AVALTB(QJ) ;FLAG=0?
\r
126 SOJG QJ,CKJB6 ;YES - TRY NEXT ONE
\r
127 JUMPLE QJ,CKJB7 ;NO - OR FINISHED?
\r
128 HLR J,AVLQTB(QJ) ;NO--GET 1ST JOB IN Q
\r
129 CKJB6A: HRRE J,JBTQ(J)
\r
130 JUMPLE J,CKJB8 ;FINISHED Q? WAIT TILL SWAPPER BRINGS IN JOB
\r
131 MOVE DAT,JBTSTS(J) ;IS JOB IN CORE?
\r
133 JRST CKJB6A ;NO, LOOK AT NEXT JOB IN THIS QUEUE
\r
134 ; TO SEE IF IN CORE.
\r
135 HRRZ DAT,AVLQTB(QJ) ;NO--GET TRANS. TABLE ADDRESS
\r
136 SETZM AVALTB(QJ) ;CLEAR AVAL FLAG
\r
137 CAIL QJ,MINQ ;LESS THAN MIN, SHARABLE DEV. Q?
\r
138 PUSHJ PDP,QXFER ;REQUEUE THE JOB AND PUT IT IN
\r
139 ; PROCESSOR Q SO SCHEDULER WILL RUN IT
\r
140 CKJB8: SOJG QJ,CKJB6 ;CONTINUE IF ANY MORE FLAGS TO LOOK AT
\r
141 \fCKJB7: ;NONE--GO SHUFFLE AND SWAP
\r
142 IFE FTSWAP,< EXTERNAL CHKSHF
\r
148 ;SCHEDULAR--SEARCH THRU QUEUES ACCORDING TO SSCAN TABLE
\r
149 ;FOR 1ST JOB IN CORE--RETURN ITS NO. IN J
\r
151 SCHED: SETZM POTLST ;CLEAR POTENTIALLY LOST TIME FLAG
\r
152 MOVEI DAT,SSCAN ;ADDRESS OF SCAN TABLE
\r
153 JSP TAC,QSCAN ;BEGIN SCAN
\r
154 JRST SCHD1 ;NO MORE JOBS--RETURN NULLJOB
\r
155 SETOM POTLST ;SET POTENTIALLY LOST TIME FLAG FOR CLOCK1
\r
156 MOVE QJ,JBTSTS(J) ;IS THIS JOB SWAPPED OUT
\r
157 TLNE QJ,SWP+SHF+JXPN ;MONITOR WAITING FOR I/O TO STOP,OR JOB EXPANDING CORE?
\r
158 JRST (TAC1) ;YES--CONTINUE SCAN,JOB CANNOT BE RUN
\r
160 HLREM TAC1,JOBQUE ;YES--SAVE ITS Q
\r
161 MOVSI QJ,WTMASK ;CLEAR WAIT CODE
\r
162 ANDCAM QJ,JBTSTS(J)
\r
163 SETZM POTLST ;CLEAR POTENTIALLY LOST TIME AS A USER IS TO BE RUN
\r
165 SCHD1: SETZ J, ;RETURN NULL JOB
\r
170 ;TEMPORARY EXPERIMENTAL SCHEDULING CHANGE TO PERMIT TTY-I/O-WAIT-SATISFIED JOBS ON
\r
171 ; THE DISK TO DISPLACE I/O BOUND JOBS IN CORE.... R.CLEMENTS/D.PLUMER 9 MAY 68
\r
172 CKJB10: SKIPE INFLG
\r
178 XWD QQTTY,-PQ2 ;MAKE JOB(LPT) COMPLETE WITH CPU BOUND JOBS
\r
179 INFLG: 0 ;NON-ZERO MEANS AT LEAST ONE JOB ON DISK WAITING TO COME IN.
\r
180 \fSUBTTL OCSS R. KRASIN/AF TS3.17 22 MAR 68 V000
\r
182 ,THIS ROUTINE MUST BE ASSEMBLED WITH THE CONFIGURATION
\r
183 ,TYPE TO DEFINE NUMBER OF JOBS
\r
184 ,THIS SECTION CONTAINS 2 ROUTINES FOR Q MANIPULATION
\r
185 ,AND NECESSARY TABLES FOR SPECIFING OPERATIONS PERFORMED
\r
188 EXTERNAL IMGIN,JBTSTS,JBTADR,PJBSTS
\r
189 INTERNAL QXFER,QSCAN,FTSWAP,FTDISK
\r
192 ,EACH Q IS A RING STRUCTURED, FORWARD AND BACKWARD
\r
193 ,LINKED SRING LIST. THE "FIRST" LINK IN A Q IS
\r
194 ,A Q-HEADER POINTING TO THE FIRST AND LAST MEMBERS OF THE Q.
\r
195 ,A NULL Q HAS ONE LINK--THE Q-HEADER ITSELF. THE LINKS MAKING
\r
196 ,UP THE OS ARE CONTAINED IN A TABLE (JBTQ) WITH NEGATIVE
\r
197 ,INDICIES (ADDRESSES LESS THAN JBTQ) USED FOR Q-HEADERS AND
\r
198 ,POSITIVE INDICIES USED FOR MEMBERS (JOBS). THUS ONLY ONE WORD
\r
199 ,PER LINK IS NECESSARY--ITS ADDRESS RELATIVE TO JBTQ GIVES THE
\r
200 ,JOB NO. (OR Q NU, IF NEGATIVE) WHICH IT REPRESENTS WHILE
\r
201 ,ITS CONTENTS CONTAINS THE LINKING POINTERS, THESE
\r
202 ,POINTERS ARE ALSO INDICIES RELATIVE TO JBTQ RATHER THAN
\r
203 ,ABSOLUTE ADDRESSES--RH(LINK)=FORWARD POINTER;
\r
204 ,LH(LINK)=BACKWARD POINTER.
\r
205 ,A JOB IS ASSUMED TO BE IN NO MORE THAN ONE Q AT A TIME, AND
\r
206 ,THE NULL JOB (JOB 0) DOES NOT APPEAR IN THE QS (I.E. JBTQ
\r
207 ,ITSELF IS THE Q-HEADER FOR Q 0).
\r
210 ,BOTH ROUTINES ARE "TABLE DRIVEN" IN THE SENSE THAT THE
\r
211 ,CALLING ROUTINE PROVIDES THE ADDRESS OF A TABLE WHICH
\r
212 ,DEFINES THE SPECIFIC OPERATIONS TO BE PERFORMED.
\r
214 ;QUEUE INITIALIZATION
\r
215 ;PUT ALL JOBS IN NULL QUEUE(JOB NO. NOT ASSIGNED)
\r
216 ;CALLED ON RESTART AT LOC 143
\r
219 EXTERNAL CPOPJ,JOBMAX,MXQUE,JBTQ
\r
220 EXTERNAL JBTQP1 ;EQUALS JBTQ+1
\r
221 EXTERNAL JBTQM1 ;EQUALS JBTQ-1
\r
222 EXTERNAL JBTQMN ;EQUALS JBTQ-NULQ
\r
224 QINI: MOVNI TAC,MXQUE ;MAKE ALL QUEUE HEADERS POINT TO THEMSELVES
\r
225 HRL TAC,TAC ;BACKWARD POINTERS TOO
\r
226 MOVEM TAC,JBTQ(TAC)
\r
228 MOVEI TAC,-NULQ ;PUT JOBS ALL IN NULQ QUEUE
\r
229 MOVSM TAC,JBTQP1 ;BACK POINTER FOR JOB 1
\r
230 MOVEI ITEM,JOBMAX ;MAX. JOB NO.
\r
231 MOVEM TAC,JBTQ(ITEM) ;FOR. POINTER OF JOBMAX JOB NO.
\r
232 HRLM ITEM,JBTQMN ;SET NULQ HEADER TO POINT TO JOB1
\r
233 MOVEI TAC,1 ;AND JOBMAX
\r
234 HRRM TAC,JBTQMN ;FORWARD POINTER
\r
235 QINI1: HRRM ITEM,JBTQM1(ITEM) ;JOB I-1 POINT TO JOB I
\r
237 SOJLE ITEM,CPOPJ ;FINISHED?
\r
238 HRLM ITEM,JBTQP1(ITEM) ;BACK POINTER JOB I+1 POINTS TO JOB I
\r
241 ,DELETES A JOB FROM ITS "SOURCE-Q", DETERMINES A "DEST-Q"
\r
242 ,ACCORDING TO ONE OF 3 FUNCTIONS, AND INSERTS THE JOB AT
\r
243 ,THE BEGINNING OR END OF THIS DEST-Q. IN ADDITION IT MAY
\r
244 ,RESET THE JOB'S QUANTUM TIME (RH JBTSTS).
\r
245 ,THE DRIVING TABLES ARE "TRANSFER TABLES":
\r
247 ,T.TABLE: EXP <CODE>
\r
248 , XWD <QUANT-TAB>,<Q-TAB>
\r
250 ,DEPENDING ON <CODE>, THE SECOND WORD IS EITHER DATA OR THE
\r
251 ,ADDRESSES OF "CORRESPONDANCE TABLES".
\r
253 ,THE PREFIX OF <CODE> SPECIFIES WHETHER THE JOB IS TO BE
\r
254 ,INSERTED AT THE BEGINNING OR END OF THE DEST-Q. THE SUFFIX
\r
255 ,DETERMINES THE FUNCTION USED TO SELECT THE DEST-Q.
\r
256 ,THE FOLLOWING ARE THE SIX CODES AND THEIR TABLE FORMATS:
\r
259 ,DEST-Q AS A FIXED (PREDETERMINED Q:
\r
260 ,BQFIX: INSERT AT BEG OF DEST-Q
\r
261 ,EQFIX: INSERT AT END
\r
263 , THE JOB IS TRANSFERED TO THE END OF BEG, OF THE Q <Q-TAB>
\r
264 , IF <QUANT-TAB> = -1, QUANT, TIME IS NOT RESET.
\r
265 , IF <QUANT-TAB> .G. 0 , QUANT. TIME IS RESET TO <QUANT-TAB>.
\r
266 , SINCE THIS FUNCTION IS FULLY DEFINED BY THE SECOND WORD
\r
267 , ALONE, O CORRES, TABLE IS NECESSARY.
\r
268 \f,DEST-Q AS A FUNCTION OF SOURCE-Q
\r
269 ,BQLINK: INSRT AT BEG OF DEST-Q
\r
270 ,EQLINK: INSERT AT END
\r
272 , <Q-TAB>=ADDRES OF A CORRES. TABLE "LINKING" SOURCE-QS TO
\r
274 , IF <QUANT-TAB> = -1, QUANT. TIME IS NOT RESET.
\r
275 , OTHERWISE <QUANT-TAB> IS TAKEN AS THE ADDRESS OF A
\r
276 , TABLE OF QUANT. TIMES CORRESPONDING TO THE Q-LINKING TABLE.
\r
277 , FORMAT OF THE TABLES ARE:
\r
279 , <Q-TAB>: XWD <SQ1>,<DQ1> ;1ST SOURCE-Q:DEST-Q PAIR
\r
281 , XWD <SQN>,<DQN> ;NTH ...
\r
282 , Z ;ZERO TERMINATES TABLE
\r
284 , <QUANT-TAB>: EXP <QUANT1> ;CORRES. TO <Q-TAB>+0
\r
286 , EXP <QUANTN> ;CORRES. TO <Q-TAB>+N-1
\r
289 , UPON A CALL TO QXFER FOR THESE 2 CODES, AC T2 CONTAINES
\r
290 , THE SOURCE-Q (CURRENT Q) OF THE JOB. THE LH OF THE
\r
291 , <Q-TAB> ENTRIES ARE SEARCHED FOR A MATCH.,IF FOUND, THE
\r
292 , RH IS TAKEN AS THE DEST-Q AND THE QUANT. TIME IS RESET
\r
293 , (IF <QUANT-TAB> NOT -1) TO THE CORRES. ENTRY IN THE
\r
294 , <QUANT-TAB> TABLE.
\r
295 , IF NO MATCH FOUND..NO TRANSFER TAKES PLACE.
\r
298 ,DEST-Q AS A FUNCTION OF JOB SIZE
\r
299 ,BQJSIZ INSERT AT BEG OF DEST-Q
\r
300 ,EQJSIZ INSERT AT END
\r
302 , <Q-TAB>=ADDRESS OF A TABLE ASSOCIATING JOB SIZE
\r
303 , (IN 1K BLOCKS) TO DEST-QS.
\r
304 , <QUANT-TAB> HAS SAME MEANING AS FOR B-EQLINK
\r
306 , <Q-TAB>: XWD <JSIZ1>,<DQ1>
\r
308 , XWD <JSIZN>,<DQN>
\r
311 , <QUANT-TAB>: SIMILAR TO THAT FOR B-EQLINK
\r
313 , THE <JSIZ>'S MUST BE IN INCREASING ORDER.
\r
314 , THE TABLE IS SEARCHED UNTIL <JSIZ> IS LESS THAN OR
\r
315 , EQUAL TO THE JOB SIZE, THEN THE CORRES. <DQ> IS
\r
316 , TAKEN AS THE DEST-Q. IF THE TABLE IS EXAUSTED, NO
\r
317 , TRANSFER TAKES PLACE,
\r
318 , QUANT, TIME IS HANDLED AS IN B-EQLINK.
\r
319 \f,CALLING SEQUENCE:
\r
320 , MOVE J,[JOB NUMBER]
\r
321 , MOVE T2,[CURRENT Q] ;BQLINK AND EQLINK ONLY
\r
322 , MOVEI TT,TRANS TABLE ADDRESS
\r
325 , ON RETURN J IS UNALTERED; LH(Q)=-1 IF QUANT, TIME OUT
\r
326 , RESET; QUANT, TIME IF RESET;RH(Q)=DEST.Q
\r
329 TT=DAT ;POINTER TO TRANSFER TABLE
\r
331 Q=PROG ;DEST-Q AND QUANT. TIME ON RETURN
\r
333 T2=TAC ;TEMP AND SOURCE-Q ON CALL TO B,EQLINK
\r
337 QXFER: MOVE Q,1(TT) ;GET TRANSFER TABLE ADDRESS
\r
338 JRST @(TT) ;DISPATCH
\r
340 ,DEST-Q AS FUNCTION OF SOURCE-Q
\r
341 QLINK: SKIPN T1,(Q) ;END OF TABLE?
\r
344 CAME T1,T2 ;NO--SOURCE-Q=LH(TABLE ENTRY)?
\r
345 AOBJP Q,QLINK ;NO- CONTINUE SEARCH
\r
348 ,DEST-Q AS FUNCTION OF JOB SIZE
\r
349 QJSIZ: HLRZ T2,JBTADR(J) ;HIGHEST REL. LOC. OF JOB
\r
350 ASH T2,-^D10 ;CONVERT TO NO. OF 1K BLOCKS - 1.
\r
351 MOVSI T2,1(T2) ;NO. OF 1K BLOKS TO LH.
\r
352 QX1: SKIPN T1,(Q) ;END OF TABLE?
\r
354 CAMLE T2,T1 ;JOBSIZE .LE. LH(TABLE ENTRY)?
\r
355 AOBJP Q,QX1 ;NO--CONTINUE SEARCH, JUMP ALWAYS.
\r
357 QX2: MOVS T2,Q ;T2 IS ADDR. OF QUANT.TIME(IF REQUESTED)
\r
358 HRRO Q,(Q) ;RH(Q)=DEST-Q;LH=-1(NO QUANT.TIME REQ.)
\r
359 SKIPL 1(TT) ;WAS QUANT. TIME REQUESTED?
\r
360 HRL Q,(T2) ;YES--GET IT
\r
363 QFIX: MOVE T1,JBTQ(J) ;DELETE JOB FROM SOURCE-Q
\r
364 MOVS T2,T1 ;T1=FORW. LINK, T2=BACK LINK
\r
365 HRRM T1,JBTQ(T2) ;FORW, LINK PAST JOB
\r
366 HRLM T2,JBTQ(T1) ;BACK LINK PAST JOB
\r
368 SKIPGE (TT) ;END OR BEG. OF Q?
\r
369 HLR Q,JBTQ(Q) ;END--THIS WILL LEAVE Q=IDX OF
\r
370 ; CURRENT LAST LINK;T2=IDX OF Q-HEADER
\r
371 MOVE T2,JBTQ(Q) ;BEG--T2=IDX OF CURRENT 1ST LINK
\r
372 ; Q=IDX OF Q-HEADER
\r
373 HRRM J,JBTQ(Q) ;INSERT JOB IN DEST-Q
\r
378 JUMPL Q,QX3 ;RETURN IF QUANT. TIME NOT REQ.
\r
379 HLRM Q,JBTSTS(J) ;SET QUANT. TIME
\r
380 MOVEI TT,RNQ ;SET JOB STATUS WAIT
\r
381 DPB TT,PJBSTS ;CODE TO RUN QUEUE (0).
\r
390 \f,SCANS THE QS RETURNING THE NUMBERS OF THE JOBS IN THE QS.
\r
391 ,THE ORDER AND MANNER IN WHICH THE QS ARE SEARCHED IS
\r
392 ,DETERMINED BY A "SCAN TABLE" ADDRESSED IN THE CALLING SEQ.
\r
393 ,THE SCAN TABLE HAS THE FORM:
\r
395 ,SCANTAB: XWD <Q1>,<CODE1> ;SCN Q1 ACCRDING TO CODE1
\r
397 , XWD <QN>,<CODEN> ;QN ACCORDING TO CODEN
\r
398 , Z ;ZERO TERMINATES TABLE
\r
400 ,EACH Q MAY BE SCANNED IN ONE OF FOUR WAYS SPECIFIEDBY <CODE>
\r
403 ,QFOR SCAN WHOLE Q FORWARD
\r
404 ,QFOR1 SCAN FOR ONLY THE 1ST MEMBER (IF ANY)
\r
405 ,QBAK SCAN WHOLE Q BACKWARD
\r
406 ,QBAK1 SCAN BACKWARD FOR ALL MEMBERS EXCEPT THE 1ST
\r
410 , MOVEI ST,SCAN TABLE ADDRESS
\r
411 , JSP PC,QSCAN ;SET UP PC FOR REPEATED RETURNS
\r
412 , ... ;RETURN HERE WHEN NO MORE JOBS
\r
413 , ... ;RETURN HERE WITH NEXT JOB IN AC J
\r
414 , ; AND ITS Q IN LH(QR)
\r
416 , PERFORM ANY NECESSARY TESTING OF THIS JOB
\r
417 , J,ST,PC,QR MUST BE PRESERVED
\r
419 , JRST (QR) ;RETURN TO QSCAN TO GET NEXT JOB
\r
420 , ; IF THIS ONE NOT ACCEPTABLE
\r
424 ST=DAT ;POINTER TO SCAN TABLE
\r
425 PC=TAC ;RETURN ADDRESS
\r
426 QR=TAC1 ;ITERATED RETURN ADDRESS TO QSCAN
\r
427 \fQSCAN: SKIPN QR,(ST) ;END OF SCAN TABLE?
\r
428 JRST (PC) ;YES--RETURN TO CALL+1
\r
429 HLRE J,QR ;NO--GET NO. OF Q
\r
430 JRST (QR) ;DISPATCH
\r
432 QFOR1: MOVEI QR,QFOR2 ;ONLY THE FIRST JOB
\r
434 QFOR: HRRE J,JBTQ(J) ;SCAN FORWARD ALL JOBS
\r
435 JUMPG J,1(PC) ;RETURN THIS JOB NO. CALL+2 UNLESS--
\r
436 QFOR2: AOJA ST,QSCAN ;END OF THIS Q--GET NEXT Q
\r
438 QBAK1: HLRE J,JBTQ(J) ;SCAN BACKWARD ALL JOBS EXCEPT 1ST
\r
439 SKIPLE JBTQ(J) ;IS THIS THE FIRST MEMBER?
\r
440 JRST 1(PC) ;NO--RETURN CALL+2
\r
441 AOJA ST,QSCAN ;YES--GET NEXT Q
\r
443 QBAK: HLRE J,JBTQ(J) ;SCAN BACKWARD ALL JOBS
\r
444 JUMPG J,1(PC) ;RETURN CALL+2 WITH JOB NO. UNLESS
\r
445 AOJA ST,QSCAN ;BEG OF THIS Q--GET NEXT Q
\r
446 \fINTERNAL FTCHECK,FTMONP
\r
447 IFN FTCHECK+FTMONP,<
\r
459 IFE FTCHECK+FTMONP,<
\r
461 ;SHARABLE DEVICE JUST BECOME AVAILABLE(EXTENDED TO OTHER QUEUEW TOO)
\r
462 ;APPROPRIATE ENTRY IS SET NON-ZERO WHEN SCHEDULER SHOULD LOOK
\r
463 ;AT THAT QUEUE TO FIND A JOB TO RUN
\r
464 ;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE)
\r
467 <INTERNAL A'AVAL,A'Q
\r
474 AVALTB: QUEUES ;GENERATE THE AVAL FLAGS
\r
477 NQUEUE=LOC ;NO. OF QUEUES COUNTING RUN QUEUE
\r
478 XP MAXQ,NQUEUE-1 ;MAX. STATE CODE WHICH HAS AN AVAL FLAG
\r
479 XP MINQ,STQ ;MINIMUM SHARABLE DEVICE QUEUE
\r
480 XP AVLNUM,MAXQ ;MAX. STATE CODE WHICH HAS AN AVAL FLAG
\r
482 ;DEFINE STATE CODES WHICH DO NOT HAVE AVAL AND REQ FLAGS
\r
492 XP MXCODE,LOC-1 ;MAX, JOB STATE DONE
\r
499 CMQ=LOC ;COMMAND DELAY QUEUE
\r
501 ;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES
\r
503 ;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE.
\r
504 ;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM
\r
505 ;FOLLOWING TABLE USING NEW STATE CODE AS INDEX
\r
515 \fIFN FTCHECK+FTMONP,<
\r
522 IFE FTCHECK+FTMONP,<
\r
524 ;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)
\r
525 ;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARABLE DEVICE
\r
526 ;WSREQ AND RNREQ ARE UNUSED
\r
535 REQTAB: QUEUES ;GENERATE REQ TABLE
\r
537 \f;CORRESPONDENCE TABLE LH=QUEUE CODE, RH=QUEUE TRANSFER TABLE ADR.
\r
538 ;INDEX INTO TABLE ALSO = QUEUE CODE
\r
539 ;FOR SHARABLE DEVICES ONLY
\r
540 ;SCHEDULER TAKES ONE JOB WAITING FOR A SHARABLE DEVICE AND
\r
541 ;PUTS IT IN THE APPROPRIATE RUN QUEUE ACCORDING TO
\r
542 ;QUEUE TRANSFER TABLE AS SPECIFIED BELOW BY THE JOB WAIT
\r
549 QRNS=0 ;NO CORRESPONDENCE TABLES FO THESE QUEUE
\r
556 \fIFN FTCHECK+FTMONP,<
\r
557 EXTERNAL QJOB,JOBQUE ;JOBQUE WILL CAUSE LOAD OF PROPER SCHDAT
\r
558 ; DEPENDING ON FTRC10 IN SCHDAT
\r
562 IFE FTCHECK+FTMONP,<
\r
566 JOBQUE: 0 ;JOBS TO BE REQUEUED ON CLOCK INTERRUPT
\r
569 QJOB: Z ;NUMBER OF JOBS NEEDING Q TRANSFERS AT OTHER THAN CLOCK LEVEL
\r
572 XJOB: Z ;NUMBER OF JOBS NEEDING CORE EXPANSION BY SWAPOUT-IN
\r
576 \fINTERNAL QSTOP,QTIME,SSCAN,QCMW
\r
578 BQFIX=QFIX ;BEGINNING OF QUEUES FIXED QUEUE DISCIPLINE
\r
579 EQFIX=QFIX+1B0 ;END OF QUEUES " " "
\r
584 DEFINE TTAB(FCTN,QUEUE,QUANT)
\r
588 DEFINE PTTAB(FCTN,QUEUE,QUANT)
\r
593 QNULW: TTAB EQFIX,NULQ,-1 ;NULL QUEUE JOB NO. NOT ASSIGNED
\r
594 QSTOP:QSTOPW: TTAB EQFIX,STOPQ,-1 ;UNRUNABLE JOBS TO END OF STOPQ
\r
595 QCMW: TTAB EQFIX,CMQ,-1 ;COMMAND WAIT TILL JOB IN CORE
\r
596 QRNW: PTTAB EQJSIZ,QSTAB,QQSTAB ;JUST RUNABLE JOBS
\r
597 ;WHICH ARE NOT IN SOME WAIT STATE BELOW,ENTER PROCESSOR
\r
598 ;QS AT END AND GET QUANT. TIME ACCORDING TO THEIR SIZE
\r
600 QWSW: TTAB BQFIX,PQ1,QQTTY ;IO WAIT SAT.(EXCEPT TTY)
\r
601 ;ENTER FRONT OF PROCESSOR QS AND GET QUANT, TIME
\r
602 ;ACCORDING TO JOB SIZE
\r
603 QTSW: TTAB BQFIX,PQ1,QQTTY ;TTY IO WAIT SATISFIED(ENTER FRONT OF PQ11)
\r
605 QIOWW: TTAB EQFIX,IOWQ,-1 ;IOW(EXDEPT TTY) HELD IN IOWQ
\r
606 QTIOWW: TTAB EQFIX,TIOWQ,-1 ;TTY IOW HELD IN TIOWQ
\r
607 QAUW: TTAB EQFIX,AUQ,-1,
\r
608 QMQW: TTAB EQFIX,MQQ,-1 ;MON. Q(DISK) WAIT
\r
609 QDAW: TTAB EQFIX,DAQ,-1 ;DEV. ALLOC.(DISK)
\r
610 QDCW: TTAB EQFIX,DCQ,-1 ;DATA CONTROL WAIT
\r
611 QSTW: TTAB EQFIX,STQ,-1 ;SYST TAPE
\r
612 QDTW: TTAB EQFIX,DTQ,-1 ;DEC TAPE
\r
613 QMTW: TTAB EQFIX,MTQ,-1 ;MAG TAPE
\r
614 QSLPW: TTAB EQFIX,SLPQ,-1 ;SLEEP UUO
\r
615 \f;TRANSLATION TABLE FROM WAIT STATE TO SATISFIED STATE
\r
616 ;DO NOT RESET QUANTUM RUN TIME
\r
620 QMQS: TTAB BQFIX,PQ1,QQSD ;START MON. Q(DISK) AT PQ1
\r
621 QDAS: TTAB BQFIX,PQ1,QQSD ;DEV. ALLOC.(DISK)...
\r
622 QDCS: TTAB BQFIX,PQ1,QQSD ;DATA CONTROL...
\r
623 QSTS: TTAB BQFIX,PQ1,QQSD ;SYST TAPE
\r
624 QDTS: TTAB BQFIX,PQ1,QQSD ;DEC TAPE
\r
625 QMTS: TTAB BQFIX,PQ1,QQSD ;MAG TAPE
\r
626 QAUS: TTAB BQFIX,PQ1,QQSD ;ALTER UFD
\r
627 QTIME: PTTAB EQLINK,QTTAB,QQSTAB ;MOVE JOB TO LOWER Q
\r
628 ;WHEN QUANT. TIME EXCEEDED AND RESET QUANT. TIME
\r
629 \f,ENTER PROCESSOR QS ACCORDING TO JOB SIZE
\r
630 QSTAB: XWD 4,-PQ1 ;PQ1 IF SIZE .LE. 4K
\r
631 XWD ^D16,-PQ2 ;PQ2 IF 4K .L. SIZE .LE. 16K
\r
632 XWD ^D256,-PQ3 ;PQ3 IF 16 .L. SIZE
\r
635 ,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME
\r
636 QTTAB: XWD -PQ1,-PQ2
\r
638 XWD -PQ3,-PQ2 ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS
\r
643 QQSD=6 ;TENTH SEC. INITIAL QUANT. FOR SHAR. DEV. WAITERS
\r
644 QQTTY=6 ;TENTH SEC. INITIAL QUANT. FOR TTY IOWS
\r
646 , QUANT. TIMES ACCORDING TO PROCESSOR Q:
\r
651 QQSTAB: EXP ^D30 ;PQ1: ONE HALF SECOND
\r
652 EXP 2*^D60 ;PQ2: TWO SECONDS
\r
653 EXP 2*^D60 ;PQ3: TWO SECONDS
\r
656 INTERNAL ISCAN,QSCAN
\r
657 ISCAN: ;SCAN FOR INPUT
\r
658 XWD -CMQ,QFOR ;MONITOR COMMAND WHICH NEEDS CORE IMAGE IN CORE
\r
659 XWD -MQQ,QFOR1 ;LOOK FOR 1ST JOBS IN SHAR. DEV QUEUES
\r
666 SSCAN: XWD -PQ1,QFOR ;SCAN PROCESSOR AS SCHEDULER DOES
\r
671 Z ;FINAL ZERO TO FLAG END
\r
673 OSCAN: ;SCAN FOR OUTPUT
\r
674 XWD -STOPQ,QFOR ;UNRUNABLE JOBS FIRST
\r
676 XWD -DTQ,QBAK1 ;ANY SHAR. DEV.WAITERS MORE THAN 1 DEEP
\r
683 XWD -TIOWQ,QFOR ;TTY IOW
\r
687 XWD -MTQ,QFOR1 ;NOW SCAN FIRST JOB IN QUEUES
\r
696 Z ;FINAL ZERO TO FLAG END
\r
699 \fSUBTTL SWAP R. KRASIN/AF TS4.34 03 FEB 69 V406
\r
701 ,SWAPPER CALLED EVERY CLOCK TIC.
\r
702 ,SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL
\r
703 ,TICS TO RUN TO COMPLETON, SEVERAL FLAGS(FINISH,FIT,FORCE
\r
704 ;ARE USED TO "REMEMBER" PREVIOUS STATES.
\r
705 ,THE BASIC ALOGRITHM:
\r
706 ;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB?
\r
707 ; YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS)
\r
708 ;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH?
\r
709 ; YES--RETURN AND DO NOTHING
\r
710 ;IS SWAPPER STILL BUSY?
\r
711 ; YES--RETURN AND DO NOTHING
\r
712 ,SCAN QS FOR 1ST JOB OUT OF CORE.
\r
715 , IF ONE--WILL LOW(HIGH) SEG FIT IN LARGEST HOLE IN CORE?
\r
716 , YES--START INPUT AND RETURN
\r
717 , NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE LOW(HIGH) SEG?
\r
718 ; YES--CALL CORE SHUFFLER
\r
719 ; IS SHUFFLER WAITING FOR IO TO STOP?
\r
720 ; YES--RETURN AND DO NOTHING
\r
722 , NO--"REMEMBER" THIS JOB FROM INPUT AND LOOK FOR OUTPUT:
\r
723 ,ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN?
\r
724 , YES--OUTPUT ONE AND RETURN
\r
725 , NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME
\r
726 , (SET ON INPUT) HAS GONE TO 0.
\r
728 , IF ONE--IS IT SWAPPABLE(NO ACTIVE IO AND NOT CURRENT JOB)?
\r
729 , YES--OUTPUT HIGH SEG(IF ANY AND NOT ON DISK) THEN LOW SEGMENT
\r
730 , NO--SET SWP BIT(SO SCHEDULER WILL NOT RUN), IO WILL CONTINUE
\r
731 , IN LOW SEGEMENT AS LONG AS IT CAN
\r
732 , IO ROUTINES NO LONGER STOP IF SWP SET, JUST SHF)
\r
735 EXTERNAL BIGHOL,CORTAL,ANYDEV,JBTADR,JBTSWP,KCORE1,TRYSWP
\r
736 EXTERNAL IMGOUT,IMGIN,FINISH,FIT,FORCE
\r
737 EXTERNAL OERROR,CORGET,JBTDAT,JOBDPG,JOBDPD,JOBPC
\r
738 EXTERNAL JBTDAT,SHFWAT,CHKSHF
\r
739 EXTERNAL FULCNT,ERRPNT,EXCALP,PCSTOP,PCORSZ,VIRTAL
\r
742 INTERNAL XPAND,FT2REL
\r
749 ,ALL DEVICE DEPENDENT CODE MARKED WITH A "*"
\r
750 \fSWAP: SKIPE SHFWAT ;IS CORE SHUFFLER WAITING FOR IO TO STOP
\r
752 PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO SEE IF
\r
754 SKIPN SHFWAT ;IS SHUFFLER STILL WAITING?
\r
755 SKIPE SQREQ ;*NO--IS SWAP SERV, ROUT. STILL BUSY WITH LAST JOB?
\r
756 POPJ PDP, ;*YES--RETURN
\r
757 SETZM INFLG ;*** EXPERIMENTAL ***
\r
758 SKIPN J,FINISH ;NO--ANY IN/OUTPUT TO FINISH?
\r
760 JUMPL J,FINOUT ;YES--INPUT OR OUTPUT?
\r
761 SKIPE SERA ;INPUT, ANY INPUT ERRORS?
\r
763 FININ0: ;HERE IF NOTHING TO SWAP IN(HIGH OR LOW SEG EXPANDING FROM 0)
\r
766 PUSHJ PDP,FININ ;IS THERE A HIGH SEG WHICH MUST BE SWAPPED IN?
\r
767 JRST FIT1 ;YES, GO SWAP IT IN(J SET TO HIGH SEG NO.JOB # INPJOB)
\r
768 ; NO, EITHER HIGH SEG ALREADY IN FOR ANOTHER USER
\r
769 ; OR THERE IS NON, J STILL JOB NO,(IE LOW SEG)
\r
770 ; OR J IS HIGH SEG WHICH EXPANDED FROM NOTHING(XPANDH)
\r
771 ; IN WHICH CASE IT HAS NO DISK SPACE AND DIDLING ACS
\r
772 ; AND SETTING PROTECT TIME WON'T MATTER EITHER.
\r
774 LDB T,IMGIN ;NEW CORE SIZE
\r
775 LDB T1,IMGOUT ;OLD SIZE WHEN ON DISK
\r
776 SUB T1,T ;OLD-NEW=DECREASE
\r
777 ; HAS USER DECREASED VIRTUAL MEMORY FROM M TO N(N OR 0)
\r
778 ; WHILE OUT ON DISK(R,RUN,GET,KJOB) TO 140 WORDS?
\r
779 ; CORE COMMAND ALWAYS FORCES SWAP IN BEFORE
\r
780 ; CORE REASSIGNMENT SO NOT IN THIS CATAGORY
\r
781 ; FRAGMENTED USER TOO HARD TO PARTIALLY RECLAIM DISK SPACE
\r
782 ; ON REDUCTION WHICH DOES NOT GO TO 0
\r
783 SKIPLE T1 ;DECREASED?
\r
784 ADDM T1,VIRTAL ;YES, NOW INCREASE VIRTUAL MEMORY AVAILABLE BY
\r
785 ; AMOUNT OF DECREASE IN HIGH OR LOW SEG
\r
786 PUSHJ PDP,ZERSWP ;RETURN LOW SEG DISK SPACE, SET IMGOUT,IMGIN
\r
787 ; AND SWP!SHF(JBTSTS) TO 0
\r
788 LDB T,PCORSZ ;COMPUTE AND SET IN CORE IN CORE PROTECT TIME FROM
\r
789 ; SIZE OF JOB(1K BLOCKS-1)
\r
790 IMUL T,PROT ;ADD VARIABLE AMOUNT DEPENDING ON CORE SIZE
\r
791 ADD T,PROT0 ;ADD FIXED AMOUNT INDEPENDENT OF CORE SIZE
\r
793 MOVE JDAT,JBTDAT(J) ;SETUP LOW SEG PROTECTION,RELOCATION
\r
795 MOVE PROG,JBTADR(J)
\r
797 MOVE T,JOBPC(JDAT) ;JOB STOPPED IN EXEC MORE?
\r
798 TLNE T,USRMOD ;TEST PD FLAG
\r
800 HRRZ T,JOBDPG(JDAT) ;YES, ADJUST PROG AND PDP IN DUMP AC AREA
\r
801 SUBI T,(PROG) ;OLD RELOC-NEW RELOC
\r
802 MOVNS T ;NEW RELOC-OLD RELOC
\r
803 ADDM T,JOBDPD(JDAT) ;ADJUST DUMP PDP
\r
804 MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG
\r
807 INERR: SETZM FINISH ;CLEAR FINISH FLAG SO SWAPPING CAN CONTINUE
\r
808 MOVE PROG,JBTADR(J) ;SETUP RELOC,PROTECTION FOR HIGH OR LOW SEG
\r
809 IFN PROG-JDAT,<MOVE JDAT,JBTDAT(J)>
\r
810 PUSHJ PDP,KCORE1 ;RETURN CORE
\r
811 JSP TAC,ERRPNT ;PRINT ON USER CONSOLE
\r
812 ASCIZ /SWAP READ ERROR/
\r
813 JRST PCSTOP ;STOP JOB AND FORCE RESCHDULING
\r
814 FINOUT: MOVNS J ;FINISH OUTPUT, -FINISH=JOB NO.
\r
815 SKIPE SERA ;ANY ERRORS
\r
816 JRST SWPREC ;YES, RECORD ERROR AND TRY AGAIN,
\r
817 ; IN A DIFFERENT PLACE ON DISK
\r
818 MOVE PROG,JBTADR(J) ;XWD PROTECT,,RELOC. FOR LOW SEG
\r
820 MOVE JDAT,JBTDAT(J) ;JOB DATA AREA
\r
822 PUSHJ PDP,KCORE1 ;RETURN CORE FOR LOW OR HIGH SEG JUST SWAPPED OUT
\r
824 ; ANOTHER JOB STARTED TO SHARE HIGH SEG DURING
\r
825 ; SWAP OUT (GET) SINCE JOB IS MARKED WITH
\r
826 ; SWP BIT ON AND CANNOT RUN UNTIL HGIH SEG IS SWAPPED BACK IN
\r
829 PUSHJ PDP,FINOT ;IS THIS A HIGH SEG WHICH WAS JUST SWAPPED OUT?
\r
830 JRST FORCEL ;YES, J SET TO LOW SEG NO, GO TRY SWAP IT OUT
\r
831 ; NO, THIS WAS A LOW SEG, ALL SWAPPING FOR THIS USER
\r
834 SWP1: SETZM FINISH ;CLEAR FINISH FLAG
\r
835 SWP2: SKIPE J,FORCE ;WAITING FOR JOB TO BECOME SWAPPABLE?
\r
837 FIT0: SKIPE J,FIT ;NO-- WAITING TO FIT JOB IN CORE?
\r
842 JRST CHKXPN ;NO INPUT TO DO--CK FOR EXPANDING JOBS
\r
843 MOVE T,JBTSTS(J) ;THIS JOB OUT OF CORE?
\r
844 TLNN T,SWP ;SWP ON IF HIGH SEG SWAPPED OUT FOR THIS USER
\r
845 ; OR BOTH SEGS SWAPPED OUT
\r
847 JRST (TAC1) ;NO--CONTINUE SCAN
\r
849 FIT1: MOVEM J,FIT ;REMEMBER JOB(OR HIGH SEG) TRYING TO FIT IN
\r
850 LDB AC1,IMGIN ;CORE SIZE NEEDED FOR THIS SEG(0 IF LOW SEG
\r
851 ; OR HIGH SEG WITH UWP OFF ALREADY IN CORE)
\r
853 CAMLE AC1,CORTAL ;WILL LOW SEG FIT IN FREE+DORMANT CORE?
\r
857 PUSHJ PDP,FITSIZ ;COMPUTE AMOUNT OF CORE NEEDED TO BRING IN
\r
858 ; 1. THIS JOBS LOW SEG AND HIGH SEG
\r
859 ; 2. THIS JOBS LOW SEG(HIGH ALREADY IN OR NONE)
\r
860 ; 3. THIS HIGH SEG BECAUSE LOW SEG ALREADY IN
\r
861 ;WILL LOW SEG FIT IN FREE+DORMANT+IDLE CORE?
\r
863 JRST SCNOUT ;NO,WILL NOT FIT EVEN IF ALL DORMANT SEGS DELETED
\r
864 ; AC1=TOTAL CORE NEEDED(IN K)
\r
865 CAMG AC1,BIGHOL ;YES, WILL THIS SEG FIT IN BIGGEST HOLE OF FREE CORE
\r
866 ; WITHOUT DELETING ANY DORMANT OR IDLE SEGS?
\r
867 ; (AC1 RESTORED TO SIZE FOR JUST THIS LOW OR HIGH SEG)
\r
869 JRST SWAPI ;YES, GO SWAP IN THIS LOW OR HIGH SEG
\r
871 EXTERN FRECR1,HOLEF
\r
872 SKIPN HOLEF ;NO, ARE THERE ANY HOLES IN CORE WHICH THE SHUFFLER
\r
873 ; COULD ELIMINATE(NOT COUNTING ONE AT TOP)?
\r
874 PUSHJ PDP,FRECR1 ;NO, GO DELETE ONE DORMANT SEG IN CORE
\r
875 ; AND ALWAYS SKIP RETURN(THERE MUST BE AT LEAST
\r
876 ; ONE, OTHERWISE CORTAL=BIGHOL)MONITOR ERROR IF NONE
\r
878 PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO MOVE ONE SEG DOWN
\r
879 SKIPN SHFWAT ;SHUFFLER WAITING FOR IO TO STOP?
\r
880 JRST FIT0 ;NO, SEE IF JOB WILL FIT NOW.
\r
881 POPJ PDP, ;YES, RETURN AND WAIT TILL IO STOPS
\r
882 \fEXTERN VIRTAL,SWPERC
\r
884 SWPREC: MOVE TAC,SERA ;ERROR FLAGS
\r
885 IORM TAC,SWPERC ;SAVE FOR POSTERITY
\r
886 LDB TAC,IMGOUT ;DECREASE TOTAL AMOUNT
\r
887 MOVNS TAC ;OF VIRTUAL CORE IN THE MACHINE
\r
888 ADDM TAC,VIRTAL ;BY THE AMOUNT BEING GIVEN UP
\r
892 JRST SWAPO ;GO TRY AGAIN
\r
895 ;NO INPUT TO DD, CHECK FOR EXPANDING JOBS
\r
896 CHKXPN: SKIPG XJOB ;ANY JOBS TO EXPAND
\r
897 POPJ PDP, ;NO, RETURN FROM SWAPPER, NOTHING TO INPUT OR OUTPUT
\r
898 ; YES, FALL INTO SCNOUT WHICH WILL SWAP OUT EXPANDING
\r
899 ; JOB SINCE THERE IS ONE
\r
900 ;INPUT TO DO, CHECK TO SEE IF ANY JOBS JUST HAPPEN TO WANT TO EXPAND
\r
901 EXTERN HIGHJB,JBTSTS,ERROR,MAXSIZ,MAXJBN,SUMCOR
\r
902 SCNOUT: SKIPG XJOB ;ANY JOBS WAITING TO EXPAND?
\r
903 JRST SCNJOB ;NO, SCAN ALL JOBS IN PRIORITY ORDER LOOKING
\r
904 ; FOR ONE TO SWAP OUT
\r
905 MOVE J,HIGHJB ;YES, START WITH HIGHEST JOB NUMBER ASSIGNED
\r
906 MOVSI T,JXPN ;SETUP JOB EXPANDED BIT
\r
907 TDNN T,JBTSTS(J) ;IS THIS JOB EXPANDING?
\r
908 SOJG J,.-1 ;NO, KEEP LOOKING
\r
911 SETZM XJOB ;CLEAR XJOB SO MESSAGE WILL PRINT
\r
912 JSP DAT,ERROR ;ERROR IF NONE FOUND
\r
914 SCNOK: SOS XJOB ;DECREMENT COUNT OF EXPANDING JOBS
\r
915 ANDCAM T,JBTSTS(J) ;CLEAR EXPAND BIT IN JOB STATUS WORD
\r
916 JRST FORCE0 ;GO TRY TO SWAP JOB OUT
\r
917 \f;SCAN FOR JOB TO OUTPUT IN ORDER TO MAKE ROOM FOR JOB TO COME IN
\r
918 ;SIZE(IN K) NEEDED TO GET THIS USER IN CORE IS IN AC1(FITSIZ)
\r
919 ;JUST LOW SEG SIZE IF NO HIGH OR HIGH ALREADY IN, JUST HIGH IF LOW ALREADY IN,
\r
920 ;OR SUM IF BOTH MUST BE SWAPPED IN
\r
922 SCNJOB: MOVE T,CORTAL ;INITIALIZE FREE CORE COUNTER
\r
924 SETZM MAXSIZ ;CLEAR SIZE OF LARGEST JOB
\r
925 MOVEI DAT,OSCAN ;SCAN ALL JOBS RANKED IN PRIORITY TO BE SWAPPED OUT
\r
927 JRST NOFIT ;NO MORE JOBS LEFT, CANNOT FIT JOB IN CORE
\r
928 CAMN J,FIT ;IS THIS JOB WE ARE TRYING TO FIND IN?
\r
929 JRST(TAC1) ;YES, GO FIND NEXT JOB TO OUTPUT
\r
930 SKIPGE T,JBTSTS(J) ;JOB RUN BIT STILL ON(JOB STILL WANT TO RUN)?>
\r
931 SKIPGE JBTSWP(J) ;YES, IS PROTECT TIME STILL LEFT?
\r
932 ; PROTECT TIME IS DECREMENTED ONLY WHEN
\r
933 ; A JOB IS RUNABLE, SO LOOK AT IT
\r
934 ; ONLY IF RUN BIT STILL ON
\r
935 TLNE T,NSWP+SWP ;NO, IS THIS JOB NOT TO BE SWAPPED OR ALREADY SWAPPED?
\r
936 ; (DISPLAY, REAL TIME)?
\r
937 JRST (TAC1) ;YES,CONTINUE SCAN TO FIND ANOTHER
\r
938 HLRZ T,JBTADR(J) ;PICK UP SIZE OF JOB
\r
939 JUMPE T,(TAC1) ;CONTINUE SCAN IF NOT IN CORE (HIGH SEG ALREADY SWAPPED)
\r
940 ; OUT FOR THIS USER IF NO LOW SEG)
\r
941 ASH T,-12 ;CONVERT TO 1K BLOCKS
\r
945 PUSHJ PDP,FORSIZ ;INCREASE SIZE(T) BY HIGH SEG IF THIS JOB
\r
946 ; IS ONLY ONE IN CORE USING HIGH SEG(J= JOB # STILL)
\r
948 CAMG T,MAXSIZ ;LARGEST SO FAR?
\r
950 MOVEM T,MAXSIZ ;YES, SAVE SIZE
\r
951 MOVEM J,MAXJBN ;AND JOB NUMBER
\r
952 FORCE2: ADDM T,SUMCOR ;ADD TO TOTAL
\r
953 CAMLE AC1,SUMCOR ;FOUND ENOUGH CORE FOR JOB TO BE FIT IN?
\r
954 JRST (TAC1) ;NO. LOOK FOR MORE
\r
955 MOVE J,MAXJBN ;YES, SWAP OUT LARGEST
\r
956 \fFORCE0: PUSHJ PDP,TRYSWP ;CAN THIS JOB BE STOPPED IN ORDER TO DO SWAP?
\r
957 JRST (TAC1) ;NO, NSWP OR NSHF SET(DISPLAY,REAL TIME) OR
\r
958 ; SAVE OR GET IN PROGRESS WITH DEVICE STILL ACTIVE
\r
959 ; LOOK FOR AN OTHER JOB TO SWAP
\r
963 PUSHJ PDP,FORHGH ;IS THERE A HIGH SEG TO BE WRITTEN BEFORE
\r
964 ; TRYING TO SWAP OUT LOW SEGMENT?
\r
965 ; WRITE HIGH SEG IF ALL OF THE FOLLOWING ARE TRUE:
\r
966 ; 1. JOB HAS A HIGH SEG AND
\r
967 ; 2. IT HAS NOT BEEN SWAPPED FOR THIS USER
\r
969 ; 3. IT IS IN CORE(NOT XPANDH)
\r
970 ; 4. IF IN-CORE COUNT IS EXECTLY 1 MEANING
\r
971 ; THIS ONLY USER USING IN CORE
\r
972 ; 5. HIGH SEG NOT ON DISK YET
\r
973 ; 6. THIS HIGH SEG IS NOT THE SAME ONE AS JOB
\r
974 ; BEING FITTED IN IS GOING TO WANT
\r
975 ; RETURN HIGH SEG NO. IN J IF YES, OTHERWISE
\r
976 ; RETURN LOW SEG NO.
\r
977 ; IF JOB JUST HAS LOW SEG. SHF BIT IS SET IN JBTSTS
\r
978 ; FOR JOB SO IO WILL STOP NEXT BUFFERE
\r
980 MOVSI T,SWP!IFE FT2REL,<SHF> ;SET SWAPPED OUT BIT FOR LOW OR HIGH SEG
\r
981 IORM T,JBTSTS(J) ;SCHEDULER WILL NO LONGER RUN THIS JOB
\r
982 ; SET SHF BIT IF ONE SEG SOFTWARE, SO IO WILL
\r
983 ; STOP AFTER NEXT BUFFERFUL.
\r
985 FORCEL: MOVEM J,FORCE ;ASSUME NOT SWAPPABLE--IS IT?
\r
989 MOVE JDAT,JBTDAT(J)
\r
991 SKIPN PROG,JBTADR(J) ;LOC. IN PHYSICAL CORE, IS CORE
\r
992 ; ASSIGNED IN MEMORY?
\r
993 JRST SWAPO ;NO, CANNOT HAVE ACTIVE DEVICES
\r
994 CAME J,JOB ;IF THIS IS CURRENT JOB, WAIT UNTIL
\r
995 ; PROTECTED AREA IS MOVED BACK TO JOB DATA AREA
\r
996 PUSHJ PDP,ANYDEV ;ANY ACTIVE DEVICES?(2ND HALF OF ANYACT BOUT.)
\r
997 POPJ PDP, ;YES--RETURN AND WAIT FOR I/O TO STOP.
\r
998 \f;SWAP OUT LOW OR HIGH SEGEMENT
\r
1003 IFN FTTRACK,<EXTERN LASOUT
\r
1004 MOVEM J,LASOUT ;SAVE LAST SWAP OUT FOR DEBUGGING ONLY
\r
1006 SETZM FORCE ;CLEAR FORCE FLAG
\r
1007 HLRZ T,JBTADR(J) ;COMPUTE CORE IMAGE
\r
1008 JUMPE T,SWP1 ;DONT OUTPUT IF 0 CORE(IMGOUT ALREADY SET TO 0
\r
1009 ; WHEN CORE WAS RETURNED
\r
1012 MOVNM T,T2 ;*SAVE COUNT FOR CALL TO SQOUT
\r
1013 ASH T,-^D10 ;CONVERT TO 1K BLOCKS
\r
1015 DPB T,IMGOUT ;RECORD AS OUT IMAGE
\r
1016 HRLI T1,-1(T2) ;*BUILD AND SAVE IOWD FOR SQOUT
\r
1018 LDB DAT,IMGIN ;HAS SIZE OF CORE NEEDED WHEN NEXT SWAPPED IN
\r
1019 SKIPN DAT ;ALREADY BEEN SET(XPAND)
\r
1020 DPB T,IMGIN ;NO, SO SET TO # 1K BLOCKS OF CORE NEEDED
\r
1021 MOVE DAT,T ;*CONVERT CORE IMAGE TO 128 WD BLOCKS
\r
1022 PUSHJ PDP,GXSAT ;*GET DEVICE STORAGE
\r
1023 JRST FULL ;*NONE AVAILABLE
\r
1024 HRLM TAC,JBTSWP(J) ;*SAVE DEVICE ADDRESS
\r
1025 OUTP2: MOVNM J,FINISH ;DISK SWAP SPACE ASSIGNED, NOW SET FINISH FLAG
\r
1026 ; SO THAT SWAPPER WILL KNOW WHICH SEG FINISHED
\r
1027 ; WHEN IO COMPLETED(SQREQ BECOMES ZERO)
\r
1028 POP PDP,TAC1 ;*GET IOWD
\r
1029 JRST SQOUT ;*START OUTPUT AND RETURN
\r
1031 NOFIT: SETZM FIT ;FORGET ABOUT FITTING IN A JOB ON DISK
\r
1032 SETOM INFLG ;*** EXPERIMENTAL *** MARK DESIRE TO INPUT
\r
1033 POPJ PDP, ;ALL JOBS IN CORE RE HIGHER PRIORITY.
\r
1034 \f;COME HERE WHEN THE AMOUNT OF SPACE NEEDED ON THE DISK
\r
1035 ;IS NOT AVAILABLE IN ONE CONTIGUOUS BLOCK
\r
1039 FULL: HRLM DAT,AC3 ;SAVE DAT (LARGEST AVAILABLE HOLE)
\r
1040 PUSHJ PDP,FULCOR ;GET 4 FREE CORE LOCS
\r
1041 HLRZ DAT,AC3 ;RESTORE DAT
\r
1042 MOVE AC3,TAC1 ;LOC OF 1ST FREE CELL
\r
1043 HRLI AC3,-4 ;4 LOCS
\r
1044 TRO TAC1,FRGSEG ;LIGHT FRAGMENTED BIT
\r
1045 HRLM TAC1,JBTSWP(ITEM) ;SAVE LOC OF TABLE IN JBTSWP
\r
1046 FULL1: PUSH PDP,DAT ;SAVE AMOUNT OF SPACE BEING REQUESTED
\r
1047 FULL1A: PUSHJ PDP,GXSAT ;GET SOME SWAPPING SPACE
\r
1048 JRST FULL2 ;CANT HAVE THAT MUCH
\r
1049 HRRM TAC,(AC3) ;SAVE LOC OF THE DISK SPACE
\r
1050 POP PDP,DAT ;RESTORE AMT GOTTEN
\r
1051 HRLM DAT,(AC3) ;SAVE AMOUNT IN TABLE
\r
1052 SUB T,DAT ;AMOUNT STILL NEEDED
\r
1053 JUMPE T,FULSET ;THROUGH IF NEED 0 K NOW
\r
1054 PUSHJ PDP,BMPAC3 ;STEP TO NEXT TABLE LOCATION
\r
1055 MOVE DAT,T ;TRY TO GET ALL WE NEED NOW IN 1 CHUNK
\r
1056 FULL1B: MOVE DAT,T ;RESET AMOUNT OF SPACE NEEDED
\r
1058 ;COME HERE WHEN CANT GET THE CHUNK REQUESTED
\r
1059 FULL2: MOVEM DAT,(PDP) ;DAT HAS LARGEST CHUNK AVAILABLE
\r
1060 JUMPG DAT,FULL1A ;GO GET THAT AMOUNT
\r
1063 PUSHJ PDP,FRESWP ;TRY TO DELETE AN UNUSED HIGH SEG FROM DISK
\r
1064 JRST FULL1B ;FOUND ONE, TRY AGAIN, J PRESERVED
\r
1065 ; NONE FOUND, PRINT MONITOR ERROR
\r
1069 POP PDP,TAC ;WHAT? NONE LEFT?
\r
1070 POP PDP,TAC ;SET PDP TO RIGHT VALUE
\r
1071 JSP DAT,CERROR ;ERROR IN MONITOR AT .....
\r
1073 ;HERE WHEN THE TOTAL AMOUNT OF SPACE NEEDED HAS BEEN OBTAINED
\r
1074 FULSET: PUSHJ PDP,BMPAC3 ;STEP TO NEXT (LAST) TABLE LOCATION
\r
1075 HLRZ TAC,JBTSWP(ITEM) ;LOC OF TABLE OF FRAGMENTS
\r
1076 JRST OUTP2 ;GO START OUTPUT
\r
1078 ;HERE TO GET 4 LOCS OF FREE CORE
\r
1079 FULCOR: PUSH PDP,ITEM ;GETFCR USES ITEM
\r
1080 PUSHJ PDP,GETFCR ;GET 4 CELLS
\r
1081 JRST IPOPJ ;RETORE ITEM AND RETURN
\r
1083 ;STEP AC3 TO NEXT LOC OF TABLE BEING BUILT
\r
1084 BMPAC3: AOBJN AC3,CPOPJ ;OK IF MORE LOCS OF TABLE
\r
1085 PUSHJ PDP,FULCOR ;GET 4 MORE LOCS
\r
1087 CAIN TAC1,(AC3) ;ARE THEY CONTIGUOUS?
\r
1088 POPJ PDP, ;YES. RETURN
\r
1089 MOVE TAC,-1(AC3) ;NO. CONVERT LAST GOOD LOC
\r
1090 HRROM TAC1,-1(AC3) ;TO A POINTER TO NEXT PART OF TABLE
\r
1091 MOVEM TAC,(TAC1) ;STORE GOOD DATA IN 1ST WD OF NEW PART
\r
1093 HRR AC3,TAC1 ;NEW TABLE LOC
\r
1094 AOBJN AC3,CPOPJ ;COUNT WORD AND RETURN
\r
1095 \f;SWAP IN A JOB OR HIGH SEGMENT
\r
1099 IFN FTTRACK,<EXTERN LASIN
\r
1100 MOVEM J,LASIN ;SAVE LAST SWAP IN FOR DEBUGGING ONLY
\r
1103 MOVEM J,FINISH ;SET FINISH FLAG TO INPUT
\r
1104 SETZM FIT ;CLEAR FIT FLAG
\r
1105 LDB TAC,IMGIN ;SIZE OF CORE TO BE ASSIGNED WHEN SWAPPED IN (INK)
\r
1106 LSH TAC,^D10 ;CONVERT TO HIGHEST ADR
\r
1107 SUBI TAC,1 ;-1 FOR CALL TO CORGET
\r
1108 SKIPE PROG,JBTADR(J) ;IS (LOW)SEG ALREADY IN CORE?
\r
1109 JRST FININ0 ;YES, POSSIBLE IF THIS IS LOW SET AND ONLY
\r
1110 ; HIGH SEG WAS SWAPPED OUT.
\r
1111 PUSHJ PDP,CORGET ;NO, GET CORE FOR LOW OR HIGH SEG
\r
1112 JSP DAT,OERROR ;NOT AVAILABLE-SHOULD NEVER HAPPEN(TELL OPER)
\r
1114 IFN FT2REL,<EXTERN FITHGH
\r
1115 PUSHJ PDP,FITHGH ;INCREASE INCORE COUNT FOR THIS JOB'S HIGH SEG.
\r
1117 LDB T,IMGOUT ;GET OUTPUT IMAGE
\r
1118 JUMPE T,FININ0 ;DONT INPUT IF OUT IMAGE IS 0
\r
1119 LDB TAC1,IMGIN ;IS SIZE OF CORE SMALLER THAN DISK SPACE?
\r
1120 CAMGE TAC1,T ;WELL?
\r
1121 MOVE T,TAC1 ;YES, ONLY INPUT SMALLER AMOUNT(R,RUN,GET,KJOB)
\r
1122 LSH T,^D18+^D10 ;*BUILD IOWD FOR SQIN
\r
1124 HRR TAC1,JBTADR(J) ;*
\r
1125 HLRZ TAC,JBTSWP(J) ;*GET DEVICE ADDRESS
\r
1126 JRST SQIN ;*START INPUT
\r
1127 \f;ROUTINE TO CHANGE DISK SWAPPING SPACE ALLOCATION(OR SET TO 0)
\r
1128 ;DIFFERS FROM ZERSWP IN THAT VIRTUAL TALLY FOR SYSTEM IS ALSO CHANGED
\r
1129 ;CALLED FROM CORE0
\r
1130 ;CALL: MOVE ITE,JOB OR HIGH SEG NO.
\r
1131 ; MOVE TAC,#1K BLOCKS TO BE NEW ASSIGNMENT
\r
1132 ; PUSHJ PDP,CHGSWP
\r
1134 ;CALLED ONLY FORM VIRTUAL+PHYSICAL CORE ROUTINE CORE0
\r
1137 EXTERN JBTSTS,IMGIN,IMGOUT,JBTSWP,VIRTAL,IPOPJ
\r
1139 CHGSWP: LDB TAC1,IMGIN ;SIZE WHEN SEG NEXT SWAPPED IN
\r
1140 JUMPE TAC,CHG1 ;IS ZERO BEING ASKED FOR?
\r
1141 LSH TAC,-12 ;NO, COVNERT TO 1K BLOCKS
\r
1142 ADDI TAC,1 ;BUT DO NOT ATTEMPT TO RETURN DISK SPACE
\r
1143 ; SINCE IT MIGHT BE FRAGMENTED(SWAPPER WILL
\r
1144 ; RETURN ALL OF DISK SPACE ON NEXT SWAPIN)
\r
1145 ; HAPPENS ONLY ON R,RUN,GET,KJOB
\r
1146 DPB TAC,IMGIN ;STORE NEW SIZE WHEN NEXT SWAPPED IN
\r
1147 PUSH PDP,ITEM ;SAVE AN AC
\r
1148 LDB ITEM,IMGOUT ;GET OLD DISK SIZE OF THIS USER(USES ITEM)
\r
1149 CAMGE TAC1,ITEM ;IS OLD IN-CORE SIZE BIGGER?
\r
1150 MOVE TAC1,ITEM ;NO, USE DISK SIZE AS USER'S OLD VIRTUAL CORE
\r
1151 CAMGE TAC,ITEM ;IS NEW IN-CORE SIZE BIGGER?
\r
1152 MOVE TAC,ITEM ;NO, USE DISK SIZE AS USER NEW
\r
1154 SUB TAC1,TAC ;DECREASE OF USER VIRT, CORE=OLD-NEW
\r
1155 ADDM TAC1,VIRTAL ;USER'S DECREASE=SYSTEM'S INCREASE OF VIRTUAL
\r
1157 JRST IPOPJ ;RESTORE ITEM AND RETURN
\r
1158 \f;ROUTINE TO RETURN ALL OF DISK SPACE FOR A LOW OR HIGH SEG
\r
1159 ;THIS IS A PHYSICAL DEALLOCATION ONLY AND HAS NO EFFECT ON A SEGMENTS
\r
1160 ;VIRTUAL CORE ASSIGNMENT
\r
1161 ;CALL: MOVE ITEM,JOB NO. OR HIGH SEG NO.
\r
1162 ; PUSHJ PDP,ZERSWP
\r
1163 ;CALLED FROM SEGCON IN MANY PLACES(5)
\r
1164 ;AND FININ0 HERE IN SWAP
\r
1168 ZERSWP: TDZA TAC,TAC ;REQUEST O SPACE ON DISK AND ALWAYS SKIP
\r
1169 CHG1: ADDM TAC1,VIRTAL ;INCREASE SIZE OF VIRTUAL CORE AVAILABLE IN SYSTEM
\r
1170 ; AND THEN RETURN ALL OF DISK SPACE(CHGSWP)
\r
1171 MOVSI TAC1,SWP!SHF ;CLEAR SWAPPED OUT BIT IN JOB OR SEG
\r
1172 ANDCAM TAC1,JBTSTS(ITEM);STATUS WORD(SHF SET IF IO WAS TO BE STOPPED
\r
1173 ; FOR SWAP OR CORE SHUFFLE
\r
1175 PUSH PDP,DAT ;SAVE TTY OUTPUT BYTE POINTER(COMMAND DECODER)
\r
1176 LDB DAT,IMGOUT ;*SIZE ON DISK(1K BLOCKS)
\r
1177 JUMPE DAT,CHG3 ;DID SEG HAVE ANY DISK SPACE?
\r
1178 HLRZ TAC,JBTSWP(ITEM) ;*YES, LOGICAL DISK BLOCK+FRGSEG BIT
\r
1179 PUSHJ PDP,FXSAT ;*FREE THE DISK BLOCKS NO LONGER NEEDED
\r
1180 CHG3: POP PDP,DAT ;RESTORE TTY OUTPUT BYTE POINTER
\r
1181 MOVEI TAC,0 ;0 IS NEW DISK ASSIGNMENT
\r
1182 DPB TAC,IMGOUT ;SET DISK ASSIGNEMENT TO 0
\r
1183 DPB TAC,IMGIN ;SET NEW CORE IMAGE BLOCK SIZE WHEN NEXT SWAPPED IN
\r
1184 ; HERE FROM CHGSWP IF NOT ASKING FOR 0
\r
1186 \f EXTERN PROT0,PROT ;PROT AND PROT0 OCCUR IN COMMON
\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
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
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
1208 ; RETURN, TAC DESTROYED
\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
1215 ;ROUTINE TO FLAG JOB TO BE STOPPED AND SWAPPED OUT
\r
1216 ;BECAUSE IT HAS JUST BEEN CONNECTED TO A HIGH SHARABLE SEG WHICH IS ON DISK
\r
1217 ;OR ON ITW WAY IN OR OUT. THE SIZE OF THE HIGH SEG IS UNCHANGED
\r
1218 ;THE JOB MUST BE STOPPED UNTIL HIGH SEG SWAPPED IN JUS AS IF JOB HAS
\r
1219 ;EXPANDED HIGH SEG(MUST BE CALLED FROM UUO LEVEL FOR CURRENT JOB IF HIGH SEG)
\r
1220 ;CALL: MOVE ITEM,HIGH SEG NUMBER
\r
1221 ; PUSHJ PDP,XPANDH
\r
1228 PUSH PDP,ITEM ;SAVE JOB NUMBER
\r
1229 CAILE ITEM,JOBMAX ;IS THIS A LOW OR HIGH SEG?
\r
1230 MOVE ITEM,JOB ;HIGH,SO GET JOB NO.(MUST BE CURRENT JOB)
\r
1232 MOVSI TAC1,JXPN ;SET THIS JOB EXPANDING BIT SO IT WILL NOT BE RUN
\r
1233 TDNN TAC1,JBTSTS(ITEM) ;IS IT ALREADY SET FOR THIS JOB?(UNLIKELY)
\r
1234 AOS XJOB ;NO, INCREMENT COUNT ONLY ONCE FOR EACH JOB EXPANDING
\r
1235 IORM TAC1,JBTSTS(ITEM) ;AND SET JOB EXPANDING BIT
\r
1240 JRST IPOPJ ;RESTORE JOB OR HIGH SEG NUMBER (ITEM) AND RETURN
\r
1242 \fSUBTTL SWPSER R.KRASIN/AF TS4.34 03 FEB 69 V406
\r
1244 INTERNAL SQIN,SQOUT,SQGO,SQGO1
\r
1246 EXTERNAL DFBUSY,DFRED,DFWRT,CPOPJ,JOBDAC,MJOBCK,CHECK,JBTCHK
\r
1248 ;PUT A REQUEST IN THE SWAPPER QUEUE. ENTER AT SQIN FOR
\r
1249 ; INPUT, SWOUT FOR OUTPUT
\r
1250 ;CALL: MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.(IE IOWD+1)
\r
1251 ; HRRZ TAC,DISK BLOCK NO.
\r
1252 ; PUSHJ PDP,SQIN/SQOUT
\r
1253 ; RETURN HERE ALWAYS
\r
1254 ; CONTENTS OF TAC,TAC1 LOST
\r
1256 SQIN: TLO TAC,400000 ;SET READ INDICATOR
\r
1257 SQOUT: MOVEM TAC,SERA ;STORE THE BLOCK NUMBER
\r
1258 MOVEM TAC1,SQREQ ;STORE THE IOWD
\r
1259 MOVEM TAC1,ESQREQ ;SAVE IN CASE OF DISK ERROR ON FRAGMENTED JOB
\r
1260 MOVNI TAC,1 ;IS THE DEVICE BUSY?
\r
1262 JUMPN TAC,CPOPJ ;YES IF JUMP
\r
1265 ERATRY=3 ;NO. OF TIMES TO READ AND WRITE ON ERRORS
\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
1271 SQGO: MOVEI TAC1,ERATRY
\r
1274 TDNE TAC,SERA ;WRITE?
\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
1286 TRZN TAC,FRGSEG ;*FRAGMENTED?
\r
1287 JRST SQGO2 ;*NO, READ IN ENTIRE (OR PART) OF SEG
\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
1299 ORM TAC,SERA ;INSERT NEW ADDRESS
\r
1302 FRGIO2: LSH DAT,12 ;CONVERT FROM K TO WORDS
\r
1303 ADDM DAT,SQLEN ;ADD TO PREVIOUSLY TRANSFERRED AMOUNT
\r
1304 MOVNS DAT ;-N WORDS
\r
1305 HRLM DAT,TAC1 ;IOWD IN TAC1
\r
1306 HRLO DAT,DAT ;-NO. OF WRDS FOR THIS DISK TRANSFER TO TH
\r
1307 CAMG DAT,SQREQ ;COMPARE WITH - NO. WORDS FOR REST OF SEG
\r
1308 HLL TAC1,SQREQ ;SWAPPER ONLY WANTS TO READ A PORTION OF SEG
\r
1309 ; NOT ALL OF IT(R,RUN,GET,KJOB COMMAND)
\r
1310 MOVNS DAT ;+NO. OF WORDS FOR THIS NEXT TRANSFER
\r
1312 ADDM DAT,SQREQ ;UPDATE LH OF IOWD FOR ENTIRE SEG, SO IT HAS
\r
1313 ; -NO. OF WORDS LEFT AFTER THIS TRANSFER IS DONE
\r
1315 SQGO2: TLZ TAC,377777 ;*CLEAR POSSIBLE TRASH IN LH.
\r
1316 ROT TAC,BLKSPK ;*RE-POSITION DISK LOGICAL BLOCK NUMBER.
\r
1317 TRZE TAC,4 ;*TEST AND CLEAR READ/WRITE BIT.
\r
1318 SOJA TAC1,DFRED ;*YES
\r
1319 SOJA TAC1,DFWRT ;*NO, WRITE.
\r
1320 \f;SERVICE A SWAPPING INTERRUPT
\r
1321 EXTERNAL DINT4B,CKSMCT
\r
1324 SWPINT: TRNE IOS,IODTER!IODERR!IOIMPM
\r
1325 JRST SWPERR ;ERRORS
\r
1326 TRZE TAC,FRGSEG ;*FRAGMENTED?
\r
1327 SKIPL TAC1,SQREQ ;*YES, MORE IOWD TO GO?
\r
1328 JRST DINT8B ;NO, ALL DONE SWAP IN OR OUT
\r
1329 AOS SERA ;YES, FRAGMENTED AND MORE TO GO
\r
1330 SKIPE 1(TAC) ;IS THIS THE END OF SWAP COMMAND LIST?
\r
1331 AOJA TAC,FRAGIO ;NO, BO DO NEXT PIECE OF FRAGMENTED SEG
\r
1333 DINT8B: TLNN TAC,400000 ;*INPUT?
\r
1340 CAME TAC1,JBTCHK(TAC)
\r
1342 DINT8A: HRRZM IOS,SERA
\r
1346 SWPER1: MOVSI TAC,100
\r
1349 SWPERR: MOVM TAC, FINISH ;*RESET SERA IN CASE OF FRAGMENTED JOB
\r
1350 HLRZ TAC, JBTSWP(TAC) ;*SWAP LOC (DISK ADR OR TABLE ADR)
\r
1351 HRRM TAC, SERA ;*RESTORE SERA
\r
1352 MOVE TAC,ESQREQ ;RESTORE ESQREQ IN CASE OF FRAGMENTED JOB
\r
1354 SOSLE SERACT ;*TRIED ENOUGH?
\r
1355 JRST SQGO1 ;*NO, TRY AGAIN
\r
1356 JRST DINT8A ;*YES, TOUGH.
\r
1358 ;SWPSER LOGIC FOR THE OLD PDP-6 (DATA PRODUCTS) DISK FILE ---
\r
1360 ;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED
\r
1362 ;CALL: MOVEI DAT,NO. OF 1K BLOCKS DESIRED
\r
1364 ; ERROR EXIT (DISK IS FULL)
\r
1365 ; NORMAL EXIT ;C(TAC) = BLOCK NO.
\r
1367 ;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST.
\r
1370 EXTERNAL GETBIT,IPOPJ1
\r
1372 GXSAT: MOVE AC1,XSAT1 ;SAVE AC1, SET IT TO TABLE LOC.
\r
1374 LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS
\r
1375 PUSH PDP,ITEM ;SAVE C(ITEM)
\r
1376 MOVE ITEM,DAT ;GETBIT EXPECTS PARAMETER IN ITEM
\r
1377 PUSHJ PDP,GETBIT ;FIND A HOLE BIG ENOUGH
\r
1378 JRST IPOPJ ;NONE, RESTORE ITEM AND ERROR RETURN
\r
1379 MOVEI TAC,-1(TAC1)
\r
1380 CAIL TAC,BLOCKS ;IS IT ON DISK 17?
\r
1381 ADDI TAC,DIFF ;YES
\r
1382 LSH TAC,-CONVMD ;CARRY DISK ADDRESS SHIFTED TO FIT IN JBTSWP.
\r
1383 JRST IPOPJ1 ;SKIP RETURN AND RESTORE JOB NUMBER(ITEM)
\r
1385 ;FREE UP A SERIES OF BLOCKS ON THE SWAPPING DEVICE. CALLED
\r
1387 ;CALL: MOVEI DAT,NO. OF 1K BLOCKS TO FREE
\r
1388 ; MOVE TAC,BLOCK NO. OF FIRST DISK BLCOK TO FREE
\r
1389 ; PUSHJ PDP,FXSTAT
\r
1390 ; ALWAYS RETURN HERE
\r
1392 ;CONTENTS OF ACS TAC,TAC1 WILL BE LOST.
\r
1395 EXTERNAL CLRBIT,IPOPJ
\r
1397 FXSAT: LSH TAC,CONVMD ;RESTORE SHIFTED DISK ADDRESS.
\r
1398 CAIL TAC,HISWAP ;ON DISK 17?
\r
1399 SUBI TAC,DIFF ;YES
\r
1400 LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS
\r
1401 MOVE AC1,XSAT1 ;SET UP AC1 WITH POINTER TO SAT BLOCK
\r
1402 MOVE AC2,XSAT2 ;AC2 TOO
\r
1403 PUSH PDP,ITEM ;SAVE C(ITEM)
\r
1404 MOVE ITEM,DAT ;CLRBIT EXPECTS PARAMETER IN DAT
\r
1406 JRST IPOPJ ;RETURN, AND RESTORE ITEM
\r
1408 ;INITIALIZE SWAPPER DISK STORAGE TABLE
\r
1411 SWPINI: MOVE TAC,XSAT2
\r
1424 IFN FTCHECK+FTMONP,<
\r
1425 EXTERNAL SQREQ,SERA,SERACT,XSAT1,XSAT2,XSAT3,XSAT4,XSAT5,XSAT6,XSAT7
\r
1426 EXTERNAL XSAT8,SWPSIZ,HISWAP,DIFF,CONVMD,BLOCKS,XSAT31,XSAT4P,XSAT61
\r
1428 IFE FTCHECK+FTMONP,<
\r
1430 ;DATA AND STORAGE AREA FOR SWAPPING. ON THE 270 DISK, DISKS
\r
1431 ; 0 & 17 ARE USED FOR SWAPPING, ECH DISK CONTAINING
\r
1432 ; 5400 (OCTAL) RECORDS
\r
1434 INTERNAL SQREQ,SERA,SERACT
\r
1435 SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE
\r
1436 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE
\r
1437 ESQREQ: Z ;COPY OF SQREQ, IN CASE OF
\r
1438 ; ERROR IN FRAGMENTED JOB
\r
1439 SERA: Z ;SIGN IS 1 IF A READ
\r
1440 ; C(RH)=BLOCK NUMBER BEFORE READING.
\r
1441 ; ERROR BITS AFTER READING.
\r
1442 SERACT: 0 ;COUNT FOR ERRORS
\r
1443 SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR - FRAG SEG
\r
1445 XSAT1: EXP XSAT3-1 ;POINTER USED BY GETBIT,CLRBIT
\r
1446 XSAT2: XWD -SWPSIZ,XSAT4 ;POINTER TO BIT TABLE
\r
1447 XSAT3: XWD 400000, ;2-WORD TABLE ALTERED BY GETBIT,CLRBIT
\r
1450 ; BIT TABLE FOR SWAPPING ALLOCATION
\r
1451 XP BLOCKS,5400 ;NUMBER OF RECORDS/DISK PLATE
\r
1452 W1=BLOCKS/^D36 ;NUMBER OF ZERO WORDS AT TOP OF TABLE
\r
1453 E1=BLOCKS-W1*^D36 ;LEADING ZERO IN W1+1ST WORD
\r
1455 W2=EX/^D36 ;ZERO WORDS AT BOTTOM OF TABLE
\r
1456 E2=EX-W2*^D36 ;LEADING ZEROES IN W1+W2+2ND WORD
\r
1465 REPEAT ^D35-E1,<X=X*2>>
\r
1469 REPEAT ^D36-E2,<Z=Z+Y
\r
1476 SWPSIZ=XSAT6-XSAT4+1 ;SIZE OF TABLE
\r
1477 HISWAP=17*BLOCKS ;LOGICAL BLOCK NUMBER OF FIRST
\r
1479 DIFF=HISWAP-BLOCKS-1
\r
1480 XP CONVMD,3 ;CONVERSION FROM 1K CORE BLOCKS TO 128 WORD
\r
1481 ;DISC BLOCKS(SHIFT COUNT)
\r
1483 XP BLKSPK,CONVMD ;NO. OF BLOCKS PER K, SAME AS CONVMD
\r
1484 XSAT4P: XWD XSAT4,XSAT4+1
\r
1486 > ;END OF SWPSER LOGIC FOR THE OLD PDP-6 DISK.
\r
1488 ;SWPSER LOGIC FOR THE NEW PDP-10 (MODEL RC-10) DISK ---
\r
1490 INTERNAL GXSAT,FXSAT,SWPINI
\r
1491 EXTERNAL GETBIT,CLRBIT
\r
1492 EXTERNAL LBHIGH,IPOPJ,IPOPJ1
\r
1495 ;SUBROUTINE "GXSAT" IS CALLED TO FIND A SERIES OF CONSECUTIVE FREE BLOCKS ON
\r
1496 ; THE DISK TO SWAP SOME JOB OUT ONTO. IT IS CALLED AT CLOCK LEVEL.
\r
1498 ;CALLING SEQUENCE ---
\r
1500 ; ERROR EXIT --- THE DISK IS FULL, NO SWAPPING SPACE AVAILABLE.
\r
1502 ;ENTRY CONDITIONS ---
\r
1503 ; C(DAT) = NUMBER OF 1K BLOCKS OF DISK STORAGE NEEDED.
\r
1504 ;EXIT CONDITIONS ---
\r
1505 ; C(TAC) = LOGICAL BLOCK NUMBER (DIVIDED BY 8) OF THE FIRST DISK BLOCK IN
\r
1506 ; THE SERIES OF CONSECUTIVE BLOCKS WHICH SATISFY THIS REQUEST.
\r
1507 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.
\r
1509 GXSAT: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".
\r
1511 MOVEI AC1,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "GETBIT" SUBROUTINE.
\r
1514 JRST IPOPJ ;NO ROOM IN THE SWAPPING PART OF THE DISK.
\r
1515 ADDI TAC1,-1(ITEM) ;ROOM FOUND--COMPUTE LOGICAL BLOCK NUMBER OF THIS
\r
1516 CAMLE TAC1,MAXSWP ;FIRST BLOCK IN A SERIOES OF CONSECUTIVE FREE DISK
\r
1517 MOVEM TAC1,MAXSWP ;BLOCKS. THE "SWPTAB" TABLE SEARCHED HAS ONE BIT
\r
1518 LSH TAC1,BLKSPK ;FOR EACH 1K OF SWAPPING DISK SPACE. BUT IS STORED
\r
1519 SUB TAC1,LBHIGH ;BACKWARDS (1ST BIT OF SWPTAB = LAST 1K OF DISK).
\r
1520 MOVM TAC,TAC1 ;ALSO UPDATE "MAXSWP" IF PREVIOUS MAXIMUM EXCEEDED.
\r
1521 LSH TAC,-BLKSPK ;COMPRESS DISK ADDRESS TO 17 BITS FOR LH OF JBTSWP
\r
1522 AOJA TAC,IPOPJ1 ;ADD 1 TO TAC AND RESTORE ITEM AND SKIP RETURN
\r
1523 \f;SUBROUTINE "FXSAT" IS CALLED TO RETURN A SERIES OF CONSECUTIVE DISK BLOCKS TO
\r
1524 ; THE FREE STORAGE POOL. THUS MAKING THEM AVAILABLE FOR RE-USE IN HANDLING
\r
1525 ; FUTURE SWAPPING REQUESTS. IT IS CALLED AT CLOCK LEVEL.
\r
1527 ;CALLING SEQUENCE ---
\r
1530 ;ENTRY CONDITIONS ---
\r
1531 ; C(TAC) = LOGICAL BLOCK NUMBER OF THE FIRST DISK BLOCK IN THE
\r
1532 ; SERIES WHICH IS TO BE MADE AVAILABLE.
\r
1533 ; C(DAT) = NUMBER OF CONSECUTIVE 1K BLOCKS OF DISK SPACE WHICH
\r
1534 ; ARETO BE MADE AVAILABLE.
\r
1535 ;EXIT CONDITIONS ---
\r
1536 ; THE REQUESTED BITS IN THE SWAPPING SPACE AVAILABILITY TABLE
\r
1537 ; (NAMELY, SWPTAB) HAVE BEEN CLEARED TO ZERO.
\r
1538 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.
\r
1540 FXSAT: TRZN TAC,FRGSEG ;FRAGMENTED?
\r
1541 JRST FXSAT1 ;NO. DO IN REGULAR WAY
\r
1542 FRAGBK: HRRZ AC3,TAC ;YES. LOC OF TABLE IN AC3
\r
1543 FRGBK1: HRRZ TAC,(AC3) ;LOC OF NEXT DISK ADDRESS
\r
1544 HLRE DAT,(AC3) ;NUMBER OF K
\r
1545 JUMPLE DAT,FRGBK2 ;GIVE UP FREE CORE IF NOT REAL ADDRESS
\r
1546 PUSHJ PDP,FXSAT1 ;GIVE UP THE DISK SPACE FOR THIS PART
\r
1547 AOBJP AC3,FRGBK1 ;COUNT WORD OF TABLE, GET NEXT
\r
1548 FRGBK2: HRRZ TAC,AC3 ;LOC OF TABLE
\r
1550 HLRZ ITEM,AC3 ;NUMBER OF WDS IN TABLE
\r
1551 SUB TAC,ITEM ;POINT TAC TO 1ST WORD OF BLOCK
\r
1552 LSH ITEM,-2 ;4 WDS PER BIT
\r
1554 PUSHJ PDP,CLCOR1 ;GIVE UP FREE CORE
\r
1556 SKIPE TAC,(AC3) ;END OF TABLE?
\r
1557 JRST FRAGBK ;NO, GO CHASSE NEXT PART
\r
1558 POPJ PDP, ;YES, DONE
\r
1560 FXSAT1: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".
\r
1562 LSH TAC,BLKSPK ;REGENERATE THREE LOW ORDER 0 BITS IN DISK ADDRESS.
\r
1563 SUB TAC,LBHIGH ;PREPARE TO CLEAR BITS IN THE SWAPPING
\r
1564 MOVMS TAC ; AVAILABLITY TABLE BY TRANSFORMING THE LOGICAL
\r
1565 ADDI TAC,1 ; BLOCK NUMBER TO AN EQUIVALENT BIT NUMBER IN THIS
\r
1566 MOVNI AC1,BLKSPK ; TABLE (WHICH IS STORED IN REVERSE ORDER AND HAS
\r
1567 LSH TAC,(AC1) ; ONE BIT PER 1K OF SWAPPING SPACE ON THE DISK).
\r
1570 MOVE AC2,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "CLRBIT" SUBROUTINE.
\r
1571 FXSATC: PUSHJ PDP,CLRBIT ;THE "CLRBIT" SUBROUTINE IN "DSKSER" ACTUALLY DOES
\r
1572 ; THE WORK OF CLEARING THE BITS.
\r
1573 JRST IPOPJ ;RESTORE ITEM AND RETURN
\r
1576 ;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT
\r
1577 ; SYSTEM INITIALIZATION TIME.
\r
1579 EXTERN VIRTAL,SWPHGH
\r
1581 SWPINI: MOVE TAC,LBHIGH ;SET HIGHEST LOGICAL BLOCK
\r
1582 MOVEM TAC,SWPHGH ;FOR SWAPPING IN COMMON
\r
1583 MOVNI TAC,1 ;SET ENTIRE TABLE TO ONES, I.E., MARK EVERYTHING
\r
1584 MOVE TAC1,SWPENT ; AS BEING UNAVAILABLE FOR SWAPPING.
\r
1587 MOVEI AC1,SWPENT ;THEN USE THE "CLRBIT" ROUTINE TO CLEAR OUT AS MANY
\r
1588 MOVE AC2,SWPENT ; BITS AT THE FRONT OF THE TABLE AS THERE ARE 1K DISK
\r
1589 MOVE ITEM,K4SWAP ; AREAS ALLOCATED FOR SWAPPING USE. THE PARAMETER
\r
1590 MOVEM ITEM,VIRTAL ;TOTAL AMOUNT OF VIRTUAL CORE ALLOWED
\r
1591 ; IS JUS EQUAL TO AMOUNT OF SWAPPING SPACE
\r
1592 ; EVEN IF USER CAN NOT HAVE ALL OF PHYSICAL USER CORE
\r
1593 \f MOVEI TAC,0 ; "K4SWAP" IS SET UP DURING DISK REFRESHING, AND
\r
1594 ; RECALLED FROM THE DISK AT EACH SYSTEM-INITIALIZE.
\r
1595 JRST CLRBIT ;IN LIEU OF "PUSHJ CLRBIT" FOLLOWED BY "POPJ".
\r
1596 \fIFN FTCHECK+FTMONP,<
\r
1597 EXTERNAL RCXSDT ;DUMMY GLOBAL SYMBOL TO PERMIT THE SYSTEM BUILDER TO
\r
1598 ; RETRIEVE THE CORRECT BINARY COPY OF "SCHDAT".
\r
1599 EXTERNAL SQREQ,SERA,SERACT
\r
1600 EXTERNAL LBHIGH,BLKSPK,MAX2SWP,SWPENT,SWPTAB,MAXSWP
\r
1603 IFE FTCHECK+FTMONP,<
\r
1604 ;DATA ASSOCIATED WITH THE SWPSER LOGIC FOR THE NEW PDP-10 DISK ---
\r
1606 INTERN MXK2SWP,CONVMD,BLKSPK,SWPTAB,MAXSWP
\r
1608 ;THE ABOVE ARE REFERENCED OR INITIALIZED BY THE "ONCE" ROUTINE.
\r
1610 ;C(LOWSWP)=LOWEST LOGICAL BLOCK NUMBER TO BE USED FOR SWAPPING
\r
1611 ;DETERMINED BY ONCE ONLY REFRESH DIALOG
\r
1612 ;C(K4SWAP)=MAX. NO. OF K DISK WORDS ALLOCATED FRO SWAPPING, ALS
\r
1613 ;DETERMINED BY ONCE ONLY REFRESH DIALOG
\r
1614 MAXSWP: 0 ;MAX. NO. OF K FROM TOP TO LOWEST JOB
\r
1615 ; USED SINCE SYSTEM BEGAN
\r
1616 ;C(MAXSWP)=MAX. NO. OF K EVER ASSIGNED COUNTING FROM TOP DOWN TO
\r
1617 ;LOWEST EXCURSION, INCLUDING HOLS. WHEN = C(K4SWAP), THEN FREAGMENTATION HAD
\r
1618 ;HAPPENED SOMETIME DURING THE PAST
\r
1619 BLKSPK=3 ;SHIFT FACTOR TO CONVERT K OF CORE TO DISK BLOCKS, I.E.,
\r
1620 ; EIGHT DISK BLOCKS PER K OF CORE.
\r
1621 CONVMD=BLKSPK ;ONLY FOR CONSISTENCY WITH OLDER PDP-6 ROUTINE.
\r
1622 MXK2SWP=^D1000 ;MASIMUM NUMBER OF 1K DISK BLOCKS WHICH MIGHT BE ALLOCATED
\r
1623 ; FOR SWAPPING (UPPER BOUND ON THE VALUE OF K4SWAP WHICH
\r
1624 ; MAY BE REQUESTED AT DISK REFRESH TIME). (ONE MILLION WORDS
\r
1625 ; FOR SWAPPING SEEMS LIKE A NON-RESTRICTIVE ARBITRARY LIMIT.)
\r
1626 SWPSIZ=MXK2SWP/^D36+1 ;SIZE OF SWPTAB ALLOCATION TABLE.
\r
1628 SWPENT: XWD -SWPSIZ,SWPTAB ;THREE WORD POINTER TABLE
\r
1629 XWD 400000,0 ; REQUIRED BY THE "GETBIT" AND
\r
1630 XWD -SWPSIZ,SWPTAB ; "CLRBIT" SUBROUTINES.
\r
1632 SWPTAB: BLOCK SWPSIZ ;SWAPPING SPACE AVAILABILITY TABLE.
\r
1634 ;DATA CARRIED OVER FROM THE COMMON PART OF OLD AND NEW SWPSER ROUTINES ---
\r
1635 INTERNAL SQREQ,SERA,SERACT,ESQREQ
\r
1636 SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE
\r
1637 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE
\r
1638 ESQREQ: Z ;COPY OF SQREQ, IN CASE OF SWAP ERROR IN FRAGMENTED JOB
\r
1639 SERA: Z ;SIGN IS 1 IF A READ
\r
1640 ; C(RH)=BLOCK NUMBER BEFORE READING.
\r
1641 ; ERROR BITS AFTER READING.
\r
1642 SERACT: 0 ;COUNT FOR ERRORS
\r
1643 SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR FOR FRAGMENTED JOB
\r
1645 > ;END OF SWPSER LOGIC FOR THE NEW PDP-10 DISK.
\r