Fixed typos.
[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\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
104 ;CHKSHF IS CALLED.\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
118 ;IOAC1 IS OFF.\r
119 \f\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
127 \r
128 INTERNAL CHKSHF,FTSWAP\r
129 EXTERNAL SHFWAT,HOLEF,CLKCHL,JBTADR,JBTSTS,JBTMAX\r
130 \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
135         POPJ PDP,               ;NO\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
138 \r
139         CAME TAC1,TAC\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
145 \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
149 IFN JDAT-PROG,<\r
150         MOVE JDAT,JBTDAT(ITEM)  ;JOB DATA AREA\r
151 >\r
152         HLRZ TAC,PROG           ;YEST, REASSIGN SAME AMOUNT OF CORE.\r
153         PUSHJ PDP,SCORE1        ;IN A LOWER POSITION IN CORE\r
154 \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
158         POPJ PDP,\r
159 \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
162 \r
163 NOTSHF: SKIPN HOLEF             ;IS HOLE STILL THERE?\r
164         JRST NOTSH1             ;NO\r
165 IFN FTSWAP,<\r
166         EXTERNAL FIT,FORCE\r
167         MOVE TAC,FORCE\r
168         CAME ITEM,FIT\r
169         CAMN ITEM,TAC\r
170         JRST NOTSH1\r
171 >\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
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;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
226 ;       PUSHJ PDP,TRYSWP\r
227 ;       RETURN1 - JOB MUST REMAIN RUNABLE(NSHF,NSWP SET OR SAVE,GET IN PROGRESS);       RETURN2  - OK TO SWAP HIGH OR LOW SEG\r
228 \r
229 IFN FTSWAP,<\r
230         INTERN TRYSWP\r
231         EXTERN JBTSTS,CPOPJ1\r
232 \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
236 IFN FT2REL,<\r
237         EXTERN ANYSAV\r
238         JRST ANYSAV             ;NO, SEE IF THIS JOB IS INVLOVED IN A SAVE,GET\r
239                                 ; WHICH IS STILL ACTIVE\r
240 >\r
241 IFE FT2REL,<\r
242         JRST CPOPJ1             ;NO, GIVE OK RETURN\r
243 >\r
244 >\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
250 ;       PUSHJ PDP,KCORE1\r
251 ;       ALWAYS RETURN HERE\r
252 ;SCORE1 IS CALLED FROM SHUFFLER WITH TAC SET TO SEG SIZE\r
253 \r
254         INTERN KCORE1\r
255 \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
260 \r
261 \r
262 \r
263 ;CORE0 IS CALLED BY THE CORE MONITOR COMMAND AND THE CORE SHUFFLER\r
264 \r
265 ;AND RUN COMMAND\r
266 ;BOTH LOGICAL AND PHYSICAL CORE ASSIGNMENT ARE AFFECTED\r
267 \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
271 ;       PUSHJ PDP,CORE0\r
272 ;       ERROR   ;EITHER JOB HAS ACTIVE IO\r
273                 ; OR NOT ENOUGH CORE\r
274 ;       OK RETURN\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
278 INTERNAL CORE0\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
307 \fCORE0:\r
308 IFE FTSWAP,<\r
309         JUMPE PROG,CORGET       ;IS JOB WITHOUT CORE IN MEMORY?\r
310 >\r
311 IFN FTSWAP,<\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
315         IFE FT2REL,<\r
316         EXTERN CORMAX\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
320 \r
321         >\r
322         IFN FT2REL,<\r
323         EXTERN SUMSEG\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
326         >\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
339 \r
340 CORE0A:\r
341 EXTERNAL  JBTSWP\r
342 >\r
343 IFN FTTRPSET,<\r
344         EXTERNAL STOPTS\r
345         SKIPN STOPTS            ;NO,IS TIME SHARING STOPPED BY\r
346                                 ; TRPSET UUO DONE FOR JOB 1?\r
347 >\r
348 \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
363 \r
364 \r
365         EXTERN SEGSIZ\r
366 \r
367 CORE1:  NOSCHEDULE              ;PREVENT SCHEDULING\r
368 \r
369 IFN FTSWAP,<\r
370         EXTERN VIRTAL\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
374                                 ; ON RT. SHIFT)\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
378 >\r
379 IFE FT2REL,<\r
380         CAML TAC,CORMAX         ; YES, IS REQUEST LESS THAN MAX, ALLOWED COR+1?\r
381 >\r
382 IFN FT2REL,<\r
383         EXTERN SUMSEG\r
384         PUSHJ PDP,SUMSEG        ;YES, IS SUM OF SEGS LESS THEN MAX. ALLOWED CORE+1?\r
385 >\r
386         POPJ PDP,               ;NO, ERROR RETURN\r
387 IFN FTSWAP,<\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
392 >\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
401 ;WANTED IN CORE.\r
402 \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
407 INTERN FTTRACK\r
408 IFN FTTRACK,<\r
409         EXTERN LASCOR\r
410         MOVEM   ITEM,LASCOR     ;LEAVE TRACKS FOR LAST JOB USING\r
411                                 ; PHYSICAL CORE ALLOCATION\r
412                                 ; (FOR DEBUGGING ONLY)\r
413 >\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
418         PUSHJ PDP,CORSTG\r
419         MOVE BLK,JBTADR(ITEM)   ;OLD CORE ASSIGNMENT\r
420         JUMPN BLK,MOVCOR        ;WAS THERE OLD MEMORY ASSIGNED?\r
421                                 ; NO,\r
422 IFN FTSWAP,<\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
425 >\r
426 IFE FTSWAP,<\r
427         MOVEI TAC1,0            ;JOB HAS NO PREVIOUS VIRT. CORE(NON-SWAP SYS)\r
428 >\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
436 \r
437 BAKOLD:\r
438 IFN FTSWAP,<\r
439         EXTERN XPAND\r
440         PUSHJ PDP,XPAND         ;TELL SWAPPER TO SWAP OUT\r
441 >\r
442 IFE FTSWAP,<\r
443         IFE FT2REL,<\r
444         SOSO (PDP)              ;SET FOR ERROR RETURN AND GET BACK LO CORE\r
445         >\r
446         IFN FT2REL,<\r
447         EXTERN FRECOR\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
452         >\r
453 >\r
454 BKOLD1: HLRZ TAC,JBTADR(ITEM)   ;GIVE BACK OLD CORE.\r
455         JRST CORGET\r
456 \f;MOVE OLD CORE TO NEW AREA\r
457 \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
463 IFN FTTIME,<\r
464         EXTERNAL SHFWRD\r
465         ADDM TAC1,SHFWRD        ;INCREMENT TOTAL NO. WORDS SHUFFLED\r
466 >\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
472 \r
473 ;CLEAR INCREASE IF NEW CORE IS BIGGER THAN OLD\r
474 \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
478 IFN FTTIME,<\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
482 >       \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
488 \f\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
492 \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
495 ;CORE WAS MOVED\r
496 \r
497 EXTERNAL SYSSIZ\r
498 \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
503 IFN FT2REL,<\r
504         EXTERN JOBMAX\r
505         CAIG ITEM,JOBMAX        ;IS THIS A HIGH SEGMENT?\r
506 >\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
520 DIDLE3:\r
521 IFN FT2REL,<\r
522         EXTERN CURHGH\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
527 \r
528 >\r
529         SETZB TAC,HOLEF         ;CLEAR HOLD FLAG\r
530         PUSHJ PDP,HOLSRC        ;IS THERE A NON-ZERO HOLE?\r
531         JRST COROK              ;NO\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
535 COROK:\r
536 IFN FTSWAP,<\r
537         EXTERNAL BIGHOLE\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
541         MOVEM T1,BIGHOLE        \r
542 >\r
543         SCHEDULE\r
544         JRST CPOPJ1             ;SKIP RETURN(UNLES ERROR)\r
545 \f\r
546 ;ROUTINE TO FIND HOLD BIG ENOUGH FOR REQUEST\r
547 ;CALL:  MOVE TAC,HIGHEST REL. ADR. ASKING FOR\r
548 ;       PUSHJ PDP,HOLSRC\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
554 ;USES TAC1\r
555 \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
560 \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
568 IFN FTSWAP,<\r
569         CAMLE BLK,T1            ;YES, BIGGEST SO FAR?\r
570         MOVEM BLK,T1            ;YES, SAVE IN T1.\r
571 >\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
576                                 ; AND RETURN\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
582 \r
583         INTERN CORE2P\r
584         EXTERN TPOPJ\r
585 \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
596 \r
597         MOVNS TAC1\r
598         ADDI TAC1,^D36\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
602         SOJG BLK,.-1\r
603         JRST TPOPJ              ;RESTORE TAC. AND POPJ\r
604 \r
605 CORE2P: POINT 1,CORTAB          ;BYTE POINTER TO FIRST BIT-1\r
606 \f\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
611 ;       PUSHJ PDP,CLRJOB\r
612 \r
613 INTERNAL CLRJOB\r
614 EXTERNAL JOBPRT,JOBPR1,JOBPFI,JOBENB\r
615 EXTERNAL JOBPD1,JOBDDT\r
616 \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
627 \r
628 COREND: END\r