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
96 ;ROUTINE TO CHECK JOBS TO SEE IF ANY JOB CAN BE SHUFFLED
\r
97 ;IT IS CALLED EVERY 60TH OF A SECOND BY CLOCK ROUTINE
\r
98 ;PROVIDING CURRENT JOB IS IN USER MODE OR JUST ENTERING
\r
99 ;IO WAIT OR SHARABLE DEVICE WIAT OR RETURNING ON UUO CALLS
\r
100 ;IE CURRENT JOB AND ALL OTHER JOB ARE SHUFFABLE WITH RESPECT
\r
101 ;TO RELOCATION INFO IN MONITOR
\r
102 ;SINCE RESCHEDULING IS NEVER DONE WHEN CURRENT JOB
\r
103 ;IS NOT SHUFFABLE. ALL JOBS ARE SHUFFABLE WHEN
\r
105 ;THE NOSHUFFLE MACRO SHOULD STILL BE USED WHEN EVER
\r
106 ;THE MONITOR MOVES RELOCATION OUT OF ACS PDP,PROG. OR JDAT
\r
107 ;IN CASE IT SHOULD PROVE DESIRABLE IN THE FUTURE TO SHUFFLE
\r
108 ;MORE FREQUENTLY THEN AT THE ABOVE TIMES
\r
109 ;FINALLY A JOB MUST HAVE ALL DEVICES INACTIVE(SINCE SOME
\r
110 ;OF THEM USE ABSOLUTE ADDRESSES)BEFORE IT CAN BE MOVED
\r
111 ;SO CORE CANNOT BE REASSIGNED WHILE DEVICES ARE ACTIVE
\r
112 ;IF DEVICES ARE ACTIVE, JOB WILL BE STOPPED SO THAT IO WILL
\r
113 ;CEASE SOON SO JOB CAN BE SHUFFLED
\r
114 ;ALL DEVICES LOOK AT SHF BIT IN JBTSTS(ADVBEF OR ADVDFE)
\r
115 ;TO SEE IF MONITOR IS WAITING TO SHUFFLE JOB
\r
116 ;THE NSHF BIT IN JOBSTS WHOULD BE SET FOR JOBS USING DISPLAYS
\r
117 ;SINCE DISSER CONTINUALLY REFERENCES USER AREA EVEN THOUGH
\r
120 ;THIS VERSION OF THE CORE SHUFFLER WORKS AS FOLLOWS:
\r
121 ;EVERY CLOCK TICK FOR WHICH ALL JOBS ARE SHUFFABLE(NOT COUNTING ACTIVE
\r
122 ;IO DEVICES). THE JOB IMMEDIATELY ABOVE THE LOWEST HOLE
\r
123 ;(IF ANY) WILL BE MOVED DOWN INTO HOLE. THE HOLEF IS SET NON-ZERO
\r
124 ;TO THE ADDRESS OF JOB IMMEDIATELY ABOVE THE LOWEST
\r
125 ;HOLE(0 IF NONE), EVERY TIME CORE IS REASSIGNED.
\r
126 ;CANNOT BE CALLED WHILE SWAPPING IN PROGRESS FOR THIS JOB(BECAUSE IT CALLS CORE0)
\r
128 INTERNAL CHKSHF,FTSWAP
\r
129 EXTERNAL SHFWAT,HOLEF,CLKCHL,JBTADR,JBTSTS,JBTMAX
\r
131 CHKSHF: SKIPE ITEM,SHFWAT ;HAS CHKSHF STOPPED A JOB AND IS WAITING FOR
\r
132 ; DEVICES TO BECOME INACTIVE?
\r
133 JRST SHFLOP ;YES, SEE IF IO HAS STOPPED YET
\r
134 SKIPN TAC,HOLEF ;NO, DOES CORE HAVE A HOLE IN IT?
\r
136 MOVEI ITEM,JBTMAX ;SEARCH FOR JOB OR HIGH SEG JUST ABOVE HOLE
\r
137 HOLLOP: HRRZ TAC1,JBTADR(ITEM) ;ADR. OF JOB
\r
140 SOJG ITEM,HOLLOP ;NOT JOB ABOVE HOLE KEEP LOOKG
\r
141 JUMPG ITEM,SHFLOP ;FOUND ONE?
\r
142 SETZM HOLEF ;NO, CLEAR HOLEF OR ELSE ERROR WILL BE PRINTED EVERY
\r
143 ; CLOCK TICK AND ERROR MESSAGE WILL NEVER PRINT
\r
144 JSP DAT,OERROR ;SYSTEM ERROR(TELL OPERATOR)
\r
146 SHFLOP: SKIPE PROG,JBTADR(ITEM) ;JOB ABOVE HOLE STILL IN CORE ?
\r
147 PUSHJ PDP,ANYACT ;NO ALL DEVICES FINISHED ?
\r
148 JRST NOTSHF ;YES, GO SEE IF HOLD STILL THERE
\r
150 MOVE JDAT,JBTDAT(ITEM) ;JOB DATA AREA
\r
152 HLRZ TAC,PROG ;YEST, REASSIGN SAME AMOUNT OF CORE.
\r
153 PUSHJ PDP,SCORE1 ;IN A LOWER POSITION IN CORE
\r
155 NOTSH1: SETZM SHFWAT ;JOB SHUFFLED, CLEAR FLAG
\r
156 MOVSI TAC,SHF ;CLEAR SHUFFLE WAIT BIT IN CASE IT WAS ON
\r
157 ANDCAM TAC,JBTSTS(ITEM)
\r
160 ;JOB CANNOT BE MOVED BECAUSE IT HAS ACTIVE DEVICES OR NSHF BIT SET(DISPLAY,REALTIME)
\r
161 ; SO JOB CANNOT BY SHUFFLED AT THIS TIME
\r
163 NOTSHF: SKIPN HOLEF ;IS HOLE STILL THERE?
\r
172 MOVEM ITEM,SHFWAT ;SET SHUFFLE WAIT FLAG WITH JOB NO.
\r
173 MOVSI TAC,SHF ;SET SHF WAIT BIT IN JOB STATUS WORD
\r
174 IORM TAC,JBTSTS(ITEM) ;SO JOB WILL NOT BE RUN
\r
175 POPJ PDP, ;AND IO WILL STOP SOON
\r
176 \f;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
222 \f;ROUTINE TO TEST TO SEE IF JOB OR HIGH SEG CAN BE SWAPPED
\r
223 ; OR WHETHER IT SHOULD BE ALLOWED TO CONITNUE RUNNING
\r
224 ; UNTIL A MORE FAVORABLE ITME
\r
225 ;CALL: MOVE ITEM,HIGH RO LOW SEG NUMBER
\r
227 ; RETURN1 - JOB MUST REMAIN RUNABLE(NSHF,NSWP SET OR SAVE,GET IN PROGRESS); RETURN2 - OK TO SWAP HIGH OR LOW SEG
\r
231 EXTERN JBTSTS,CPOPJ1
\r
233 TRYSWP: MOVE T,JBTSTS(ITEM) ;IS JONB OR HIGH SEG NOT SWAPPABLE?
\r
234 TLNE T,NSHF!NSWP ;OR SHUFFABLE(DISPLAY,REAL TIME)?
\r
235 POPJ PDP, ;YES, ERROR RETURN
\r
238 JRST ANYSAV ;NO, SEE IF THIS JOB IS INVLOVED IN A SAVE,GET
\r
239 ; WHICH IS STILL ACTIVE
\r
242 JRST CPOPJ1 ;NO, GIVE OK RETURN
\r
245 \f;ROUTINE TO FLUSH PHYSICAL CORE ASSIGNED IN MEMORY
\r
246 ;NOTE: THIS ROUTINE DIFERS SIGNIFICANTLY FROM CORE0 AND CORE1 IN THAT
\r
247 ;IT IS ONLY A PHYSICAL REMOVAL OF CORE(VIRTAL IS NOT AFFECTED)
\r
248 ;SEE COMMENTS FOR CORE1
\r
249 ;CALL: MOVE ITEM,HIGH OR LOW SEGMENT NUMBER
\r
251 ; ALWAYS RETURN HERE
\r
252 ;SCORE1 IS CALLED FROM SHUFFLER WITH TAC SET TO SEG SIZE
\r
256 KCORE1: MOVEI TAC,0 ;SETUP DESIRED HIGHEST ADR
\r
257 SCORE1: SOS(PDP) ;CORE1 WILL ALWAYS SKIP RETURN
\r
258 JRST CORE1A ;BYPASS LOGICAL CORE ASSIGNMENT PART
\r
259 ; AND FLUSH PHYSICAL CORE(LOGICAL CORE UNEFFECTED)
\r
263 ;CORE0 IS CALLED BY THE CORE MONITOR COMMAND AND THE CORE SHUFFLER
\r
266 ;BOTH LOGICAL AND PHYSICAL CORE ASSIGNMENT ARE AFFECTED
\r
268 ;CALL: MOVE TAC,HIGHEST LEGAL ASSRESSABLE LOC. DESIRED
\r
269 ; MOVE ITEM,JOB NUMBER
\r
270 ; MOVE PROG,[XWD PROT,,RELOC.]=JBTADR(ITEM)
\r
272 ; ERROR ;EITHER JOB HAS ACTIVE IO
\r
273 ; OR NOT ENOUGH CORE
\r
275 ;JOB IS MOVED IF NECESSARY TO SATISFY REQUEST
\r
276 ;PROG AND JDAT ARE SET TO NEW CORE ASSIGNMENT ON EITHER RETURN
\r
277 ;0 MEANS NONE ASSIGNED IN MEMORY, ASSIGNED ON DISK
\r
279 INTERNAL CORE1,FTTIME,FTTRPSET,CORGET,FTSWAP
\r
280 EXTERNAL JOBJDA,JOB,USRJDA,JOBADR,JBTADR
\r
281 EXTERNAL JOBREL,JOBADR,JOBDAC,JOBPC,JOBDAT,JBTDAT
\r
282 EXTERNAL CORTAL,CORLST,CORTAB,HOLEF,CLRWRD
\r
283 EXTERNAL USRREL,CPOPJ1,JOBJMH,JOBENB,JOBDPD,JOBDPG
\r
284 EXTERNAL JOBPR1,CPOPJ1,JOBPRT,USRPC,CORMAX
\r
285 ;ENTER HERE FROM CORE CONSOLE COMMAND OR INITIAL CORE
\r
286 ;ASSIGNMENT OF JUST A JOB DATA AREA FOR RUN COMMAND
\r
287 ;IE ENTER WHEN DEVICES MAY BE ACTIVE OR JOB MAY HAVE NO PREVIOUS CORE
\r
288 ;JOB CAN HAVE CORE IN MEMORY, CORE ON DISK., OR NONE EITHER PLACE
\r
289 ;JOB CANNOT BE IN PROCESS OF SWAP OUT OR SWAP IN(CALLER'S RESPONSIBILITY)
\r
290 ;CORE0 NO LONGER REASSIGN CORE ON DISK IF OLD CORE ON DISK
\r
291 ;BECAUSE OF FRAGMENTED SWAPPING(TOO HARD) UNLESS 0 BEING ASKED FOR
\r
292 ;THEREFORE THE CORE COMMAND CAUSES JOB TO BE SWAPPED INTO CORE FIRST(INCORE=1)
\r
293 ;HOWEVER, THE R,RUN,GET,KJOB COMMANDS DO NOT REQUIRE HE PREVIOUS CORE IMAGE TO
\r
294 ;BE SWAPPED IN(AS THIS IS SLOW). THEY ASK FOR 140 WORDS, AND LARGER DISK SPACE IS RELINQUISHED
\r
295 ;UPON SWAPIN BY THE SWAPPER, VIRTAL IS INCREASED THEN RATHER THAN
\r
296 ;ON THE CALL TO CORE0.
\r
297 ;IT WILL TRY TO REASSIGN CORE IN MEMORY IF OLD CORE IN MEMORY
\r
298 ;IF THIS FAILS, IT WILL REASSIGN NEW CORE ON DISK AND ASK SWAPPER TO EXPAND
\r
299 ;IF JOB DID NOT HAVE OLD CORE, AN ATTEMPT WILL BE MADE TO ASSIGN CORE IN MEMORY
\r
300 ;IF THIS FAILS, TI WILL BE ASSIGNED ON THE DISK AND ASK SWAPPER TO EXPAND
\r
301 ;THE OTHER PLACES IN THE MONITOR WHERE THE IN-CORE COUNT IS TOUCHED IS
\r
302 ;IN GET WHERE IT INCREMENTS TO SHARE COPY ALREADY IN CORE.
\r
303 ;AND END OF SWPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER
\r
304 ;THE CORE ROUTINES DO NOT ALTER THE HIGH SEG IN CORE COUT. IT IS UP TO THE CALLER
\r
305 ;(IN SEGCOR) TO CALL THE CORE ROUTINES ONLY IF IN CORE COUNT IS 0
\r
306 ;AND END OF SWAPIN OF LOW SEG AND HIGH SEG IS ALREADY IN CORE FOR OTHER USER
\r
309 JUMPE PROG,CORGET ;IS JOB WITHOUT CORE IN MEMORY?
\r
312 EXTERN IMGOUT,CPOPJ1,CHGSWP
\r
313 JUMPN PROG,CORE0A ;DOES JOB HAVE CORE IN MEMORY?
\r
314 ; (ALWAYS TRUE BOTH SEGS IF CORE UUO)
\r
317 CAML TAC,CORMAX ;NO, WILL REQUEST FIT IN PHYSICAL CORE?
\r
318 ; COMPARE WITH LARGEST PERMITTED ADR+1(BUILD AND
\r
319 ; ONCE CAN RESTART CORMAX)
\r
324 PUSHJ PDP,SUMSEG ;NO, WILL SUM OF BOTHER SEGMENTS FIR IN PHYSICAL CORE?
\r
325 ; LARGEST PERMITTED CORE, COMPARE SUM WITH CORMAX
\r
327 POPJ PDP, ;NO, GIVE ERROR RETURN
\r
328 MOVSI TAC1,SWP ;IS JOB SWAPPED OUT?
\r
329 TDNN TAC1,JBTSTS(ITEM) ;(MAY HAVE 0 DISK SPACE ALTHOUGH SWAPPED OUT)
\r
330 JRST CORE1 ;NO, TRY TO ASSIGN CORE IN MEMORY
\r
331 PUSHJ PDP,CHGSWP ;YES, CHANGE ASSIGNMENT OF SWAPPING SPACE ON DISK
\r
332 ; INCREASE VIRTAL(COUNT OF FREE 1K BLOCKS OF SWAPPING
\r
333 ; (SHOULD NEVER NEED TO DECREASE VIRTAL SINCE
\r
334 ; CORE COMMAND ALWAYSSWAPS JOB IN FIRST).
\r
335 ; (FRAGMENTATION POSTPONES RETURNING SPACE AND
\r
336 ; INCREASING VIRTAL UNTIL SWAP IN IF NOTASKING
\r
337 ; FOR 0 VIRTUAL CORE)
\r
338 JRST CPOPJ1 ;GIVE OK RETURN TO CALLER
\r
345 SKIPN STOPTS ;NO,IS TIME SHARING STOPPED BY
\r
346 ; TRPSET UUO DONE FOR JOB 1?
\r
349 PUSHJ PDP,ANYACT ;NO,ANY ACTIVE DEVICE?
\r
350 POPJ PDP, ;YES, CANNOT ASSIGN CORE
\r
351 ; NO, FALL INTO CORE1
\r
352 \f;ROUTINE TO TRY TO ASSIGN CORE IN CORE
\r
353 ;LOW OR HIGH SEG MUST NOT BE SWAPPED OUT(CALLER'S RESPONSIBILITY)
\r
354 ;AND MUST NOT HAVE ANY ACTIVE DEVICES(IT MAY HAVE 0 CORE IN CORE THOUGH)
\r
355 ;IN OTHER WORDS HIGH OR LOW SEG MAY OR MAY NOT HAVE VIRTUAL CORE
\r
356 ;BUT IF IT HAS VIRTUAL CORE IT MUST BE IN PHYSICAL CORE
\r
357 ;THIS IS BOTH A LOGICAL AND A PHYSICAL CORE ASSIGNMENT
\r
358 ;FIRST OLD CORE IS RETURNED TO SYSTEM
\r
359 ;THEN NEW REQUEST IS ATTEMPTED TO BE SATISFIED IN LOWEST
\r
360 ;POSITION POSSIBLE. THUS CORE TENDS TO BE PACKED
\r
361 ;IF NEW REQUEST CANNOT BE GRANTED, OLD AMOUNT OIS RETAINED, IF NON-SWAPPING SYS
\r
362 ;OTHERWISE SWAPPER IS CALLED(XPAND) TO EXPAND CORE BY SWAPPING OUT
\r
367 CORE1: NOSCHEDULE ;PREVENT SCHEDULING
\r
371 PUSHJ PDP,SEGSIZ ;TAC1=OLD SEG SIZE
\r
372 SKIPN LOC,TAC ;IS 0 BEING REQUESTED?
\r
373 MOVNI LOC,1 ;YES, PRETEND -1(DEPEND ON ASH BUG WHICH KEEPS -1
\r
375 ASH LOC,-12 ;CONVERT TO NO. OF K-1(01,0,1,2,...)
\r
376 SUB LOC,TAC1 ;NO. OF K-1 INCREASE=NEW-OLD-1
\r
377 CAMGE LOC,VIRTAL ;IS THERE ENOUGH FREE VIRTUAL CORE IN SYSTEM?
\r
380 CAML TAC,CORMAX ; YES, IS REQUEST LESS THAN MAX, ALLOWED COR+1?
\r
384 PUSHJ PDP,SUMSEG ;YES, IS SUM OF SEGS LESS THEN MAX. ALLOWED CORE+1?
\r
386 POPJ PDP, ;NO, ERROR RETURN
\r
388 ADDI LOC,1 ;YES, GET NO. OF K OF INCREASE
\r
389 MOVNS LOC ;MAKE MINUS FOR UPDATE
\r
390 ADDM LOC,VIRTAL ;AND UPDATE TOTAL VIRTUAL CORE IN SYSTEM
\r
391 ; SINCE THIS REQUEST CAN BE SATISFIIED
\r
393 CORE1A: NOSCHEDULE ;PREVENT JOB SCHEDULING
\r
394 JUMPE PROG,CORGET ;OLD ASSIGNMENT 0?
\r
395 ; IF YES, DO NOT ATTEMPT TO RETURN OLD CORE
\r
396 HRRZ LOC,PROG ;NO. ABS, LOC. OF OLD CORE
\r
397 HLRZ BLK,PROG ;HIGHEST LEGAL REL. ADR.
\r
398 MOVEI T,0 ;CLEAR FOR CORSTG CALL
\r
399 PUSHJ PDP,CORSTG ;RETURN OLD CORE TO FREE STORAGE
\r
400 \f;CORGET IS CALLED BY SWAPPER WHEN JOB IS ON DISC AND IS
\r
403 CORGET: SETZB LOC,PROG ;SET NEW ASSIGNMENT TO 0 AND DIST. MOVED
\r
404 JUMPE TAC,DIDLE1 ;IS ZERO CORE BEING REQUESTED?
\r
405 PUSHJ PDP,HOLSRC ;NO, SEARCH FOR HOLE BIG ENOUGH
\r
406 JRST BAKOLD ;NONE, GIVE BACK OLD AMOUNT
\r
410 MOVEM ITEM,LASCOR ;LEAVE TRACKS FOR LAST JOB USING
\r
411 ; PHYSICAL CORE ALLOCATION
\r
412 ; (FOR DEBUGGING ONLY)
\r
414 MOVEM LOC,PROG ;SETUP NEW RELOC
\r
415 HRLM TAC,PROG ;AND NEW PROTECT.
\r
416 MOVEI BLK,(TAC) ;HIGHEST REL ADR. BEING REQUESTED
\r
417 MOVEI T,1 ;SET USE BITS IN CORE TBALE
\r
419 MOVE BLK,JBTADR(ITEM) ;OLD CORE ASSIGNMENT
\r
420 JUMPN BLK,MOVCOR ;WAS THERE OLD MEMORY ASSIGNED?
\r
423 LDB TAC1,IMGOUT ;SIZE(IN K) OF SEG ON DISK TO BE SWAAPED IN
\r
424 LSH TAC1,12 ;CONVERT TO WORDS
\r
427 MOVEI TAC1,0 ;JOB HAS NO PREVIOUS VIRT. CORE(NON-SWAP SYS)
\r
429 MOVE BLK,PROG ;MAKE OLD ASSIGNMENT(BL) APPEAR TO START
\r
430 ; AT SAME PLACE AS NEW ASSIGNMENT(FOR CLEARING)
\r
431 SOJA TAC1,CLRCR1 ;IF NEW CORE SIZE IS BIGGER THAN
\r
432 ;OLD, CLEAR OUT INCREASED SO SECURITY WILL
\r
433 ; BE MAINTAINED. TAC1 IS SIZE-1 OF OLD
\r
434 ; ASSIGNMENT. -1 OF NO OLD ASSIGNMENT
\r
435 \f;HERE WHEN FREE CORE TABLE DOES NOT HAVE ENOUGH ROOM FOR REQUEST
\r
440 PUSHJ PDP,XPAND ;TELL SWAPPER TO SWAP OUT
\r
444 SOSO (PDP) ;SET FOR ERROR RETURN AND GET BACK LO CORE
\r
448 PUSHJ PDP,FRECOR ;TRY TO DELETE 1 DORMANT HIGH SEGMENT,
\r
449 ; IF REQUEST DOES NOT EXCEED FREE CORE+DORMANT SEGS
\r
450 SOSA (PDP) ;ERROR RETURN-NOT ENOUGH CORE, GET OLD AMOUNT BACK
\r
451 JRST CORGET ;1 DORMANT SEG DELETED, TRY REQUEST AGAIN
\r
454 BKOLD1: HLRZ TAC,JBTADR(ITEM) ;GIVE BACK OLD CORE.
\r
456 \f;MOVE OLD CORE TO NEW AREA
\r
458 MOVCOR: CAIN LOC,(BLK) ;IS NEW CORE IN SAME PLACE AS OLD?
\r
459 JRST CLRCOR ;YES, DO NOT MOVE IT,CLEAR IF INCREASE
\r
460 HLRZ TAC1,BLK ;LENGTH OF OLD CORE
\r
461 CAILE TAC1,(TAC) ;IS OLD CORE LESS THEN NEW?
\r
462 HRRZ TAC1,TAC ;NO, MOVE THE SHORTENED NEW CORE
\r
465 ADDM TAC1,SHFWRD ;INCREMENT TOTAL NO. WORDS SHUFFLED
\r
467 ADD TAC1,LOC ;ADD IN NEW RELOC.
\r
468 MOVE AC1,LOC ;DEST.=NEW RELOC.
\r
469 HRL AC1,BLK ;SOURCE=OLD RELOC.
\r
470 SETZM JBTADR(ITEM) ;FLAG THAT CORE IS IN TRANSIT(TTY ROUTINES)
\r
471 BLT AC1,(TAC1) ;MOVE CORE TO NEW ASSIGNMENT
\r
473 ;CLEAR INCREASE IF NEW CORE IS BIGGER THAN OLD
\r
475 CLRCOR: HLRZ TAC1,BLK ;OLD CORE SIZE-1
\r
476 CLRCR1: CAMG TAC,TAC1 ;IS NEW CORE SIZE-1 VREATER THAN OLD CORE SIZE-1
\r
477 JRST DIDLE ;NO, DO NOT CLEAR ANY CORE
\r
479 MOVE AC1,TAC ;NEW CORE SIZE
\r
480 SUB AC1,TAC1 ;LESS OLD CORE SIZE
\r
481 ADDM AC1,CLRWRD ;ACCUMULATE NO. OF WORDS CLEARED
\r
483 ADDI TAC1,2(PROG) ;YES, OLD SIZE-1+NEW RELOC+2=2ND LOC TO CLEAR
\r
484 ADDI TAC,(PROG) ;NEW SIZE-1+NEW RELOC=LAST LOC TO CLEAR
\r
485 SETZM -1(TAC1) ;CLEAR FIRST WORD
\r
486 HRLI TAC1,-1(TAC1) ;SET LH TO FIRST ADR. TO CLEAR
\r
487 BLT TAC1,(TAC) ;CLEAR THE INCREASE PORTION
\r
489 ;IF THE SHUFFLED JOB IS IN EXEC MODE, ITS DUMP ACS
\r
490 ;(PDP,PROG,JDAT SAVED IN JOB DATA AREA) MUST BE
\r
491 ;ALTERED BY DISTANCE CODE WAS MOVED
\r
493 ;IF THE SHUFFLED JOB IS CURRENT JOB, THE SOFTWARE STATE OF
\r
494 ;THE MONITOR(IE SOFTWARE INFO OF JOB) MUST BE ALTERED BY AMOUNT
\r
499 DIDLE: SUBI LOC,(BLK) ;DISTANCE JOB WAS MOVED(DIST.-SOURCE)
\r
500 CAME ITEM,JOB ;IS THIS CURRENT JOB?
\r
501 SKIPA TAC,JOBPC(JDAT) ;NO. GET PC IN JOB DATA AREA
\r
502 MOVE TAC,USRPC ;YES, PC IN PROTECTED SYSTEM AREA
\r
505 CAIG ITEM,JOBMAX ;IS THIS A HIGH SEGMENT?
\r
507 TLNE TAC,USRMOD ;NO. IS JOB IN USER MODE?
\r
508 JRST DIDLE1 ;YES, DO NOT ALTER DUMP ACS
\r
509 ; BECAUSE THEY ARE IN USERS(OR HIGH SEG)
\r
510 ADDM LOC,JOBDPD(JDAT) ;NO. ALTER DUMP PDP BY DIST. OF MOVE
\r
511 ADDM LOC,JOBDPG(JDAT) ;AND ALTER PROG BY DIST. MOVED
\r
512 DIDLE1: MOVEM PROG,JBTADR(ITEM) ;STORE NEW CORE ASSIGNMENT(LOW OR HIGH SEG)
\r
513 CAME ITEM,JOB ;IS THIS CURRENT JOB?
\r
514 JRST DIDLE3 ;NO, DO NOT ALTER STATE OF MONITOR
\r
515 MOVE TAC,SYSSIZ ;DONT CHANGE PDP IF LIST
\r
516 CAIG TAC,(PDP) ;IS IN SYSTEM
\r
517 ADD PDP,LOC ;YES, ALTER PUSH DOWN POINTER BY AMOUNT OF MOVE
\r
518 PUSHJ PDP,SETREL ;GO SETUP NEW HARDWARE AND SOFTWARE RELOCATION
\r
519 ; INFORMATION FOR HIGH AND LOW SEGS FOR CURRENT JOB
\r
523 PUSHJ PDP,CURHGH ;CHECK TO SEE IF THIS CORE ASSIGNMENT IS FOR
\r
524 ; HIGH SEG WHICH CURRENT USER MAY ALSO BE USING
\r
525 ; IF YES, RESET HARDWARE AND SOFTWARE RELOC INFO.
\r
526 ; OF SEG WHICH HAS JUST HAD CORE REASSIGNED
\r
529 SETZB TAC,HOLEF ;CLEAR HOLD FLAG
\r
530 PUSHJ PDP,HOLSRC ;IS THERE A NON-ZERO HOLE?
\r
532 ADDI LOC,1(BLK) ;YES, FORM ADR. OF JOB JUST ABOVE HOLD
\r
533 CAME T,CORLST ;IS HOLE AT TOP OF MEMORY
\r
534 MOVEM LOC,HOLEF ;NO, FLAG WITH ADDRESS OF JOB ABOVE HOLE
\r
538 MOVEI TAC,-1 ;FIND BIGGEST HOLE
\r
539 PUSHJ PDP,HOLSRC ;ALWAYS GET ERROR RETURN
\r
540 ASH T1,-^D10 ;CONVERT TPO 1K BLOCKS
\r
544 JRST CPOPJ1 ;SKIP RETURN(UNLES ERROR)
\r
546 ;ROUTINE TO FIND HOLD BIG ENOUGH FOR REQUEST
\r
547 ;CALL: MOVE TAC,HIGHEST REL. ADR. ASKING FOR
\r
549 ; RETURN1 ;NO HOLES BIG ENOUGH
\r
550 ; RETURN2 ;T BYTE SET TO LAST BLOCK+1 IN HOLE
\r
551 ; ;BLK SET TO HIGHEST REL. LOC. IN THAT HOLE
\r
552 ; ;LOC SET TO ADDRESS OF FIRST BLOCK IN HOLE
\r
553 ; ;T1=LARGEST HOLE SEEN
\r
556 HOLSRC: MOVE T,CORE2P ;BYTE POINTER TO FIRST BIT-1
\r
557 SETZB LOC,T1 ;START AT BOTTOM OF MEMORY
\r
558 ; LARGEST HOLE SO FAR=0
\r
559 CORHOL: TDZA BLK,BLK ;START BLK AT 0 AND SKIP
\r
561 CORHO0: ADDI BLK,2000 ;INCREMENT HIGHEST REL LOC.
\r
562 CORHO1: CAMN T,CORLST ;BYTE POINTER TO 1ST NON-EXISTANT BLOCK
\r
563 POPJ PDP, ;NO MORE CORE TO SEARCH
\r
564 ILDB TAC1,T ;GET NEXT CORE USE BIT
\r
565 ADDI LOC,2000 ;INCREMENT ADDRESS OF BLOCK
\r
566 JUMPE TAC1,CORHO0 ;IS THIS BLOCK IN USE?
\r
567 JUMPE BLK,CORHO1 ;YES, HAVE ANY FREE BLOCKS BEEN SEEN YET?
\r
569 CAMLE BLK,T1 ;YES, BIGGEST SO FAR?
\r
570 MOVEM BLK,T1 ;YES, SAVE IN T1.
\r
572 CAMG BLK,TAC ;YES, IS THIS HOLD EQUAL OR GREATER THEN REQUEST?
\r
573 JRST CORHOL ;NO, KEEP LOOKING FOR HOLES
\r
574 SUBI LOC,2000(BLK) ;YES, SET LOC TO FIRST BLOCK IN HOLD
\r
575 SOJA BLK,CPOPJ1 ;SET BLK TO HIGHEST REL. LOC.
\r
577 \f;ROUTINE TO SET AND CLEAR CORE USE TABLE
\r
578 ;CALL: MOVEI T,1 ;TO SET TABLE
\r
579 MOVEI T,0 ;TO CLEAR TABLE
\r
580 ; MOVE BLK,HIGHEST REL. LOC. IN USER AREA
\r
581 ; MOVE LOC,ADDRESS OF FIRST BLOCK TO SET CLEAR
\r
586 CORSTG: PUSH PDP,TAC ;SAVE HIGHEST LOC. BEING REQUESTED
\r
587 ASH BLK,-12 ;CONVERT TO NO. OF BLOCKS-1
\r
588 ADDI BLK,1 ;NO. OF BLOCKS
\r
589 SKIPE T ;UPDATE NO OF FREE BLOCKS
\r
590 MOVNS BLK ;DECREASE IF SETTING BITS
\r
591 ADDM BLK,CORTAL ;INCREASE IF CLEARING,DECREASE IF SSETING BITS
\r
592 MOVE TAC,LOC ;ADDRESS OF FIRST BLOCK
\r
593 ASH TAC,-12 ;FORM BYTE POINTER TO BIT-1
\r
594 IDIVI TAC,^D36 ;TAC=WORD,TAC1=BIT
\r
595 ADD TAC,CORE2P ;FORM BYTE POINTER
\r
599 DPB TAC1,[POINT 6,TAC,5]
\r
600 MOVMS BLK ;GET MAG. OF NO. OF BLOCKS INVOLVED
\r
601 IDPB T,TAC ;SET OR CLEAR EACH USE BIT
\r
603 JRST TPOPJ ;RESTORE TAC. AND POPJ
\r
605 CORE2P: POINT 1,CORTAB ;BYTE POINTER TO FIRST BIT-1
\r
607 ;ROUTINE TO CLEAR PART OF JOB DAT AREA(PART PROTECTED FROM USER IO)
\r
608 ;CALLED WHEN NEW CORE ASSIGNED AND AT SYSTEM RESTART(140)
\r
609 ; MOVE ITEM,JOB NO.
\r
610 ;CALL: MOVE JDAT,ADR. OF JOB DATA AREA
\r
614 EXTERNAL JOBPRT,JOBPR1,JOBPFI,JOBENB
\r
615 EXTERNAL JOBPD1,JOBDDT
\r
617 CLRJOB: SETZM JOBPRT(JDAT) ;FIRST LOC. PROTECED FROM USER
\r
618 MOVSI TAC,JOBPRT(JDAT)
\r
619 HRRI TAC,JOBPR1(JDAT)
\r
620 MOVE TAC1,JOBDDT(JDAT) ;SAVE DDT STARTING ADDRESS
\r
621 BLT TAC,JOBPFI(JDAT)
\r
622 MOVEM TAC1,JOBDDT(JDAT)
\r
623 SETZM JOBENB(JDAT) ;ALSO CLEAR APR ENABLE WORD
\r
624 SETZM JOBPD1(JDAT) ;AND UUO PC FLAGS(USED WHEN JOB STARTS)
\r
625 JRST ESTOP1 ;GO SET JOB STATUS, SO CONT WILL
\r
626 ; NOT WORK,(DO NOT CLEAR JACCT BIT)
\r