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
9 ;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
192 PUSHJ PDP,TRYSWP ;SHOULD SWAPPER MAKE JOB UNRUNNABLE
\r
193 ; IN ORDER TO SWAP OUT?
\r
194 POPJ PDP, ;NO, ACTIVE SAVE IN PROGRSS OR NSH,NSWP
\r
195 ; (REAL TIME OR DISPLAY)
\r
197 ANYDEV: MOVE T,JBTSTS(ITEM) ;IS JOB(OR HIGH SEG) NOT SHUFFABLE?
\r
198 TLNE T,NSHF ;DISPLAY AND REAL TIME SET NSHF
\r
199 POPJ PDP, ;CANNOT BE SHUFFLED
\r
201 CAILE ITEM,JOBMAX ;YES IT THIS A HIGH SEG?
\r
202 JRST CPOPJ1 ;YES, OK TO SHUFFLE OR SWAP SINCE NSHF,NSWP
\r
203 ; AND NO SAVE IN PROGRESS
\r
205 MOVEI T,JOBJDA(JDAT) ;ASSUME JOB IS NOT CURRENT JOB
\r
206 CAMN ITEM,JOB ;IS IT?
\r
207 MOVEI T,USRJDA ;IT IS CURRENT JOB
\r
208 ; DEVICE ASSIGNMENT TABLE IN MONITOR
\r
209 MOVEI IOS,IOACT ;IO DEVICE ACTIVE BIT
\r
210 HRRZ T1,JOBJMH(T) ;GET NO. OF USER IO CHANNELS IN USE
\r
211 ; FOR JOB(EITHER FROM JOB DATA AREA
\r
212 ; OR FROM MONITOR (IGNORE LH WHICH MY BE-1
\r
213 ; IF SAVEGET IN PROGRESS)
\r
214 TLO T,T1 ;SET TO ADD T TO T1
\r
215 MOVSI AC3,DVTTY ;DEVICE IS A TTY BIT
\r
216 ANY: SKIPE DEVDAT,@T ;IS A DEVICE ASSIGNED TO THIS CHANNEL?
\r
217 TDNN IOS,DEVIOS(DEVDAT) ;YES, IS IT ACTIVE?
\r
218 ANY2: SOJGE T1,ANY ;NO, KEEP LOOKING
\r
219 JUMPL T1,CPOPJ1 ;YES, FINISHED YET?
\r
220 TDNN AC3,DEVMOD(DEVDAT) ;NOT FINISHED, IS DEVICE TTY?
\r
221 POPJ PDP, ;NO, ERROR RETURN, CANNOT ASSIGN CORE
\r
222 JRST ANY2 ;YES, KEEP LOOKING FOR AN ACTIVE DEVICE
\r
223 \f;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)
\r
229 ; RETURN2 - OK TO SWAP HIGH OR LOW SEG
\r
233 EXTERN JBTSTS,CPOPJ1
\r
235 TRYSWP: MOVE T,JBTSTS(ITEM) ;IS JONB OR HIGH SEG NOT SWAPPABLE?
\r
236 TLNE T,NSHF!NSWP ;OR SHUFFABLE(DISPLAY,REAL TIME)?
\r
237 POPJ PDP, ;YES, ERROR RETURN
\r
240 JRST ANYSAV ;NO, SEE IF THIS JOB IS INVLOVED IN A SAVE,GET
\r
241 ; WHICH IS STILL ACTIVE
\r
244 JRST CPOPJ1 ;NO, GIVE OK RETURN
\r
247 \f;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
265 ;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
310 JUMPE PROG,CORGET ;IS JOB WITHOUT CORE IN MEMORY?
\r
313 EXTERN IMGOUT,CPOPJ1,CHGSWP
\r
314 JUMPN PROG,CORE0A ;DOES JOB HAVE CORE IN MEMORY?
\r
315 ; (ALWAYS TRUE BOTH SEGS IF CORE UUO)
\r
318 CAML TAC,CORMAX ;NO, WILL REQUEST FIT IN PHYSICAL CORE?
\r
319 ; COMPARE WITH LARGEST PERMITTED ADR+1(BUILD AND
\r
320 ; ONCE CAN RESTART CORMAX)
\r
325 PUSHJ PDP,SUMSEG ;NO, WILL SUM OF BOTHER SEGMENTS FIR IN PHYSICAL CORE?
\r
326 ; LARGEST PERMITTED CORE, COMPARE SUM WITH CORMAX
\r
328 POPJ PDP, ;NO, GIVE ERROR RETURN
\r
329 MOVSI TAC1,SWP ;IS JOB SWAPPED OUT?
\r
330 TDNN TAC1,JBTSTS(ITEM) ;(MAY HAVE 0 DISK SPACE ALTHOUGH SWAPPED OUT)
\r
331 JRST CORE1 ;NO, TRY TO ASSIGN CORE IN MEMORY
\r
332 PUSHJ PDP,CHGSWP ;YES, CHANGE ASSIGNMENT OF SWAPPING SPACE ON DISK
\r
333 ; INCREASE VIRTAL(COUNT OF FREE 1K BLOCKS OF SWAPPING
\r
334 ; (SHOULD NEVER NEED TO DECREASE VIRTAL SINCE
\r
335 ; CORE COMMAND ALWAYSSWAPS JOB IN FIRST).
\r
336 ; (FRAGMENTATION POSTPONES RETURNING SPACE AND
\r
337 ; INCREASING VIRTAL UNTIL SWAP IN IF NOTASKING
\r
338 ; FOR 0 VIRTUAL CORE)
\r
339 JRST CPOPJ1 ;GIVE OK RETURN TO CALLER
\r
346 SKIPN STOPTS ;NO,IS TIME SHARING STOPPED BY
\r
347 ; TRPSET UUO DONE FOR JOB 1?
\r
350 PUSHJ PDP,ANYACT ;NO,ANY ACTIVE DEVICE?
\r
351 POPJ PDP, ;YES, CANNOT ASSIGN CORE
\r
352 ; NO, FALL INTO CORE1
\r
353 \f;ROUTINE TO TRY TO ASSIGN CORE IN CORE
\r
354 ;LOW OR HIGH SEG MUST NOT BE SWAPPED OUT(CALLER'S RESPONSIBILITY)
\r
355 ;AND MUST NOT HAVE ANY ACTIVE DEVICES(IT MAY HAVE 0 CORE IN CORE THOUGH)
\r
356 ;IN OTHER WORDS HIGH OR LOW SEG MAY OR MAY NOT HAVE VIRTUAL CORE
\r
357 ;BUT IF IT HAS VIRTUAL CORE IT MUST BE IN PHYSICAL CORE
\r
358 ;THIS IS BOTH A LOGICAL AND A PHYSICAL CORE ASSIGNMENT
\r
359 ;FIRST OLD CORE IS RETURNED TO SYSTEM
\r
360 ;THEN NEW REQUEST IS ATTEMPTED TO BE SATISFIED IN LOWEST
\r
361 ;POSITION POSSIBLE. THUS CORE TENDS TO BE PACKED
\r
362 ;IF NEW REQUEST CANNOT BE GRANTED, OLD AMOUNT OIS RETAINED, IF NON-SWAPPING SYS
\r
363 ;OTHERWISE SWAPPER IS CALLED(XPAND) TO EXPAND CORE BY SWAPPING OUT
\r
368 CORE1: NOSCHEDULE ;PREVENT SCHEDULING
\r
372 PUSHJ PDP,SEGSIZ ;TAC1=OLD SEG SIZE
\r
373 SKIPN LOC,TAC ;IS 0 BEING REQUESTED?
\r
374 MOVNI LOC,1 ;YES, PRETEND -1(DEPEND ON ASH BUG WHICH KEEPS -1
\r
376 ASH LOC,-12 ;CONVERT TO NO. OF K-1(01,0,1,2,...)
\r
377 SUB LOC,TAC1 ;NO. OF K-1 INCREASE=NEW-OLD-1
\r
378 CAMGE LOC,VIRTAL ;IS THERE ENOUGH FREE VIRTUAL CORE IN SYSTEM?
\r
381 CAML TAC,CORMAX ; YES, IS REQUEST LESS THAN MAX, ALLOWED COR+1?
\r
385 PUSHJ PDP,SUMSEG ;YES, IS SUM OF SEGS LESS THEN MAX. ALLOWED CORE+1?
\r
387 POPJ PDP, ;NO, ERROR RETURN
\r
389 ADDI LOC,1 ;YES, GET NO. OF K OF INCREASE
\r
390 MOVNS LOC ;MAKE MINUS FOR UPDATE
\r
391 ADDM LOC,VIRTAL ;AND UPDATE TOTAL VIRTUAL CORE IN SYSTEM
\r
392 ; SINCE THIS REQUEST CAN BE SATISFIIED
\r
394 CORE1A: NOSCHEDULE ;PREVENT JOB SCHEDULING
\r
395 JUMPE PROG,CORGET ;OLD ASSIGNMENT 0?
\r
396 ; IF YES, DO NOT ATTEMPT TO RETURN OLD CORE
\r
397 HRRZ LOC,PROG ;NO. ABS, LOC. OF OLD CORE
\r
398 HLRZ BLK,PROG ;HIGHEST LEGAL REL. ADR.
\r
399 MOVEI T,0 ;CLEAR FOR CORSTG CALL
\r
400 PUSHJ PDP,CORSTG ;RETURN OLD CORE TO FREE STORAGE
\r
401 \f;CORGET IS CALLED BY SWAPPER WHEN JOB IS ON DISC AND IS
\r
404 CORGET: SETZB LOC,PROG ;SET NEW ASSIGNMENT TO 0 AND DIST. MOVED
\r
405 JUMPE TAC,DIDLE1 ;IS ZERO CORE BEING REQUESTED?
\r
406 PUSHJ PDP,HOLSRC ;NO, SEARCH FOR HOLE BIG ENOUGH
\r
407 JRST BAKOLD ;NONE, GIVE BACK OLD AMOUNT
\r
411 MOVEM ITEM,LASCOR ;LEAVE TRACKS FOR LAST JOB USING
\r
412 ; PHYSICAL CORE ALLOCATION
\r
413 ; (FOR DEBUGGING ONLY)
\r
415 MOVEM LOC,PROG ;SETUP NEW RELOC
\r
416 HRLM TAC,PROG ;AND NEW PROTECT.
\r
417 MOVEI BLK,(TAC) ;HIGHEST REL ADR. BEING REQUESTED
\r
418 MOVEI T,1 ;SET USE BITS IN CORE TBALE
\r
420 MOVE BLK,JBTADR(ITEM) ;OLD CORE ASSIGNMENT
\r
421 JUMPN BLK,MOVCOR ;WAS THERE OLD MEMORY ASSIGNED?
\r
424 LDB TAC1,IMGOUT ;SIZE(IN K) OF SEG ON DISK TO BE SWAAPED IN
\r
425 LSH TAC1,12 ;CONVERT TO WORDS
\r
428 MOVEI TAC1,0 ;JOB HAS NO PREVIOUS VIRT. CORE(NON-SWAP SYS)
\r
430 MOVE BLK,PROG ;MAKE OLD ASSIGNMENT(BL) APPEAR TO START
\r
431 ; AT SAME PLACE AS NEW ASSIGNMENT(FOR CLEARING)
\r
432 SOJA TAC1,CLRCR1 ;IF NEW CORE SIZE IS BIGGER THAN
\r
433 ;OLD, CLEAR OUT INCREASED SO SECURITY WILL
\r
434 ; BE MAINTAINED. TAC1 IS SIZE-1 OF OLD
\r
435 ; ASSIGNMENT. -1 OF NO OLD ASSIGNMENT
\r
436 \f;HERE WHEN FREE CORE TABLE DOES NOT HAVE ENOUGH ROOM FOR REQUEST
\r
441 PUSHJ PDP,XPAND ;TELL SWAPPER TO SWAP OUT
\r
445 SOS (PDP) ;SET FOR ERROR RETURN AND GET BACK LO CORE
\r
449 PUSHJ PDP,FRECOR ;TRY TO DELETE 1 DORMANT HIGH SEGMENT,
\r
450 ; IF REQUEST DOES NOT EXCEED FREE CORE+DORMANT SEGS
\r
451 SOSA (PDP) ;ERROR RETURN-NOT ENOUGH CORE, GET OLD AMOUNT BACK
\r
452 JRST CORGET ;1 DORMANT SEG DELETED, TRY REQUEST AGAIN
\r
455 BKOLD1: HLRZ TAC,JBTADR(ITEM) ;GIVE BACK OLD CORE.
\r
457 \f;MOVE OLD CORE TO NEW AREA
\r
459 MOVCOR: CAIN LOC,(BLK) ;IS NEW CORE IN SAME PLACE AS OLD?
\r
460 JRST CLRCOR ;YES, DO NOT MOVE IT,CLEAR IF INCREASE
\r
461 HLRZ TAC1,BLK ;LENGTH OF OLD CORE
\r
462 CAILE TAC1,(TAC) ;IS OLD CORE LESS THEN NEW?
\r
463 HRRZ TAC1,TAC ;NO, MOVE THE SHORTENED NEW CORE
\r
466 ADDM TAC1,SHFWRD ;INCREMENT TOTAL NO. WORDS SHUFFLED
\r
468 ADD TAC1,LOC ;ADD IN NEW RELOC.
\r
469 MOVE AC1,LOC ;DEST.=NEW RELOC.
\r
470 HRL AC1,BLK ;SOURCE=OLD RELOC.
\r
471 SETZM JBTADR(ITEM) ;FLAG THAT CORE IS IN TRANSIT(TTY ROUTINES)
\r
472 BLT AC1,(TAC1) ;MOVE CORE TO NEW ASSIGNMENT
\r
474 ;CLEAR INCREASE IF NEW CORE IS BIGGER THAN OLD
\r
476 CLRCOR: HLRZ TAC1,BLK ;OLD CORE SIZE-1
\r
477 CLRCR1: CAMG TAC,TAC1 ;IS NEW CORE SIZE-1 VREATER THAN OLD CORE SIZE-1
\r
478 JRST DIDLE ;NO, DO NOT CLEAR ANY CORE
\r
480 MOVE AC1,TAC ;NEW CORE SIZE
\r
481 SUB AC1,TAC1 ;LESS OLD CORE SIZE
\r
482 ADDM AC1,CLRWRD ;ACCUMULATE NO. OF WORDS CLEARED
\r
484 ADDI TAC1,2(PROG) ;YES, OLD SIZE-1+NEW RELOC+2=2ND LOC TO CLEAR
\r
485 ADDI TAC,(PROG) ;NEW SIZE-1+NEW RELOC=LAST LOC TO CLEAR
\r
486 SETZM -1(TAC1) ;CLEAR FIRST WORD
\r
487 HRLI TAC1,-1(TAC1) ;SET LH TO FIRST ADR. TO CLEAR
\r
488 BLT TAC1,(TAC) ;CLEAR THE INCREASE PORTION
\r
490 ;IF THE SHUFFLED JOB IS IN EXEC MODE, ITS DUMP ACS
\r
491 ;(PDP,PROG,JDAT SAVED IN JOB DATA AREA) MUST BE
\r
492 ;ALTERED BY DISTANCE CODE WAS MOVED
\r
494 ;IF THE SHUFFLED JOB IS CURRENT JOB, THE SOFTWARE STATE OF
\r
495 ;THE MONITOR(IE SOFTWARE INFO OF JOB) MUST BE ALTERED BY AMOUNT
\r
500 DIDLE: SUBI LOC,(BLK) ;DISTANCE JOB WAS MOVED(DIST.-SOURCE)
\r
501 CAME ITEM,JOB ;IS THIS CURRENT JOB?
\r
502 SKIPA TAC,JOBPC(JDAT) ;NO. GET PC IN JOB DATA AREA
\r
503 MOVE TAC,USRPC ;YES, PC IN PROTECTED SYSTEM AREA
\r
506 CAIG ITEM,JOBMAX ;IS THIS A HIGH SEGMENT?
\r
508 TLNE TAC,USRMOD ;NO. IS JOB IN USER MODE?
\r
509 JRST DIDLE1 ;YES, DO NOT ALTER DUMP ACS
\r
510 ; BECAUSE THEY ARE IN USERS(OR HIGH SEG)
\r
511 ADDM LOC,JOBDPD(JDAT) ;NO. ALTER DUMP PDP BY DIST. OF MOVE
\r
512 ADDM LOC,JOBDPG(JDAT) ;AND ALTER PROG BY DIST. MOVED
\r
513 DIDLE1: MOVEM PROG,JBTADR(ITEM) ;STORE NEW CORE ASSIGNMENT(LOW OR HIGH SEG)
\r
514 CAME ITEM,JOB ;IS THIS CURRENT JOB?
\r
515 JRST DIDLE3 ;NO, DO NOT ALTER STATE OF MONITOR
\r
516 MOVE TAC,SYSSIZ ;DONT CHANGE PDP IF LIST
\r
517 CAIG TAC,(PDP) ;IS IN SYSTEM
\r
518 ADD PDP,LOC ;YES, ALTER PUSH DOWN POINTER BY AMOUNT OF MOVE
\r
519 PUSHJ PDP,SETREL ;GO SETUP NEW HARDWARE AND SOFTWARE RELOCATION
\r
520 ; INFORMATION FOR HIGH AND LOW SEGS FOR CURRENT JOB
\r
524 PUSHJ PDP,CURHGH ;CHECK TO SEE IF THIS CORE ASSIGNMENT IS FOR
\r
525 ; HIGH SEG WHICH CURRENT USER MAY ALSO BE USING
\r
526 ; IF YES, RESET HARDWARE AND SOFTWARE RELOC INFO.
\r
527 ; RETURN WITH ITEM PRESERVED,PROG SET TO RELOC
\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
579 \f;ROUTINE TO SET AND CLEAR CORE USE TABLE
\r
580 ;CALL: MOVEI T,1 ;TO SET TABLE
\r
581 ; MOVEI T,0 ;TO CLEAR TABLE
\r
582 ; MOVE BLK,HIGHEST REL. LOC. IN USER AREA
\r
583 ; MOVE LOC,ADDRESS OF FIRST BLOCK TO SET CLEAR
\r
588 CORSTG: PUSH PDP,TAC ;SAVE HIGHEST LOC. BEING REQUESTED
\r
589 ASH BLK,-12 ;CONVERT TO NO. OF BLOCKS-1
\r
590 ADDI BLK,1 ;NO. OF BLOCKS
\r
591 SKIPE T ;UPDATE NO OF FREE BLOCKS
\r
592 MOVNS BLK ;DECREASE IF SETTING BITS
\r
593 ADDM BLK,CORTAL ;INCREASE IF CLEARING,DECREASE IF SSETING BITS
\r
594 MOVE TAC,LOC ;ADDRESS OF FIRST BLOCK
\r
595 ASH TAC,-12 ;FORM BYTE POINTER TO BIT-1
\r
596 IDIVI TAC,^D36 ;TAC=WORD,TAC1=BIT
\r
597 ADD TAC,CORE2P ;FORM BYTE POINTER
\r
600 DPB TAC1,[POINT 6,TAC,5]
\r
601 MOVMS BLK ;GET MAG. OF NO. OF BLOCKS INVOLVED
\r
602 IDPB T,TAC ;SET OR CLEAR EACH USE BIT
\r
604 JRST TPOPJ ;RESTORE TAC. AND POPJ
\r
606 CORE2P: POINT 1,CORTAB ;BYTE POINTER TO FIRST BIT-1
\r
608 ;ROUTINE TO CLEAR PART OF JOB DAT AREA(PART PROTECTED FROM USER IO)
\r
609 ;CALLED WHEN NEW CORE ASSIGNED AND AT SYSTEM RESTART(140)
\r
610 ; MOVE ITEM,JOB NO.
\r
611 ;CALL: MOVE JDAT,ADR. OF JOB DATA AREA
\r
615 EXTERNAL JOBPRT,JOBPR1,JOBPFI,JOBENB
\r
616 EXTERNAL JOBPD1,JOBDDT
\r
618 CLRJOB: SETZM JOBPRT(JDAT) ;FIRST LOC. PROTECED FROM USER
\r
619 MOVSI TAC,JOBPRT(JDAT)
\r
620 HRRI TAC,JOBPR1(JDAT)
\r
621 MOVE TAC1,JOBDDT(JDAT) ;SAVE DDT STARTING ADDRESS
\r
622 BLT TAC,JOBPFI(JDAT)
\r
623 MOVEM TAC1,JOBDDT(JDAT)
\r
624 SETZM JOBENB(JDAT) ;ALSO CLEAR APR ENABLE WORD
\r
625 SETZM JOBPD1(JDAT) ;AND UUO PC FLAGS(USED WHEN JOB STARTS)
\r
626 JRST ESTOP1 ;GO SET JOB STATUS, SO CONT WILL
\r
627 ; NOT WORK,(DO NOT CLEAR JACCT BIT)
\r