1 TITLE CORE1 - LOGICAL AND PHYSICAL CORE ALLOCATION ROUTINES - V414
\r
2 SUBTTL T. HASTINGS/TH/RCC TS 04 JUN 69
\r
4 ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB
\r
6 ENTRY CORE1 ;ALWAYS LOAD CORE1(FOR LIB SEARCH)
\r
8 ;CORE ALLOCATION IS DONE ON A 1K BLOCK BASIS
\r
10 ;USING A USE BIT TABLE(CORTAB) WHICH HAS A 1
\r
11 ;FOR EVERY BLOCK WHICH IS NOT AVAILABLE BECAUSE:
\r
12 ; 1.IN USE BY MONITOR
\r
14 ; 3.NON-EXISTANT MEMORY
\r
15 ;0 MEANS BLOCK IS NOT IN USE
\r
17 ;WHEN THE SYSTEM IS STARTED, SYSINI SETS THE CORTAB TABLE
\r
18 ;IT ALSO SETS A BYTE POINTER(CORLST) WHICH POINTS TO THE
\r
19 ;LOWEST NON-EXISTANT BLOCK IMMEDIATELY ABOVE THE HIGHEST
\r
20 ;EXISTANT BLOCK. IT ALSO SETS CORTAL TO THE NO. OF
\r
21 ;FREE BLOCKS AVAILABLE.
\r
22 ;THE CORE1 ROUTINE ASSIGNS CORE IF POSSIBLE. SETS THE USE BITS.
\r
23 ;AND MOVES THE JOB IF NEW ASSIGNEMENT IS A DIFFERENT PLACE THEN OLD
\r
24 ;THE JBTADR TABLE IS ALSO UPDATED BY THE CORE ROUTINES
\r
25 ;LH-PROTECTION,RH=RELOCATION
\r
26 ;JOBADR IS MODIFIED IF CORE FOR CURRENT JOB
\r
27 ;HARDWARE RELOC. AND PROTEC. ARE RESET IF CURRENT JOB
\r
28 ;FINALLY JOBREL(PROTECTION) IN JOB DATA AREA IS ALWAYS UPDATED
\r
30 ;LIST OF GLOBALS AFFECTED:
\r
31 ;JBTADR,CORTAL,CORTAB,HOLEF,SWFWAT,JOBADR
\r
33 ;ACS USED(BESIDES TAC,TAC1,JDAT,IOS,DEVDAT,AND POP)
\r
34 BLK=BUFPNT ;HIGHEST REL. ADR. IN USER AREA
\r
35 LOC=BUFWRD ;ABS. LOC. OF FIRST BLOCK IN USER AREA
\r
39 ;CALL MOVEI AC,HIGHEST REL. ADR. DESIRED IN LOW SEG
\r
40 ; HRLI AC,HIGHEST REL. ADR. DESIRED IN HIGH SEG
\r
41 ; CALL AC,[SIXBIT /CORE/]
\r
43 ; OK RETURN TO USER. JOB MOVED IF NECESSARY
\r
44 ;RETURN NO. OF FREE 1K BLOCKS IN AC(OR MAX. NO. BLOCKS ALLOWED IF SWAPPING SYS)
\r
45 ;BOTH HALVES 0 MEANS ERROR RETURN NO. OF FREE 1K BLOCKS(OR MAX. NO. OF BLOCKS
\r
46 ; ALLOWED IF SWAPPING SYSTEM) IMMEDIATELY WIOTHOUT AFFECTING CORE
\r
47 ; OR WAITING FOR IO DEVICES
\r
48 ;LH=0 MEANS DO NOT CHANGE HIGH SEG ASSIGNMENT
\r
49 ;RH=0 MEANS DO NOT CHANGE LOW SEG ASSIGNMENT
\r
52 EXTERNAL USRREL,JOB,CORTAL
\r
53 EXTERNAL ESTOP1,IOWAIT,OERROR,SETREL,STOTAC,WSCHED
\r
55 CORUUO: JUMPE TAC,ZERCOR ;IS HE ASKING FOR ZERO CORE?
\r
56 PUSH PDP,TAC ;NO, SAVE HIGHEST DESIRED ADDRESS IN BOTH SEGS
\r
57 PUSHJ PDP,IOWAIT ;WAIT FOR ALL DEVICE INACTIVE
\r
58 HRRZ TAC,(PDP) ;HIGHEST REL. LOC. DESIRED FOR LOW SEG(RH)
\r
59 JUMPE TAC,CORU1 ;IS RH 0(IF YES DO NOT CHANGE LOW SEG)?
\r
60 IORI TAC,1777 ;NO, MAKE EVEN MULTIPLE OF 1K-1
\r
61 PUSHJ PDP,CORE1 ;TRY TO ASSIGN CORE
\r
62 JRST CORERR ;NOT AVIALABLE, ERROR RETURN
\r
63 ; SUM OF NEW LOW AND OLD HIGH SEG TO BIG
\r
64 CORU1: HLRZ TAC,(PDP) ;CHECK TO SEE IF USER REQUESTING HIGH CORE
\r
66 CAMG TAC,USRREL ;0 MEANS NO CHANGE, 1 THRU TOP OF LOW SEG MEANS
\r
67 ; RETURN HIGH CORE (IF ANY), ALWAYS LEGAL
\r
68 ; EVEN IF NO HIGH SEB SHARP WARE OR SOFTWARE
\r
72 PUSHJ PDP,UCORHI ;TRY TO ASSIGN CORE TO HIGH SEG.
\r
73 ; UCORHI EXPECTS ARG ON PD LIST
\r
74 JRST CORERR ;ERROR-ACTIVE IO(SAVE IN PROGRESS FOR SOME USER)
\r
75 ; OR SUM OF NEW LOW SEG AND NEW HIGH SEG TOO BIG
\r
77 AOS -1(PDP) ;SET FOR DK(SKIP) RETURN
\r
78 CORERR: POP PDP,TAC ;REMOVE ARG FROM LIST
\r
80 PUSHJ PDP,WSCHED ;CALL SCHEDULER TO STOP JOB
\r
81 ; IN CASE LOW SEG MUST BE SWAPPED OUT TO EXPAND
\r
82 ; OR HIGH SEG LOGICAL CORE ASSIGNED ON DISK
\r
83 ; SAVE ALL ACS EXECPT AC1,AC2,AC3,
\r
87 MOVE TAC,CORTAL ;RETURN NO. OF FREE 1K BLOCKS (COUNTING
\r
88 ; DORMANT AND IDLE SEGMENTS AS FREE)
\r
91 MOVE TAC,CORMAX ;RETURN MAX. NO. 1K BLOCKS ALLOWED FOR 1 USER TO HAVE
\r
94 JRST STOTAC ;STORE IN USER AC AND RETURN TO USER
\r
95 \f;ROUTINE TO CHECK JOBS TO SEE IF ANY JOB CAN BE SHUFFLED
\r
96 ;IT IS CALLED EVERY 60TH OF A SECOND BY CLOCK ROUTINE
\r
97 ;PROVIDING CURRENT JOB IS IN USER MODE OR JUST ENTERING
\r
98 ;IO WAIT OR SHARABLE DEVICE WIAT OR RETURNING ON UUO CALLS
\r
99 ;IE CURRENT JOB AND ALL OTHER JOB ARE SHUFFABLE WITH RESPECT
\r
100 ;TO RELOCATION INFO IN MONITOR
\r
101 ;SINCE RESCHEDULING IS NEVER DONE WHEN CURRENT JOB
\r
102 ;IS NOT SHUFFABLE. ALL JOBS ARE SHUFFABLE WHEN
\r
104 ;THE NOSHUFFLE MACRO SHOULD STILL BE USED WHEN EVER
\r
105 ;THE MONITOR MOVES RELOCATION OUT OF ACS PDP,PROG. OR JDAT
\r
106 ;IN CASE IT SHOULD PROVE DESIRABLE IN THE FUTURE TO SHUFFLE
\r
107 ;MORE FREQUENTLY THEN AT THE ABOVE TIMES
\r
108 ;FINALLY A JOB MUST HAVE ALL DEVICES INACTIVE(SINCE SOME
\r
109 ;OF THEM USE ABSOLUTE ADDRESSES)BEFORE IT CAN BE MOVED
\r
110 ;SO CORE CANNOT BE REASSIGNED WHILE DEVICES ARE ACTIVE
\r
111 ;IF DEVICES ARE ACTIVE, JOB WILL BE STOPPED SO THAT IO WILL
\r
112 ;CEASE SOON SO JOB CAN BE SHUFFLED
\r
113 ;ALL DEVICES LOOK AT SHF BIT IN JBTSTS(ADVBEF OR ADVDFE)
\r
114 ;TO SEE IF MONITOR IS WAITING TO SHUFFLE JOB
\r
115 ;THE NSHF BIT IN JOBSTS WHOULD BE SET FOR JOBS USING DISPLAYS
\r
116 ;SINCE DISSER CONTINUALLY REFERENCES USER AREA EVEN THOUGH
\r
119 ;THIS VERSION OF THE CORE SHUFFLER WORKS AS FOLLOWS:
\r
120 ;EVERY CLOCK TICK FOR WHICH ALL JOBS ARE SHUFFABLE(NOT COUNTING ACTIVE
\r
121 ;IO DEVICES). THE JOB IMMEDIATELY ABOVE THE LOWEST HOLE
\r
122 ;(IF ANY) WILL BE MOVED DOWN INTO HOLE. THE HOLEF IS SET NON-ZERO
\r
123 ;TO THE ADDRESS OF JOB IMMEDIATELY ABOVE THE LOWEST
\r
124 ;HOLE(0 IF NONE), EVERY TIME CORE IS REASSIGNED.
\r
125 ;CANNOT BE CALLED WHILE SWAPPING IN PROGRESS FOR THIS JOB(BECAUSE IT CALLS CORE0)
\r
127 INTERNAL CHKSHF,FTSWAP
\r
128 EXTERNAL SHFWAT,HOLEF,CLKCHL,JBTADR,JBTSTS,JBTMAX
\r
130 CHKSHF: SKIPE ITEM,SHFWAT ;HAS CHKSHF STOPPED A JOB AND IS WAITING FOR
\r
131 ; DEVICES TO BECOME INACTIVE?
\r
132 JRST SHFLOP ;YES, SEE IF IO HAS STOPPED YET
\r
133 SKIPN TAC,HOLEF ;NO, DOES CORE HAVE A HOLE IN IT?
\r
135 MOVEI ITEM,JBTMAX ;SEARCH FOR JOB OR HIGH SEG JUST ABOVE HOLE
\r
136 HOLLOP: HRRZ TAC1,JBTADR(ITEM) ;ADR. OF JOB
\r
139 SOJG ITEM,HOLLOP ;NOT JOB ABOVE HOLE KEEP LOOKG
\r
140 JUMPG ITEM,SHFLOP ;FOUND ONE?
\r
141 SETZM HOLEF ;NO, CLEAR HOLEF OR ELSE ERROR WILL BE PRINTED EVERY
\r
142 ; CLOCK TICK AND ERROR MESSAGE WILL NEVER PRINT
\r
143 JSP DAT,OERROR ;SYSTEM ERROR(TELL OPERATOR)
\r
145 SHFLOP: SKIPE PROG,JBTADR(ITEM) ;JOB ABOVE HOLE STILL IN CORE ?
\r
146 PUSHJ PDP,ANYACT ;NO ALL DEVICES FINISHED ?
\r
147 JRST NOTSHF ;YES, GO SEE IF HOLD STILL THERE
\r
149 MOVE JDAT,JBTDAT(ITEM) ;JOB DATA AREA
\r
151 HLRZ TAC,PROG ;YEST, REASSIGN SAME AMOUNT OF CORE.
\r
152 PUSHJ PDP,SCORE1 ;IN A LOWER POSITION IN CORE
\r
154 NOTSH1: SETZM SHFWAT ;JOB SHUFFLED, CLEAR FLAG
\r
155 MOVSI TAC,SHF ;CLEAR SHUFFLE WAIT BIT IN CASE IT WAS ON
\r
156 ANDCAM TAC,JBTSTS(ITEM)
\r
159 ;JOB CANNOT BE MOVED BECAUSE IT HAS ACTIVE DEVICES OR NSHF BIT SET(DISPLAY,REALTIME)
\r
160 ; SO JOB CANNOT BY SHUFFLED AT THIS TIME
\r
162 NOTSHF: SKIPN HOLEF ;IS HOLE STILL THERE?
\r
171 MOVEM ITEM,SHFWAT ;SET SHUFFLE WAIT FLAG WITH JOB NO.
\r
172 MOVSI TAC,SHF ;SET SHF WAIT BIT IN JOB STATUS WORD
\r
173 IORM TAC,JBTSTS(ITEM) ;SO JOB WILL NOT BE RUN
\r
174 POPJ PDP, ;AND IO WILL STOP SOON
\r
176 ;ROUTINE TO TEST FOR ANY ACTIVE DEVICES
\r
178 ;CALL: MOVE ITEM,JOB NUMBER OR HIGH SEG NUMBER
\r
179 ; MOVE JDAT,ADDRESS OF JOB DATA AREA
\r
182 ; DEVICES NOT ACTIVE EXCEPT POSSIBLY TTY
\r
183 ;IN SWAPPIN SYSTEMS ANYACT IS BROKEN INTO 2 CALLS, TRYSWP AND ANYDEV
\r
184 ;TRYSWP TEST WHTETHER SWAPPER SHOULD EVEN CONSIDER SWAPING JOB
\r
186 INTERN ANYACT,ANYDEV
\r
191 PUSHJ PDP,TRYSWP ;SHOULD SWAPPER MAKE JOB UNRUNNABLE
\r
192 ; IN ORDER TO SWAP OUT?
\r
193 POPJ PDP, ;NO, ACTIVE SAVE IN PROGRSS OR NSH,NSWP
\r
194 ; (REAL TIME OR DISPLAY)
\r
196 ANYDEV: MOVE T,JBTSTS(ITEM) ;IS JOB(OR HIGH SEG) NOT SHUFFABLE?
\r
197 TLNE T,NSHF ;DISPLAY AND REAL TIME SET NSHF
\r
198 POPJ PDP, ;CANNOT BE SHUFFLED
\r
200 CAILE ITEM,JOBMAX ;YES IT THIS A HIGH SEG?
\r
201 JRST CPOPJ1 ;YES, OK TO SHUFFLE OR SWAP SINCE NSHF,NSWP
\r
202 ; AND NO SAVE IN PROGRESS
\r
204 MOVEI T,JOBJDA(JDAT) ;ASSUME JOB IS NOT CURRENT JOB
\r
205 CAMN ITEM,JOB ;IS IT?
\r
206 MOVEI T,USRJDA ;IT IS CURRENT JOB
\r
207 ; DEVICE ASSIGNMENT TABLE IN MONITOR
\r
208 MOVEI IOS,IOACT ;IO DEVICE ACTIVE BIT
\r
209 HRRZ T1,JOBJMH(T) ;GET NO. OF USER IO CHANNELS IN USE
\r
210 ; FOR JOB(EITHER FROM JOB DATA AREA
\r
211 ; OR FROM MONITOR (IGNORE LH WHICH MY BE-1
\r
212 ; IF SAVEGET IN PROGRESS)
\r
213 TLO T,T1 ;SET TO ADD T TO T1
\r
214 MOVSI AC3,DVTTY ;DEVICE IS A TTY BIT
\r
215 ANY: SKIPE DEVDAT,@T ;IS A DEVICE ASSIGNED TO THIS CHANNEL?
\r
216 TDNN IOS,DEVIOS(DEVDAT) ;YES, IS IT ACTIVE?
\r
217 ANY2: SOJGE T1,ANY ;NO, KEEP LOOKING
\r
218 JUMPL T1,CPOPJ1 ;YES, FINISHED YET?
\r
219 TDNN AC3,DEVMOD(DEVDAT) ;NOT FINISHED, IS DEVICE TTY?
\r
220 POPJ PDP, ;NO, ERROR RETURN, CANNOT ASSIGN CORE
\r
221 JRST ANY2 ;YES, KEEP LOOKING FOR AN ACTIVE DEVICE
\r
223 ;ROUTINE TO TEST TO SEE IF JOB OR HIGH SEG CAN BE SWAPPED
\r
224 ; OR WHETHER IT SHOULD BE ALLOWED TO CONITNUE RUNNING
\r
225 ; UNTIL A MORE FAVORABLE ITME
\r
226 ;CALL: MOVE ITEM,HIGH RO LOW SEG NUMBER
\r
228 ; RETURN1 - JOB MUST REMAIN RUNABLE(NSHF,NSWP SET OR SAVE,GET IN PROGRESS); RETURN2 - OK TO SWAP HIGH OR LOW SEG
\r
232 EXTERN JBTSTS,CPOPJ1
\r
234 TRYSWP: MOVE T,JBTSTS(ITEM) ;IS JONB OR HIGH SEG NOT SWAPPABLE?
\r
235 TLNE T,NSHF!NSWP ;OR SHUFFABLE(DISPLAY,REAL TIME)?
\r
236 POPJ PDP, ;YES, ERROR RETURN
\r
239 JRST ANYSAV ;NO, SEE IF THIS JOB IS INVLOVED IN A SAVE,GET
\r
240 ; WHICH IS STILL ACTIVE
\r
243 JRST CPOPJ1 ;NO, GIVE OK RETURN
\r
247 ;ROUTINE TO FLUSH PHYSICAL CORE ASSIGNED IN MEMORY
\r
248 ;NOTE: THIS ROUTINE DIFERS SIGNIFICANTLY FROM CORE0 AND CORE1 IN THAT
\r
249 ;IT IS ONLY A PHYSICAL REMOVAL OF CORE(VIRTAL IS NOT AFFECTED)
\r
250 ;SEE COMMENTS FOR CORE1
\r
251 ;CALL: MOVE ITEM,HIGH OR LOW SEGMENT NUMBER
\r
253 ; ALWAYS RETURN HERE
\r
254 ;SCORE1 IS CALLED FROM SHUFFLER WITH TAC SET TO SEG SIZE
\r
258 KCORE1: MOVEI TAC,0 ;SETUP DESIRED HIGHEST ADR
\r
259 SCORE1: SOS(PDP) ;CORE1 WILL ALWAYS SKIP RETURN
\r
260 JRST CORE1A ;BYPASS LOGICAL CORE ASSIGNMENT PART
\r
261 ; AND FLUSH PHYSICAL CORE(LOGICAL CORE UNEFFECTED)
\r
264 ;CORE0 IS CALLED BY THE CORE MONITOR COMMAND AND THE CORE SHUFFLER
\r
267 ;BOTH LOGICAL AND PHYSICAL CORE ASSIGNMENT ARE AFFECTED
\r
269 ;CALL: MOVE TAC,HIGHEST LEGAL ASSRESSABLE LOC. DESIRED
\r
270 ; MOVE ITEM,JOB NUMBER
\r
271 ; MOVE PROG,[XWD PROT,,RELOC.]=JBTADR(ITEM)
\r
273 ; ERROR ;EITHER JOB HAS ACTIVE IO
\r
274 ; OR NOT ENOUGH CORE
\r
276 ;JOB IS MOVED IF NECESSARY TO SATISFY REQUEST
\r
277 ;PROG AND JDAT ARE SET TO NEW CORE ASSIGNMENT ON EITHER RETURN
\r
278 ;0 MEANS NONE ASSIGNED IN MEMORY, ASSIGNED ON DISK
\r
280 INTERNAL CORE1,FTTIME,FTTRPSET,CORGET,FTSWAP
\r
281 EXTERNAL JOBJDA,JOB,USRJDA,JOBADR,JBTADR
\r
282 EXTERNAL JOBREL,JOBADR,JOBDAC,JOBPC,JOBDAT,JBTDAT
\r
283 EXTERNAL CORTAL,CORLST,CORTAB,HOLEF,CLRWRD
\r
284 EXTERNAL USRREL,CPOPJ1,JOBJMH,JOBENB,JOBDPD,JOBDPG
\r
285 EXTERNAL JOBPR1,CPOPJ1,JOBPRT,USRPC,CORMAX
\r
286 ;ENTER HERE FROM CORE CONSOLE COMMAND OR INITIAL CORE
\r
287 ;ASSIGNMENT OF JUST A JOB DATA AREA FOR RUN COMMAND
\r
288 ;IE ENTER WHEN DEVICES MAY BE ACTIVE OR JOB MAY HAVE NO PREVIOUS CORE
\r
289 ;JOB CAN HAVE CORE IN MEMORY, CORE ON DISK., OR NONE EITHER PLACE
\r
290 ;JOB CANNOT BE IN PROCESS OF SWAP OUT OR SWAP IN(CALLER'S RESPONSIBILITY)
\r
291 ;CORE0 NO LONGER REASSIGN CORE ON DISK IF OLD CORE ON DISK
\r
292 ;BECAUSE OF FRAGMENTED SWAPPING(TOO HARD) UNLESS 0 BEING ASKED FOR
\r
293 ;THEREFORE THE CORE COMMAND CAUSES JOB TO BE SWAPPED INTO CORE FIRST(INCORE=1)
\r
294 ;HOWEVER, THE R,RUN,GET,KJOB COMMANDS DO NOT REQUIRE HE PREVIOUS CORE IMAGE TO
\r
295 ;BE SWAPPED IN(AS THIS IS SLOW). THEY ASK FOR 140 WORDS, AND LARGER DISK SPACE IS RELINQUISHED
\r
296 ;UPON SWAPIN BY THE SWAPPER, VIRTAL IS INCREASED THEN RATHER THAN
\r
297 ;ON THE CALL TO CORE0.
\r
298 ;IT WILL TRY TO REASSIGN CORE IN MEMORY IF OLD CORE IN MEMORY
\r
299 ;IF THIS FAILS, IT WILL REASSIGN NEW CORE ON DISK AND ASK SWAPPER TO EXPAND
\r
300 ;IF JOB DID NOT HAVE OLD CORE, AN ATTEMPT WILL BE MADE TO ASSIGN CORE IN MEMORY
\r
301 ;IF THIS FAILS, TI WILL BE ASSIGNED ON THE DISK AND ASK SWAPPER TO EXPAND
\r
302 ;THE OTHER PLACES IN THE MONITOR WHERE THE IN-CORE COUNT IS TOUCHED IS
\r
303 ;IN GET WHERE IT INCREMENTS TO SHARE COPY ALREADY IN CORE.
\r
304 ;AND END OF SWPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER
\r
305 ;THE CORE ROUTINES DO NOT ALTER THE HIGH SEG IN CORE COUT. IT IS UP TO THE CALLER
\r
306 ;(IN SEGCOR) TO CALL THE CORE ROUTINES ONLY IF IN CORE COUNT IS 0
\r
307 ;AND END OF SWAPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER
\r
311 JUMPE PROG,CORGET ;IS JOB WITHOUT CORE IN MEMORY?
\r
314 EXTERN IMGOUT,CPOPJ1,CHGSWP
\r
315 JUMPN PROG,CORE0A ;DOES JOB HAVE CORE IN MEMORY?
\r
316 ; (ALWAYS TRUE BOTH SEGS IF CORE UUO)
\r
319 CAML TAC,CORMAX ;NO, WILL REQUEST FIT IN PHYSICAL CORE?
\r
320 ; COMPARE WITH LARGEST PERMITTED ADR+1(BUILD AND
\r
321 ; ONCE CAN RESTART CORMAX)
\r
326 PUSHJ PDP,SUMSEG ;NO, WILL SUM OF BOTHER SEGMENTS FIR IN PHYSICAL CORE?
\r
327 ; LARGEST PERMITTED CORE, COMPARE SUM WITH CORMAX
\r
329 POPJ PDP, ;NO, GIVE ERROR RETURN
\r
330 MOVSI TAC1,SWP ;IS JOB SWAPPED OUT?
\r
331 TDNN TAC1,JBTSTS(ITEM) ;(MAY HAVE 0 DISK SPACE ALTHOUGH SWAPPED OUT)
\r
332 JRST CORE1 ;NO, TRY TO ASSIGN CORE IN MEMORY
\r
333 PUSHJ PDP,CHGSWP ;YES, CHANGE ASSIGNMENT OF SWAPPING SPACE ON DISK
\r
334 ; INCREASE VIRTAL(COUNT OF FREE 1K BLOCKS OF SWAPPING
\r
335 ; (SHOULD NEVER NEED TO DECREASE VIRTAL SINCE
\r
336 ; CORE COMMAND ALWAYSSWAPS JOB IN FIRST).
\r
337 ; (FRAGMENTATION POSTPONES RETURNING SPACE AND
\r
338 ; INCREASING VIRTAL UNTIL SWAP IN IF NOTASKING
\r
339 ; FOR 0 VIRTUAL CORE)
\r
340 JRST CPOPJ1 ;GIVE OK RETURN TO CALLER
\r
347 SKIPN STOPTS ;NO,IS TIME SHARING STOPPED BY
\r
348 ; TRPSET UUO DONE FOR JOB 1?
\r
351 PUSHJ PDP,ANYACT ;NO,ANY ACTIVE DEVICE?
\r
352 POPJ PDP, ;YES, CANNOT ASSIGN CORE
\r
353 ; NO, FALL INTO CORE1
\r
354 ;ROUTINE TO TRY TO ASSIGN CORE IN CORE
\r
355 ;LOW OR HIGH SEG MUST NOT BE SWAPPED OUT(CALLER'S RESPONSIBILITY)
\r
356 ;AND MUST NOT HAVE ANY ACTIVE DEVICES(IT MAY HAVE 0 CORE IN CORE THOUGH)
\r
357 ;IN OTHER WORDS HIGH OR LOW SEG MAY OR MAY NOT HAVE VIRTUAL CORE
\r
358 ;BUT IF IT HAS VIRTUAL CORE IT MUST BE IN PHYSICAL CORE
\r
359 ;THIS IS BOTH A LOGICAL AND A PHYSICAL CORE ASSIGNMENT
\r
360 ;FIRST OLD CORE IS RETURNED TO SYSTEM
\r
361 ;THEN NEW REQUEST IS ATTEMPTED TO BE SATISFIED IN LOWEST
\r
362 ;POSITION POSSIBLE. THUS CORE TENDS TO BE PACKED
\r
363 ;IF NEW REQUEST CANNOT BE GRANTED, OLD AMOUNT OIS RETAINED, IF NON-SWAPPING SYS
\r
364 ;OTHERWISE SWAPPER IS CALLED(XPAND) TO EXPAND CORE BY SWAPPING OUT
\r
369 CORE1: NOSCHEDULE ;PREVENT SCHEDULING
\r
373 PUSHJ PDP,SEGSIZ ;TAC1=OLD SEG SIZE
\r
374 SKIPN LOC,TAC ;IS 0 BEING REQUESTED?
\r
375 MOVNI LOC,1 ;YES, PRETEND -1(DEPEND ON ASH BUG WHICH KEEPS -1
\r
377 ASH LOC,-12 ;CONVERT TO NO. OF K-1(01,0,1,2,...)
\r
378 SUB LOC,TAC1 ;NO. OF K-1 INCREASE=NEW-OLD-1
\r
379 CAMGE LOC,VIRTAL ;IS THERE ENOUGH FREE VIRTUAL CORE IN SYSTEM?
\r
382 CAML TAC,CORMAX ; YES, IS REQUEST LESS THAN MAX, ALLOWED COR+1?
\r
386 PUSHJ PDP,SUMSEG ;YES, IS SUM OF SEGS LESS THEN MAX. ALLOWED CORE+1?
\r
388 POPJ PDP, ;NO, ERROR RETURN
\r
390 ADDI LOC,1 ;YES, GET NO. OF K OF INCREASE
\r
391 MOVNS LOC ;MAKE MINUS FOR UPDATE
\r
392 ADDM LOC,VIRTAL ;AND UPDATE TOTAL VIRTUAL CORE IN SYSTEM
\r
393 ; SINCE THIS REQUEST CAN BE SATISFIIED
\r
395 CORE1A: NOSCHEDULE ;PREVENT JOB SCHEDULING
\r
396 JUMPE PROG,CORGET ;OLD ASSIGNMENT 0?
\r
397 ; IF YES, DO NOT ATTEMPT TO RETURN OLD CORE
\r
398 HRRZ LOC,PROG ;NO. ABS, LOC. OF OLD CORE
\r
399 HLRZ BLK,PROG ;HIGHEST LEGAL REL. ADR.
\r
400 MOVEI T,0 ;CLEAR FOR CORSTG CALL
\r
401 PUSHJ PDP,CORSTG ;RETURN OLD CORE TO FREE STORAGE
\r
402 ;CORGET IS CALLED BY SWAPPER WHEN JOB IS ON DISC AND IS
\r
405 CORGET: SETZB LOC,PROG ;SET NEW ASSIGNMENT TO 0 AND DIST. MOVED
\r
406 JUMPE TAC,DIDLE1 ;IS ZERO CORE BEING REQUESTED?
\r
407 PUSHJ PDP,HOLSRC ;NO, SEARCH FOR HOLE BIG ENOUGH
\r
408 JRST BAKOLD ;NONE, GIVE BACK OLD AMOUNT
\r
412 MOVEM ITEM,LASCOR ;LEAVE TRACKS FOR LAST JOB USING
\r
413 ; PHYSICAL CORE ALLOCATION
\r
414 ; (FOR DEBUGGING ONLY)
\r
416 MOVEM LOC,PROG ;SETUP NEW RELOC
\r
417 HRLM TAC,PROG ;AND NEW PROTECT.
\r
418 MOVEI BLK,(TAC) ;HIGHEST REL ADR. BEING REQUESTED
\r
419 MOVEI T,1 ;SET USE BITS IN CORE TBALE
\r
421 MOVE BLK,JBTADR(ITEM) ;OLD CORE ASSIGNMENT
\r
422 JUMPN BLK,MOVCOR ;WAS THERE OLD MEMORY ASSIGNED?
\r
425 LDB TAC1,IMGOUT ;SIZE(IN K) OF SEG ON DISK TO BE SWAAPED IN
\r
426 LSH TAC1,12 ;CONVERT TO WORDS
\r
429 MOVEI TAC1,0 ;JOB HAS NO PREVIOUS VIRT. CORE(NON-SWAP SYS)
\r
431 MOVE BLK,PROG ;MAKE OLD ASSIGNMENT(BL) APPEAR TO START
\r
432 ; AT SAME PLACE AS NEW ASSIGNMENT(FOR CLEARING)
\r
433 SOJA TAC1,CLRCR1 ;IF NEW CORE SIZE IS BIGGER THAN
\r
434 ;OLD, CLEAR OUT INCREASED SO SECURITY WILL
\r
435 ; BE MAINTAINED. TAC1 IS SIZE-1 OF OLD
\r
436 ; ASSIGNMENT. -1 OF NO OLD ASSIGNMENT
\r
437 ;HERE WHEN FREE CORE TABLE DOES NOT HAVE ENOUGH ROOM FOR REQUEST
\r
442 PUSHJ PDP,XPAND ;TELL SWAPPER TO SWAP OUT
\r
446 SOSO (PDP) ;SET FOR ERROR RETURN AND GET BACK LO CORE
\r
450 PUSHJ PDP,FRECOR ;TRY TO DELETE 1 DORMANT HIGH SEGMENT,
\r
451 ; IF REQUEST DOES NOT EXCEED FREE CORE+DORMANT SEGS
\r
452 SOSA (PDP) ;ERROR RETURN-NOT ENOUGH CORE, GET OLD AMOUNT BACK
\r
453 JRST CORGET ;1 DORMANT SEG DELETED, TRY REQUEST AGAIN
\r
456 BKOLD1: HLRZ TAC,JBTADR(ITEM) ;GIVE BACK OLD CORE.
\r
459 ;MOVE OLD CORE TO NEW AREA
\r
461 MOVCOR: CAIN LOC,(BLK) ;IS NEW CORE IN SAME PLACE AS OLD?
\r
462 JRST CLRCOR ;YES, DO NOT MOVE IT,CLEAR IF INCREASE
\r
463 HLRZ TAC1,BLK ;LENGTH OF OLD CORE
\r
464 CAILE TAC1,(TAC) ;IS OLD CORE LESS THEN NEW?
\r
465 HRRZ TAC1,TAC ;NO, MOVE THE SHORTENED NEW CORE
\r
468 ADDM TAC1,SHRWRD ;INCREMENT TOTAL NO. WORDS SHUFFLED
\r
470 ADD TAC1,LOC ;ADD IN NEW RELOC.
\r
471 MOVE AC1,LOC ;DEST.=NEW RELOC.
\r
472 HRL AC1,BLK ;SOURCE=OLD RELOC.
\r
473 SETZM JBTADR(ITEM) ;FLAG THAT CORE IS IN TRANSIT(TTY ROUTINES)
\r
474 BLT AC1,(TAC1) ;MOVE CORE TO NEW ASSIGNMENT
\r
476 ;CLEAR INCREASE IF NEW CORE IS BIGGER THAN OLD
\r
478 CLRCOR: HLRZ TAC1,BLK ;OLD CORE SIZE-1
\r
479 CLRCR1: CAMG TAC,TAC1 ;IS NEW CORE SIZE-1 VREATER THAN OLD CORE SIZE-1
\r
480 JRST DIDLE ;NO, DO NOT CLEAR ANY CORE
\r
482 MOVE AC1,TAC ;NEW CORE SIZE
\r
483 SUB AC1,TAC1 ;LESS OLD CORE SIZE
\r
484 ADDM AC1,CLRWRD ;ACCUMULATE NO. OF WORDS CLEARED
\r
486 ADDI TAC1,2(PROG) ;YES, OLD SIZE-1+NEW RELOC+2=2ND LOC TO CLEAR
\r
487 ADDI TAC,(PROG) ;NEW SIZE-1+NEW RELOC=LAST LOC TO CLEAR
\r
488 SETZM -1(TAC1) ;CLEAR FIRST WORD
\r
489 HRLI TAC1,-1(TAC1) ;SET LH TO FIRST ADR. TO CLEAR
\r
490 BLT TAC1,(TAC) ;CLEAR THE INCREASE PORTION
\r
491 ;IF THE SHUFFLED JOB IS IN EXEC MODE, ITS DUMP ACS
\r
492 ;(PDP,PROG,JDAT SAVED IN JOB DATA AREA) MUST BE
\r
493 ;ALTERED BY DISTANCE CODE WAS MOVED
\r
495 ;IF THE SHUFFLED JOB IS CURRENT JOB, THE SOFTWARE STATE OF
\r
496 ;THE MONITOR(IE SOFTWARE INFO OF JOB) MUST BE ALTERED BY AMOUNT
\r
501 DIDLE: SUBI LOC,(BLK) ;DISTANCE JOB WAS MOVED(DIST.-SOURCE)
\r
502 CAME ITEM,JOB ;IS THIS CURRENT JOB?
\r
503 SKIPA TAC,JOBPC(JDAT) ;NO. GET PC IN JOB DATA AREA
\r
504 MOVE TAC,USRPC ;YES, PC IN PROTECTED SYSTEM AREA
\r
507 CAIG ITEM,JOBMAX ;IS THIS A HIGH SEGMENT?
\r
509 TLNE TAC,USRMOD ;NO. IS JOB IN USER MODE?
\r
510 JRST DIDLE1 ;YES, DO NOT ALTER DUMP ACS
\r
511 ; BECAUSE THEY ARE IN USERS(OR HIGH SEG)
\r
512 ADDM LOC,JOBDPD(JDAT) ;NO. ALTER DUMP PDP BY DIST. OF MOVE
\r
513 ADDM LOC,JOBDPG(JDAT) ;AND ALTER PROG BY DIST. MOVED
\r
514 DIDLE1: MOVEM PROG,JBTADR(ITEM) ;STORE NEW CORE ASSIGNMENT(LOW OR HIGH SEG)
\r
515 CAME ITEM,JOB ;IS THIS CURRENT JOB?
\r
516 JRST DIDLE3 ;NO, DO NOT ALTER STATE OF MONITOR
\r
517 MOVE TAC,SYSSIZ ;DONT CHANGE PDP IF LIST
\r
518 CAIG TAC,(PDP) ;IS IN SYSTEM
\r
519 ADD PDP,LOC ;YES, ALTER PUSH DOWN POINTER BY AMOUNT OF MOVE
\r
520 PUSHJ PDP,SETREL ;GO SETUP NEW HARDWARE AND SOFTWARE RELOCATION
\r
521 ; INFORMATION FOR HIGH AND LOW SEGS FOR CURRENT JOB
\r
525 PUSHJ PDP,CURHGH ;CHECK TO SEE IF THIS CORE ASSIGNMENT IS FOR
\r
526 ; HIGH SEG WHICH CURRENT USER MAY ALSO BE USING
\r
527 ; IF YES, RESET HARDWARE AND SOFTWARE RELOC INFO.
\r
528 ; OF SEG WHICH HAS JUST HAD CORE REASSIGNED
\r
531 SETZB TAC,HOLEF ;CLEAR HOLD FLAG
\r
532 PUSHJ PDP,HOLSRC ;IS THERE A NON-ZERO HOLE?
\r
534 ADDI LOC,1(BLK) ;YES, FORM ADR. OF JOB JUST ABOVE HOLD
\r
535 CAME T,CORLST ;IS HOLE AT TOP OF MEMORY
\r
536 MOVEM LOC,HOLEF ;NO, FLAG WITH ADDRESS OF JOB ABOVE HOLE
\r
540 MOVEI TAC,-1 ;FIND BIGGEST HOLE
\r
541 PUSHJ PDP,HOLSRC ;ALWAYS GET ERROR RETURN
\r
542 ASH T1,-^D10 ;CONVERT TPO 1K BLOCKS
\r
546 JRST CPOPJ1 ;SKIP RETURN(UNLES ERROR)
\r
548 ;ROUTINE TO FIND HOLD BIG ENOUGH FOR REQUEST
\r
549 ;CALL: MOVE TAC,HIGHEST REL. ADR. ASKING FOR
\r
551 ; RETURN1 ;NO HOLES BIG ENOUGH
\r
552 ; RETURN2 ;T BYTE SET TO LAST BLOCK+1 IN HOLE
\r
553 ; ;BLK SET TO HIGHEST REL. LOC. IN THAT HOLE
\r
554 ; ;LOC SET TO ADDRESS OF FIRST BLOCK IN HOLE
\r
555 ; ;T1=LARGEST HOLE SEEN
\r
558 HOLSRC: MOVE T,CORE2P ;BYTE POINTER TO FIRST BIT-1
\r
559 SETZB LOC,T1 ;START AT BOTTOM OF MEMORY
\r
560 ; LARGEST HOLE SO FAR=0
\r
561 CORHOL: TDZA BLK,BLK ;START BLK AT 0 AND SKIP
\r
563 CORHO0: ADDI BLK,2000 ;INCREMENT HIGHEST REL LOC.
\r
564 CORHO1: CAMN T,CORLST ;BYTE POINTER TO 1ST NON-EXISTANT BLOCK
\r
565 POPJ PDP, ;NO MORE CORE TO SEARCH
\r
566 ILDB TAC1,T ;GET NEXT CORE USE BIT
\r
567 ADDI LOC,2000 ;INCREMENT ADDRESS OF BLOCK
\r
568 JUMPE TAC1,CORHO0 ;IS THIS BLOCK IN USE?
\r
569 JUMPE BLK,CORHO1 ;YES, HAVE ANY FREE BLOCKS BEEN SEEN YET?
\r
571 CAMLE BLK,T1 ;YES, BIGGEST SO FAR?
\r
572 MOVEM BLK,T1 ;YES, SAVE IN T1.
\r
574 CAMG BLK,TAC ;YES, IS THIS HOLD EQUAL OR GREATER THEN REQUEST?
\r
575 JRST CORHOL ;NO, KEEP LOOKING FOR HOLES
\r
576 SUBI LOC,2000(BLK) ;YES, SET LOC TO FIRST BLOCK IN HOLD
\r
577 SOJA BLK,CPOPJ1 ;SET BLK TO HIGHEST REL. LOC.
\r
580 ;ROUTINE TO SET AND CLEAR CORE USE TABLE
\r
581 ;CALL: MOVEI T,1 ;TO SET TABLE
\r
582 MOVEI T,0 ;TO CLEAR TABLE
\r
583 ; MOVE BLK,HIGHEST REL. LOC. IN USER AREA
\r
584 ; MOVE LOC,ADDRESS OF FIRST BLOCK TO SET CLEAR
\r
589 CORSTG: PUSH PDP,TAC ;SAVE HIGHEST LOC. BEING REQUESTED
\r
590 ASH BLK,-12 ;CONVERT TO NO. OF BLOCKS-1
\r
591 ADDI BLK,1 ;NO. OF BLOCKS
\r
592 SKIPE T ;UPDATE NO OF FREE BLOCKS
\r
593 MOVNS BLK ;DECREASE IF SETTING BITS
\r
594 ADDM BLK,CORTAL ;INCREASE IF CLEARING,DECREASE IF SSETING BITS
\r
595 MOVE TAC,LOC ;ADDRESS OF FIRST BLOCK
\r
596 ASH TAC,-12 ;FORM BYTE POINTER TO BIT-1
\r
597 IDIVI TAC,^D36 ;TAC=WORD,TAC1=BIT
\r
598 ADD TAC,CORE2P ;FORM BYTE POINTER
\r
602 DPB TAC1,[POINT 6,TAC,5]
\r
603 MOVMS BLK ;GET MAG. OF NO. OF BLOCKS INVOLVED
\r
604 IDPB T,TAC ;SET OR CLEAR EACH USE BIT
\r
606 JRST TPOPJ ;RESTORE TAC. AND POPJ
\r
608 CORE2P: POINT 1,CORTAB ;BYTE POINTER TO FIRST BIT-1
\r
610 ;ROUTINE TO CLEAR PART OF JOB DAT AREA(PART PROTECTED FROM USER IO)
\r
611 ;CALLED WHEN NEW CORE ASSIGNED AND AT SYSTEM RESTART(140)
\r
612 ; MOVE ITEM,JOB NO.
\r
613 ;CALL: MOVE JDAT,ADR. OF JOB DATA AREA
\r
617 EXTERNAL JOBPRT,JOBPR1,JOBPFI,JOBENB
\r
618 EXTERNAL JOBPD1,JOBDDT
\r
620 CLRJOB: SETZM JOBPRT(JDAT) ;FIRST LOC. PROTECED FROM USER
\r
621 MOVSI TAC,JOBPRT(JDAT)
\r
622 HRRI TAC,JOBPR1(JDAT)
\r
623 MOVE TAC1,JOBDDT(JDAT) ;SAVE DDT STARTING ADDRESS
\r
624 BLT TAC,JOBPFI(JDAT)
\r
625 MOVEM TAC1,JOBDDT(JDAT)
\r
626 SETZM JOBENB(JDAT) ;ALSO CLEAR APR ENABLE WORD
\r
627 SETZM JOBPD1(JDAT) ;AND UUO PC FLAGS(USED WHEN JOB STARTS)
\r
628 JRST ESTOP1 ;GO SET JOB STATUS, SO CONT WILL
\r
629 ; NOT WORK,(DO NOT CLEAR JACCT BIT)
\r