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 CKJR3 ;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,QJDB ;SET QJ NON ZERO IF ANY REQUEUING TO DO
\r
89 JRST CKJB5 ;NO REQUEUEING NECESSARY
\r
90 MOVEI J,JOBMAX ;START WITH HIGHEST JOB NUMBER ASSIGNED
\r
91 CKJB2: MOVSI SW,JBQ ;JOB NEEDS REQUEUEING BIT
\r
92 TDNN SW,JBTSTS(J) ;THIS JOB?
\r
93 SOJG J,.-1 ;NO, KEEP LOOKING
\r
94 JUMPLE J,CKJB5 ;YES,LOOKED AT ALL JOBS?
\r
95 ; (MAY NOT FIND A KJOBED JOB IF HIGHEST
\r
96 ; GO DECR, COUNT QJOB ANYWAY)
\r
97 ANDCAM SW,JBTSTS(J) ;NO,MARK THIS JOB AS DONE
\r
98 CKJB3: MOVE SW,JBTSTS(J) ;JOB STATUS WORD
\r
99 MOVEI DAT,QCMW ;ASSUME COMMAND WAIT
\r
100 TLNN SW,CMWB ;IS JOB IN COMMAND WAIT?
\r
102 TLNE SW,SWP+JXPN ;YES, IS JOB ON DISK, OR TRYING TO EXPAND?
\r
103 JRST CK,JB4A ;YES. PUT JOB IN COMMAND WAIT Q
\r
104 CKJB9: JUMPGE SW,CKJB4 ;NO,WAIT STATUS CODE DETERMINES NEW Q
\r
105 LDB SW,PJBSTS ;YES, GET QUEUE CODE.
\r
106 CAIN SW,WSQ ;*** EXPERIMENTAL ***
\r
107 JRST CKJB10 ;*** EXPERIMENTAL ***
\r
108 CAIN SW,TIOWD ;CURRENT JOB GOING INTO TTY IO WAIT?
\r
109 HRROS JBTSWP(J) ;YES, SET IN CORE PROTECT TIME TO -1,
\r
110 ; SO HE CAN BE SWAPPED IMMEDIATELY IF SOMEONE
\r
111 ; ELSE WANTS TO BE SWAPPED IN
\r
112 CKJB4B: SKIPA DAT,QBITS(SW) ;GET ADDRESS OF TRANSFER TABLE
\r
113 CKJB4: MOVEI DAT,QSTOP ;IF RUN BIT WAS OFF
\r
114 CKJB4A: PUSHJ PDP,QXFER ;REQUEUE THE JOB
\r
115 JUMPE QJ,SCHED ;IF FROM NXTJOB GO DIRECTLY TO SCHED
\r
116 ; I.E, CURRENT JOB NO LONGER RUNNABLE(IOW)
\r
117 ; BUT JRQ WASN'T SET SO DON'T DECR QJOB
\r
118 SOSLE QJ,QJOB ;ANY MORE JOBS TO REQUEUE?
\r
119 SOJG J,CKJB2 ;YES,BUT LOOK AT EACH JOB ONLY ONCE PER CLOCK TICK
\r
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 JBTCM1 ;EQUALS JBTQ-1
\r
218 EXTERNAL JBTOMN ;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,EQLINE
\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
486 \f;CORRESPONDENCE TABLE BETWEEN JOB STATUS CODES AND QUEUE TRANSFER TABLES
\r
488 ;RUNCSS SETS JOB STATUS WORD TO NEW STATE CODE.
\r
489 ;SCHEDULER SETS UP QUEUE TRANSFER TABLE ADDRESS FROM
\r
490 ;FOLLOWING TABLE USING NEW STATE CODE AS INDEX
\r
499 \fIFN FTCHECK+FTMONP,<
\r
506 IFE FTCHECK+FTMONP,<
\r
508 ;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)
\r
509 ;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARABLE DEVICE
\r
510 ;WSREQ AND RNREQ ARE UNUSED
\r
519 REQTAB: QUEUES ;GENERATE REQ TABLE
\r
521 \f;CORRESPONDENCE TABLE LH=QUEUE CODE, RH=QUEUE TRANSFER TABLE ADR.
\r
522 ;INDEX INTO TABLE ALSO = QUEUE CODE
\r
523 ;FOR SHARABLE DEVICES ONLY
\r
524 ;SCHEDULER TAKES ONE JOB WAITING FOR A SHARABLE DEVICE AND
\r
525 ;PUTS IT IN THE APPROPRIATE RUN QUEUE ACCORDING TO
\r
526 ;QUEUE TRANSFER TABLE AS SPECIFIED BELOW BY THE JOB WAIT
\r
533 QRNS=0 ;NO CORRESPONDENCE TABLES FO THESE QUEUE
\r
540 \fIFN FTCHECK+FTMONP,<
\r
541 EXTERNAL QJOB,JOBQUE ;JOBQUE WILL CAUSE LOAD OF PROPER SCHDAT
\r
542 ; DEPENDING ON FTRC10 IN SCHDAT
\r
546 IFE FTCHECK+FTMONP,<
\r
549 JOBQUE: 0 ;JOBS TO BE REQUEUED ON CLOCK INTERRUPT
\r
552 QJOB: Z ;NUMBER OF JOBS NEEDING Q TRANSFERS AT OTHER THAN CLOCK LEVEL
\r
555 XJOB: Z ;NUMBER OF JOBS NEEDING CORE EXPANSION BY SWAPOUT-IN
\r
559 \fINTERNAL QSTOP,QTIME,SSCAN,QCMW
\r
561 BQFIX=QFIX ;BEGINNING OF QUEUES FIXED QUEUE DISCIPLINE
\r
562 EQFIX=QFIX+1B0 ;END OF QUEUES " " "
\r
567 DEFINE TTAB(FCTN,QUEUE,QUANT)
\r
571 DEFINE PTTAB(FCTN,QUEUE,QUANT)
\r
576 QNULW: TTAB EQFIX,NULQ,-1 ;NULL QUEUE JOB NO. NOT ASSIGNED
\r
577 QSTOP:QSTOPW: TTAB EQFIX,STOPQ,-1 ;UNRUNABLE JOBS TO END OF STOPQ
\r
578 QCMW: TTAB EQFIX,CMQ,-1 ;COMMAND WAIT TILL JOB IN CORE
\r
579 QRNW: PTTAB EQJSIZ,QSTAB,QQSTAB ;JUST RUNABLE JOBS
\r
580 ;WHICH ARE NOT IN SOME WAIT STATE BELOW,ENTER PROCESSOR
\r
581 ;QS AT END AND GET QUANT. TIME ACCORDING TO THEIR SIZE
\r
583 QWSW: TTAB BQFIX,PQ1,QQTTY ;IO WAIT SAT.(EXCEPT TTY)
\r
584 ;ENTER FRONT OF PROCESSOR QS AND GET QUANT, TIME
\r
585 ;ACCORDING TO JOB SIZE
\r
586 QTSW: TTAB BQFIX,PQ,QQTTY ;TTY IO WAIT SATISFIED(ENTER FRONT OF PQ1)
\r
588 QIOWW: TTAB EQFIX,IOWQ,-1 ;IOW(EXDEPT TTY) HELD IN IOWQ
\r
589 QTIOWW: TTAB EQFIX,TIOWQ,-1 ;TTY IOW HELD IN TIOWQ
\r
590 QAUW: TTAB EQFIX,AUQ,-1,
\r
591 QMQW: TTAB EQFIX,MQQ,-1 ;MON. Q(DISK) WAIT
\r
592 QDAW: TTAB EQFIX,DAQ,-1 ;DEV. ALLOC.(DISK)
\r
593 QDCW: TTAB EQFIX,DCQ,-1 ;DATA CONTROL WAIT
\r
594 QSTW: TTAB EQFIX,STQ,-1 ;SYST TAPE
\r
595 QDTW: TTAB EQFIX,DTQ,-1 ;DEC TAPE
\r
596 QMTW: TTAB EQFIX,MTQ,-1 ;MAG TAPE
\r
597 QSLPW: TTAB EQFIX,SLPQ,-1 ;SLEEP UUO
\r
598 \f;TRANSLATION TABLE FROM WAIT STATE TO SATISFIED STATE
\r
599 ;DO NOT RESET QUANTUM RUN TIME
\r
603 QMSQ: TTAB BQFIX,PQ1,QQSD ;START MON. Q(DISK) AT PQ1
\r
604 QDAS: TTAB BQFIX,PQ1,QQSD ;DEV. ALLOC.(DISK)...
\r
605 QDCS: TTAB BQFIX,PQ1,QQSD ;DATA CONTROL...
\r
606 QSTS: TTAB BQFIX,PQ1,QQSD ;SYST TAPE
\r
607 QDTS: TTAB BQFIX,PQ1,QQSD ;DEC TAPE
\r
608 QMTS: TTAB BQFIX,PQ1,QQSD ;MAG TAPE
\r
609 QAUS: TTAB BQFIX,PQ1,QQSD ;ALTER UFD
\r
610 QTIME PTTAB EQLINK,QTTAB,QQSTAB ;MOVE JOB TO LOWER Q
\r
611 ;WHEN QUANT. TIME EXCEEDED AND RESET QUANT. TIME
\r
612 \f,ENTER PROCESSOR QS ACCORDING TO JOB SIZE
\r
613 QSTAB: XWD 4,-PQ1 ;PQ1 IF SIZE .LE. 4K
\r
614 XWD ^D16,-PQ2 ;PQ2 IF 4K .L. SIZE .LE. 16K
\r
615 XWD ^D256,-PQ3 ;PQ3 IF 16 .L. SIZE
\r
617 ,PUT JOB DOWN A Q IF EXCEEDS QUANT. TIME
\r
618 QQTAB: XWD -PQ1,-PQ2
\r
620 XWD -PQ3,-PQ2 ;BACK TO PQ2 TO COMPETE WITH IOWS JOBS
\r
625 QQSD=6 ;TENTH SEC. INITIAL QUANT. FOR SHAR. DEV. WAITERS
\r
626 QQTTY=6 ;TENTH SEC. INITIAL QUANT. FOR TTY IOWS
\r
628 , QUANT. TIMES ACCORDING TO PROCESSOR Q:
\r
633 QQSTAB: EXP ^D30 ;PQ1: ONE HALF SECOND
\r
634 EXP 2*^D60 ;PQ2: TWO SECONDS
\r
635 EXP 2*^D60 ;PQ3: TWO SECONDS
\r
638 INTERNAL ISCAN,QSCAN
\r
639 ISCAN: ;SCAN FOR INPUT
\r
640 XWD -CWM,QFOR ;MONITOR COMMAND WHICH NEEDS CORE IMAGE IN CORE
\r
641 XWD -MQQ,QFOR1 ;LOOK FOR 1ST JOBS IN SHAR. DEV QUEUES
\r
648 SSCAN: XWD -PQ1,QFOR ;SCAN PROCESSOR AS SCHEDULER DOES
\r
653 Z ;FINAL ZERO TO FLAG END
\r
655 QSCAN: ;SCAN FOR OUTPUT
\r
656 XWD -STOPQ,QFOR ;UNRUNABLE JOBS FIRST
\r
658 XWD -DTQ,QBAK1 ;ANY SHAR. DEV.WAITERS MORE THAN 1 DEEP
\r
665 XWD -TIOWQ,QFOR ;TTY IOW
\r
669 XWD -MTQ,QFOR1 ;NOW SCAN FIRST JOB IN QUEUES
\r
678 Z ;FINAL ZERO TO FLAG END
\r
680 \fSUBTTL SWAP R. KRASIN/AF TS4.34 03 FEB 69 V406
\r
682 ,SWAPPER CALLED EVERY CLOCK TIC.
\r
683 ,SINCE MOST OPERATIONS STARTED BY THE SWAPPER REQUIRE SEVERAL
\r
684 ,TICS TO RUN TO COMPLETON, SEVERAL FLAGS(FINISH,FIT,FORCE
\r
685 ;ARE USED TO "REMEMBER" PREVIOUS STATES.
\r
686 ,THE BASIC ALOGRITHM:
\r
687 ;IS CORE SHUFFLER WAITING FOR IO TO FINISH FOR SOME JOB?
\r
688 ; YES--TRY AGAIN TO SHUFFLE(WHEN IO STOPS)
\r
689 ;IS CORE SHUFFLER STILL WAITING FOR IO TO FINISH?
\r
690 ; YES--RETURN AND DO NOTHING
\r
691 ;IS SWAPPER STILL BUSY?
\r
692 ; YES--RETURN AND DO NOTHING
\r
693 ,SCAN QS FOR 1ST JOB OUT OF CORE.
\r
696 , IF ONE--WILL LOW(HIGH) SEG FIT IN LARGEST HOLE IN CORE?
\r
697 , YES--START INPUT AND RETURN
\r
698 , NO--IS TOTAL FREE CORE(CORTAL) ENOUGH TO ACCOMMODATE LOW(HIGH) SEG?
\r
700 ; YES--CALL CORE SHUFFLER
\r
701 ; IS SHUFFLER WAITING FOR IO TO STOP?
\r
702 ; YES--RETURN AND DO NOTHING
\r
704 , NO--"REMEMBER" THIS JOB FROM INPUT AND LOOK FOR OUTPUT:
\r
705 ,ANY JOBS WAITING TO XPAND CORE BY SWAP OUT/IN?
\r
706 , YES--OUTPUT ONE AND RETURN
\r
707 , NO--SCAN QS BACKWARD FOR JOB IN CORE WHOSE PROTECT TIME
\r
708 , (SET ON INPUT) HAS GONE TO 0.
\r
710 , IF ONE--IS IT SWAPPABLE(NO ACTIVE IO AND NOT CURRENT JOB)?
\r
711 , YES--OUTPUT HIGH SEG(IF ANY AND NOT ON DISK) THEN LOW SEGMENT
\r
712 , NO--SET SWP BIT(SO SCHEDULER WILL NOT RUN), IO WILL CONTINUE
\r
713 , IN LOW SEGEMENT AS LONG AS IT CAN
\r
714 , IO ROUTINES NO LONGER STOP IF SWP SET, JUST SHF)
\r
717 EXTERNAL BIGHOL,CORTAL,ANYDEV,JBTADR,JBTSWP,KCORE1,TRYSWP
\r
718 EXTERNAL IMGOUT,IMGIN,FINISH,FIT,FORCE
\r
719 EXTERNAL OERROR,CORGET,JBTDAT,JOBDPG,JOBDPD,JOBPC
\r
720 EXTERNAL JBTDAT,SHFWAT,CHKSHF
\r
721 EXTERNAL FULCNT,ERRPNT,EXCALP,PCSTOP,PCORSZ,VIRTAL
\r
724 INTERNAL XPAND,FT2REL
\r
731 ,ALL DEVICE DEPENDENT CODE MARKED WITH A "*"
\r
732 \fSWAP: SKIPE SHWAT ;IS CORE SHUFFLER WAITING FOR IO TO STOP
\r
734 PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO SEE IF
\r
736 SKIPN SHFWAT ;IS SHUFFLER STILL WAITING?
\r
737 SKIPE SQREQ ;*NO--IS SWAP SERV, ROUT. STILL BUSY WITH LAST JOB?
\r
738 POPJ PDP, ;*YES--RETURN
\r
739 SETZM INFLG ;*** EXPERIMENTAL ***
\r
740 SKIPN J,FINISH ;NO--ANY IN/OUTPUT TO FINISH?
\r
742 JUMPL J,FINOUT ;YES--INPUT OR OUTPUT?
\r
743 SKIPE SERA ;INPUT, ANY INPUT ERRORS?
\r
745 FININ0: ;HERE IF NOTHING TO SWAP IN(HIGH OR LOW SEG EXPANDING FROM 0)
\r
748 PUSHJ PDP,FININ ;IS THERE A HIGH SEG WHICH MUST BE SWAPPED IN?
\r
749 JRST FIT1 ;YES, GO SWAP IT IN(J SET TO HIGH SEG NO.JOB # INPJOB)
\r
750 ; NO, EITHER HIGH SEG ALREADY IN FOR ANOTHER USER
\r
751 ; OR THERE IS NON, J STILL JOB NO,(IE LOW SEG)
\r
752 ; OR J IS HIGH SEG WHICH EXPANDED FROM NOTHING(XPANDH)
\r
753 ; IN WHICH CASE IT HAS NO DISK SPACE AND DIDLING ACS
\r
754 ; AND SETTING PROTECT TIME WON'T MATTER EITHER.
\r
756 LDB T,IMGIN ;NEW CORE SIZE
\r
757 LDB T1,IMGOUT ;OLD SIZE WHEN ON DISK
\r
758 SUB T1,T ;OLD-NEW=DECREASE
\r
759 ; HAS USER DECREASED VIRTUAL MEMORY FROM M TO N(N OR 0)
\r
760 ; WHILE OUT ON DISK(R,RUN,GET,KJOB) TO 140 WORDS?
\r
761 ; CORE COMMAND ALWAYS FORCES SWAP IN BEFORE
\r
762 ; CORE REASSIGNMENT SO NOT IN THIS CATAGORY
\r
763 ; FRAGMENTED USER TOO HARD TO PARTIALLY RECLAIM DISK SPACE
\r
764 ; ON REDUCTION WHICH DOES NOT GO TO 0
\r
765 SKIPLE T1 ;DECREASED?
\r
766 ADDM T1,VIRTAL ;YES, NOW INCREASE VIRTUAL MEMORY AVAILABLE BY
\r
767 ; AMOUNT OF DECREASE IN HIGH OR LOW SEG
\r
768 PUSHJ PDP,ZERSWP ;RETURN LOW SEG DISK SPACE, SET IMGOUT,IMGIN
\r
769 ; AND SWP!SHF(JBTSTS) TO 0
\r
770 LDB T,PCORSZ ;COMPUTE AND SET IN CORE IN CORE PROTECT TIME FROM
\r
771 ; SIZE OF JOB(1K BLOCKS-1)
\r
772 IMUL T,PROT ;ADD VARIABLE AMOUNT DEPENDING ON CORE SIZE
\r
773 ADD T,PROT0 ;ADD FIXED AMOUNT INDEPENDENT OF CORE SIZE
\r
775 MOVE JDAT,JBTDAT(J) ;SETUP LOW SEG PROTECTION,RELOCATION
\r
777 MOVE PROG,JBTADR(J)
\r
779 MOVE T,JOBPC(JDAT) ;JOB STOPPED IN EXEC MORE?
\r
780 TLNE T,USRMOD ;TEST PD FLAG
\r
782 HRRZ T,JOBDPG(JDAT) ;YES, ADJUST PROG AND PDP IN DUMP AC AREA
\r
783 SUBI T,(PROG) ;OLD RELOC-NEW RELOC
\r
784 MOVNS T ;NEW RELOC-OLD RELOC
\r
785 ADDM T,JOBDPD(JDAT) ;ADJUST DUMP PDP
\r
786 MOVEM PROG,JOBDPG(JDAT) ;STORE NEW AC PROG
\r
789 INERR: SETZM FINISH ;CLEAR FINISH FLAG SO SWAPPING CAN CONTINUE
\r
790 MOVE PROG,JBTADR(J) ;SETUP RELOC,PROTECTION FOR HIGH OR LOW SEG
\r
791 IFN PROG-JDAT,<MOVE JDAT,JBTDAT(J)>
\r
792 PUSHJ PDP,KCORE1 ;RETURN CORE
\r
793 JSP TAC,ERRPNT ;PRINT ON USER CONSOLE
\r
794 ASCIZ /SWAP READ ERROR/
\r
795 JRST PCSTOP ;STOP JOB AND FORCE RESCHDULING
\r
796 FINOUT: MOVNS J ;FINISH OUTPUT, -FINISH=JOB NO.
\r
797 SKIPE SERA ;ANY ERRORS
\r
798 JRST SWPREC ;YES, RECORD ERROR AND TRY AGAIN,
\r
799 ; IN A DIFFERENT PLACE ON DISK
\r
800 MOVE PROG,JBTADR(J) ;XWD PROTECT,,RELOC. FOR LOW SEG
\r
802 MOVE JDAT,JBTDAT(J) ;JOB DATA AREA
\r
804 PUSHJ PDP,KCORE1 ;RETURN CORE FOR LOW OR HIGH SEG JUST SWAPPED OUT
\r
806 ; ANOTHER JOB STARTED TO SHARE HIGH SEG DURING
\r
807 ; SWAP OUT (GET) SINCE JOB IS MARKED WITH
\r
808 ; SWP BIT ON AND CANNOT RUN UNTIL HGIH SEG IS SWAPPED BACK IN
\r
811 PUSHJ PDP,FINOT ;IS THIS A HIGH SEG WHICH WAS JUST SWAPPED OUT?
\r
812 ;YES, J SET TO LOW SEG NO, GO TRY SWAP IT OUT
\r
813 ; NO, THIS WAS A LOW SEG, ALL SWAPPING FOR THIS USER
\r
816 SWP1: SETZM FINISH ;CLEAR FINISH FLAG
\r
817 SWP2: SKIPE J,FORCE ;WAITING FOR JOB TO BECOME SWAPPABLE?
\r
819 FIT0: SKIPE J,FIT ;NO-- WAITING TO FIT JOB IN CORE?
\r
824 JRST CHKXPN ;NO INPUT TO DO--CK FOR EXPANDING JOBS
\r
825 MOVE T,JBTSTS(J) ;THIS JOB OUT OF CORE?
\r
826 TLNN T,SWP ;SWP ON IF HIGH SEG SWAPPED OUT FOR THIS USER
\r
827 ; OR BOTH SEGS SWAPPED OUT
\r
829 JRST (TAC1) ;NO--CONTINUE SCAN
\r
831 FIT1: MOVEM J,FIT ;REMEMBER JOB(OR HIGH SEG) TRYING TO FIT IN
\r
832 LDB AC1,IMGIN ;CORE SIZE NEEDED FOR THIS SEG(0 IF LOW SEG
\r
833 ; OR HIGH SEG WITH UWP OFF ALREADY IN CORE)
\r
835 CAMLE AC1,CORTAL ;WILL LOW SEG FIT IN FREE+DORMANT CORE?
\r
839 PUSHJ PDP,FITSIZ ;COMPUTE AMOUNT OF CORE NEEDED TO BRING IN
\r
840 ; 1. THIS JOBS LOW SEG AND HIGH SEG
\r
841 ; 2. THIS JOBS LOW SEG(HIGH ALREADY IN OR NONE)
\r
842 ; 3. THIS HIGH SEG BECAUSE LOW SEG ALREADY IN
\r
843 ;WILL LOW SEG FIT IN FREE+DORMANT+IDLE CORE?
\r
845 JRST SCNOUT ;NO,WILL NOT FIT EVEN IF ALL DORMANT SEGS DELETED
\r
846 ; AC1=TOTAL CORE NEEDED(IN K)
\r
847 CAMG AC1,BIGHOL ;YES, WILL THIS SEG FIT IN BIGGEST HOLE OF FREE CORE
\r
848 ; WITHOUT DELETING ANY DORMANT OR IDLE SEGS?
\r
849 ; (AC1 RESTORED TO SIZE FOR JUST THIS LOW OR HIGH SEG)
\r
851 JRST SWAPI ;YES, GO SWAP IN THIS LOW OR HIGH SEG
\r
853 EXTERN FRECR1,HOLEF
\r
854 SKIPN HOLEF ;NO, ARE THERE ANY HOLES IN CORE WHICH THE SHUFFLER
\r
855 ; COULD ELIMINATE(NOT COUNTING ONE AT TOP)?
\r
856 PUSHJ PDP,FRECR1 ;NO, GO DELETE ONE DORMANT SEG IN CORE
\r
857 ; AND ALWAYS SKIP RETURN(THERE MUST BE AT LEAST
\r
858 ; ONE, OTHERWISE CORTAL=BIGHOL)MONITOR ERROR IF NONE
\r
860 PUSHJ PDP,CHKSHF ;YES, CALL CORE SHUFFLER TO MOVE ONE SEG DOWN
\r
861 SKIPN SHFWAT ;SHUFFLER WAITING FOR IO TO STOP?
\r
862 JRST FIT0 ;NO, SEE IF JOB WILL FIT NOW.
\r
863 POPJ PDP, ;YES, RETURN AND WAIT TILL IO STOPS
\r
864 \fEXTERN VIRTAL,SWPERC
\r
866 SWPREC: MOVE TAC,SERA ;ERROR FLAGS
\r
867 IORM TAC,SWPERC ;SAVE FOR POSTERITY
\r
868 LDB TAC,IMGOUT ;DECREASE TOTAL AMOUNT
\r
869 MOVNS TAC ;OF VIRTUAL CORE IN THE MACHINE
\r
870 ADDM TAC,VIRTAL ;BY THE AMOUNT BEING GIVEN UP
\r
874 JRST SWAPO ;GO TRY AGAIN
\r
876 ;NO INPUT TO DD, CHECK FOR EXPANDING JOBS
\r
877 CHKXPN: SKIPG XJOB ;ANY JOBS TO EXPAND
\r
878 POPJ PDP, ;NO, RETURN FROM SWAPPER, NOTHING TO INPUT OR OUTPUT
\r
879 ; YES, FALL INTO SCNOUT WHICH WILL SWAP OUT EXPANDING
\r
880 ; JOB SINCE THERE IS ONE
\r
881 ;INPUT TO DO, CHECK TO SEE IF ANY JOBS JUST HAPPEN TO WANT TO EXPAND
\r
883 EXTERN HIGHJB,JBTSTS,ERROR,MAXSIZ,MAXJBN,SUMCOR
\r
884 SCNOUT: SKIPG XJOB ;ANY JOBS WAITING TO EXPAND?
\r
885 JRST SCNJOB ;NO, SCAN ALL JOBS IN PRIORITY ORDER LOOKING
\r
886 ; FOR ONE TO SWAP OUT
\r
887 MOVE J,HIGHJB ;YES, START WITH HIGHEST JOB NUMBER ASSIGNED
\r
888 MOVSI T,JXPN ;SETUP JOB EXPANDED BIT
\r
889 TDDN T,JBTSTS(J) ;IS THIS JOB EXPANDING?
\r
890 SOJG J,.-1 ;NO, KEEP LOOKING
\r
892 JUMPG J,SCNOK ;CLEAR XJOB SO MESSAGE WILL PRINT
\r
893 JSP DAT,ERROR ;ERROR IF NONE FOUND
\r
895 SCNOK: SOS XJOB ;DECREMENT COUNT OF EXPANDING JOBS
\r
896 ANDCAM T,JBTSTS(J) ;CLEAR EXPAND BIT IN JOB STATUS WORD
\r
897 JRST FORCE0 ;GO TRY TO SWAP JOB OUT
\r
898 \f;SCAN FOR JOB TO OUTPUT IN ORDER TO MAKE ROOM FOR JOB TO COME IN
\r
899 ;SIZE(IN K) NEEDED TO GET THIS USER IN CORE IS IN AC1(FITSIZ)
\r
900 ;JUST LOW SEG SIZE IF NO HIGH OR HIGH ALREADY IN, JUST HIGH IF LOW ALREADY IN,
\r
901 ;OR SUM IF BOTH MUST BE SWAPPED IN
\r
903 SCNJOB: MOVE T,CORTAL ;INITIALIZE FREE CORE COUNTER
\r
905 SETZM MAXSIZ ;CLEAR SIZE OF LARGEST JOB
\r
906 MOVEI DAT,OSCAN ;SCAN ALL JOBS RANKED IN PRIORITY TO BE SWAPPED OUT
\r
908 JRST NOFIT ;NO MORE JOBS LEFT, CANNOT FIT JOB IN CORE
\r
909 CAMN J,FIT ;IS THIS JOB WE ARE TRYING TO FIND IN?
\r
910 JRST(TAC1) ;YES, GO FIND NEXT JOB TO OUTPUT
\r
911 SKIPGE T,JBTSTS(J) ;JOB RUN BIT STILL ON(JOB STILL WANT TO RUN)?>
\r
912 SKIPGE JBTSWP(J) ;YES, IS PROTECT TIME STILL LEFT?
\r
913 ; PROTECT TIME IS DECREMENTED ONLY WHEN
\r
914 ; A JOB IS RUNABLE, SO LOOK AT IT
\r
915 ; ONLY IF RUN BIT STILL ON
\r
916 TLNE T,NSWP+SWP ;NO, IS THIS JOB NOT TO BE SWAPPED OR ALREADY SWAPPED?
\r
917 ; (DISPLAY, REAL TIME)?
\r
918 JRST (TAC1) ;YES,CONTINUE SCAN TO FIND ANOTHER
\r
919 HLRZ T,JBTADR(J) ;PICK UP SIZE OF JOB
\r
920 JUMPE T,(TAC1) ` ;CONTINUE SCAN IF NOT IN CORE (HIGH SEG ALREADY SWAPPED
\r
921 ; OUT FOR THIS USER IF NO LOW SEG)
\r
922 ASH T,-12 ;CONVERT TO 1K BLOCKS
\r
926 PUSHJ PDP,FORSIZ ;INCREASE SIZE(T) BY HIGH SEG IF THIS JOB
\r
927 ; IS ONLY ONE IN CORE USING HIGH SEG(J= JOB # STILL)
\r
929 CAMG T,MAXSIZ ;LARGEST SO FAR?
\r
931 MOVEM T,MAXSIZ ;YES, SAVE SIZE
\r
932 MOVEM J,MAXJBN ;AND JOB NUMBER
\r
933 FORCE2: ADDM T,SUMCOR ;ADD TO TOTAL
\r
934 CAMLE AC1,SUMCOR ;FOUND ENOUGH CORE FOR JOB TO BE FIT IN?
\r
935 JRST (TAC1) ;NO. LOOK FOR MORE
\r
936 MOVE J,MAXJBN ;YES, SWAP OUT LARGEST
\r
937 \fFORCE0: PUSHJ PDP,TRYSWP ;CAN THIS JOB BE STOPPED IN ORDER TO DO SWAP?
\r
938 JRST (TAC1) ;NO, NSWP OR NSHF SET(DISPLAY,REAL TIME) OR
\r
939 ; SAVE OR GET IN PROGRESS WITH DEVICE STILL ACTIVE
\r
940 ; LOOK FOR AN OTHER JOB TO SWAP
\r
944 PUSHJ PDP,FORHGH ;IS THERE A HIGH SEG TO BE WRITTEN BEFORE
\r
945 ; TRYING TO SWAP OUT LOW SEGMENT?
\r
946 ; WRITE HIGH SEG IF ALL OF THE FOLLOWING ARE TRUE:
\r
947 ; 1. JOB HAS A HIGH SEG AND
\r
948 ; 2. IT HAS NOT BEEN SWAPPED FOR THIS USER
\r
950 ; 3. IT IS IN CORE(NOT XPANDH)
\r
951 ; 4. IF IN-CORE COUNT IS EXECTLY 1 MEANING
\r
952 ; THIS ONLY USER USING IN CORE
\r
953 ; 5. HIGH SEG NOT ON DISK YET
\r
954 ; 6. THIS HIGH SEG IS NOT THE SAME ONE AS JOB
\r
955 ; BEING FITTED IN IS GOING TO WANT
\r
957 ; RETURN HIGH SEG NO. IN J IF YES, OTHERWISE
\r
958 ; RETURN LOW SEG NO.
\r
959 ; IF JOB JUST HAS LOW SEG. SHF BIT IS SET IN JBTSTS
\r
960 ; FOR JOB SO IO WILL STOP NEXT BUFFERE
\r
962 MOVSI T,SWP!IFE FT2REL,<SHF> ;SET SWAPPED OUT BIT FOR LOW OR HIGH SEG
\r
963 IORM T,JBTSTS(J) ;SCHEDULER WILL NO LONGER RUN THIS JOB
\r
964 ; SET SHF BIT IF ONE SEG SOFTWARE, SO IO WILL
\r
965 ; STOP AFTER NEXT BUFFERFUL.
\r
967 FORCEL: MOVEM J,FORCE ;ASSUME NOT SWAPPABLE--IS IT?
\r
971 MOVE JDAT,JBTDAT(J)
\r
973 SKIPN PROG,JBTADR(J) ;LOC. IN PHYSICAL CORE, IS CORE
\r
974 ; ASSIGNED IN MEMORY?
\r
975 JRST SWAPO ;NO, CANNOT HAVE ACTIVE DEVICES
\r
976 CAME J,JOB ;IF THIS IS CURRENT JOB, WAIT UNTIL
\r
977 ; PROTECTED AREA IS MOVED BACK TO JOB DATA AREA
\r
978 PUSHJ PDP,ANYDEV ;ANY ACTIVE DEVICES?(2ND HALF OF ANYACT BOUT.)
\r
979 POPJ PDP, ;YES--RETURN AND WAIT FOR I/O TO STOP.
\r
980 \f;SWAP OUT LOW OR HIGH SEGEMENT
\r
985 IFN FTTRACK,<EXTERN LASOUT
\r
986 MOVEM J,LASOUT ;SAVE LAST SWAP OUT FOR DEBUGGING ONLY
\r
988 SETZM FORCE ;CLEAR FORCE FLAG
\r
989 HLRZ T,JBTADTR(J) ;COMPUTE CORE IMAGE
\r
990 JUMPE T,SWP1 ;DONT OUTPUT IF 0 CORE(IMGOUT ALREADY SET TO 0
\r
991 ; WHEN CORE WAS RETURNED
\r
994 MOVNM T,T2 ;*SAVE COUNT FOR CALL TO SQOUT
\r
995 ASH T,-^D10 ;CONVERT TO 1K BLOCKS
\r
997 DPB T,IMGOUT ;RECORD AS OUT IMAGE
\r
998 HRLI T1,-1(T2) ;*BUILD AND SAVE IOWD FOR SQOUT
\r
1000 LDB DAT,IMGIN ;HAS SIZE OF CORE NEEDED WHEN NEXT SWAPPED IN
\r
1001 SKIPN DAT ;ALREADY BEEN SET(XPAND)
\r
1002 DPB T,IMGIN ;NO, SO SET TO # 1K BLOCKS OF CORE NEEDED
\r
1003 MOVE DAT,T ;*CONVERT CORE IMAGE TO 128 WD BLOCKS
\r
1004 PUSHJ PDP,GXSAT ;*GET DEVICE STORAGE
\r
1005 JRST FULL ;*NONE AVAILABLE
\r
1006 HRLM TAC,JBTSWP(J) ;*SAVE DEVICE ADDRESS
\r
1007 OUTP2: MOVNM J,FINISH ;DISK SWAP SPACE ASSIGNED, NOW SET FINISH FLAG
\r
1008 ; SO THAT SWAPPER WILL KNOW WHICH SEG FINISHED
\r
1009 ; WHEN IO COMPLETED(SQREQ BECOMES ZERO)
\r
1010 POP PDP,TAC1 ;*GET IOWD
\r
1011 JRST SQOUT ;*START OUTPUT AND RETURN
\r
1013 NOFIT: SETZM FIT ;FORGET ABOUT FITTING IN A JOB ON DISK
\r
1014 SETOM INFLG ;*** EXPERIMENTAL *** MARK DESIRE TO INPUT
\r
1015 POPJ PDP, ;ALL JOBS IN CORE RE HIGHER PRIORITY.
\r
1016 \f;COME HERE WHEN THE AMOUNT OF SPACE NEEDED ON THE DISK
\r
1017 ;IS NOT AVAILABLE IN ONE CONTIGUOUS BLOCK
\r
1021 FULL: HRLM DAT,AC3 ;SAVE DAT (LARGEST AVAILABLE HOLE)
\r
1022 PUSHJ PDP,FULCOR ;GET 4 FREE CORE LOCS
\r
1023 HLRZ DAT,AC3 ;RESTORE DAT
\r
1024 MOVE AC3,TAC1 ;LOC OF 1ST FREE CELL
\r
1025 HRLI AC3,-4 ;4 LOCS
\r
1026 TRO TAC1,FRGSEG ;LIGHT FRAGMENTED BIT
\r
1027 HRLM TAC1,JBTSWP(ITEM) ;SAVE LOC OF TABLE IN JBTSWP
\r
1028 FULL1: PUSH PDP,DAT ;SAVE AMOUNT OF SPACE BEING REQUESTED
\r
1029 FULL1A: PUSHJ PDP,GXSAT ;GET SOME SWAPPING SPACE
\r
1030 JRST FULL2 ;CANT HAVE THAT MUCH
\r
1031 HRRM TAC,(AC3) ;SAVE LOC OF THE DISK SPACE
\r
1032 POP PDP,DAT ;RESTORE AMT GOTTEN
\r
1033 HRLM DAT,(AC3) ;SAVE AMOUNT IN TABLE
\r
1034 SUB T,DAT ;AMOUNT STILL NEEDED
\r
1036 JUMPE T,FULSET ;THROUGH IF NEED 0 K NOW
\r
1037 PUSHJ PDP,BMPAC3 ;STEP TO NEXT TABLE LOCATION
\r
1038 MOVE DAT,T ;TRY TO GET ALL WE NEED NOW IN 1 CHUNK
\r
1039 FULL1B: MOVE DAT,T ;RESET AMOUNT OF SPACE NEEDED
\r
1041 ;COME HERE WHEN CANT GET THE CHUNK REQUESTED
\r
1042 FULL2: MOVEM DAT,(PDP) ;DAT HAS LARGEST CHUNK AVAILABLE
\r
1043 JUMPG DAT,FULL1A ;GO GET THAT AMOUNT
\r
1046 PUSHJ PDP,FRESWP ;TRY TO DELETE AN UNUSED HIGH SEG FROM DISK
\r
1047 JRST FULL1B ;FOUND ONE, TRY AGAIN, J PRESERVED
\r
1048 ; NONE FOUND, PRINT MONITOR ERROR
\r
1052 POP PDP,TAC ;WHAT? NONE LEFT?
\r
1053 POP PDP,TAC ;SET PDP TO RIGHT VALUE
\r
1054 JSP DAT,CERROR ;ERROR IN MONITOR AT .....
\r
1056 ;HERE WHEN THE TOTAL AMOUNT OF SPACE NEEDED HAS BEEN OBTAINED
\r
1057 FULSET: PUSHJ PDP,BMPAC3 ;STEP TO NEXT (LAST) TABLE LOCATION
\r
1058 HLRZ TAC,JBTSWP(ITEM) ;LOC OF TABLE OF FRAGMENTS
\r
1059 JRST OUTP2 ;GO START OUTPUT
\r
1061 ;HERE TO GET 4 LOCS OF FREE CORE
\r
1062 FULCOR: PUSH PDP,ITEM ;GETFOR USES ITEM
\r
1063 PUSHJ PDP,GETFOR ;GET 4 CELLS
\r
1064 JRST IPOPJ ;RETORE ITEM AND RETURN
\r
1066 ;STEP AC3 TO NEXT LOC OF TABLE BEING BUILT
\r
1067 BMPAC3: AOBJN AC3,CPOPJ ;OK IF MORE LOCS OF TABLE
\r
1068 PUSHJ PDP,FULCOR ;GET 4 MORE LOCS
\r
1070 CAIN TAC1,(AC3) ;ARE THEY CONTIGUOUS?
\r
1071 POPJ PDP, ;YES. RETURN
\r
1072 MOVE TAC,-1(AC3) ;NO. CONVERT LAST GOOD LOC
\r
1073 HRROM TAC1,-1(AC3) ;TO A POINTER TO NEXT PART OF TABLE
\r
1074 MOVEM TAC,(TAC1) ;STORE GOOD DATA IN 1ST WD OF NEW PART
\r
1076 HRR AC3,TAC1 ;NEW TABLE LOC
\r
1077 AOBJN AC3,CPOPJ ;COUNT WORD AND RETURN
\r
1078 \f;SWAP IN A JOB OR HIGH SEGMENT
\r
1082 IFN FTTRACK,<EXTERN LASIN
\r
1083 MOVEM J,LASIN ;SAVE LAST SWAP IN FOR DEBUGGING ONLY
\r
1086 MOVEM J,FINISH ;SET FINISH FLAG TO INPUT
\r
1087 SETZM FIT ;CLEAR FIT FLAG
\r
1088 LDB TAC,IMGIN ;SIZE OF CORE TO BE ASSIGNED WHEN SWAPPED IN (INK)
\r
1089 LSH TAC,^D10 ;CONVERT TO HIGHEST ADR
\r
1090 SUBI TAC,1 ;-1 FOR CALL TO CORGET
\r
1091 SKIPE PROG,JBTADR(J) ;IS (LOW)SEG ALREADY IN CORE?
\r
1092 JRST FININ0 ;YES, POSSIBLE IF THIS IS LOW SET AND ONLY
\r
1093 ; HIGH SEG WAS SWAPPED OUT.
\r
1094 PUSHJ PDP,CORGET ;NO, GET CORE FOR LOW OR HIGH SEG
\r
1095 JSP DAT,OERROR ;NOT AVAILABLE-SHOULD NEVER HAPPEN(TELL OPER)
\r
1097 IFN FT2REL,<EXTERN FITHGH
\r
1098 PUSHJ PDP,FITHGH ;INCREASE INCORE COUNT FOR THIS JOB'S HIGH SEG.
\r
1100 LDB T,IMGOUT ;GET OUTPUT IMAGE
\r
1101 JUMPE T,FININ0 ;DONT INPUT IF OUT IMAGE IS 0
\r
1102 LDB TAC1,IMGIN ;IS SIZE OF CORE SMALLER THAN DISK SPACE?
\r
1103 CAMGE TAC1,T ;WELL?
\r
1104 MOVE T,TAC1 ;YES, ONLY INPUT SMALLER AMOUNT(R,RUN,GET,KJOB)
\r
1105 LSH T,^D18+^D10 ;*BUILD IOWD FOR SQIN
\r
1107 HRR TAC1,JBTADR(J) ;*
\r
1108 HLRZ TAC,JBTSWP(J) ;*GET DEVICE ADDRESS
\r
1109 JRST SQIN ;*START INPUT
\r
1110 \f;ROUTINE TO CHANGE DISK SWAPPING SPACE ALLOCATION(OR SET TO 0)
\r
1111 ;DIFFERS FROM ZERSWP IN THAT VIRTUAL TALLY FOR SYSTEM IS ALSO CHANGED
\r
1112 ;CALLED FROM CORE0
\r
1113 ;CALL: MOVE ITE,JOB OR HIGH SEG NO.
\r
1114 ; MOVE TAC,#1K BLOCKS TO BE NEW ASSIGNMENT
\r
1115 ; PUSHJ PDP,CHGSWP
\r
1117 ;CALLED ONLY FORM VIRTUAL+PHYSICAL CORE ROUTINE CORE0
\r
1120 EXTERN JBTSTS,IMGIN,IMGOUT,JBTSWP,VIRTAL,IPOPJ
\r
1122 CHGSWP: LDB TAC1,IMGIN ;SIZE WHEN SEG NEXT SWAPPED IN
\r
1123 JUMPE TAC,CHG1 ;IS ZERO BEING ASKED FOR?
\r
1124 LSH TAC,-12 ;NO, COVNERT TO 1K BLOCKS
\r
1125 ADDI TAC,1 ;BUT DO NOT ATTEMPT TO RETURN DISK SPACE
\r
1126 ; SINCE IT MIGHT BE FRAGMENTED(SWAPPER WILL
\r
1127 ; RETURN ALL OF DISK SPACE ON NEXT SWAPIN)
\r
1128 ; HAPPENS ONLY ON R,RUN,GET,KJOB
\r
1129 DPB TAC,IMGIN ;STORE NEW SIZE WHEN NEXT SWAPPED IN
\r
1130 PUSH PDP,ITEM ;SAVE AN AC
\r
1131 LDB ITEM,IMGOUT ;GET OLD DISK SIZE OF THIS USER(USES ITEM)
\r
1132 CAMGE TAC1,ITEM ;IS OLD IN-CORE SIZE BIGGER?
\r
1133 MOVE TAC1,ITEM ;NO, USE DISK SIZE AS USER'S OLD VIRTUAL CORE
\r
1134 CAMGE TAC,ITEM ;IS NEW IN-CORE SIZE BIGGER?
\r
1135 MOVE TAC,ITEM ;NO, USE DISK SIZE AS USER NEW
\r
1137 SUB TAC1,TAC ;DECREASE OF USER VIRT, CORE=OLD-NEW
\r
1138 ADDM TAC1,VIRTAL ;USER'S DECREASE=SYSTEM'S INCREASE OF VIRTUAL
\r
1140 JRST IPOPJ ;RESTORE ITEM AND RETURN
\r
1141 \f;ROUTINE TO RETURN ALL OF DISK SPACE FOR A LOW OR HIGH SEG
\r
1142 ;THIS IS A PHYSICAL DEALLOCATION ONLY AND HAS NO EFFECT ON A SEGMENTS
\r
1143 ;VIRTUAL CORE ASSIGNMENT
\r
1144 ;CALL: MOVE ITEM,JOB NO. OR HIGH SEG NO.
\r
1145 ; PUSHJ PDP,ZERSWP
\r
1146 ;CALLED FROM SEGCON IN MANY PLACES(5)
\r
1147 ;AND FININ0 HERE IN SWAP
\r
1151 ZERSWPL TDZA TAC,TAC ;REQUEST O SPACE ON DISK AND ALWAYS SKIP
\r
1152 CHG1: ADDM TAC1,VIRTAL ;INCREASE SIZE OF VIRTUAL CORE AVAILABLE IN SYSTEM
\r
1153 ; AND THEN RETURN ALL OF DISK SPACE(CHGSWP)
\r
1154 MOVSI TAC1,SWP!SHF ;CLEAR SWAPPED OUT BIT IN JOB OR SEG
\r
1155 ANDCAM TAC1,JBTSTS(ITEM);STATUS WORD(SHF SET IF IO WAS TO BE STOPPED
\r
1156 ; FOR SWAP OR CORE SHUFFLE
\r
1158 PUSH PDP,DAT ;SAVE TTY OUTPUT BYTE POINTER(COMMAND DECODER)
\r
1159 LDB DAT,IMGOUT ;*SIZE ON DISK(1K BLOCKS)
\r
1161 JUMPE DAT,CHG3 ;DID SEG HAVE ANY DISK SPACE?
\r
1162 HLRZ TAC,JBTSWP(ITEM) ;*YES, LOGICAL DISK BLOCK+FRGSEG BIT
\r
1163 PUSHJ PDP,FXSAT ;*FREE THE DISK BLOCKS NO LONGER NEEDED
\r
1164 CHG3: POP PDP,DAT ;RESTORE TTY OUTPUT BYTE POINTER
\r
1165 MOVEI TAC,0 ;0 IS NEW DISK ASSIGNMENT
\r
1166 DPB TAC,IMGOUT ;SET DISK ASSIGNEMENT TO 0
\r
1167 DPB TAC,IMGIN ;SET NEW CORE IMAGE BLOCK SIZE WHEN NEXT SWAPPED IN
\r
1168 ; HERE FROM CHGSWP IF NOT ASKING FOR 0
\r
1170 \f EXTERN PROT0,PROT ;PROT AND PROT0 OCCUR IN COMMON
\r
1173 XP ICPRT1,3+1*3 ;PROTECT TIME IN CLOCK TICS=
\r
1174 XP ICPROT,^D10 ;((JOBSIZE/1K)*+PROT0)*PROT
\r
1175 ; PROT0=3,PROT=4 PRODUCT PROTECT TIMES ROUGHLY
\r
1176 ; EQUAL TO 270 DISK SWAP(1-WAY) TIMES.
\r
1179 ;SIMILAR IN-CORE PROTECT TIME PARAMETERS FOR FAASTER RD-10 DISK......
\r
1180 XP ICPRT1,3+1*3 ;ZERO CORE PLUS K MULTIPLIER
\r
1181 XP ICPROT,3 ;MULTIPLY BY K-1 OF LOW SEG
\r
1183 \f;XPAND SETS CONDITIONS TO GET MORE CORE FRO A JOB BY SWAPPING IN OUT
\r
1184 ,THEM BACK IN TO DESIRED AMOUNT.
\r
1185 ,JOBS POSITION IN QS NOT AFFECTED.
\r
1186 ;CALLED ONLY FROM CORE COMMAND
\r
1187 ;ASSUMES CALL FOR CURRENT JOB IF EXPANDING HIGH SEG,IE ASSUME AT UUO LEVEL
\r
1188 ;THIS IS TRUE SINCE THERE IS NO CORE COMMAND WHICH CAN EXPAND HIGH SEG
\r
1189 ,CALL: MOVE ITEM,[JOB NO.]
\r
1190 ; MOVE TAC,[HIGHEST LEGAL ADDRESS DESIRED]
\r
1192 ; RETURN, TAC DESTROYED
\r
1194 XPAND: LSH TAC,-12 ;CONVERT HIGHEST DESIRED ADDRESS
\r
1195 ADDI TAC,1 ;TO 1K BLOCKS
\r
1196 DPB TAC,IMGIN ;STORE, SO SWAPPER WILL KNOW HOW MUCH CORE
\r
1197 ; TO REQUEST WHEN NEXT SWAPPED IN
\r
1199 ;ROUTINE TO FLAG JOB TO BE STOPPED AND SWAPPED OUT
\r
1200 ;BECAUSE IT HAS JUST BEEN CONNECTED TO A HIGH SHARABLE SEG WHICH IS ON DISK
\r
1201 ;OR ON ITW WAY IN OR OUT. THE SIZE OF THE HIGH SEG IS UNCHANGED
\r
1203 ;THE JOB MUST BE STOPPED UNTIL HIGH SEG SWAPPED IN JUS AS IF JOB HAS
\r
1204 ;EXPANDED HIGH SEG(MUST BE CALLED FROM UUO LEVEL FOR CURRENT JOB IF HIGH SEG)
\r
1205 ;CALL: MOVE ITEM,HIGH SEG NUMBER
\r
1206 ; PUSHJ PDP,XPANDH
\r
1213 PUSH PDP,ITEM ;SAVE JOB NUMBER
\r
1214 CAILE ITEM,JOBMAX ;IS THIS A LOW OR HIGH SEG?
\r
1215 MOVE ITEM,JOB ;HIGH,SO GET JOB NO.(MUST BE CURRENT JOB)
\r
1217 MOVSI TAC1,JXPN ;SET THIS JOB EXPANDING BIT SO IT WILL NOT BE RUN
\r
1218 TDNN TAC1,JBTSTS(ITEM) ;IS IT ALREADY SET FOR THIS JOB?(UNLIKELY)
\r
1219 AOS XJOB ;NO, INCREMENT COUNT ONLY ONCE FOR EACH JOB EXPANDING
\r
1220 IORM TAC1,JBTSTS(ITEM) ;AND SET JOB EXPANDING BIT
\r
1225 JRST IPOPJ ;RESTORE JOB OR HIGH SEG NUMBER (ITEM) AND RETURN
\r
1227 \fSUBTTL SWPSER R.KRASIN/AF TS4.34 03 FEB 69 V406
\r
1229 INTERNAL SQIN,SQOUT,SQGO,SQGO1
\r
1231 EXTERNAL DFBUSY,DFRED,DFWRT,CPOPJ,JOBDAC,MJOBCK,CHECK,JBTCHK
\r
1233 ;PUT A REQUEST IN THE SWAPPER QUEUE. ENTER AT SQIN FOR
\r
1234 ; INPUT, SWOUT FOR OUTPUT
\r
1235 ;CALL: MOVE TAC1,XWD -NO. OF WORDS,FIRST CORE LOC.(IE IOWD+1)
\r
1236 ; HRRZ TAC,DISK BLOCK NO.
\r
1237 ; PUSHJ PDP,SQIN/SQOUT
\r
1238 ; RETURN HERE ALWAYS
\r
1239 ; CONTENTS OF TAC,TAC1 LOST
\r
1241 SQIN: TLO TAC,400000 ;SET READ INDICATOR
\r
1242 SQOUT: MOVEM TAC,SERA ;STORE THE BLOCK NUMBER
\r
1243 MOVEM TAC1,SQREQ ;STORE THE IOWD
\r
1244 MOVEM TAC1,ESQREQ ;SAVE IN CASE OF DISK ERROR ON FRAGMENTED JOB
\r
1245 MOVNI TAC,1 ;IS THE DEVICE BUSY?
\r
1247 JUMPN TAC,CPOPJ ;YES IF JUMP
\r
1249 ERATRY=3 ;NO. OF TIMES TO READ AND WRITE ON ERRORS
\r
1251 ;START UP DEVICE WITH SWAPPING REQUEST. THIS ROUTINE
\r
1252 ;IS CALLED FROM DISK INTERRUPT SERVICE, AS WELL AS FROM ABOVE.
\r
1253 ;IF A SWAPPER REQUEST IS WAITING(SQREQ WILL BE NON-ZERO)
\r
1255 SQGO: MOVEI TAC1,ERATRY
\r
1258 TDNE TAC,SERA ;WRITE?
\r
1265 MOVEM TAC1,JBTCHK(TAC)
\r
1266 \fSQGO1: SETZM SQLEN ;ZERO AMOUNT TRANSFERRED SO FAR
\r
1267 MOVE TAC1,SQREQ ;*PUT IOWD INTO TAC1
\r
1268 MOVSI TAC,200000 ;*SET "SWAPPER I/O GOING" FLAG ON
\r
1270 TRZN TAC,FRGSEG ;*FRAGMENTED?
\r
1271 JRST SQGO2 ;*NO, READ IN ENTIRE (OR PART) OF SEG
\r
1275 FRAGIO: PUSH PDP,DAT
\r
1276 MOVN DAT,SQLEN ;AMOUNT PREVIOUSLY TRANSFERRED
\r
1277 SUB TAC1,DAT ;INCREASE CORE ADDRESS BY WORDCOUNT PREVIOUS
\r
1278 FRGIO1: HLRE DAT,(TAC) ;NO OF K IN THIS DISK CHUNCK
\r
1279 HRR TAC,(TAC) ;SWAPPING ADDRESS FOR THIS DISK CHUNK
\r
1280 JUMPGE DAT,FRGIO2 ;POINTER TO NEW CORE LIST IF NEG.
\r
1281 MOVEI DAT,77777 ;CLEAR OUT ADR(15 BITS)
\r
1283 ORM TAC,SERA ;INSERT NEW ADDRESS
\r
1287 FRGIO2: LSH DAT,12 ;CONVERT FROM K TO WORDS
\r
1288 ADDM DAT,SQLEN ;ADD TO PREVIOUSLY TRANSFERRED AMOUNT
\r
1289 MOVNS DAT ;-N WORDS
\r
1290 HRLM DAT,TAC1 ;IOWD IN TAC1
\r
1291 HRLO DAT,DAT ;-NO. OF WRDS FOR THIS DISK TRANSFER TO TH
\r
1292 CAMG DAT,SQREQ ;COMPARE WITH - NO. WORDS FOR REST OF SEG
\r
1293 HLL TAC1,SQREQ ;SWAPPER ONLY WANTS TO READ A PORTION OF SEG
\r
1294 ; NOT ALL OF IT(R,RUN,GET,KJOB COMMAND)
\r
1295 MOVNS DAT ;+NO. OF WORDS FOR THIS NEXT TRANSFER
\r
1297 ADDM DAT,SQREQ ;UPDATE LH OF IOWD FOR ENTIRE SEG, SO IT HAS
\r
1298 ; -NO. OF WORDS LEFT AFTER THIS TRANSFER IS DONE
\r
1300 SQGO2: TLZ TAC,377777 ;*CLEAR POSSIBLE TRASH IN LH.
\r
1301 ROT TAC,BLKSPK ;*RE-POSITION DISK LOGICAL BLOCK NUMBER.
\r
1302 TRZE TAC,4 ;*TEST AND CLEAR READ/WRITE BIT.
\r
1303 SOJA TAC1,DFRED ;*YES
\r
1304 SOJA TAC1,DFWRT ;*NO, WRITE.
\r
1305 \f;SERVICE A SWAPPING INTERRUPT
\r
1306 EXTERNAL DINT4B,CKSMCT
\r
1309 SWPINT: TRNE IOS,IODTER!IODERR!IOIMPM
\r
1310 JRST SWPERR ;ERRORS
\r
1311 TRZE TAC,FRGSEG ;*FRAGMENTED?
\r
1312 SKIPL TAC1,SQREQ ;*YES, MORE IOWD TO GO?
\r
1313 JRST DINT8B ;NO, ALL DONE SWAP IN OR OUT
\r
1314 AOS SERA ;YES, FRAGMENTED AND MORE TO GO
\r
1315 SKIPE 1(TAC) ;IS THIS THE END OF SWAP COMMAND LIST?
\r
1316 AOJA TAC,FRAGIO ;NO, BO DO NEXT PIECE OF FRAGMENTED SEG
\r
1318 DINT8B: TLNN TAC,400000 ;*INPUT?
\r
1325 CAME TAC1,JBTCHK(TAC)
\r
1327 DINT8A: HRRZM IOS,SERA
\r
1331 SWPER1; MOVSI TAC,100
\r
1334 SWPERR: MOVM TAC, FINISH ;*RESET SERA IN CASE OF FRAGMENTED JOB
\r
1335 HLRZ TAC, JBTSWP(TAC) ;*SWAP LOC (DISK ADR OR TABLE ADR)
\r
1336 HRRM TAC, SERA ;*RESTORE SERA
\r
1337 MOVE TAC,ESQREQ ;RESTORE ESQREQ IN CASE OF FRAGMENTED JOB
\r
1339 SOSLE SERACT ;*TRIED ENOUGH?
\r
1340 JRST SQGO1 ;*NO, TRY AGAIN
\r
1341 JRST DINT8A ;*YES, TOUGH.
\r
1343 ;SWPSER LOGIC FOR THE OLD PDP-6 (DATA PRODUCTS) DISK FILE ---
\r
1345 ;FIND A SERIES OF BLOCKS ON THE DISK TO SWAP ONTO. CALLED
\r
1347 ;CALL: MOVEI DAT,NO. OF 1K BLOCKS DESIRED
\r
1349 ; ERROR EXIT (DISK IS FULL)
\r
1350 ; NORMAL EXIT ;C(TAC) = BLOCK NO.
\r
1352 ;CONTENTS OF ACS TAC,TAC1,DAT WILL BE LOST.
\r
1355 EXTERNAL GETBIT,IPOPJ1
\r
1357 GXSAT: MOVE AC1,XSAT1 ;SAVE AC1, SET IT TO TABLE LOC.
\r
1359 LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS
\r
1360 PUSH PDP,ITEM ;SAVE C(ITEM)
\r
1362 MOVE ITEM,DAT ;GETBIT EXPECTS PARAMETER IN ITEM
\r
1363 PUSHJ PDP,GETBIT ;FIND A HOLE BIG ENOUGH
\r
1364 JRST IPOPJ ;NONE, RESTORE ITEM AND ERROR RETURN
\r
1365 MOVEI TAC,-1(TAC1)
\r
1366 CAIL TAC,BLOCKS ;IS IT ON DISK 17?
\r
1367 ADDI TAC,DIFF ;YES
\r
1368 LSH TAC,-CONVMD ;CARRY DISK ADDRESS SHIFTED TO FIT IN JBTSWP.
\r
1369 JRST IPOPJ1 ;SKIP RETURN AND RESTORE JOB NUMBER(ITEM)
\r
1371 ;FREE UP A SERIES OF BLOCKS ON THE SWAPPING DEVICE. CALLED
\r
1373 ;CALL: MOVEI DAT,NO. OF 1K BLOCKS TO FREE
\r
1374 ; MOVE TAC,BLOCK NO. OF FIRST DISK BLCOK TO FREE
\r
1375 ; PUSHJ PDP,FXSTAT
\r
1376 ; ALWAYS RETURN HERE
\r
1378 ;CONTENTS OF ACS TAC,TAC1 WILL BE LOST.
\r
1381 EXTERNAL CLRBIT,IPOPJ
\r
1383 FXSAT: LSH TAC,CONVMD ;RESTORE SHIFTED DISK ADDRESS.
\r
1384 CAIL TAC,HISWAP ;ON DISK 17?
\r
1385 SUBI TAC,DIFF ;YES
\r
1386 LSH DAT,CONVMD ;CONVERT TO 128 WORD DISK BLOCKS
\r
1387 MOVE AC1,XSAT1 ;SET UP AC1 WITH POINTER TO SAT BLOCK
\r
1388 MOVE AC2,XSAT2 ;AC2 TOO
\r
1389 PUSH PDP,ITEM ;SAVE C(ITEM)
\r
1390 MOVE ITEM,DAT ;CLRBIT EXPECTS PARAMETER IN DAT
\r
1392 JRST IPOPJ ;RETURN, AND RESTORE ITEM
\r
1394 ;INITIALIZE SWAPPER DISK STORAGE TABLE
\r
1398 SWPINI: MOVE TAC,XSAT2
\r
1411 IFN FTCHECK+FTMONP,<
\r
1412 EXTERNAL SQREQ,SERA,SERACT,XSAT1,XSAT2,XSAT3,XSAT4,XSAT5,XSAT6,XSAT7
\r
1413 EXTERNAL XSAT8,SWPSIZ,HISWAP,DIFF,CONVMD,BLOCKS,XSAT31,XSAT4P,XSAT61
\r
1415 IFE FTCHECK+FTMONP,<
\r
1417 ;DATA AND STORAGE AREA FOR SWAPPING. ON THE 270 DISK, DISKS
\r
1418 ; 0 & 17 ARE USED FOR SWAPPING, ECH DISK CONTAINING
\r
1419 ; 5400 (OCTAL) RECORDS
\r
1421 INTERNAL SQREQ,SERA,SERACT
\r
1422 SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE
\r
1423 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE
\r
1424 ESQREQ: Z ;COPY OF SQREQ, IN CASE OF
\r
1425 ; ERROR IN FRAGMENTED JOB
\r
1426 SERA: Z ;SIGN IS 1 IF A READ
\r
1427 ; C(RH)=BLOCK NUMBER BEFORE READING.
\r
1428 ; ERROR BITS AFTER READING.
\r
1429 SELACT: 0 ;COUNT FOR ERRORS
\r
1430 SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR - FRAG SEG
\r
1432 XSAT1: EXP XSAT3-1 ;POINTER USED BY GETBIT,CLRBIT
\r
1433 XSAT2: XWD -SWPSIZ,XSAT4 ;POINTER TO BIT TABLE
\r
1434 XSAT3: XWD 400000, ;2-WORD TABLE ALTERED BY GETBIT,CLRBIT
\r
1437 ; BIT TABLE FOR SWAPPING ALLOCATION
\r
1438 XP BLOCKS,5400 ;NUMBER OF RECORDS/DISK PLATE
\r
1439 W1=BLOCKS/^D36 ;NUMBER OF ZERO WORDS AT TOP OF TABLE
\r
1440 E1=BLOCKS-W1*^D36 ;LEADING ZERO IN W1+1ST WORD
\r
1442 W2=EX/^D36 ;ZERO WORDS AT BOTTOM OF TABLE
\r
1443 E2=EX-W2*^D36 ;LEADING ZEROES IN W1+W2+2ND WORD
\r
1452 REPEAT ^D35-E1,<X=X*2>>
\r
1456 REPEAT ^D36-E2,<Z=Z+Y
\r
1463 SWPSIZ=XSAT6-XSAT4+1 ;SIZE OF TABLE
\r
1464 HISWAP=17*BLOCKS ;LOGICAL BLOCK NUMBER OF FIRST
\r
1466 DIFF=HISWAP-BLOCKS-1
\r
1468 XP CONVMD,3 ;CONVERSION FROM 1K CORE BLOCKS TO 128 WORD
\r
1469 ;DISC BLOCKS(SHIFT COUNT)
\r
1471 XP BLKSPK,CONVMD ;NO. OF BLOCKS PER K, SAME AS CONVMD
\r
1472 XSAT4P: XWD XSAT4,XSAT4+1
\r
1474 > ;END OF SWPSER LOGIC FOR THE OLD PDP-6 DISK.
\r
1476 ;SWPSER LOGIC FOR THE NEW PDP-10 (MODEL RC-10) DISK ---
\r
1478 INTERNAL GXSAT,FXSAT,SWPINI
\r
1479 EXTERNAL GETBIT,CLRBIT
\r
1480 EXTERNAL LBHIGH,IPOPJ,IPOPJ1
\r
1483 ;SUBROUTINE "GXSAT" IS CALLED TO FIND A SERIES OF CONSECUTIVE FREE BLOCKS ON
\r
1484 ; THE DISK TO SWAP SOME JOB OUT ONTO. IT IS CALLED AT CLOCK LEVEL.
\r
1486 ;CALLING SEQUENCE ---
\r
1488 ; ERROR EXIT --- THE DISK IS FULL, NO SWAPPING SPACE AVAILABLE.
\r
1490 ;ENTRY CONDITIONS ---
\r
1491 ; C(DAT) = NUMBER OF 1K BLOCKS OF DISK STORAGE NEEDED.
\r
1492 ;EXIT CONDITIONS ---
\r
1493 ; C(TAC) = LOGICAL BLOCK NUMBER (DIVIDED BY 8) OF THE FIRST DISK BLOCK IN
\r
1494 ; THE SERIES OF CONSECUTIVE BLOCKS WHICH SATISFY THIS REQUEST.
\r
1495 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.
\r
1497 GXSAT: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".
\r
1499 MOVEI AC1,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "GETBIT" SUBROUTINE.
\r
1502 JRST IPOPJ ;NO ROOM IN THE SWAPPING PART OF THE DISK.
\r
1503 ADDI TAC1,-1(ITEM) ;ROOM FOUND--COMPUTE LOGICAL BLOCK NUMBER OF THIS
\r
1504 CAMLE TAC1,MAXSWP ;FIRST BLOCK IN A SERIOES OF CONSECUTIVE FREE DISK
\r
1505 MOVEM TAC1,MAXSWP ;BLOCKS. THE "SWPTAB" TABLE SEARCHED HAS ONE BIT
\r
1506 LSH TAC1,BLKSPK ;FOR EACH 1K OF SWAPPING DISK SPACE. BUT IS STORED
\r
1507 SUB TAC1,LBHIGH ;BACKWARDS (1ST BIT OF SWPTAB = LAST 1K OF DISK).
\r
1508 MOVM TAC,TAC1 ;ALSO UPDATE "MAXSWP" IF PREVIOUS MAXIMUM EXCEEDED.
\r
1509 LSH TAC,-BLKSPK ;COMPRESS DISK ADDRESS TO 17 BITS FOR LH OF JBTSWP
\r
1510 AOJA TAC,IPOPJ1 ;ADD 1 TO TAC AND RESTORE ITEM AND SKIP RETURN
\r
1511 \f;SUBROUTINE "FXSAT" IS CALLED TO RETURN A SERIES OF CONSECUTIVE DISK BLOCKS TO
\r
1512 ; THE FREE STORAGE POOL. THUS MAKING THEM AVAILABLE FOR RE-USE IN HANDLING
\r
1513 ; FUTURE SWAPPING REQUESTS. IT IS CALLED AT CLOCK LEVEL.
\r
1515 ;CALLING SEQUENCE ---
\r
1518 ;ENTRY CONDITIONS ---
\r
1519 ; C(TAC) = LOGICAL BLOCK NUMBER OF THE FIRST DISK BLOCK IN THE
\r
1520 ; SERIES WHICH IS TO BE MADE AVAILABLE.
\r
1521 ; C(DAT) = NUMBER OF CONSECUTIVE 1K BLOCKS OF DISK SPACE WHICH
\r
1522 ; ARETO BE MADE AVAILABLE.
\r
1523 ;EXIT CONDITIONS ---
\r
1524 ; THE REQUESTED BITS IN THE SWAPPING SPACE AVAILABILITY TABLE
\r
1525 ; (NAMELY, SWPTAB) HAVE BEEN CLEARED TO ZERO.
\r
1526 ;ACCUMULATORS DAT, TAC, TAC1, AC1, AND AC2 ARE DESTROYED BY THIS SUBROUTINE.
\r
1528 FXSAT: TRZN TAC,FRGSEG ;FRAGMENTED?
\r
1529 JRST FXSAT1 ;NO. DO IN REGULAR WAY
\r
1531 FRAGRK: HRRZ AC3,TAC ;YES. LOC OF TABLE IN AC3
\r
1532 FRGBK1: HRRZ TAC,(AC3) ;LOC OF NEXT DISK ADDRESS
\r
1533 HLRE DAT,(AC3) ;NUMBER OF K
\r
1534 JUMPLE DAT,FRGBK2 ;GIVE UP FREE CORE IF NOT REAL ADDRESS
\r
1535 PUSHJ PDP,FXSAT1 ;GIVE UP THE DISK SPACE FOR THIS PART
\r
1536 AOBJP AC3,FRGBK1 ;COUNT WORD OF TABLE, GET NEXT
\r
1537 FRGBK2: HRRZ TAC,AC3 ;LOC OF TABLE
\r
1539 HLRZ ITEM,AC3 ;NUMBER OF WDS IN TABLE
\r
1540 SUB TAC,ITEM ;POINT TAC TO 1ST WORD OF BLOCK
\r
1541 LSH ITEM,-2 ;4 WDS PER BIT
\r
1543 PUSHJ PDP,CLCOR1 ;GIVE UP FREE CORE
\r
1545 SKIPE TAC,(AC3) ;END OF TABLE?
\r
1546 JRST FRAGBK ;NO, GO CHASSE NEXT PART
\r
1547 POPJ PDP, ;YES, DONE
\r
1549 FXSAT1: PUSH PDP,ITEM ;THIS ROUTINE SAVES AND RESTORES ACCUMULATOR "ITEM".
\r
1551 LSH TAC,BLKSPK ;REGENERATE THREE LOW ORDER 0 BITS IN DISK ADDRESS.
\r
1552 SUB TAC,LBHIGH ;PREPARE TO CLEAR BITS IN THE SWAPPING
\r
1553 MOVMS TAC ; AVAILABLITY TABLE BY TRANSFORMING THE LOGICAL
\r
1554 ADDI TAC,1 ; BLOCK NUMBER TO AN EQUIVALENT BIT NUMBER IN THIS
\r
1555 MOVNI AC1,BLKSPK ; TABLE (WHICH IS STORED IN REVERSE ORDER AND HAS
\r
1556 LSH TAC,(AC1) ; ONE BIT PER 1K OF SWAPPING SPACE ON THE DISK).
\r
1559 MOVE AC2,SWPENT ;SET UP ENTRY CONDITIONS FOR THE "CLRBIT" SUBROUTINE.
\r
1560 FXSATC: PUSHJ PDP,CLRBIT ;THE "CLRBIT" SUBROUTINE IN "DSKSER" ACTUALLY DOES
\r
1561 ; THE WORK OF CLEARING THE BITS.
\r
1562 JRST IPOPJ ;RESTORE ITEM AND RETURN
\r
1563 ;ROUTINE TO RE-INITIALIZE THE SWAPPING AVAILABILITY TABLE. CALLED AT
\r
1564 ; SYSTEM INITIALIZATION TIME.
\r
1566 EXTERN VIRTAL,SWPHGH
\r
1568 SWPINI: MOVE TAC,LBHIGH ;SET HIGHEST LOGICAL BLOCK
\r
1569 MOVEM TAC,SWPHGH ;FOR SWAPPING IN COMMON
\r
1570 MOVNI TAC,1 ;SET ENTIRE TABLE TO ONES, I.E., MARK EVERYTHING
\r
1571 MOVE TAC1,SWPENT ; AS BEING UNAVAILABLE FOR SWAPPING.
\r
1574 MOVEI AC1,SWPENT ;THEN USE THE "CLRBIT" ROUTINE TO CLEAR OUT AS MANY
\r
1575 MOVE AC2,SWPENT ; BITS AT THE FRONT OF THE TABLE AS THERE ARE 1K DISK
\r
1576 MOVE ITEM,K4SWAP ; AREAS ALLOCATED FOR SWAPPING USE. THE PARAMETER
\r
1577 MOVEM ITEM,VIRTAL ;TOTAL AMOUNT OF VIRTUAL CORE ALLOWED
\r
1578 ; IS JUS EQUAL TO AMOUNT OF SWAPPING SPACE
\r
1579 ; EVEN IF USER CAN NOT HAVE ALL OF PHYSICAL USER CORE
\r
1580 \f MOVEI TAC,0 ; "K4SWAP" IS SET UP DURING DISK REFRESHING, AND
\r
1581 ; RECALLED FROM THE DISK AT EACH SYSTEM-INITIALIZE.
\r
1582 JRST CLRBIT ;IN LIEU OF "PUSHJ CLRBIT" FOLLOWED BY "POPJ".
\r
1583 \fIFN FTCHECK+FTMONP,<
\r
1584 EXTERNAL RCXSDT ;DUMMY GLOBAL SYMBOL TO PERMIT THE SYSTEM BUILDER TO
\r
1585 ; RETRIEVE THE CORRECT BINARY COPY OF "SCHDAT".
\r
1586 EXTERNAL SQREQ,SERA,SERACT
\r
1587 EXTERNAL LBHIGH,BLKSPK,MAX2SWP,SWPENT,SWPTAB,MAXSWP
\r
1590 IFE FTCHECK+FTMONP,<
\r
1591 ;DATA ASSOCIATED WITH THE SWPSER LOGIC FOR THE NEW PDP-10 DISK ---
\r
1593 INTERN MXK2SWP,CONVMD,BLKSPK,SWAPTAB,MAXSWP
\r
1595 ;THE ABOVE ARE REFERENCED OR INITIALIZED BY THE "ONCE" ROUTINE.
\r
1597 ;C(LOWSWP)=LOWEST LOGICAL BLOCK NUMBER TO BE USED FOR SWAPPING
\r
1598 ;DETERMINED BY ONCE ONLY REFRESH DIALOG
\r
1599 ;C(K4SWAP)=MAX. NO. OF K DISK WORDS ALLOCATED FRO SWAPPING, ALS
\r
1600 ;DETERMINED BY ONCE ONLY REFRESH DIALOG
\r
1601 MAXSWP: 0 ;MAX. NO. OF K FROM TOP TO LOWEST JOB
\r
1602 ; USED SINCE SYSTEM BEGAN
\r
1603 ;C(MAXSWP)=MAX. NO. OF K EVER ASSIGNED COUNTING FROM TOP DOWN TO
\r
1604 ;LOWEST EXCURSION, INCLUDING HOLS. WHEN = C(K4SWAP), THEN FREAGMENTATION HAD
\r
1605 ;HAPPENED SOMETIME DURING THE PAST
\r
1606 BLKSPK=3 ;SHIFT FACTOR TO CONVERT K OF CORE TO DISK BLOCKS, I.E.,
\r
1607 ; EIGHT DISK BLOCKS PER K OF CORE.
\r
1608 CONVMD=BLKSPK ;ONLY FOR CONSISTENCY WITH OLDER PDP-6 ROUTINE.
\r
1609 MXK2SWP=^D1000 ;MASIMUM NUMBER OF 1K DISK BLOCKS WHICH MIGHT BE ALLOCATED
\r
1610 ; FOR SWAPPING (UPPER BOUND ON THE VALUE OF K4SWAP WHICH
\r
1611 ; MAY BE REQUESTED AT DISK REFRESH TIME). (ONE MILLION WORDS
\r
1612 ; FOR SWAPPING SEEMS LIKE A NON-RESTRICTIVE ARBITRARY LIMIT.)
\r
1613 SWPSIZ=MXK2SWP/.^D36+1 ;SIZE OF SWPTAB ALLOCATION TABLE.
\r
1615 SWPENT: XWD -SWPSIZ,SWPTAB ;THREE WORD POINTER TABLE
\r
1616 XWD 400000,0 ; REQUIRED BY THE "GETBIT" AND
\r
1617 XWD -SWPSIZ,SWPTAB ; "CLRBIT" SUBROUTINES.
\r
1619 SWPTAB: BLOCK SWPSIZ ;SWAPPING SPACE AVAILABILITY TABLE.
\r
1621 ;DATA CARRIED OVER FROM THE COMMON PART OF OLD AND NEW SWPSER ROUTINES ---
\r
1622 INTERNAL SQREQ,SERA,SERACT,ESQREQ
\r
1623 SQREQ: Z ;C(LH)=NEG. OF SIZE OF READ/WRITE
\r
1624 ; C(RH)=LOC. OF FIRST WORD TO READ/WRITE
\r
1625 ESQREQ: Z ;COPY OF SQREQ, IN CASE OF SWAP ERROR IN FRAGMENTED JOB
\r
1626 SERA: Z ;SIGN IS 1 IF A READ
\r
1627 ; C(RH)=BLOCK NUMBER BEFORE READING.
\r
1628 ; ERROR BITS AFTER READING.
\r
1629 SELACT: 0 ;COUNT FOR ERRORS
\r
1630 SQLEN: 0 ;AMOUNT TRANSFERRED SO FAR FOR FRAGMENTED JOB
\r
1632 > ;END OF SWPSER LOGIC FOR THE NEW PDP-10 DISK.
\r