1b96cdbcbafafa6e28bc26dddfa6cff5ad67425f
[retro-software/dec/tops10/v4.5.git] / src / core1.mac
1 TITLE CORE1 - LOGICAL AND PHYSICAL CORE ALLOCATION ROUTINES - V414\r
2 SUBTTL T. HASTINGS/TH/RCC  TS  04 JUN 69\r
3 XP VCORE1,414\r
4                         ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
5 \r
6         ENTRY CORE1     ;ALWAYS LOAD CORE1(FOR LIB SEARCH)\r
7 \r
8 ;CORE ALLOCATION IS DONE ON A 1K BLOCK BASIS\r
9 \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
13 ; 2.IN USE BY USER\r
14 ; 3.NON-EXISTANT MEMORY\r
15 ;0 MEANS BLOCK IS NOT IN USE\r
16 \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
29 \r
30 ;LIST OF GLOBALS AFFECTED:\r
31 ;JBTADR,CORTAL,CORTAB,HOLEF,SWFWAT,JOBADR\r
32 \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
36 T=AC1   ;TEMPORARY\r
37 T1=AC2  ;"\r
38 \f;CORE UUO\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
42 ;       ERROR RETURN\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
50 \r
51 INTERNAL CORUUO\r
52 EXTERNAL USRREL,JOB,CORTAL\r
53 EXTERNAL ESTOP1,IOWAIT,OERROR,SETREL,STOTAC,WSCHED\r
54 \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
65 IFE FT2REL,<\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
69 >\r
70 IFN FT2REL,<\r
71         EXTERN UCORHI\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
76 >\r
77         AOS -1(PDP)             ;SET FOR DK(SKIP) RETURN\r
78 CORERR: POP PDP,TAC             ;REMOVE ARG FROM LIST\r
79 IFN FTSWAP,<\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
84 >\r
85 ZERCOR:\r
86 IFE FTSWAP,<\r
87         MOVE TAC,CORTAL         ;RETURN NO. OF FREE 1K BLOCKS (COUNTING\r
88                                 ; DORMANT AND IDLE SEGMENTS AS FREE)\r
89 >\r
90 IFN FTSWAP,<\r
91         MOVE TAC,CORMAX         ;RETURN MAX. NO. 1K BLOCKS ALLOWED FOR 1 USER TO HAVE\r
92         LSH TAC,-12\r
93 >\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
103 ;CHKSHF IS CALLED.\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
117 ;IOAC1 IS OFF.\r
118 \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
126 \r
127 INTERNAL CHKSHF,FTSWAP\r
128 EXTERNAL SHFWAT,HOLEF,CLKCHL,JBTADR,JBTSTS,JBTMAX\r
129 \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
134         POPJ PDP,               ;NO\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
137 \r
138         CAME TAC1,TAC\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
144 \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
148 IFN JDAT-PROG,<\r
149         MOVE JDAT,JBTDAT(ITEM)  ;JOB DATA AREA\r
150 >\r
151         HLRZ TAC,PROG           ;YEST, REASSIGN SAME AMOUNT OF CORE.\r
152         PUSHJ PDP,SCORE1        ;IN A LOWER POSITION IN CORE\r
153 \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
157         POPJ PDP,\r
158 \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
161 \r
162 NOTSHF: SKIPN HOLEF             ;IS HOLE STILL THERE?\r
163         JRST NOTSH1             ;NO\r
164 IFN FTSWAP,<\r
165         EXTERNAL FIT,FORCE\r
166         MOVE TAC,FORCE\r
167         CAME ITEM,FIT\r
168         CAMN ITEM,TAC\r
169         JRST NOTSH1\r
170 >\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
175 \f\r
176 ;ROUTINE TO TEST FOR ANY ACTIVE DEVICES\r
177 \r
178 ;CALL:  MOVE ITEM,JOB NUMBER OR HIGH SEG NUMBER\r
179 ;       MOVE JDAT,ADDRESS OF JOB DATA AREA\r
180 ;       PUSHJ PDP,ANYACT\r
181 ;       DEVICES ACTIVE\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
185 \r
186         INTERN ANYACT,ANYDEV\r
187         EXTERN JOBMAX\r
188 ANYACT:\r
189 IFN FTSWAP,<\r
190         INTERN 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
195 >\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
199 IFN FT2REL,<\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
203 >\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\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
227 ;       PUSHJ PDP,TRYSWP\r
228 ;       RETURN1 - JOB MUST REMAIN RUNABLE(NSHF,NSWP SET OR SAVE,GET IN PROGRESS);       RETURN2  - OK TO SWAP HIGH OR LOW SEG\r
229 \r
230 IFN FTSWAP,<\r
231         INTERN TRYSWP\r
232         EXTERN JBTSTS,CPOPJ1\r
233 \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
237 IFN FT2REL,<\r
238         EXTERN ANYSAV\r
239         JRST ANYSAV             ;NO, SEE IF THIS JOB IS INVLOVED IN A SAVE,GET\r
240                                 ; WHICH IS STILL ACTIVE\r
241 >\r
242 IFE FT2REL,<\r
243         JRST CPOPJ1             ;NO, GIVE OK RETURN\r
244 >\r
245 >\r
246 \f\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
252 ;       PUSHJ PDP,KCORE1\r
253 ;       ALWAYS RETURN HERE\r
254 ;SCORE1 IS CALLED FROM SHUFFLER WITH TAC SET TO SEG SIZE\r
255 \r
256         INTERN KCORE1\r
257 \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
262 \r
263 \r
264 ;CORE0 IS CALLED BY THE CORE MONITOR COMMAND AND THE CORE SHUFFLER\r
265 \r
266 ;AND RUN COMMAND\r
267 ;BOTH LOGICAL AND PHYSICAL CORE ASSIGNMENT ARE AFFECTED\r
268 \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
272 ;       PUSHJ PDP,CORE0\r
273 ;       ERROR   ;EITHER JOB HAS ACTIVE IO\r
274                 ; OR NOT ENOUGH CORE\r
275 ;       OK RETURN\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
279 INTERNAL CORE0\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
308 \f\r
309 CORE0:\r
310 IFE FTSWAP,<\r
311         JUMPE PROG,CORGET       ;IS JOB WITHOUT CORE IN MEMORY?\r
312 >\r
313 IFN FTSWAP,<\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
317         IFE FT2REL,<\r
318         EXTERN CORMAX\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
322 \r
323         >\r
324         IFN FT2REL,<\r
325         EXTERN SUMSEG\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
328         >\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
341 \r
342 CORE0A:\r
343 EXTERNAL  JBTSWP\r
344 >\r
345 IFN FTTRPSET,<\r
346         EXTERNAL STOPTS\r
347         SKIPN STOPTS            ;NO,IS TIME SHARING STOPPED BY\r
348                                 ; TRPSET UUO DONE FOR JOB 1?\r
349 >\r
350 \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
365 \r
366 \r
367         EXTERN SEGSIZ\r
368 \r
369 CORE1:  NOSCHEDULE              ;PREVENT SCHEDULING\r
370 \r
371 IFN FTSWAP,<\r
372         EXTERN VIRTAL\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
376                                 ; ON RT. SHIFT)\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
380 >\r
381 IFE FT2REL,<\r
382         CAML TAC,CORMAX         ; YES, IS REQUEST LESS THAN MAX, ALLOWED COR+1?\r
383 >\r
384 IFN FT2REL,<\r
385         EXTERN SUMSEG\r
386         PUSHJ PDP,SUMSEG        ;YES, IS SUM OF SEGS LESS THEN MAX. ALLOWED CORE+1?\r
387 >\r
388         POPJ PDP,               ;NO, ERROR RETURN\r
389 IFN FTSWAP,<\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
394 >\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
403 ;WANTED IN CORE.\r
404 \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
409 INTERN FTTRACK\r
410 IFN FTTRACK,<\r
411         EXTERN LASCOR\r
412         MOVEM   ITEM,LASCOR     ;LEAVE TRACKS FOR LAST JOB USING\r
413                                 ; PHYSICAL CORE ALLOCATION\r
414                                 ; (FOR DEBUGGING ONLY)\r
415 >\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
420         PUSHJ PDP,CORSTG\r
421         MOVE BLK,JBTADR(ITEM)   ;OLD CORE ASSIGNMENT\r
422         JUMPN BLK,MOVCOR        ;WAS THERE OLD MEMORY ASSIGNED?\r
423                                 ; NO,\r
424 IFN FTSWAP,<\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
427 >\r
428 IFE FTSWAP,<\r
429         MOVEI TAC1,0            ;JOB HAS NO PREVIOUS VIRT. CORE(NON-SWAP SYS)\r
430 >\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
438 \r
439 BAKOLD:\r
440 IFN FTSWAP,<\r
441         EXTERN XPAND\r
442         PUSHJ PDP,XPAND         ;TELL SWAPPER TO SWAP OUT\r
443 >\r
444 IFE FTSWAP,<\r
445         IFE FT2REL,<\r
446         SOSO (PDP)              ;SET FOR ERROR RETURN AND GET BACK LO CORE\r
447         >\r
448         IFN FT2REL,<\r
449         EXTERN FRECOR\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
454         >\r
455 >\r
456 BKOLD1: HLRZ TAC,JBTADR(ITEM)   ;GIVE BACK OLD CORE.\r
457         JRST CORGET\r
458 \f\r
459 ;MOVE OLD CORE TO NEW AREA\r
460 \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
466 IFN FTTIME,<\r
467         EXTERNAL SHRWRD\r
468         ADDM TAC1,SHRWRD        ;INCREMENT TOTAL NO. WORDS SHUFFLED\r
469 >\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
475 \r
476 ;CLEAR INCREASE IF NEW CORE IS BIGGER THAN OLD\r
477 \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
481 IFN FTTIME,<\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
485 >       \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
494 \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
497 ;CORE WAS MOVED\r
498 \r
499 EXTERNAL SYSSIZ\r
500 \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
505 IFN FT2REL,<\r
506         EXTERN JOBMAX\r
507         CAIG ITEM,JOBMAX        ;IS THIS A HIGH SEGMENT?\r
508 >\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
522 DIDLE3:\r
523 IFN FT2REL,<\r
524         EXTERN CURHGH\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
529 \r
530 >\r
531         SETZB TAC,HOLEF         ;CLEAR HOLD FLAG\r
532         PUSHJ PDP,HOLSRC        ;IS THERE A NON-ZERO HOLE?\r
533         JRST COROK              ;NO\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
537 COROK:\r
538 IFN FTSWAP,<\r
539         EXTERNAL BIGHOLE\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
543         MOVEM T1,BIGHOLE        \r
544 >\r
545         SCHEDULE\r
546         JRST CPOPJ1             ;SKIP RETURN(UNLES ERROR)\r
547 \f\r
548 ;ROUTINE TO FIND HOLD BIG ENOUGH FOR REQUEST\r
549 ;CALL:  MOVE TAC,HIGHEST REL. ADR. ASKING FOR\r
550 ;       PUSHJ PDP,HOLSRC\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
556 ;USES TAC1\r
557 \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
562 \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
570 IFN FTSWAP,<\r
571         CAMLE BLK,T1            ;YES, BIGGEST SO FAR?\r
572         MOVEM BLK,T1            ;YES, SAVE IN T1.\r
573 >\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
578                                 ; AND RETURN\r
579 \f\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
585 \r
586         INTERN CORE2P\r
587         EXTERN TPOPJ\r
588 \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
599 \r
600         MOVNS TAC1\r
601         ADDI TAC1,^D36\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
605         SOJG BLK,.-1\r
606         JRST TPOPJ              ;RESTORE TAC. AND POPJ\r
607 \r
608 CORE2P: POINT 1,CORTAB          ;BYTE POINTER TO FIRST BIT-1\r
609 \f\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
614 ;       PUSHJ PDP,CLRJOB\r
615 \r
616 INTERNAL CLRJOB\r
617 EXTERNAL JOBPRT,JOBPR1,JOBPFI,JOBENB\r
618 EXTERNAL JOBPD1,JOBDDT\r
619 \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
630 \r
631 COREND: END\r