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
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
16 ENTRY RCXSKD ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM
\r
17 RCXSKD: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.
\r
25 EXTERNAL JBTQ,PJBSTS
\r
26 EXTERNAL PJBSTS,TIMEF,MJOBN
\r
28 INTERNAL NXTJOB,FTSWAP
\r
30 ;ACCUMULATOR DEFINITIONS ---
\r
31 QJ=DEVDAT ;QJOB WORD
\r
32 SW=TAC1 ;STATUS WORD
\r
35 ;INITIALIZE SCHEDULER (CALLED FROM SYSINI BEFORE ALL OTHER
\r
36 ; DEVICES ARE INITIALIZED)
\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
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
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
58 EXTERNAL JBTSWP,POTLST
\r
60 NXTJOB: SKIPN TIMEF ;CLOCK TIC?
\r
63 MOVSI SW,-1 ;DECREMENT IN CORE PROTECT TIME
\r
72 NXTJB1: SKIPN J,JOB ;CURRENT JOB NO., IS IT NULL JOB?
\r
73 JRST CKJB1 ;YES,GO SEE IF OTHER JOBS NEED RESCHEDULING
\r
74 MOVEI QJ,0 ;GET READY IN CASE CURRENT JOB UNRUNNABLE
\r
75 HLRZ SW,JBTSTS(J) ;GET JOB STATUS BITS AND CODES
\r
76 TRZ SW,RUNMSK+CMWB ;MASK OUT DO NOT CARE BITS
\r
77 CAIE SW,RUNABLE ;IS CURRENT JOB RUNABLE?
\r
78 JRST CKJB3 ;NO. REQUEU CURRENT JOB
\r
79 SKIPN TIMEF ;NO. IS THIS A TIME INTERRUPT?
\r
82 SOS SW,JBTSTS(J) ;DECREMENT QUANT. TIME
\r
83 TRNE SW,-1 ;HAS TIME GONE TO 0?
\r
85 MOVEI DAT,QTIME ;YES---REQUEUE AND RESET QUANT. TIME
\r
88 \fCKJB1: SKIPG QJ,QJOB ;SET QJ NON ZERO IF ANY REQUEUING TO DO
\r
89 JRST CKJB5 ;NO REQUEUEING NECESSARY
\r
90 MOVEI J,JOBMAX ;START WITH HIGHEST JOB NUMBER ASSIGNED
\r
91 CKJB2: MOVSI SW,JRQ ;JOB NEEDS REQUEUEING BIT
\r
92 TDNN SW,JBTSTS(J) ;THIS JOB?
\r
93 SOJG J,.-1 ;NO, KEEP LOOKING
\r
94 JUMPLE J,CKJB5 ;YES,LOOKED AT ALL JOBS?
\r
95 ; (MAY NOT FIND A KJOBED JOB IF HIGHEST
\r
96 ; GO DECR, COUNT QJOB ANYWAY)
\r
97 ANDCAM SW,JBTSTS(J) ;NO,MARK THIS JOB AS DONE
\r
98 CKJB3: MOVE SW,JBTSTS(J) ;JOB STATUS WORD
\r
99 MOVEI DAT,QCMW ;ASSUME COMMAND WAIT
\r
100 TLNN SW,CMWB ;IS JOB IN COMMAND WAIT?
\r
102 TLNE SW,SWP+JXPN ;YES, IS JOB ON DISK, OR TRYING TO EXPAND?
\r
103 JRST CKJB4A ;YES. PUT JOB IN COMMAND WAIT Q
\r
104 CKJB9: JUMPGE SW,CKJB4 ;NO,WAIT STATUS CODE DETERMINES NEW Q
\r
105 LDB SW,PJBSTS ;YES, GET QUEUE CODE.
\r
106 CAIN SW,WSQ ;*** EXPERIMENTAL ***
\r
107 JRST CKJB10 ;*** EXPERIMENTAL ***
\r
108 CAIN SW,TIOWQ ;CURRENT JOB GOING INTO TTY IO WAIT?
\r
109 HRROS JBTSWP(J) ;YES, SET IN CORE PROTECT TIME TO -1,
\r
110 ; SO HE CAN BE SWAPPED IMMEDIATELY IF SOMEONE
\r
111 ; ELSE WANTS TO BE SWAPPED IN
\r
112 CKJB4B: SKIPA DAT,QBITS(SW) ;GET ADDRESS OF TRANSFER TABLE
\r
113 CKJB4: MOVEI DAT,QSTOP ;IF RUN BIT WAS OFF
\r
114 CKJB4A: PUSHJ PDP,QXFER ;REQUEUE THE JOB
\r
115 JUMPE QJ,SCHED ;IF FROM NXTJOB GO DIRECTLY TO SCHED
\r
116 ; I.E, CURRENT JOB NO LONGER RUNNABLE(IOW)
\r
117 ; BUT JRQ WASN'T SET SO DON'T DECR QJOB
\r
118 SOSLE QJ,QJOB ;ANY MORE JOBS TO REQUEUE?
\r
119 SOJG J,CKJB2 ;YES,BUT LOOK AT EACH JOB ONLY ONCE PER CLOCK TICK
\r
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
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
146 ;SCHEDULAR--SEARCH THRU QUEUES ACCORDING TO SSCAN TABLE
\r
147 ;FOR 1ST JOB IN CORE--RETURN ITS NO. IN J
\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
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
163 SCHD1: SETZ J, ;RETURN NULL JOB
\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
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
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
185 EXTERNAL IMGIN,JBTSTS,JBTADR,PJBSTS
\r
186 INTERNAL QXFER,QSCAN,FTSWAP,FTDISK
\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
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
215 EXTERNAL CPOPJ,JOBMAX,MXQUE,JBTQ
\r
216 EXTERNAL JBTQP1 ;EQUALS JBTQ+1
\r
217 EXTERNAL JBTQM1 ;EQUALS JBTQ-1
\r
218 EXTERNAL JBTQMN ;EQUALS JBTQ-NULQ
\r
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
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
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
234 SOJLE ITEM,CPOPJ ;FINISHED?
\r
235 HRLM ITEM,JBTQP1(ITEM) ;BACK POINTER JOB I+1 POINTS TO JOB I
\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
243 ,T.TABLE: EXP <CODE>
\r
244 , XWD <QUANT-TAB>,<Q-TAB>
\r
246 ,DEPENDING ON <CODE>, THE SECOND WORD IS EITHER DATA OR THE
\r
247 ,ADDRESSES OF "CORRESPONDANCE TABLES".
\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
255 ,DEST-Q AS A FIXED (PREDETERMINED Q:
\r
256 ,BQFIX: INSERT AT BEG OF DEST-Q
\r
257 ,EQFIX: INSERT AT END
\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
268 , <Q-TAB>=ADDRES OF A CORRES. TABLE "LINKING" SOURCE-QS TO
\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
275 , <Q-TAB>: XWD <SQ1>,<DQ1> ;1ST SOURCE-Q:DEST-Q PAIR
\r
277 , XWD <SQN>,<DQN> ;NTH ...
\r
278 , Z ;ZERO TERMINATES TABLE
\r
280 , <QUANT-TAB>: EXP <QUANT1> ;CORRES. TO <Q-TAB>+0
\r
282 , EXP <QUANTN> ;CORRES. TO <Q-TAB>+N-1
\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
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
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
302 , <Q-TAB>: XWD <JSIZ1>,<DQ1>
\r
304 , XWD <JSIZN>,<DQN>
\r
307 , <QUANT-TAB>: SIMILAR TO THAT FOR B-EQLINK
\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
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
325 TT=DAT ;POINTER TO TRANSFER TABLE
\r
327 Q=PROG ;DEST-Q AND QUANT. TIME ON RETURN
\r
329 T2=TAC ;TEMP AND SOURCE-Q ON CALL TO B,EQLINK
\r
333 QXFER: MOVE Q,1(TT) ;GET TRANSFER TABLE ADDRESS
\r
334 JRST @(TT) ;DISPATCH
\r
336 ,DEST-Q AS FUNCTION OF SOURCE-Q
\r
337 QLINK: SKIPN T1,(Q) ;END OF TABLE?
\r
340 CAME T1,T2 ;NO--SOURCE-Q=LH(TABLE ENTRY)?
\r
341 AOBJP Q,QLINK ;NO- CONTINUE SEARCH
\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
350 CAMLE T2,T1 ;JOBSIZE .LE. LH(TABLE ENTRY)?
\r
351 AOBJP Q,QX1 ;NO--CONTINUE SEARCH, JUMP ALWAYS.
\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
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
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
373 JUMPL Q,QX3 ;RETURN IF QUANT. TIME NOT REQ.
\r
374 HLRM Q,JBTSTS(J) ;SET QUANT. TIME
\r
376 MOVEI TT,RNQ ;SET JOB STATUS WAIT
\r
377 DPB TT,PJBSTS ;CODE TO RUN QUEUE (0).
\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
391 ,SCANTAB: XWD <Q1>,<CODE1> ;SCN Q1 ACCRDING TO CODE1
\r
393 , XWD <QN>,<CODEN> ;QN ACCORDING TO CODEN
\r
394 , Z ;ZERO TERMINATES TABLE
\r
396 ,EACH Q MAY BE SCANNED IN ONE OF FOUR WAYS SPECIFIEDBY <CODE>
\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
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
412 , PERFORM ANY NECESSARY TESTING OF THIS JOB
\r
413 , J,ST,PC,QR MUST BE PRESERVED
\r
415 , JRST (QR) ;RETURN TO QSCAN TO GET NEXT JOB
\r
416 , ; IF THIS ONE NOT ACCEPTABLE
\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
428 QFOR1: MOVEI QR,QFOR2 ;ONLY THE FIRST JOB
\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
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
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
455 IFE FTCHECK+FTMONP,<
\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
463 <INTERNAL A'AVAL,A'Q
\r
469 AVALTB: QUEUES ;GENERATE THE AVAL FLAGS
\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
477 ;DEFINE STATE CODES WHICH DO NOT HAVE AVAL AND REQ FLAGS
\r
487 XP MXCODE,LOC-1 ;MAX, JOB STATE DONE
\r
494 CMQ=LOC ;COMMAND DELAY QUEUE
\r
495 \f;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES
\r
497 ;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE.
\r
498 ;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM
\r
499 ;FOLLOWING TABLE USING NEW STATE CODE AS INDEX
\r
509 \fIFN FTCHECK+FTMONP,<
\r
516 IFE FTCHECK+FTMONP,<
\r
518 ;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)
\r
519 ;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARABLE DEVICE
\r
520 ;WSREQ AND RNREQ ARE UNUSED
\r
529 REQTAB: QUEUES ;GENERATE REQ TABLE
\r
531 \f;CORRESPONDENCE TABLE LH=QUEUE CODE, RH=QUEUE TRANSFER TABLE ADR.
\r
532 ;INDEX INTO TABLE ALSO = QUEUE CODE
\r
533 ;FOR SHARABLE DEVICES ONLY
\r
534 ;SCHEDULER TAKES ONE JOB WAITING FOR A SHARABLE DEVICE AND
\r
535 ;PUTS IT IN THE APPROPRIATE RUN QUEUE ACCORDING TO
\r
536 ;QUEUE TRANSFER TABLE AS SPECIFIED BELOW BY THE JOB WAIT
\r
543 QRNS=0 ;NO CORRESPONDENCE TABLES FO THESE QUEUE
\r
550 \fIFN FTCHECK+FTMONP,<
\r
551 EXTERNAL QJOB,JOBQUE ;JOBQUE WILL CAUSE LOAD OF PROPER SCHDAT
\r
552 ; DEPENDING ON FTRC10 IN SCHDAT
\r
556 IFE FTCHECK+FTMONP,<
\r
559 JOBQUE: 0 ;JOBS TO BE REQUEUED ON CLOCK INTERRUPT
\r
562 QJOB: Z ;NUMBER OF JOBS NEEDING Q TRANSFERS AT OTHER THAN CLOCK LEVEL
\r
565 XJOB: Z ;NUMBER OF JOBS NEEDING CORE EXPANSION BY SWAPOUT-IN
\r
569 \fINTERNAL QSTOP,QTIME,SSCAN,QCMW
\r
571 BQFIX=QFIX ;BEGINNING OF QUEUES FIXED QUEUE DISCIPLINE
\r
572 EQFIX=QFIX+1B0 ;END OF QUEUES " " "
\r
577 DEFINE TTAB(FCTN,QUEUE,QUANT)
\r
581 DEFINE PTTAB(FCTN,QUEUE,QUANT)
\r
586 QNULW: TTAB EQFIX,NULQ,-1 ;NULL QUEUE JOB NO. NOT ASSIGNED
\r
587 QSTOP:QSTOPW: TTAB EQFIX,STOPQ,-1 ;UNRUNABLE JOBS TO END OF STOPQ
\r
588 QCMW: TTAB EQFIX,CMQ,-1 ;COMMAND WAIT TILL JOB IN CORE
\r
589 QRNW: PTTAB EQJSIZ,QSTAB,QQSTAB ;JUST RUNABLE JOBS
\r
590 ;WHICH ARE NOT IN SOME WAIT STATE BELOW,ENTER PROCESSOR
\r
591 ;QS AT END AND GET QUANT. TIME ACCORDING TO THEIR SIZE
\r
593 QWSW: TTAB BQFIX,PQ1,QQTTY ;IO WAIT SAT.(EXCEPT TTY)
\r
594 ;ENTER FRONT OF PROCESSOR QS AND GET QUANT, TIME
\r
595 ;ACCORDING TO JOB SIZE
\r
596 QTSW: TTAB BQFIX,PQ1,QQTTY ;TTY IO WAIT SATISFIED(ENTER FRONT OF PQ11)
\r
598 QIOWW: TTAB EQFIX,IOWQ,-1 ;IOW(EXDEPT TTY) HELD IN IOWQ
\r
599 QTIOWW: TTAB EQFIX,TIOWQ,-1 ;TTY IOW HELD IN TIOWQ
\r
600 QAUW: TTAB EQFIX,AUQ,-1,
\r
601 QMQW: TTAB EQFIX,MQQ,-1 ;MON. Q(DISK) WAIT
\r
602 QDAW: TTAB EQFIX,DAQ,-1 ;DEV. ALLOC.(DISK)
\r
603 QDCW: TTAB EQFIX,DCQ,-1 ;DATA CONTROL WAIT
\r
604 QSTW: TTAB EQFIX,STQ,-1 ;SYST TAPE
\r
605 QDTW: TTAB EQFIX,DTQ,-1 ;DEC TAPE
\r
606 QMTW: TTAB EQFIX,MTQ,-1 ;MAG TAPE
\r
607 QSLPW: TTAB EQFIX,SLPQ,-1 ;SLEEP UUO
\r
608 \f;TRANSLATION TABLE FROM WAIT STATE TO SATISFIED STATE
\r
609 ;DO NOT RESET QUANTUM RUN TIME
\r
613 QMQS: TTAB BQFIX,PQ1,QQSD ;START MON. Q(DISK) AT PQ1
\r
614 QDAS: TTAB BQFIX,PQ1,QQSD ;DEV. ALLOC.(DISK)...
\r
615 QDCS: TTAB BQFIX,PQ1,QQSD ;DATA CONTROL...
\r
616 QSTS: TTAB BQFIX,PQ1,QQSD ;SYST TAPE
\r
617 QDTS: TTAB BQFIX,PQ1,QQSD ;DEC TAPE
\r
618 QMTS: TTAB BQFIX,PQ1,QQSD ;MAG TAPE
\r
619 QAUS: TTAB BQFIX,PQ1,QQSD ;ALTER UFD
\r
620 QTIME: PTTAB EQLINK,QTTAB,QQSTAB ;MOVE JOB TO LOWER Q
\r
621 ;WHEN QUANT. TIME EXCEEDED AND RESET QUANT. TIME
\r
622 \f,ENTER PROCESSOR QS ACCORDING TO JOB SIZE
\r
623 QSTAB: XWD 4,-PQ1 ;PQ1 IF SIZE .LE. 4K
\r
624 XWD ^D16,-PQ2 ;PQ2 IF 4K .L. SIZE .LE. 16K
\r
625 XWD ^D256,-PQ3 ;PQ3 IF 16 .L. SIZE
\r
627 ,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME
\r
628 QQTAB: XWD -PQ1,-PQ2
\r
630 XWD -PQ3,-PQ2 ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS
\r
633 ,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME
\r
634 QTTAB: XWD -PQ1,-PQ2
\r
636 XWD -PQ3,-PQ2 ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS
\r
641 QQSD=6 ;TENTH SEC. INITIAL QUANT. FOR SHAR. DEV. WAITERS
\r
642 QQTTY=6 ;TENTH SEC. INITIAL QUANT. FOR TTY IOWS
\r
644 , QUANT. TIMES ACCORDING TO PROCESSOR Q:
\r
649 QQSTAB: EXP ^D30 ;PQ1: ONE HALF SECOND
\r
650 EXP 2*^D60 ;PQ2: TWO SECONDS
\r
651 EXP 2*^D60 ;PQ3: TWO SECONDS
\r
654 INTERNAL ISCAN,QSCAN
\r
655 ISCAN: ;SCAN FOR INPUT
\r
656 XWD -CMQ,QFOR ;MONITOR COMMAND WHICH NEEDS CORE IMAGE IN CORE
\r
657 XWD -MQQ,QFOR1 ;LOOK FOR 1ST JOBS IN SHAR. DEV QUEUES
\r
664 SSCAN: XWD -PQ1,QFOR ;SCAN PROCESSOR AS SCHEDULER DOES
\r
669 Z ;FINAL ZERO TO FLAG END
\r
671 OSCAN: ;SCAN FOR OUTPUT
\r
672 XWD -STOPQ,QFOR ;UNRUNABLE JOBS FIRST
\r
674 XWD -DTQ,QBAK1 ;ANY SHAR. DEV.WAITERS MORE THAN 1 DEEP
\r
681 XWD -TIOWQ,QFOR ;TTY IOW
\r
685 XWD -MTQ,QFOR1 ;NOW SCAN FIRST JOB IN QUEUES
\r
694 Z ;FINAL ZERO TO FLAG END
\r
696 \fSUBTTL SWAP R. KRASIN/AF TS4.34 03 FEB 69 V406
\r
698 ,SWAPPER CALLED EVERY CLOCK TIC.
\r
699 ,SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL
\r
700 ,TICS TO RUN TO COMPLETON, SEVERAL FLAGS(FINISH,FIT,FORCE
\r
701 ;ARE USED TO "REMEMBER" PREVIOUS STATES.
\r
702 ,THE BASIC ALOGRITHM:
\r
703 ;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB?
\r
704 ; YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS)
\r
705 ;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH?
\r
706 ; YES--RETURN AND DO NOTHING
\r
707 ;IS SWAPPER STILL BUSY?
\r
708 ; YES--RETURN AND DO NOTHING
\r
709 ,SCAN QS FOR 1ST JOB OUT OF CORE.
\r
712 , IF ONE--WILL LOW(HIGH) SEG FIT IN LARGEST HOLE IN CORE?
\r
713 , YES--START INPUT AND RETURN
\r
714 , NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE LOW(HIGH) SEG?
\r
716 ; YES--CALL CORE SHUFFLER
\r
717 ; IS SHUFFLER WAITING FOR IO TO STOP?
\r
718 ; YES--RETURN AND DO NOTHING
\r
720 , NO--"REMEMBER" THIS JOB FROM INPUT AND LOOK FOR OUTPUT:
\r
721 ,ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN?
\r
722 , YES--OUTPUT ONE AND RETURN
\r
723 , NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME
\r
724 , (SET ON INPUT) HAS GONE TO 0.
\r
726 , IF ONE--IS IT SWAPPABLE(NO ACTIVE IO AND NOT CURRENT JOB)?
\r
727 , YES--OUTPUT HIGH SEG(IF ANY AND NOT ON DISK) THEN LOW SEGMENT
\r
728 , NO--SET SWP BIT(SO SCHEDULER WILL NOT RUN), IO WILL CONTINUE
\r
729 , IN LOW SEGEMENT AS LONG AS IT CAN
\r
730 , IO ROUTINES NO LONGER STOP IF SWP SET, JUST SHF)
\r
733 EXTERNAL BIGHOL,CORTAL,ANYDEV,JBTADR,JBTSWP,KCORE1,TRYSWP
\r
734 EXTERNAL IMGOUT,IMGIN,FINISH,FIT,FORCE
\r
735 EXTERNAL OERROR,CORGET,JBTDAT,JOBDPG,JOBDPD,JOBPC
\r
736 EXTERNAL JBTDAT,SHFWAT,CHKSHF
\r
737 EXTERNAL FULCNT,ERRPNT,EXCALP,PCSTOP,PCORSZ,VIRTAL
\r
740 INTERNAL XPAND,FT2REL
\r
747 ,ALL DEVICE DEPENDENT CODE MARKED WITH A "*"
\r
748 \fSWAP: SKIPE SHFWAT ;IS CORE SHUFFLER WAITING FOR IO TO STOP
\r
750 PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO SEE IF
\r
752 SKIPN SHFWAT ;IS SHUFFLER STILL WAITING?
\r
753 SKIPE SQREQ ;*NO--IS SWAP SERV, ROUT. STILL BUSY WITH LAST JOB?
\r
754 POPJ PDP, ;*YES--RETURN
\r
755 SETZM INFLG ;*** EXPERIMENTAL ***
\r
756 SKIPN J,FINISH ;NO--ANY IN/OUTPUT TO FINISH?
\r
758 JUMPL J,FINOUT ;YES--INPUT OR OUTPUT?
\r
759 SKIPE SERA ;INPUT, ANY INPUT ERRORS?
\r
761 FININ0: ;HERE IF NOTHING TO SWAP IN(HIGH OR LOW SEG EXPANDING FROM 0)
\r
764 PUSHJ PDP,FININ ;IS THERE A HIGH SEG WHICH MUST BE SWAPPED IN?
\r
765 JRST FIT1 ;YES, GO SWAP IT IN(J SET TO HIGH SEG NO.JOB # INPJOB)
\r
766 ; NO, EITHER HIGH SEG ALREADY IN FOR ANOTHER USER
\r
767 ; OR THERE IS NON, J STILL JOB NO,(IE LOW SEG)
\r
768 ; OR J IS HIGH SEG WHICH EXPANDED FROM NOTHING(XPANDH)
\r
769 ; IN WHICH CASE IT HAS NO DISK SPACE AND DIDLING ACS
\r
770 ; AND SETTING PROTECT TIME WON'T MATTER EITHER.
\r
772 LDB T,IMGIN ;NEW CORE SIZE
\r
773 LDB T1,IMGOUT ;OLD SIZE WHEN ON DISK
\r
774 SUB T1,T ;OLD-NEW=DECREASE
\r
775 ; HAS USER DECREASED VIRTUAL MEMORY FROM M TO N(N OR 0)
\r
776 ; WHILE OUT ON DISK(R,RUN,GET,KJOB) TO 140 WORDS?
\r
777 ; CORE COMMAND ALWAYS FORCES SWAP IN BEFORE
\r
778 ; CORE REASSIGNMENT SO NOT IN THIS CATAGORY
\r
779 ; FRAGMENTED USER TOO HARD TO PARTIALLY RECLAIM DISK SPACE
\r
780 ; ON REDUCTION WHICH DOES NOT GO TO 0
\r
781 SKIPLE T1 ;DECREASED?
\r
782 ADDM T1,VIRTAL ;YES, NOW INCREASE VIRTUAL MEMORY AVAILABLE BY
\r
783 ; AMOUNT OF DECREASE IN HIGH OR LOW SEG
\r
784 PUSHJ PDP,ZERSWP ;RETURN LOW SEG DISK SPACE, SET IMGOUT,IMGIN
\r
785 ; AND SWP!SHF(JBTSTS) TO 0
\r
786 LDB T,PCORSZ ;COMPUTE AND SET IN CORE IN CORE PROTECT TIME FROM
\r
787 ; SIZE OF JOB(1K BLOCKS-1)
\r
788 IMUL T,PROT ;ADD VARIABLE AMOUNT DEPENDING ON CORE SIZE
\r
789 ADD T,PROT0 ;ADD FIXED AMOUNT INDEPENDENT OF CORE SIZE
\r
791 MOVE JDAT,JBTDAT(J) ;SETUP LOW SEG PROTECTION,RELOCATION
\r
793 MOVE PROG,JBTADR(J)
\r
795 MOVE T,JOBPC(JDAT) ;JOB STOPPED IN EXEC MORE?
\r
796 TLNE T,USRMOD ;TEST PD FLAG
\r
798 HRRZ T,JOBDPG(JDAT) ;YES, ADJUST PROG AND PDP IN DUMP AC AREA
\r
799 SUBI T,(PROG) ;OLD RELOC-NEW RELOC
\r
800 MOVNS T ;NEW RELOC-OLD RELOC
\r
801 ADDM T,JOBDPD(JDAT) ;ADJUST DUMP PDP
\r
802 MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG
\r
805 INERR: SETZM FINISH ;CLEAR FINISH FLAG SO SWAPPING CAN CONTINUE
\r
806 MOVE PROG,JBTADR(J) ;SETUP RELOC,PROTECTION FOR HIGH OR LOW SEG
\r
807 IFN PROG-JDAT,<MOVE JDAT,JBTDAT(J)>
\r
808 PUSHJ PDP,KCORE1 ;RETURN CORE
\r
809 JSP TAC,ERRPNT ;PRINT ON USER CONSOLE
\r
810 ASCIZ /SWAP READ ERROR/
\r
811 JRST PCSTOP ;STOP JOB AND FORCE RESCHDULING
\r
812 FINOUT: MOVNS J ;FINISH OUTPUT, -FINISH=JOB NO.
\r
813 SKIPE SERA ;ANY ERRORS
\r
814 JRST SWPREC ;YES, RECORD ERROR AND TRY AGAIN,
\r
815 ; IN A DIFFERENT PLACE ON DISK
\r
816 MOVE PROG,JBTADR(J) ;XWD PROTECT,,RELOC. FOR LOW SEG
\r
818 MOVE JDAT,JBTDAT(J) ;JOB DATA AREA
\r
820 PUSHJ PDP,KCORE1 ;RETURN CORE FOR LOW OR HIGH SEG JUST SWAPPED OUT
\r
822 ; ANOTHER JOB STARTED TO SHARE HIGH SEG DURING
\r
823 ; SWAP OUT (GET) SINCE JOB IS MARKED WITH
\r
824 ; SWP BIT ON AND CANNOT RUN UNTIL HGIH SEG IS SWAPPED BACK IN
\r
827 PUSHJ PDP,FINOT ;IS THIS A HIGH SEG WHICH WAS JUST SWAPPED OUT?
\r
828 ;YES, J SET TO LOW SEG NO, GO TRY SWAP IT OUT
\r
829 ; NO, THIS WAS A LOW SEG, ALL SWAPPING FOR THIS USER
\r
832 SWP1: SETZM FINISH ;CLEAR FINISH FLAG
\r
833 SWP2: SKIPE J,FORCE ;WAITING FOR JOB TO BECOME SWAPPABLE?
\r
835 FIT0: SKIPE J,FIT ;NO-- WAITING TO FIT JOB IN CORE?
\r
840 JRST CHKXPN ;NO INPUT TO DO--CK FOR EXPANDING JOBS
\r
841 MOVE T,JBTSTS(J) ;THIS JOB OUT OF CORE?
\r
842 TLNN T,SWP ;SWP ON IF HIGH SEG SWAPPED OUT FOR THIS USER
\r
843 ; OR BOTH SEGS SWAPPED OUT
\r
845 JRST (TAC1) ;NO--CONTINUE SCAN
\r
847 FIT1: MOVEM J,FIT ;REMEMBER JOB(OR HIGH SEG) TRYING TO FIT IN
\r
848 LDB AC1,IMGIN ;CORE SIZE NEEDED FOR THIS SEG(0 IF LOW SEG
\r
849 ; OR HIGH SEG WITH UWP OFF ALREADY IN CORE)
\r
851 CAMLE AC1,CORTAL ;WILL LOW SEG FIT IN FREE+DORMANT CORE?
\r
855 PUSHJ PDP,FITSIZ ;COMPUTE AMOUNT OF CORE NEEDED TO BRING IN
\r
856 ; 1. THIS JOBS LOW SEG AND HIGH SEG
\r
857 ; 2. THIS JOBS LOW SEG(HIGH ALREADY IN OR NONE)
\r
858 ; 3. THIS HIGH SEG BECAUSE LOW SEG ALREADY IN
\r
859 ;WILL LOW SEG FIT IN FREE+DORMANT+IDLE CORE?
\r
861 JRST SCNOUT ;NO,WILL NOT FIT EVEN IF ALL DORMANT SEGS DELETED
\r
862 ; AC1=TOTAL CORE NEEDED(IN K)
\r
863 CAMG AC1,BIGHOL ;YES, WILL THIS SEG FIT IN BIGGEST HOLE OF FREE CORE
\r
864 ; WITHOUT DELETING ANY DORMANT OR IDLE SEGS?
\r
865 ; (AC1 RESTORED TO SIZE FOR JUST THIS LOW OR HIGH SEG)
\r
867 JRST SWAPI ;YES, GO SWAP IN THIS LOW OR HIGH SEG
\r
869 EXTERN FRECR1,HOLEF
\r
870 SKIPN HOLEF ;NO, ARE THERE ANY HOLES IN CORE WHICH THE SHUFFLER
\r
871 ; COULD ELIMINATE(NOT COUNTING ONE AT TOP)?
\r
872 PUSHJ PDP,FRECR1 ;NO, GO DELETE ONE DORMANT SEG IN CORE
\r
873 ; AND ALWAYS SKIP RETURN(THERE MUST BE AT LEAST
\r
874 ; ONE, OTHERWISE CORTAL=BIGHOL)MONITOR ERROR IF NONE
\r
876 PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO MOVE ONE SEG DOWN
\r
877 SKIPN SHFWAT ;SHUFFLER WAITING FOR IO TO STOP?
\r
878 JRST FIT0 ;NO, SEE IF JOB WILL FIT NOW.
\r
879 POPJ PDP, ;YES, RETURN AND WAIT TILL IO STOPS
\r
880 \fEXTERN VIRTAL,SWPERC
\r
882 SWPREC: MOVE TAC,SERA ;ERROR FLAGS
\r
883 IORM TAC,SWPERC ;SAVE FOR POSTERITY
\r
884 LDB TAC,IMGOUT ;DECREASE TOTAL AMOUNT
\r
885 MOVNS TAC ;OF VIRTUAL CORE IN THE MACHINE
\r
886 ADDM TAC,VIRTAL ;BY THE AMOUNT BEING GIVEN UP
\r
890 JRST SWAPO ;GO TRY AGAIN
\r
892 ;NO INPUT TO DD, CHECK FOR EXPANDING JOBS
\r
893 CHKXPN: SKIPG XJOB ;ANY JOBS TO EXPAND
\r
894 POPJ PDP, ;NO, RETURN FROM SWAPPER, NOTHING TO INPUT OR OUTPUT
\r
895 ; YES, FALL INTO SCNOUT WHICH WILL SWAP OUT EXPANDING
\r
896 ; JOB SINCE THERE IS ONE
\r
897 ;INPUT TO DO, CHECK TO SEE IF ANY JOBS JUST HAPPEN TO WANT TO EXPAND
\r
899 EXTERN HIGHJB,JBTSTS,ERROR,MAXSIZ,MAXJBN,SUMCOR
\r
900 SCNOUT: SKIPG XJOB ;ANY JOBS WAITING TO EXPAND?
\r
901 JRST SCNJOB ;NO, SCAN ALL JOBS IN PRIORITY ORDER LOOKING
\r
902 ; FOR ONE TO SWAP OUT
\r
903 MOVE J,HIGHJB ;YES, START WITH HIGHEST JOB NUMBER ASSIGNED
\r
904 MOVSI T,JXPN ;SETUP JOB EXPANDED BIT
\r
905 TDNN T,JBTSTS(J) ;IS THIS JOB EXPANDING?
\r
906 SOJG J,.-1 ;NO, KEEP LOOKING
\r
908 JUMPG J,SCNOK ;CLEAR XJOB SO MESSAGE WILL PRINT
\r
909 JSP DAT,ERROR ;ERROR IF NONE FOUND
\r
911 SCNOK: SOS XJOB ;DECREMENT COUNT OF EXPANDING JOBS
\r
912 ANDCAM T,JBTSTS(J) ;CLEAR EXPAND BIT IN JOB STATUS WORD
\r
913 JRST FORCE0 ;GO TRY TO SWAP JOB OUT
\r
914 \f;SCAN FOR JOB TO OUTPUT IN ORDER TO MAKE ROOM FOR JOB TO COME IN
\r
915 ;SIZE(IN K) NEEDED TO GET THIS USER IN CORE IS IN AC1(FITSIZ)
\r
916 ;JUST LOW SEG SIZE IF NO HIGH OR HIGH ALREADY IN, JUST HIGH IF LOW ALREADY IN,
\r
917 ;OR SUM IF BOTH MUST BE SWAPPED IN
\r
919 SCNJOB: MOVE T,CORTAL ;INITIALIZE FREE CORE COUNTER
\r
921 SETZM MAXSIZ ;CLEAR SIZE OF LARGEST JOB
\r
922 MOVEI DAT,OSCAN ;SCAN ALL JOBS RANKED IN PRIORITY TO BE SWAPPED OUT
\r
924 JRST NOFIT ;NO MORE JOBS LEFT, CANNOT FIT JOB IN CORE
\r
925 CAMN J,FIT ;IS THIS JOB WE ARE TRYING TO FIND IN?
\r
926 JRST(TAC1) ;YES, GO FIND NEXT JOB TO OUTPUT
\r
927 SKIPGE T,JBTSTS(J) ;JOB RUN BIT STILL ON(JOB STILL WANT TO RUN)?>
\r
928 SKIPGE JBTSWP(J) ;YES, IS PROTECT TIME STILL LEFT?
\r
929 ; PROTECT TIME IS DECREMENTED ONLY WHEN
\r
930 ; A JOB IS RUNABLE, SO LOOK AT IT
\r
931 ; ONLY IF RUN BIT STILL ON
\r
932 TLNE T,NSWP+SWP ;NO, IS THIS JOB NOT TO BE SWAPPED OR ALREADY SWAPPED?
\r
933 ; (DISPLAY, REAL TIME)?
\r
934 JRST (TAC1) ;YES,CONTINUE SCAN TO FIND ANOTHER
\r
935 HLRZ T,JBTADR(J) ;PICK UP SIZE OF JOB
\r
936 JUMPE T,(TAC1) ;CONTINUE SCAN IF NOT IN CORE (HIGH SEG ALREADY SWAPPED)
\r
937 ; OUT FOR THIS USER IF NO LOW SEG)
\r
938 ASH T,-12 ;CONVERT TO 1K BLOCKS
\r
942 PUSHJ PDP,FORSIZ ;INCREASE SIZE(T) BY HIGH SEG IF THIS JOB
\r
943 ; IS ONLY ONE IN CORE USING HIGH SEG(J= JOB # STILL)
\r
945 CAMG T,MAXSIZ ;LARGEST SO FAR?
\r
947 MOVEM T,MAXSIZ ;YES, SAVE SIZE
\r
948 MOVEM J,MAXJBN ;AND JOB NUMBER
\r
949 FORCE2: ADDM T,SUMCOR ;ADD TO TOTAL
\r
950 CAMLE AC1,SUMCOR ;FOUND ENOUGH CORE FOR JOB TO BE FIT IN?
\r
951 JRST (TAC1) ;NO. LOOK FOR MORE
\r
952 MOVE J,MAXJBN ;YES, SWAP OUT LARGEST
\r
953 \fFORCE0: PUSHJ PDP,TRYSWP ;CAN THIS JOB BE STOPPED IN ORDER TO DO SWAP?
\r
954 JRST (TAC1) ;NO, NSWP OR NSHF SET(DISPLAY,REAL TIME) OR
\r
955 ; SAVE OR GET IN PROGRESS WITH DEVICE STILL ACTIVE
\r
956 ; LOOK FOR AN OTHER JOB TO SWAP
\r
960 PUSHJ PDP,FORHGH ;IS THERE A HIGH SEG TO BE WRITTEN BEFORE
\r
961 ; TRYING TO SWAP OUT LOW SEGMENT?
\r
962 ; WRITE HIGH SEG IF ALL OF THE FOLLOWING ARE TRUE:
\r
963 ; 1. JOB HAS A HIGH SEG AND
\r
964 ; 2. IT HAS NOT BEEN SWAPPED FOR THIS USER
\r
966 ; 3. IT IS IN CORE(NOT XPANDH)
\r
967 ; 4. IF IN-CORE COUNT IS EXECTLY 1 MEANING
\r
968 ; THIS ONLY USER USING IN CORE
\r
969 ; 5. HIGH SEG NOT ON DISK YET
\r
970 ; 6. THIS HIGH SEG IS NOT THE SAME ONE AS JOB
\r
971 ; BEING FITTED IN IS GOING TO WANT
\r
973 ; RETURN HIGH SEG NO. IN J IF YES, OTHERWISE
\r
974 ; RETURN LOW SEG NO.
\r
975 ; IF JOB JUST HAS LOW SEG. SHF BIT IS SET IN JBTSTS
\r
976 ; FOR JOB SO IO WILL STOP NEXT BUFFERE
\r
978 MOVSI T,SWP!IFE FT2REL,<SHF> ;SET SWAPPED OUT BIT FOR LOW OR HIGH SEG
\r
979 IORM T,JBTSTS(J) ;SCHEDULER WILL NO LONGER RUN THIS JOB
\r
980 ; SET SHF BIT IF ONE SEG SOFTWARE, SO IO WILL
\r
981 ; STOP AFTER NEXT BUFFERFUL.
\r
983 FORCEL: MOVEM J,FORCE ;ASSUME NOT SWAPPABLE--IS IT?
\r
987 MOVE JDAT,JBTDAT(J)
\r
989 SKIPN PROG,JBTADR(J) ;LOC. IN PHYSICAL CORE, IS CORE
\r
990 ; ASSIGNED IN MEMORY?
\r
991 JRST SWAPO ;NO, CANNOT HAVE ACTIVE DEVICES
\r
992 CAME J,JOB ;IF THIS IS CURRENT JOB, WAIT UNTIL
\r
993 ; PROTECTED AREA IS MOVED BACK TO JOB DATA AREA
\r
994 PUSHJ PDP,ANYDEV ;ANY ACTIVE DEVICES?(2ND HALF OF ANYACT BOUT.)
\r
995 POPJ PDP, ;YES--RETURN AND WAIT FOR I/O TO STOP.
\r
996 \f;SWAP OUT LOW OR HIGH SEGEMENT
\r
1001 IFN FTTRACK,<EXTERN LASOUT
\r
1002 MOVEM J,LASOUT ;SAVE LAST SWAP OUT FOR DEBUGGING ONLY
\r
1004 SETZM FORCE ;CLEAR FORCE FLAG
\r
1005 HLRZ T,JBTADR(J) ;COMPUTE CORE IMAGE
\r
1006 JUMPE T,SWP1 ;DONT OUTPUT IF 0 CORE(IMGOUT ALREADY SET TO 0
\r
1007 ; WHEN CORE WAS RETURNED
\r
1010 MOVNM T,T2 ;*SAVE COUNT FOR CALL TO SQOUT
\r
1011 ASH T,-^D10 ;CONVERT TO 1K BLOCKS
\r
1013 DPB T,IMGOUT ;RECORD AS OUT IMAGE
\r
1014 HRLI T1,-1(T2) ;*BUILD AND SAVE IOWD FOR SQOUT
\r
1016 LDB DAT,IMGIN ;HAS SIZE OF CORE NEEDED WHEN NEXT SWAPPED IN
\r
1017 SKIPN DAT ;ALREADY BEEN SET(XPAND)
\r
1018 DPB T,IMGIN ;NO, SO SET TO # 1K BLOCKS OF CORE NEEDED
\r
1019 MOVE DAT,T ;*CONVERT CORE IMAGE TO 128 WD BLOCKS
\r
1020 PUSHJ PDP,GXSAT ;*GET DEVICE STORAGE
\r
1021 JRST FULL ;*NONE AVAILABLE
\r
1022 HRLM TAC,JBTSWP(J) ;*SAVE DEVICE ADDRESS
\r
1023 OUTP2: MOVNM J,FINISH ;DISK SWAP SPACE ASSIGNED, NOW SET FINISH FLAG
\r
1024 ; SO THAT SWAPPER WILL KNOW WHICH SEG FINISHED
\r
1025 ; WHEN IO COMPLETED(SQREQ BECOMES ZERO)
\r
1026 POP PDP,TAC1 ;*GET IOWD
\r
1027 JRST SQOUT ;*START OUTPUT AND RETURN
\r
1029 NOFIT: SETZM FIT ;FORGET ABOUT FITTING IN A JOB ON DISK
\r
1030 SETOM INFLG ;*** EXPERIMENTAL *** MARK DESIRE TO INPUT
\r
1031 POPJ PDP, ;ALL JOBS IN CORE RE HIGHER PRIORITY.
\r
1032 \f;COME HERE WHEN THE AMOUNT OF SPACE NEEDED ON THE DISK
\r
1033 ;IS NOT AVAILABLE IN ONE CONTIGUOUS BLOCK
\r
1037 FULL: HRLM DAT,AC3 ;SAVE DAT (LARGEST AVAILABLE HOLE)
\r
1038 PUSHJ PDP,FULCOR ;GET 4 FREE CORE LOCS
\r
1039 HLRZ DAT,AC3 ;RESTORE DAT
\r
1040 MOVE AC3,TAC1 ;LOC OF 1ST FREE CELL
\r
1041 HRLI AC3,-4 ;4 LOCS
\r
1042 TRO TAC1,FRGSEG ;LIGHT FRAGMENTED BIT
\r
1043 HRLM TAC1,JBTSWP(ITEM) ;SAVE LOC OF TABLE IN JBTSWP
\r
1044 FULL1: PUSH PDP,DAT ;SAVE AMOUNT OF SPACE BEING REQUESTED
\r
1045 FULL1A: PUSHJ PDP,GXSAT ;GET SOME SWAPPING SPACE
\r
1046 JRST FULL2 ;CANT HAVE THAT MUCH
\r
1047 HRRM TAC,(AC3) ;SAVE LOC OF THE DISK SPACE
\r
1048 POP PDP,DAT ;RESTORE AMT GOTTEN
\r
1049 HRLM DAT,(AC3) ;SAVE AMOUNT IN TABLE
\r
1050 SUB T,DAT ;AMOUNT STILL NEEDED
\r
1052 JUMPE T,FULSET ;THROUGH IF NEED 0 K NOW
\r
1053 PUSHJ PDP,BMPAC3 ;STEP TO NEXT TABLE LOCATION
\r
1054 MOVE DAT,T ;TRY TO GET ALL WE NEED NOW IN 1 CHUNK
\r
1055 FULL1B: MOVE DAT,T ;RESET AMOUNT OF SPACE NEEDED
\r
1057 ;COME HERE WHEN CANT GET THE CHUNK REQUESTED
\r
1058 FULL2: MOVEM DAT,(PDP) ;DAT HAS LARGEST CHUNK AVAILABLE
\r
1059 JUMPG DAT,FULL1A ;GO GET THAT AMOUNT
\r
1062 PUSHJ PDP,FRESWP ;TRY TO DELETE AN UNUSED HIGH SEG FROM DISK
\r
1063 JRST FULL1B ;FOUND ONE, TRY AGAIN, J PRESERVED
\r
1064 ; NONE FOUND, PRINT MONITOR ERROR
\r
1068 POP PDP,TAC ;WHAT? NONE LEFT?
\r
1069 POP PDP,TAC ;SET PDP TO RIGHT VALUE
\r
1070 JSP DAT,CERROR ;ERROR IN MONITOR AT .....
\r
1072 ;HERE WHEN THE TOTAL AMOUNT OF SPACE NEEDED HAS BEEN OBTAINED
\r
1073 FULSET: PUSHJ PDP,BMPAC3 ;STEP TO NEXT (LAST) TABLE LOCATION
\r
1074 HLRZ TAC,JBTSWP(ITEM) ;LOC OF TABLE OF FRAGMENTS
\r
1075 JRST OUTP2 ;GO START OUTPUT
\r
1077 ;HERE TO GET 4 LOCS OF FREE CORE
\r
1078 FULCOR: PUSH PDP,ITEM ;GETFCR USES ITEM
\r
1079 PUSHJ PDP,GETFCR ;GET 4 CELLS
\r
1080 JRST IPOPJ ;RETORE ITEM AND RETURN
\r
1082 ;STEP AC3 TO NEXT LOC OF TABLE BEING BUILT
\r
1083 BMPAC3: AOBJN AC3,CPOPJ ;OK IF MORE LOCS OF TABLE
\r
1084 PUSHJ PDP,FULCOR ;GET 4 MORE LOCS
\r
1086 CAIN TAC1,(AC3) ;ARE THEY CONTIGUOUS?
\r
1087 POPJ PDP, ;YES. RETURN
\r
1088 MOVE TAC,-1(AC3) ;NO. CONVERT LAST GOOD LOC
\r
1089 HRROM TAC1,-1(AC3) ;TO A POINTER TO NEXT PART OF TABLE
\r
1090 MOVEM TAC,(TAC1) ;STORE GOOD DATA IN 1ST WD OF NEW PART
\r
1092 HRR AC3,TAC1 ;NEW TABLE LOC
\r
1093 AOBJN AC3,CPOPJ ;COUNT WORD AND RETURN
\r
1094 \f;SWAP IN A JOB OR HIGH SEGMENT
\r
1098 IFN FTTRACK,<EXTERN LASIN
\r
1099 MOVEM J,LASIN ;SAVE LAST SWAP IN FOR DEBUGGING ONLY
\r
1102 MOVEM J,FINISH ;SET FINISH FLAG TO INPUT
\r
1103 SETZM FIT ;CLEAR FIT FLAG
\r
1104 LDB TAC,IMGIN ;SIZE OF CORE TO BE ASSIGNED WHEN SWAPPED IN (INK)
\r
1105 LSH TAC,^D10 ;CONVERT TO HIGHEST ADR
\r
1106 SUBI TAC,1 ;-1 FOR CALL TO CORGET
\r
1107 SKIPE PROG,JBTADR(J) ;IS (LOW)SEG ALREADY IN CORE?
\r
1108 JRST FININ0 ;YES, POSSIBLE IF THIS IS LOW SET AND ONLY
\r
1109 ; HIGH SEG WAS SWAPPED OUT.
\r
1110 PUSHJ PDP,CORGET ;NO, GET CORE FOR LOW OR HIGH SEG
\r
1111 JSP DAT,OERROR ;NOT AVAILABLE-SHOULD NEVER HAPPEN(TELL OPER)
\r
1113 IFN FT2REL,<EXTERN FITHGH
\r
1114 PUSHJ PDP,FITHGH ;INCREASE INCORE COUNT FOR THIS JOB'S HIGH SEG.
\r
1116 LDB T,IMGOUT ;GET OUTPUT IMAGE
\r
1117 JUMPE T,FININ0 ;DONT INPUT IF OUT IMAGE IS 0
\r
1118 LDB TAC1,IMGIN ;IS SIZE OF CORE SMALLER THAN DISK SPACE?
\r
1119 CAMGE TAC1,T ;WELL?
\r
1120 MOVE T,TAC1 ;YES, ONLY INPUT SMALLER AMOUNT(R,RUN,GET,KJOB)
\r
1121 LSH T,^D18+^D10 ;*BUILD IOWD FOR SQIN
\r
1123 HRR TAC1,JBTADR(J) ;*
\r
1124 HLRZ TAC,JBTSWP(J) ;*GET DEVICE ADDRESS
\r
1125 JRST SQIN ;*START INPUT
\r
1126 \f;ROUTINE TO CHANGE DISK SWAPPING SPACE ALLOCATION(OR SET TO 0)
\r
1127 ;DIFFERS FROM ZERSWP IN THAT VIRTUAL TALLY FOR SYSTEM IS ALSO CHANGED
\r
1128 ;CALLED FROM CORE0
\r
1129 ;CALL: MOVE ITE,JOB OR HIGH SEG NO.
\r
1130 ; MOVE TAC,#1K BLOCKS TO BE NEW ASSIGNMENT
\r
1131 ; PUSHJ PDP,CHGSWP
\r
1133 ;CALLED ONLY FORM VIRTUAL+PHYSICAL CORE ROUTINE CORE0
\r
1136 EXTERN JBTSTS,IMGIN,IMGOUT,JBTSWP,VIRTAL,IPOPJ
\r
1138 CHGSWP: LDB TAC1,IMGIN ;SIZE WHEN SEG NEXT SWAPPED IN
\r
1139 JUMPE TAC,CHG1 ;IS ZERO BEING ASKED FOR?
\r
1140 LSH TAC,-12 ;NO, COVNERT TO 1K BLOCKS
\r
1141 ADDI TAC,1 ;BUT DO NOT ATTEMPT TO RETURN DISK SPACE
\r
1142 ; SINCE IT MIGHT BE FRAGMENTED(SWAPPER WILL
\r
1143 ; RETURN ALL OF DISK SPACE ON NEXT SWAPIN)
\r
1144 ; HAPPENS ONLY ON R,RUN,GET,KJOB
\r
1145 DPB TAC,IMGIN ;STORE NEW SIZE WHEN NEXT SWAPPED IN
\r
1146 PUSH PDP,ITEM ;SAVE AN AC
\r
1147 LDB ITEM,IMGOUT ;GET OLD DISK SIZE OF THIS USER(USES ITEM)
\r
1148 CAMGE TAC1,ITEM ;IS OLD IN-CORE SIZE BIGGER?
\r
1149 MOVE TAC1,ITEM ;NO, USE DISK SIZE AS USER'S OLD VIRTUAL CORE
\r
1150 CAMGE TAC,ITEM ;IS NEW IN-CORE SIZE BIGGER?
\r
1151 MOVE TAC,ITEM ;NO, USE DISK SIZE AS USER NEW
\r
1153 SUB TAC1,TAC ;DECREASE OF USER VIRT, CORE=OLD-NEW
\r
1154 ADDM TAC1,VIRTAL ;USER'S DECREASE=SYSTEM'S INCREASE OF VIRTUAL
\r
1156 JRST IPOPJ ;RESTORE ITEM AND RETURN
\r
1157 \f;ROUTINE TO RETURN ALL OF DISK SPACE FOR A LOW OR HIGH SEG
\r
1158 ;THIS IS A PHYSICAL DEALLOCATION ONLY AND HAS NO EFFECT ON A SEGMENTS
\r
1159 ;VIRTUAL CORE ASSIGNMENT
\r
1160 ;CALL: MOVE ITEM,JOB NO. OR HIGH SEG NO.
\r
1161 ; PUSHJ PDP,ZERSWP
\r
1162 ;CALLED FROM SEGCON IN MANY PLACES(5)
\r
1163 ;AND FININ0 HERE IN SWAP
\r
1167 ZERSWP: TDZA TAC,TAC ;REQUEST O SPACE ON DISK AND ALWAYS SKIP
\r
1168 CHG1: ADDM TAC1,VIRTAL ;INCREASE SIZE OF VIRTUAL CORE AVAILABLE IN SYSTEM
\r
1169 ; AND THEN RETURN ALL OF DISK SPACE(CHGSWP)
\r
1170 MOVSI TAC1,SWP!SHF ;CLEAR SWAPPED OUT BIT IN JOB OR SEG
\r
1171 ANDCAM TAC1,JBTSTS(ITEM);STATUS WORD(SHF SET IF IO WAS TO BE STOPPED
\r
1172 ; FOR SWAP OR CORE SHUFFLE
\r
1174 PUSH PDP,DAT ;SAVE TTY OUTPUT BYTE POINTER(COMMAND DECODER)
\r
1175 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
1219 ;THE JOB MUST BE STOPPED UNTIL HIGH SEG SWAPPED IN JUS AS IF JOB HAS
\r
1220 ;EXPANDED HIGH SEG(MUST BE CALLED FROM UUO LEVEL FOR CURRENT JOB IF HIGH SEG)
\r
1221 ;CALL: MOVE ITEM,HIGH SEG NUMBER
\r
1222 ; PUSHJ PDP,XPANDH
\r
1229 PUSH PDP,ITEM ;SAVE JOB NUMBER
\r
1230 CAILE ITEM,JOBMAX ;IS THIS A LOW OR HIGH SEG?
\r
1231 MOVE ITEM,JOB ;HIGH,SO GET JOB NO.(MUST BE CURRENT JOB)
\r
1233 MOVSI TAC1,JXPN ;SET THIS JOB EXPANDING BIT SO IT WILL NOT BE RUN
\r
1234 TDNN TAC1,JBTSTS(ITEM) ;IS IT ALREADY SET FOR THIS JOB?(UNLIKELY)
\r
1235 AOS XJOB ;NO, INCREMENT COUNT ONLY ONCE FOR EACH JOB EXPANDING
\r
1236 IORM TAC1,JBTSTS(ITEM) ;AND SET JOB EXPANDING BIT
\r
1241 JRST IPOPJ ;RESTORE JOB OR HIGH SEG NUMBER (ITEM) AND RETURN
\r
1243 \fSUBTTL SWPSER R.KRASIN/AF TS4.34 03 FEB 69 V406
\r
1245 INTERNAL SQIN,SQOUT,SQGO,SQGO1
\r
1247 EXTERNAL DFBUSY,DFRED,DFWRT,CPOPJ,JOBDAC,MJOBCK,CHECK,JBTCHK
\r
1249 ;PUT A REQUEST IN THE SWAPPER QUEUE. ENTER AT SQIN FOR
\r
1250 ; INPUT, SWOUT FOR OUTPUT
\r
1251 ;CALL: MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.(IE IOWD+1)
\r
1252 ; HRRZ TAC,DISK BLOCK NO.
\r
1253 ; PUSHJ PDP,SQIN/SQOUT
\r
1254 ; RETURN HERE ALWAYS
\r
1255 ; CONTENTS OF TAC,TAC1 LOST
\r
1257 SQIN: TLO TAC,400000 ;SET READ INDICATOR
\r
1258 SQOUT: MOVEM TAC,SERA ;STORE THE BLOCK NUMBER
\r
1259 MOVEM TAC1,SQREQ ;STORE THE IOWD
\r
1260 MOVEM TAC1,ESQREQ ;SAVE IN CASE OF DISK ERROR ON FRAGMENTED JOB
\r
1261 MOVNI TAC,1 ;IS THE DEVICE BUSY?
\r
1263 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
1303 FRGIO2: LSH DAT,12 ;CONVERT FROM K TO WORDS
\r
1304 ADDM DAT,SQLEN ;ADD TO PREVIOUSLY TRANSFERRED AMOUNT
\r
1305 MOVNS DAT ;-N WORDS
\r
1306 HRLM DAT,TAC1 ;IOWD IN TAC1
\r
1307 HRLO DAT,DAT ;-NO. OF WRDS FOR THIS DISK TRANSFER TO TH
\r
1308 CAMG DAT,SQREQ ;COMPARE WITH - NO. WORDS FOR REST OF SEG
\r
1309 HLL TAC1,SQREQ ;SWAPPER ONLY WANTS TO READ A PORTION OF SEG
\r
1310 ; NOT ALL OF IT(R,RUN,GET,KJOB COMMAND)
\r
1311 MOVNS DAT ;+NO. OF WORDS FOR THIS NEXT TRANSFER
\r
1313 ADDM DAT,SQREQ ;UPDATE LH OF IOWD FOR ENTIRE SEG, SO IT HAS
\r
1314 ; -NO. OF WORDS LEFT AFTER THIS TRANSFER IS DONE
\r
1316 SQGO2: TLZ TAC,377777 ;*CLEAR POSSIBLE TRASH IN LH.
\r
1317 ROT TAC,BLKSPK ;*RE-POSITION DISK LOGICAL BLOCK NUMBER.
\r
1318 TRZE TAC,4 ;*TEST AND CLEAR READ/WRITE BIT.
\r
1319 SOJA TAC1,DFRED ;*YES
\r
1320 SOJA TAC1,DFWRT ;*NO, WRITE.
\r
1321 \f;SERVICE A SWAPPING INTERRUPT
\r
1322 EXTERNAL DINT4B,CKSMCT
\r
1325 SWPINT: TRNE IOS,IODTER!IODERR!IOIMPM
\r
1326 JRST SWPERR ;ERRORS
\r
1327 TRZE TAC,FRGSEG ;*FRAGMENTED?
\r
1328 SKIPL TAC1,SQREQ ;*YES, MORE IOWD TO GO?
\r
1329 JRST DINT8B ;NO, ALL DONE SWAP IN OR OUT
\r
1330 AOS SERA ;YES, FRAGMENTED AND MORE TO GO
\r
1331 SKIPE 1(TAC) ;IS THIS THE END OF SWAP COMMAND LIST?
\r
1332 AOJA TAC,FRAGIO ;NO, BO DO NEXT PIECE OF FRAGMENTED SEG
\r
1334 DINT8B: TLNN TAC,400000 ;*INPUT?
\r
1341 CAME TAC1,JBTCHK(TAC)
\r
1343 DINT8A: HRRZM IOS,SERA
\r
1347 SWPER1: MOVSI TAC,100
\r
1350 SWPERR: MOVM TAC, FINISH ;*RESET SERA IN CASE OF FRAGMENTED JOB
\r
1351 HLRZ TAC, JBTSWP(TAC) ;*SWAP LOC (DISK ADR OR TABLE ADR)
\r
1352 HRRM TAC, SERA ;*RESTORE SERA
\r
1353 MOVE TAC,ESQREQ ;RESTORE ESQREQ IN CASE OF FRAGMENTED JOB
\r
1355 SOSLE SERACT ;*TRIED ENOUGH?
\r
1356 JRST SQGO1 ;*NO, TRY AGAIN
\r
1357 JRST DINT8A ;*YES, TOUGH.
\r
1359 ;SWPSER LOGIC FOR THE OLD PDP-6 (DATA PRODUCTS) DISK FILE ---
\r
1361 ;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED
\r
1363 ;CALL: MOVEI DAT,NO. OF 1K BLOCKS DESIRED
\r
1365 ; ERROR EXIT (DISK IS FULL)
\r
1366 ; NORMAL EXIT ;C(TAC) = BLOCK NO.
\r
1368 ;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST.
\r
1371 EXTERNAL GETBIT,IPOPJ1
\r
1373 GXSAT: MOVE AC1,XSAT1 ;SAVE AC1, SET IT TO TABLE LOC.
\r
1375 LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS
\r
1376 PUSH PDP,ITEM ;SAVE C(ITEM)
\r
1378 MOVE ITEM,DAT ;GETBIT EXPECTS PARAMETER IN ITEM
\r
1379 PUSHJ PDP,GETBIT ;FIND A HOLE BIG ENOUGH
\r
1380 JRST IPOPJ ;NONE, RESTORE ITEM AND ERROR RETURN
\r
1381 MOVEI TAC,-1(TAC1)
\r
1382 CAIL TAC,BLOCKS ;IS IT ON DISK 17?
\r
1383 ADDI TAC,DIFF ;YES
\r
1384 LSH TAC,-CONVMD ;CARRY DISK ADDRESS SHIFTED TO FIT IN JBTSWP.
\r
1385 JRST IPOPJ1 ;SKIP RETURN AND RESTORE JOB NUMBER(ITEM)
\r
1387 ;FREE UP A SERIES OF BLOCKS ON THE SWAPPING DEVICE. CALLED
\r
1389 ;CALL: MOVEI DAT,NO. OF 1K BLOCKS TO FREE
\r
1390 ; MOVE TAC,BLOCK NO. OF FIRST DISK BLCOK TO FREE
\r
1391 ; PUSHJ PDP,FXSTAT
\r
1392 ; ALWAYS RETURN HERE
\r
1394 ;CONTENTS OF ACS TAC,TAC1 WILL BE LOST.
\r
1397 EXTERNAL CLRBIT,IPOPJ
\r
1399 FXSAT: LSH TAC,CONVMD ;RESTORE SHIFTED DISK ADDRESS.
\r
1400 CAIL TAC,HISWAP ;ON DISK 17?
\r
1401 SUBI TAC,DIFF ;YES
\r
1402 LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS
\r
1403 MOVE AC1,XSAT1 ;SET UP AC1 WITH POINTER TO SAT BLOCK
\r
1404 MOVE AC2,XSAT2 ;AC2 TOO
\r
1405 PUSH PDP,ITEM ;SAVE C(ITEM)
\r
1406 MOVE ITEM,DAT ;CLRBIT EXPECTS PARAMETER IN DAT
\r
1408 JRST IPOPJ ;RETURN, AND RESTORE ITEM
\r
1410 ;INITIALIZE SWAPPER DISK STORAGE TABLE
\r
1414 SWPINI: MOVE TAC,XSAT2
\r
1427 IFN FTCHECK+FTMONP,<
\r
1428 EXTERNAL SQREQ,SERA,SERACT,XSAT1,XSAT2,XSAT3,XSAT4,XSAT5,XSAT6,XSAT7
\r
1429 EXTERNAL XSAT8,SWPSIZ,HISWAP,DIFF,CONVMD,BLOCKS,XSAT31,XSAT4P,XSAT61
\r
1431 IFE FTCHECK+FTMONP,<
\r
1433 ;DATA AND STORAGE AREA FOR SWAPPING. ON THE 270 DISK, DISKS
\r
1434 ; 0 & 17 ARE USED FOR SWAPPING, ECH DISK CONTAINING
\r
1435 ; 5400 (OCTAL) RECORDS
\r
1437 INTERNAL SQREQ,SERA,SERACT
\r
1438 SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE
\r
1439 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE
\r
1440 ESQREQ: Z ;COPY OF SQREQ, IN CASE OF
\r
1441 ; ERROR IN FRAGMENTED JOB
\r
1442 SERA: Z ;SIGN IS 1 IF A READ
\r
1443 ; C(RH)=BLOCK NUMBER BEFORE READING.
\r
1444 ; ERROR BITS AFTER READING.
\r
1445 SERACT: 0 ;COUNT FOR ERRORS
\r
1446 SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR - FRAG SEG
\r
1448 XSAT1: EXP XSAT3-1 ;POINTER USED BY GETBIT,CLRBIT
\r
1449 XSAT2: XWD -SWPSIZ,XSAT4 ;POINTER TO BIT TABLE
\r
1450 XSAT3: XWD 400000, ;2-WORD TABLE ALTERED BY GETBIT,CLRBIT
\r
1453 ; BIT TABLE FOR SWAPPING ALLOCATION
\r
1454 XP BLOCKS,5400 ;NUMBER OF RECORDS/DISK PLATE
\r
1455 W1=BLOCKS/^D36 ;NUMBER OF ZERO WORDS AT TOP OF TABLE
\r
1456 E1=BLOCKS-W1*^D36 ;LEADING ZERO IN W1+1ST WORD
\r
1458 W2=EX/^D36 ;ZERO WORDS AT BOTTOM OF TABLE
\r
1459 E2=EX-W2*^D36 ;LEADING ZEROES IN W1+W2+2ND WORD
\r
1468 REPEAT ^D35-E1,<X=X*2>>
\r
1472 REPEAT ^D36-E2,<Z=Z+Y
\r
1479 SWPSIZ=XSAT6-XSAT4+1 ;SIZE OF TABLE
\r
1480 HISWAP=17*BLOCKS ;LOGICAL BLOCK NUMBER OF FIRST
\r
1482 DIFF=HISWAP-BLOCKS-1
\r
1484 XP CONVMD,3 ;CONVERSION FROM 1K CORE BLOCKS TO 128 WORD
\r
1485 ;DISC BLOCKS(SHIFT COUNT)
\r
1487 XP BLKSPK,CONVMD ;NO. OF BLOCKS PER K, SAME AS CONVMD
\r
1488 XSAT4P: XWD XSAT4,XSAT4+1
\r
1490 > ;END OF SWPSER LOGIC FOR THE OLD PDP-6 DISK.
\r
1492 ;SWPSER LOGIC FOR THE NEW PDP-10 (MODEL RC-10) DISK ---
\r
1494 INTERNAL GXSAT,FXSAT,SWPINI
\r
1495 EXTERNAL GETBIT,CLRBIT
\r
1496 EXTERNAL LBHIGH,IPOPJ,IPOPJ1
\r
1499 ;SUBROUTINE "GXSAT" IS CALLED TO FIND A SERIES OF CONSECUTIVE FREE BLOCKS ON
\r
1500 ; THE DISK TO SWAP SOME JOB OUT ONTO. IT IS CALLED AT CLOCK LEVEL.
\r
1502 ;CALLING SEQUENCE ---
\r
1504 ; ERROR EXIT --- THE DISK IS FULL, NO SWAPPING SPACE AVAILABLE.
\r
1506 ;ENTRY CONDITIONS ---
\r
1507 ; C(DAT) = NUMBER OF 1K BLOCKS OF DISK STORAGE NEEDED.
\r
1508 ;EXIT CONDITIONS ---
\r
1509 ; C(TAC) = LOGICAL BLOCK NUMBER (DIVIDED BY 8) OF THE FIRST DISK BLOCK IN
\r
1510 ; THE SERIES OF CONSECUTIVE BLOCKS WHICH SATISFY THIS REQUEST.
\r
1511 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.
\r
1513 GXSAT: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".
\r
1515 MOVEI AC1,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "GETBIT" SUBROUTINE.
\r
1518 JRST IPOPJ ;NO ROOM IN THE SWAPPING PART OF THE DISK.
\r
1519 ADDI TAC1,-1(ITEM) ;ROOM FOUND--COMPUTE LOGICAL BLOCK NUMBER OF THIS
\r
1520 CAMLE TAC1,MAXSWP ;FIRST BLOCK IN A SERIOES OF CONSECUTIVE FREE DISK
\r
1521 MOVEM TAC1,MAXSWP ;BLOCKS. THE "SWPTAB" TABLE SEARCHED HAS ONE BIT
\r
1522 LSH TAC1,BLKSPK ;FOR EACH 1K OF SWAPPING DISK SPACE. BUT IS STORED
\r
1523 SUB TAC1,LBHIGH ;BACKWARDS (1ST BIT OF SWPTAB = LAST 1K OF DISK).
\r
1524 MOVM TAC,TAC1 ;ALSO UPDATE "MAXSWP" IF PREVIOUS MAXIMUM EXCEEDED.
\r
1525 LSH TAC,-BLKSPK ;COMPRESS DISK ADDRESS TO 17 BITS FOR LH OF JBTSWP
\r
1526 AOJA TAC,IPOPJ1 ;ADD 1 TO TAC AND RESTORE ITEM AND SKIP RETURN
\r
1527 \f;SUBROUTINE "FXSAT" IS CALLED TO RETURN A SERIES OF CONSECUTIVE DISK BLOCKS TO
\r
1528 ; THE FREE STORAGE POOL. THUS MAKING THEM AVAILABLE FOR RE-USE IN HANDLING
\r
1529 ; FUTURE SWAPPING REQUESTS. IT IS CALLED AT CLOCK LEVEL.
\r
1531 ;CALLING SEQUENCE ---
\r
1534 ;ENTRY CONDITIONS ---
\r
1535 ; C(TAC) = LOGICAL BLOCK NUMBER OF THE FIRST DISK BLOCK IN THE
\r
1536 ; SERIES WHICH IS TO BE MADE AVAILABLE.
\r
1537 ; C(DAT) = NUMBER OF CONSECUTIVE 1K BLOCKS OF DISK SPACE WHICH
\r
1538 ; ARETO BE MADE AVAILABLE.
\r
1539 ;EXIT CONDITIONS ---
\r
1540 ; THE REQUESTED BITS IN THE SWAPPING SPACE AVAILABILITY TABLE
\r
1541 ; (NAMELY, SWPTAB) HAVE BEEN CLEARED TO ZERO.
\r
1542 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.
\r
1544 FXSAT: TRZN TAC,FRGSEG ;FRAGMENTED?
\r
1545 JRST FXSAT1 ;NO. DO IN REGULAR WAY
\r
1547 FRAGBK: HRRZ AC3,TAC ;YES. LOC OF TABLE IN AC3
\r
1548 FRGBK1: HRRZ TAC,(AC3) ;LOC OF NEXT DISK ADDRESS
\r
1549 HLRE DAT,(AC3) ;NUMBER OF K
\r
1550 JUMPLE DAT,FRGBK2 ;GIVE UP FREE CORE IF NOT REAL ADDRESS
\r
1551 PUSHJ PDP,FXSAT1 ;GIVE UP THE DISK SPACE FOR THIS PART
\r
1552 AOBJP AC3,FRGBK1 ;COUNT WORD OF TABLE, GET NEXT
\r
1553 FRGBK2: HRRZ TAC,AC3 ;LOC OF TABLE
\r
1555 HLRZ ITEM,AC3 ;NUMBER OF WDS IN TABLE
\r
1556 SUB TAC,ITEM ;POINT TAC TO 1ST WORD OF BLOCK
\r
1557 LSH ITEM,-2 ;4 WDS PER BIT
\r
1559 PUSHJ PDP,CLCOR1 ;GIVE UP FREE CORE
\r
1561 SKIPE TAC,(AC3) ;END OF TABLE?
\r
1562 JRST FRAGBK ;NO, GO CHASSE NEXT PART
\r
1563 POPJ PDP, ;YES, DONE
\r
1565 FXSAT1: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".
\r
1567 LSH TAC,BLKSPK ;REGENERATE THREE LOW ORDER 0 BITS IN DISK ADDRESS.
\r
1568 SUB TAC,LBHIGH ;PREPARE TO CLEAR BITS IN THE SWAPPING
\r
1569 MOVMS TAC ; AVAILABLITY TABLE BY TRANSFORMING THE LOGICAL
\r
1570 ADDI TAC,1 ; BLOCK NUMBER TO AN EQUIVALENT BIT NUMBER IN THIS
\r
1571 MOVNI AC1,BLKSPK ; TABLE (WHICH IS STORED IN REVERSE ORDER AND HAS
\r
1572 LSH TAC,(AC1) ; ONE BIT PER 1K OF SWAPPING SPACE ON THE DISK).
\r
1575 MOVE AC2,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "CLRBIT" SUBROUTINE.
\r
1576 FXSATC: PUSHJ PDP,CLRBIT ;THE "CLRBIT" SUBROUTINE IN "DSKSER" ACTUALLY DOES
\r
1577 ; THE WORK OF CLEARING THE BITS.
\r
1578 JRST IPOPJ ;RESTORE ITEM AND RETURN
\r
1579 ;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT
\r
1580 ; SYSTEM INITIALIZATION TIME.
\r
1582 EXTERN VIRTAL,SWPHGH
\r
1584 SWPINI: MOVE TAC,LBHIGH ;SET HIGHEST LOGICAL BLOCK
\r
1585 MOVEM TAC,SWPHGH ;FOR SWAPPING IN COMMON
\r
1586 MOVNI TAC,1 ;SET ENTIRE TABLE TO ONES, I.E., MARK EVERYTHING
\r
1587 MOVE TAC1,SWPENT ; AS BEING UNAVAILABLE FOR SWAPPING.
\r
1590 MOVEI AC1,SWPENT ;THEN USE THE "CLRBIT" ROUTINE TO CLEAR OUT AS MANY
\r
1591 MOVE AC2,SWPENT ; BITS AT THE FRONT OF THE TABLE AS THERE ARE 1K DISK
\r
1592 MOVE ITEM,K4SWAP ; AREAS ALLOCATED FOR SWAPPING USE. THE PARAMETER
\r
1593 MOVEM ITEM,VIRTAL ;TOTAL AMOUNT OF VIRTUAL CORE ALLOWED
\r
1594 ; IS JUS EQUAL TO AMOUNT OF SWAPPING SPACE
\r
1595 ; EVEN IF USER CAN NOT HAVE ALL OF PHYSICAL USER CORE
\r
1596 \f MOVEI TAC,0 ; "K4SWAP" IS SET UP DURING DISK REFRESHING, AND
\r
1597 ; RECALLED FROM THE DISK AT EACH SYSTEM-INITIALIZE.
\r
1598 JRST CLRBIT ;IN LIEU OF "PUSHJ CLRBIT" FOLLOWED BY "POPJ".
\r
1599 \fIFN FTCHECK+FTMONP,<
\r
1600 EXTERNAL RCXSDT ;DUMMY GLOBAL SYMBOL TO PERMIT THE SYSTEM BUILDER TO
\r
1601 ; RETRIEVE THE CORRECT BINARY COPY OF "SCHDAT".
\r
1602 EXTERNAL SQREQ,SERA,SERACT
\r
1603 EXTERNAL LBHIGH,BLKSPK,MAX2SWP,SWPENT,SWPTAB,MAXSWP
\r
1606 IFE FTCHECK+FTMONP,<
\r
1607 ;DATA ASSOCIATED WITH THE SWPSER LOGIC FOR THE NEW PDP-10 DISK ---
\r
1609 INTERN MXK2SWP,CONVMD,BLKSPK,SWPTAB,MAXSWP
\r
1611 ;THE ABOVE ARE REFERENCED OR INITIALIZED BY THE "ONCE" ROUTINE.
\r
1613 ;C(LOWSWP)=LOWEST LOGICAL BLOCK NUMBER TO BE USED FOR SWAPPING
\r
1614 ;DETERMINED BY ONCE ONLY REFRESH DIALOG
\r
1615 ;C(K4SWAP)=MAX. NO. OF K DISK WORDS ALLOCATED FRO SWAPPING, ALS
\r
1616 ;DETERMINED BY ONCE ONLY REFRESH DIALOG
\r
1617 MAXSWP: 0 ;MAX. NO. OF K FROM TOP TO LOWEST JOB
\r
1618 ; USED SINCE SYSTEM BEGAN
\r
1619 ;C(MAXSWP)=MAX. NO. OF K EVER ASSIGNED COUNTING FROM TOP DOWN TO
\r
1620 ;LOWEST EXCURSION, INCLUDING HOLS. WHEN = C(K4SWAP), THEN FREAGMENTATION HAD
\r
1621 ;HAPPENED SOMETIME DURING THE PAST
\r
1622 BLKSPK=3 ;SHIFT FACTOR TO CONVERT K OF CORE TO DISK BLOCKS, I.E.,
\r
1623 ; EIGHT DISK BLOCKS PER K OF CORE.
\r
1624 CONVMD=BLKSPK ;ONLY FOR CONSISTENCY WITH OLDER PDP-6 ROUTINE.
\r
1625 MXK2SWP=^D1000 ;MASIMUM NUMBER OF 1K DISK BLOCKS WHICH MIGHT BE ALLOCATED
\r
1626 ; FOR SWAPPING (UPPER BOUND ON THE VALUE OF K4SWAP WHICH
\r
1627 ; MAY BE REQUESTED AT DISK REFRESH TIME). (ONE MILLION WORDS
\r
1628 ; FOR SWAPPING SEEMS LIKE A NON-RESTRICTIVE ARBITRARY LIMIT.)
\r
1629 SWPSIZ=MXK2SWP/^D36+1 ;SIZE OF SWPTAB ALLOCATION TABLE.
\r
1631 SWPENT: XWD -SWPSIZ,SWPTAB ;THREE WORD POINTER TABLE
\r
1632 XWD 400000,0 ; REQUIRED BY THE "GETBIT" AND
\r
1633 XWD -SWPSIZ,SWPTAB ; "CLRBIT" SUBROUTINES.
\r
1635 SWPTAB: BLOCK SWPSIZ ;SWAPPING SPACE AVAILABILITY TABLE.
\r
1637 ;DATA CARRIED OVER FROM THE COMMON PART OF OLD AND NEW SWPSER ROUTINES ---
\r
1638 INTERNAL SQREQ,SERA,SERACT,ESQREQ
\r
1639 SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE
\r
1640 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE
\r
1641 ESQREQ: Z ;COPY OF SQREQ, IN CASE OF SWAP ERROR IN FRAGMENTED JOB
\r
1642 SERA: Z ;SIGN IS 1 IF A READ
\r
1643 ; C(RH)=BLOCK NUMBER BEFORE READING.
\r
1644 ; ERROR BITS AFTER READING.
\r
1645 SERACT: 0 ;COUNT FOR ERRORS
\r
1646 SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR FOR FRAGMENTED JOB
\r
1648 > ;END OF SWPSER LOGIC FOR THE NEW PDP-10 DISK.
\r