Fixed typos.
[retro-software/dec/tops10/v4.5.git] / src / segcon.mac
1 TITLE   SEGCON - HIGH SEGMENT CONTROL FOR REENTRANT USER PROGRAMMING V5500\r
2 SUBTTL  T. HASTINGS/TW/TNM/TH/AF/CHW/TW/PFC  04 OCT 71\r
3 XP VSEGCN,5500\r
4                 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER MAP\r
5 \r
6 ;ALL OF THE CODE DEALING WITH THE SECOND RELOCATION REGISTER HAS BEEN ISOLATED\r
7 ;IN THIS ONE ROUTINE NAMED SEGCON\r
8 \r
9 ;SIX OF THE MONITOR MODULES CALL SUBROUTINES IN SEGCON WITH PUSHJ'S.\r
10 ;THIS HAS BEEN DONE FOR TWO REASONS:\r
11 ;       1.TO MAKE IT EASY TO BUILD SYSTEMS WITH OR WITHOUT 2 REG. CAPABILITY\r
12 ;       SEGCON CAN BE REPLACED BY A SHORT DUMMY ROUTINE(NULSEG), SO THERE\r
13 ;       IS NO CONDITIONAL ASSEMBLY REQUIRED TO ELIMINATE MOST OF THE CODE.\r
14 ;       \0THOSE CUSTOMERS WHO WOULD LIKE TO ELIMINATE ALL OF THE CODE MAY DO SO BY\r
15 ;       REASSEMBLING THE MONITOR WITH FEATURE SWITCH FT2REL=0.\r
16 ;       THIS WILL ELIMINATE ALL PUSHJ CALLS TO SEGCON\r
17 \r
18 ;       2. TO MAKE IT CLEAR EXACTLY WHERE TWO SEGMENTS ARE DEALT WITH\r
19 \r
20 \r
21 ;ALL OF THE CALLS TO SEGCON ARE OF THE FORM:\r
22 ;IFN FT2REL,<\r
23 ;       EXTERN  XXXXXX\r
24 ;       PUSHJ   PDP,XXXXXX\r
25 ;       ERROR RETURN OR NOTHING TO DO\r
26 ;       OK RETURN\r
27 ;>\r
28 \r
29 ;OR:\r
30 ;IFN FT2REL,<\r
31 ;       EXTERN  XXXXXX\r
32 ;       PUSHJ   PDP,XXXXXX\r
33 ;       OK RETURN\r
34 ;>\r
35 \r
36 ;SEGCON IS GOOD FOR SWAPPING AND NON-SWAPPING SYSTEMS\r
37 ;AND FOR SYSTEMS WITH AND WITHOUT DISK\r
38 \r
39         INTERN  FTSWAP,FTDISK\r
40 \r
41 \r
42 ;TO MAKE IT CLEAR WHERE EACH SUBROUTINE IS CALLED FROM\r
43 ;AND WHAT FUNCTION IT IS PERFORMING, THE MODULES OF THE MONITOR HAVE BEEN REPLICATED\r
44 ;IN SEGCON USING SUBTTL.  THE MODULES ARE:\r
45 ;       1. CLOCK\r
46 ;       2. COMCSS\r
47 ;       3. CORE1\r
48 ;       4. SAVGET\r
49 ;       5. SWAP\r
50 ;       6. UUOCON\r
51 \f;ADDITIONAL MONITOR DATA TO HANDLE TWO SEGMENT USER PROGRAMS:\r
52 \r
53 ;A NUMBER OF THE ALREADY EXISTING JOB TABLES HAVE BEEN LENGTHENED\r
54 ;BY AN AMOUNT SEGN(THE NUMBER OF POSSIBLE HIGH SEGMENTS).  THE LOWER\r
55 ;PART OT THESE TABLES HAVE REMAINED AS THEY WERE(O THRU JOBMAX=JOBN-1)\r
56 ;WITH ONE WORD PER JOB( OR LOW SEGMENT).  THE NEW HALF(GREATER THAN JOBMAX)\r
57 ;HAVE ONE WORD FOR EACH HIGH SEGMENT.  A HIGH SEGMENT NUMBER IS REALLY\r
58 ;A LARGE JOB NUMBER AND IS AN INDEX INTO THE JOB TABLES.\r
59 ;THE HIGHEST INDEX IN THESE LENGTHENED JOB TABLES IS JBTMAX.\r
60 ;THERE IS AT LEAST ENOUGH TABLE SPACE SO THAT EACH JOB CAN HAVE A\r
61 ;DIFFERENT HIGH SEGMENT.  THE FOLLOWING TABLES HAVE BEEN LEGNTHENED:\r
62 \r
63 ;JBTSTS- JOB(SEG) STATUS\r
64 ;       LH=STATUS BITS:\r
65 ;               SWP=1 IF HIGH SEG SWAPPED OUT(WHETHER SPACE ON DISK OR NONE)\r
66 ;                       OR ON WAY IN OR OUT.  IE SWP=1 MEANS NOT RUNABLE COR IN CORE.\r
67 ;                       SWP=0 WHEN HIGH SEG HAS RUNABLE COR IN CORE\r
68 ;                       EVEN THOUGH ALSO HAS SPACE ONDISK.\r
69 \r
70 ;               SNA=1 IF HIGH SEG NO. APPEARS IN AT LEAST ONE USER'S LOGICAL ADR. SPACE\r
71 ;                       SNA IS SIGN BIT OF JBTSTS.\r
72 ;               SNA=0 IF HIGH SEG IS COMPLETELY FREE OR IS DORMANT,\r
73 ;               WHERE DORMANT MEANS THAT THE SEGMENT DOES NOT APPEAR IN ANY USER'S\r
74 ;                 LOGINCAL ADDRESSING SPACE, BUT IS STILL AROUND PHYSICALLY ON DISK\r
75 ;                 OR IN CORE\r
76 ;               SHRSEG=1 IF SEG IS SHARABLE(WHETHER IT STILL HAS A NAME OR\r
77 ;                       HAS BEEN SUPERCEDED).\r
78 ;       BITS 9-17 ARE ACCESS PRIBILEGES - SAME FORMAT AS DISK FILES\r
79 ;               HSAPOS=RIGHT MOST BIT POSITION\r
80 ;               HSAMSK=MASK FOR BITS(ALL ONES)\r
81 ;               HSASIZ=SIZE OF FIELD\r
82 ;       RH=IN-CORE COUNT(RATHER THAN RUN TIME LEFT) IE NUMBER OF JOBS\r
83 ;               IN CORE USING HIGH SEG IN CORE\r
84 \f;JBTADR- HIGH JOB(SEG) CORE ASSIGNMENT\r
85 ;       LH=LENGTH-1 OF HIGH SEG(NOT PROTECTION LIKE LOW SEG)\r
86 ;               FOR LOW SEGS PROTECTION(HIGHEST LEGAL USER ADDRESS) AND LENGTH-1\r
87 ;               ARE THE SAME. HOWEVER THEY ARE DIFFERENT FOR HIGH SEGS, SO LENGTH-1\r
88 ;               WAS CHOSEN INSTEAD OF THE PROTECTION AS THE QUANTITY FOR THE LH.\r
89 ;       RH=ABSOLUTE ADR. OF BEG OF HIGH SEG(NOT RELOCATION LIKE LOW SEG)\r
90 ;               FOR LOW SEGS THE RELOACTION AND THE ABSOLUTE ORIGIN ARE THE SAME.\r
91 ;               HOWEVER THEY ARE DIFFERENT FOR HIGH SEGS, SO THE ABSOLUTE ORIGIN WAS\r
92 ;               CHOSEN INSTEAD OF THE RELOCATION AS THE QUANTITY FOR THE RH.\r
93 ;       0 MEANS NO CORE IN MEMORY AT ALL\r
94 ;       CORE IS ASSIGNED DURING SWAP IN AND OUT TOO\r
95 ;JBTSWP- JOB SWAP INFO\r
96 ;       LH=DISK ADR. ALWAYS(NEVER CORE PROTECT TIME LIKE LOW SEG WHEN IN CORE)\r
97 ;       RH=IMGIN,IMGOUT - NO. OF 1K BLOCKS WHEN BROUGHT IN, NO. OF 1K BLOCKS ON DISK\r
98 ;       IMGOUT=0 WHEN NO COPY ON DISK(ALWAYS TRUE IF UWP IS OFF\r
99 ;               FOR HIGH SEG SO USER CAN MODIFY HIGH SEG)\r
100 ;JBTCHK- CHECKSUM FOR HIGH SEG WHEN SWAPPED OUT\r
101 \f;THE FOLLOWING JOB TABLES HAVE BEEN ADDED:\r
102 ;JBTSGN(0...JOBMAX) - HIGH SEG NUMBER WHICH JOB IS USING IN CORE OR ON DISK\r
103 ;       0 MEANS JOB DOES NOT HAVE A HIGH SEGMENT.\r
104 ;               LH BITS:\r
105 ;       SPYSEG=1(SIGN BIT) HIGH SEG IS PART OF PHYSICAL CORE(SPY UUO),\r
106 ;        RH IS HIGHEST PHYSICAL ADR FOR THIS USER TO LOOK AT\r
107 ;       SERSEG=1 MEANS THAT THE HIGH SEG WHICH THIS USER IS USING IS SHARABLE\r
108 ;        THIS BIT ALSO APPEARS IN THE JBTSTS WORD IN THE SAME POSITION\r
109 ;        IN THE WORD, SINCE SHARABLE IS A PROPERTY OF A SEGMENT, NOT OF\r
110 ;        THE JOB USING THE SEGMENT.  IT IS DUPLICATED HERE ONLY AS\r
111 ;        A CONVENIENCE SO IT WILL APPEAR IN THE LH OF AC ITEM.\r
112 ;       UWPOFF=1 USER WRITE PROTECT IS OFF FOR THIS USER(NORMALLY \r
113 ;         UWP OS ON, SO UWPOFF=0)\r
114 ;        MEDDLE=1 IF USER HAS MEDDLED WITH PROGRAM SO HE SHOULD NOT BE ALLOWED\r
115 ;               TO TURN OFF UWP OR CHANGE CORE ASSIGNMENT\r
116 ;               MEDDLE IS SET ONLY IF HIGH SEG IS SHARABLE OR A SPY SEG\r
117 ;               MEDDLING IS DEFINED AS ANYTHING WHICH CAUSES THE PROGRAM NOT\r
118 ;               NOT TO BE IN CONTROL OF ITSELF:\r
119 ;               1. START COMMAND WITH ARG\r
120 ;               2. DEPOSIT COMMAND(D) IN LOW SEG(HIGH SEG ALWAYS ILLEGAL)\r
121 ;               3. RUN UUO WITH BIGGER START ADR. INCREMENT THAN 0 OR 1\r
122 ;               4. GETSEG UUO\r
123 ;               5. HIGH SEG IS PHYSICAL CORE(SPY UUO)\r
124 ;CORCNT=1 IF HIGH SEG IN CORE COUNT HAS BEEN INCREMENTED FOR THIS JOB\r
125 ;                (JOB LOW SEG MAY OR MAY NOT BE IN CORE)\r
126 ;                SET BY INCCNT ROUTINE, CLEARED BY DECCNT ROUTINE\r
127 ;JBTDIR(JOBN...JBTMAX) - HIGH SEG DEVICE NAME OF FILE STRUCTURE NAME\r
128 ;                       (EG DSKA,DSKB,DTAN,MTAN)\r
129 ;PRJPRG(JOBN...JBTMAX) - HIGH SEG DIRECTORY NAME(EXTENSION OF PRJPRG TABLE)\r
130 ;       IS PROJECT-PROGRAMMER IF DISK, 0 IF DTA OR MTA\r
131 ;JBTNAM(JOBN...JBTMAX) - HIGH SEG NAME(EXTENSION ASSUMED TO BE SHR)\r
132 ;       (EXTENSION OF JBTPRG TABLE)\r
133 ;       THE NAME(AND DISK COPY) IS RETAINED EVEN AFTER NO JOBAS ARE USING\r
134 ;               HIGH SEG IN CORE OR ON DISK, THUS SAVING TIME FOR GET'S.\r
135 ;               HOWEVER, IF SWAPPING SPACE BECOMES FULL, THESE UNUSED HIGH SEGS\r
136 ;               ARE DELETED ONE AT A TIME, UNTIL THERE IS ROOM. IF STILL NO ROOM,\r
137 ;               COPIES OF HIGH SEGS WHICH ARE ALSO IN CORE ARE DELETED.\r
138 ;               ANY HIGH SEG WHICH HAS A NAME IS SHARABLE AND HAS SHRSEG SET IN JBTSTS.\r
139 ;               A HIGH SEG WITH SEGSHR SET AND JBTNAM=0 IS A HIGH SEG WHICH HAS BEEN\r
140 ;               SUPERCEDED BY A LATER VERSION OF A HIGH FILE.\r
141 \f;THE FOLLOWING LOCATION HAS BEEN ADDED TO THE JOB DATA AREA:\r
142 \r
143 ;JOBHRL - RH IS ANALOGOUS TO JOBREL, HIGHEST RELATIVE(USER) ADR. IN HIGH SEG\r
144 ;       IE HIGHEST LEGAL USER ADDRESS IN HIGH SEG\r
145 ;       0 MEANS JOB DOES NOT HAVE A HIGH SEG\r
146 ;       SET BY MONITOR EVERY TIME JOB RUNS\r
147 ;       LH IS ANALOGOUS TO LH OF JOBSA, FIRST FREE(RELATIVE) LOCATION IN HIGH SEG\r
148 ;       SET BY LINKING LOADER, USED ON SAVE FOR AMOUNT TO WRITE\r
149 ;       THE FIRST FREE LOCATION CONTAINS THE STARTING ADDRESS OF JOB\r
150 ;       WHICH IS SET BY SAVE FROM JOBSA WHICH WAS SET BY LINKING LOADER\r
151 ;       BOTH HALVES ARE 0 IF NO HIGH SEG\r
152 \r
153 ;JOBCOR - LH IS HIGHEST LOC LOADED WITH DATA IN LOW SEG\r
154 ;       SET BY LINKING LOADER\r
155 ;       USED BY SAVE FOR 2 SEG PROGRAM ONLY, WRITE LOW SEG IF LH JOBCOR IS\r
156 ;       GREATER THAN 137(HIGHEST LOC IN JOB DATA AREA\r
157 \r
158 ;THE HIGH SEGMENT HAS A VERY SMALL JOB DATA AREA(10 LOCATIONS)\r
159 ;WHICH IS USED FOR INITIALIZING THE REGULAR JOB DATA AREA ON A GET\r
160 ;IN CASE THE JOB DOES NOT HAVE A LOW SEGMENT FILE(HIGHLY DESIRABLE)\r
161 ;SEE JOBDAT FOR DEFINITIONS.\r
162 \r
163 ;THE CONTENTS OF AC ITEM MAY BE A JOB NUMBER OR A HIGH SEGMENT NUMBER\r
164 ;AC ITEM IS LOADED FROM JBTSGN INDEXED BY JOB NUMBER\r
165 ;SO THAT AC ITEM CONTAINS LH BITS FOR EASY TESTING WHEN THE RH\r
166 ;HAS A HIGH EGMENT NUMBER IN IT.  WHEN AC ITEM HAS A JOB NUMBER\r
167 ;IN IT, THE LH IS ALWAYS 0\r
168 ;IN SWAP, AC ITEM IS DEFINED TO BE AC ITEM\r
169 ;HOWEVER, A COMPARE WITH JOBMAX WILL STILL GIVE HIGH SEG OR LOW SEG\r
170 ;NOTE, THAT SPYSEG IS SIGN BIT SO 'SKIPG' TEST FOR REAL HIGH SEG\r
171 \r
172 \r
173 ;TERMINOLOGY IN THE COMMENTS OF SEGCON:\r
174 ;'SEG' IS AN ABREVIATION FOR 'SEGMENT'\r
175 ;'JOB' OR 'JOB NUMBER' ALWAYS REFERS TO NUBERS LESS-THAN OR EQUAL-TO JOBMAX\r
176 ;THE COMMENTS IN THE REST OF THE MONITOR HAVE NOT BEEN CHANGED, SO THAT THERE ARE\r
177 ;MANY ROUTINES WHICH ARE NOW DEALING WITH BOTH JOB NUMBERS AND HIG SEG NUMBERS\r
178 ;(MAINLY IN CORE AND SWAP ROUTINES) WITHOUT KNOWING IT.\r
179 ;'SEGMENT' REFERS TO BOTH LOW AND HIGH SGMENTS, RATHER THAN JUST HIGH SEGMENTS\r
180 ;AND WILL ALWAYS BE PRECEDED BY 'LOW' OR 'HIGH' IF BOTH IS NOT INTENDED.\r
181 ;'JOB NUMBER' IS USED INTERCHANGEABLE WITH 'LOW SEG NUMBER'.\r
182 \r
183 ;'ADDRESS','ADR','LOCATION','LOC', AND 'ORIGIN' ALL\r
184 ;REFER TO USER(IE BEFORE HARDWARE OR SOFTWARE RELOCATION) QUANTITIES.\r
185 ;MOST OF THE TIME THESE WORDS ARE MODIFIED WITH 'USER' OR 'RELATIVE'.\r
186 ;HOWEVER, THIS IS NOT COMPLETELY CONSISTENT.\r
187 ;OCCASIONALLY ABSOLUTE ADDRESSES ARE COMPUTED BY THE MONITOR. IN ALL THESE\r
188 ;CASES, 'ABSOLUTE' OR 'ABS' PRECEEDS THESE WORDS.\r
189 ;THE REENTRANT CAPABILITY IMPROVES SYSTEM THRUPUT BY REDUCING THE DEMANDS ON:\r
190 ;       1. CORE MEMORY - SHARING\r
191 ;       2. SWAPPING STORAGE - SHARING\r
192 ;       3. SWAPPING CHANNEL READS\r
193 ;       4. SWAPPING CHANNEL WRITES\r
194 ;       5. STORAGE CHANNEL READS - GET\r
195 ;HOWEVER, 2 COMPETES WITH 4 AND 5, IN THAT TO REDUCE THE DEMANDS 4 AND 5,\r
196 ;COPIES OF UNUSED (DORMANT) HIGH SEGMENTS ARE KEPT ON THE SWAPPING DEVICE, THEREBY\r
197 ;INCREASING THE DEMAND FOR SWAPPING STORAGE(2).  THE QUESTION NATURALLY ARISES,\r
198 ;HOW DOES THE SYSTEM DETERMINE THIS SPACE-TIME TRADEOFF?\r
199 ;THE MONITOR ACHIEVES THE BALANCE DYNAMICALLY, AFTER THE OPERATOR\r
200 ;ESTABLISHED THE SIZE OF THE SWAPPING SPACE WHEN THE SYSTEM IS STARTED\r
201 ;(ONCE ONLY DIALOG). THE MONITOR ASSUMES THAT THERE IS NO SHORTAGE\r
202 ;OF SWAPPING SPACE, AND SO KEEPS A SINGLE COPY OF AS MANY HIGH SHARABLE\r
203 ;SEGMENTS IN THE SWAPPING SPACE AS THERE ARE HIGH SEG NUMBERS.\r
204 ;(THE MAX NUMBER OF HIGH SEG NUMBERS IS ESTABLISHED AT BUILD TIME\r
205 ;AND IS EQUAL TO OR GREATER THAN THE NUMBER OF JOBS(COUNTING THE NULL JOB).\r
206 ;THUS DEMANDS 4 AND 5 ARE MINIMIZED.\r
207 ;HOWEVER IF SWAPING SPACE IS EXHAUSTED, THE MONITOR WILL TRY DELETING\r
208 ;A HIGH SHARABLE SEG THAT IS NOT IN USE BY ANY JOB.(A SO-CALLED DORMANT SEG)\r
209 ;WHEN DELETED SEG IS NEXT NEEDED(A GET OCCURRED), IT WILL\r
210 ;BE GOTTEN FROM STORAGE DEVICE, INCREASING DEMAND 5.  IF NO UNUSED HIGH SEGS EXIST\r
211 ;THE MONITOR WILL TRY DELETING A HIGH(SHARABLE OR NON-SHARABLE) SEG THAT\r
212 ;IS IN USE AND HAS A COPY, BOTH ON THE DISK AND IN CORE.  THUS WHEN THIS HIGH SEG IS\r
213 ;SWAPPED OUT, IT WILL REQUIRE A WRITE, INCREASING DEMAND 4.\r
214 \r
215 ;TO RESTATE: THE MONITOR USES ALL THE SWAPPING SPACE AVAILABLE. IF IT RUNS OUT,\r
216 ;IT INCREASES STORAGE CHANNEL READS(GET), THEN SWAPPING CHANNEL WRITES IN ORDER\r
217 ;TO OVERCOME THE SPACE SHORTAGE.\r
218 \r
219 ;THE SAME LOOK-A-SIDE TECHNIQUE IS USED FOR CORE IN BOTH SWAPPING AND NON-SWAPPING\r
220 ; SYSTEMS IN THAT THE MONITOR KEEPS DORMANT SEGMENTS IN CORE\r
221 ;UNTIL THEY ARE NEEDED OR CORE DEMAND REQUIRES THAT THEY BE RETURNED\r
222 ;THERE IS A THIRD CLASS OF SEGMENTS, CALLED 'IDLE'.\r
223 ;AN IDLE SEGMENT IS A SHARABLE SEG WHICH IS IN CORE, BUT NO JOB IN CORE\r
224 ;IS USING IT, BUT SOMEONE ON DISK IS.  IT WILL BE DELETED IF CORE IS NEEDED\r
225 ;THE 3 CLASSES OF SEGMENTS ARE ACTIVE,IDLE,DORMANT.\r
226 ;LOCATION CORTAL CONTAINS THE SUM OF FREE BLOCKS+DORMANT BLOCKS\r
227 ;HOWEVER CORTAB CONTAINS 0 BITS ONLY FOR FREE BLOCKS\r
228 ;TO FREE STORAGE\r
229 ;THE CORE COMMAND WITH NO ARG STILL PRINTS CORE AS IF NO DORMANT SEGS IN CORE\r
230 \r
231 ;VIRTAL CONTAINS THH AMOUNT OF FREE VIRTUAL CORE LEFT IN SYSTEM\r
232 ;INCLUDING HIGH SEGMENTS.  SINCE THIS QUANTITY IS USED TO PREVENT\r
233 ;THE CORE ROUTINES FROM OVER COMMITTING SWAP SPACE. SHARED SEG ARE ONLY\r
234 ;COUNTED ONCE, AND DORMANT SEGMENTS ARE NOT INCLUDED.  THUS VIRTAL IS\r
235 ;DECREMENTED WHEN THE FIRST USER SHARES A SEGMENT CHANGING IT FROM DORMANT\r
236 ;TO ACTIVE\r
237 \f       ENTRY   SEGCON\r
238 \r
239 SEGCON:         ;ENTRY POINT SYMBOL TO CAUSE LOADING OF SEGCON\r
240                 ;(AS OPPOSED TO NULSEG OR NEITHER)\r
241 \r
242 \r
243 SUBTTL  ONCE - ONCE ONLY STARTUP CODE\r
244 \r
245 ;LOCATION 'TWOREG' IS A FLAG WHICH IS TESTED AT POINTS WHERE A HIGH\r
246 ;SEGMENT CAN BE CREATED, TO SEE IF BOTH HARDWARE AND SOFTWARE HAVE TWO\r
247 ;REGISTER CAPABILITY\r
248 \r
249 ;INITIALIZE LOC TWOREG TO 0 IF SOFTWARE OR HARDWARE DOES NOT HAVE 2 SEGMENT\r
250 ;CAPABILTIY.  SET TWOREG TO -1 IF BOTH DO HAVE 2 SEGMENT CAPABILITY.\r
251 ;SYMBOL AND2RG IS ANDDED TO 'TWOREG' FROM ONCE ONLY CODE AFTER THE HARDWARE IS\r
252 ;EXAMINED AND TWOREG HAS BEEN SET TO 0 OR -1 ACCORDINGLY.\r
253 \r
254         INTERN  AND2RG\r
255 \r
256 AND2RG=-1       ;AND WITH -1, IE LEAVE 'TWOREG' SET TO 0 OR -1 ACCORDING TO THE\r
257                         ;CAPABILITIES OF THE HARDWARE.\r
258 \fSUBTTL CLOCK - CLOCK ROUTINE\r
259 \r
260 ;ROUTINE TO ADJUST AC R SO THAT IT HAS PROPER RELOCATION AND PROTECTION\r
261 ;INFORMATION FOR CURRENT JOB, SO THAT A DATAO APR, R CAN BE DONE.\r
262 ;CALLED FROM SETREL ONLY.  SETREL IS CALLED FROM CLOCK,CORE UUO,\r
263 ;REMAP UUO, AND RESET UUO.\r
264 \r
265 ;CALL:  MOVE ITEM,JOB NUMBER\r
266 ;       MOVE R,JBTADR(ITEM)     ;XWD PROTECT,RELOC FOR LOW SEGMENT\r
267 ;       PUSHJ P,SETHGH\r
268 ;       RETURN WITH R SET FOR DATAO APR,R FOR BOTH LOW AND HIGH SEGMENTS\r
269 ;       J STILL JOB NUMBER\r
270 \r
271         INTERN  SETHGH\r
272         EXTERN  JBTSGN,JBTADR,JOBHRL,JOBHCU\r
273 \r
274 SETHGH: MOVEI   TAC1,377777     ;ASSUME HIGH SEGMENT STARTS AT USER LOC 400000\r
275         SKIPGE  PROG            ;IS LOW SEGMENT LONG(GREATER THAN 377777)\r
276         HLRZ    TEM,PROG        ;YES, PROTECTION FOR LOW SEG IS STARTING ADR-1\r
277         SKIPG   AC1,JBTSGN(ITEM) ;DOES USER HAVE A REAL HIGH SEG?\r
278         SKIPA   TAC,AC1         ;NO, MUST BE NONE OR SPYING ON EXEC\r
279                                 ; IF SPYING, RH HAS HIGHEST PHY. ADR FOR THIS USER\r
280         HLRZ    TAC,JBTADR(AC1) ;NO. OF WORDS-1 IN HIGH SEG\r
281         JUMPE   TAC,NOHGH       ;DOES USER HAVE A HIGH SEG IN CORE?\r
282         ADDI    TAC,1(TAC1)     ;YES, HIGHEST USER ADR.=1+NO. WORDS-1+HIGH ORIGIN-1\r
283 NOHGH:  SKIPL   JOBHCU(PROG)    ;DO NOT STORE IN JOBHRL IF SAVE OR GET IN PROGRESS\r
284                                 ; BECAUSE IT USES THESE LOCATIONS FOR ZERO COMPRESSION\r
285         HRRM    TAC,JOBHRL(PROG) ;STORE IN USER AREA SO HE CAN LOOK AT IT.\r
286                                 ;LH UNALTERED(HIGHESTREL  LOC LOADED+1 BY LOADER)\r
287                                 ;0 MEANS NO HIGH SEG\r
288         LSH     TAC,-12         ;RIGHT JUSTIFY 8 BIT PROTECTION FOR HIG SEG\r
289         DPB     TAC,[POINT 8,PROG,16]   ;STORE IN POSITION FOR DOING DATAO APR,R\r
290                                 ;IF NO HIGH SEG, 0 WILL CAUSE FAILURE IF REF\r
291         SKIPGE  AC1             ;IS THIS ASPY SEG?\r
292         TDZA    TAC,TAC         ;YES, ABS. ADR OF BEGINNING IS 0\r
293                                 ; (AC1 HAS HIGHEST PAT ADR USER WANTS\r
294         HRRZ    TAC,JBTADR(AC1) ;ABSOLUTE ADR. OF BEG. OF HIGH SEG\r
295         SUBI    TAC,1(TAC1)     ;SUBTRACT 400000 OR LENGTH OF LOW SEG(IF GREATER)\r
296         LSH     TAC,-11         ;SHIFT RELOC. FOR HIGH SEG TO POSITION FOR DATAO\r
297         ANDI    TAC,776         ;MASK OUT ALL BUT 8 BITS\r
298         IOR     PROG,TAC        ;INSERT RELOC AND PROT FOR HIGH SEG IN PROG\r
299         TLO     PROG,UWP        ;ASSUME USER-MODE WRITE PROTECT IS ON\r
300         TLNE    AC1,UWPOFF      ;HAS USER DONE A SETUWP UUO AND TURNED OFF UWP?\r
301                                 ; (AND HAS NOT MEDDLED WITH PROGRAM)\r
302         TLZ     PROG,UWP        ;YES, SET UWP OFF FOR DATAO\r
303         POPJ    PDP,\r
304 \fSUBTTL COMCSS - COMMAND DECODER SUBROUTINES\r
305 \r
306 ;ROUTINE TO STOP NEW USERS FROM SHARAING EXISTING SEGMENTS ON DECTAPE\r
307 ;AND MAGTAPE WHICH HAVE BEEN JUST ASSIGNED, SINCE THE NEW TAPE MAY HAVE\r
308 ;A LATER VERSION OF THE FILE WITH THE SAME NAME AS THE SEGMENT.\r
309 ;REMSEG - DELETE ALL SEGS OF DISK FILE STRUCTURE BEING REMOVED \r
310 ;CALLED FROM ASSIGN,DEASG(DEASSIGN,FINISH,KJOB) CONSOLE COMMAND. REMSTRR UUO\r
311 ;CALL:  MOVE F,DEVICE DATA BLOCK ADDRESS OR STR DATA BLOCK ADR.\r
312 ;       MOVE TAC1,DEVMOD(F)     ;DEVICE CHARACTERISTICS\r
313 ;       PUSHJ PDP,ASGHGH\r
314 ;       ALWAYS RETURN, C(TAC1) DESTROYED\r
315 \r
316         INTERN  ASGHGH,REMSEG\r
317         EXTERN  SEGPTR,JBTDIR,IPOPJ\r
318 \r
319 ASGHGH: TLNN    TAC1,DVDTA!DVMTA ;IS THIS DEVICE JUST ASSIGNED A DTA OR MTA?\r
320         POPJ    PDP,            ;NO, NO CONFLICT POSSIBLE\r
321 REMSEG: PUSH    PDP,ITEM        ;YES, SAVE JOB NUMBER\r
322 ASG1:   MOVE    ITEM,SEGPTR     ;SCAN ALL HIGH SEGMENTS\r
323 ASG2:   MOVE    TAC,DEVNAM(DEVDAT) ;GET DEVICE NAME(PHYSICAL)\r
324         CAME    TAC,JBTDIR(ITEM) ;DOES IT MATCH DEVICE NAME OF SEG?\r
325 ASG3:   AOBJN   ITEM,ASG2       ;NO, KEEP LOOKING, FINISHED?\r
326         JUMPG   ITEM,IPOPJ      ;RETURN IF FINISHED AND RESTORE JOB NUMBER\r
327         TLZ     ITEM,-1         ;CLEAR OUT LH BITS OF HIGH SEG NO.\r
328         PUSHJ   PDP,CLRNAM      ;NOT FINISHED, CLEAR SEG NAME\r
329                                 ;AND RETURN DISK SPACE IF NOT IN USE\r
330         JRST    ASG1            ;CONTINUE SCAN, RESTORE TAC TO DEVICE NAME\r
331 \r
332 \r
333 ;ROUTINE TO PRINT SIZE OF HIGH SEG LOGICAL CORE\r
334 ;CALL:  MOVE ITEM,JOB NO.\r
335 ;       PUSHJ PDP,PRTHGH\r
336 ;       ALWAYS RETURN WITH ITEM RESTORED\r
337 ;PRINTS +N(UNLESS NOT TWO REG HARDWARE, SO USERS CAN TELL IF 2 REG. HARD.)\r
338 \r
339         INTERN  PRTHGH\r
340         EXTERN  TWOREG,INLMES,JBTSGN,PRTSEG,IPOPJ\r
341 \r
342 PRTHGH: SKIPN   TWOREG          ;2 REG. MACHINE?\r
343         POPJ    PDP,            ;NO, DO NOT PRINT EVEN +0\r
344         PUSHJ   PDP,INLMES      ;YES, PRINT +\r
345         ASCIZ   /+/\r
346         PUSH    PDP,ITEM        ;SAVE JOB NUMBER\r
347         SKIPG   ITEM,JBTSGN(ITEM) ;DOES JOB HAVE A REAL HIGH SEG?\r
348         MOVEI   ITEM,0          ;NO, MAKE SURE NO HIGH SEG(IN CASE SPY SEG)\r
349         PUSHJ   PDP,PRTSEG      ;PRINT SIZE OF LOGICAL ADR. HIGH SEG\r
350         JRST    IPOPJ           ;RESTORE JOB NUMBER AND RETURN\r
351 \f;ROUTINE TO CHECK TO SEE IF USER IS MEDDLING WITH A SHARABE PROGRAM\r
352 ; IF YES, TURN UWPOFF OFF SO UWP(USER MODE WRITE PROTECT) WILL BE ON\r
353 ; AND SET MEDDLE, SO HE CANNOT TURN UWP BACK OFF AND CANNOT CHANGE CORE\r
354 ; ASSIGNMENT OF HIGH SEG(EXCEPT TO REMOVE IT COMPLETELY)\r
355 ;CALL:  MOVE ITEM,JOB NO.\r
356 ;       PUSHJ PDP,CHKMED\r
357 ;       ALWAYS RETURN, ITEM RESTORED AND TAC1 PRESERVED(TAC USED)\r
358 ;CALLED FROM DEPOSIT, START N, RUN UUO, GETSEG UUO\r
359 ;TAC1 PRESERVED\r
360 \r
361         INTERN  CHKMED\r
362         EXTERN  JBTSGN\r
363 \r
364 CHKMED: SKIPLE  TAC,JBTSGN(ITEM) ;DOES JOB HAVE A REAL HIGH SEG?\r
365         TLNN    TAC,SHRSEG      ;YES, IS IT SHARABLE?\r
366         POPJ    PDP,            ;NO(NONE OR SPY SEG(MEDDLE ALREADY ON))\r
367         TLO     TAC,MEDDLE      ;YES, FLAG TIS USER AS MEDDLING\r
368         TLZ     TAC,UWPOFF      ;AND FORCE UWP ON IN HARDWARE SO WRITES TRAP\r
369         MOVEM   TAC,JBTSGN(ITEM) ;NEXT TIME USER RUNS\r
370         POPJ    PDP,\r
371 \f\r
372 ;ROUTINE TO COMPUTE NO. OF ITEM USED BY A JOB\r
373 ;BOTH LOW AND HIGH SEGMENTS\r
374 ;CALL:  MOVE ITEM, JOB NO.\r
375 ;       PUSHJ PDP,JOBSIZ\r
376 ;       RETURN WITH TAC1=SIZE INK, ITEM PRESERVED\r
377 \r
378         INTERN  JOBSIZ\r
379         EXTERN  SEGSIZ,JBTSGN,IPOPJ\r
380 \r
381 JOBSIZ: PUSHJ   PDP,SEGSIZ      ;SIZE OF LOW SEG\r
382         MOVE    TAC,TAC1        ;SAVE IN TAC\r
383         PUSH    PDP,ITEM        ;SAVE LOW SEG NUMBER\r
384         SKIPG   ITEM,JBTSGN(ITEM) ;DOES JOB HAVE REAL HIGH SEG?\r
385         JRST    IPOPJ           ;NO, RESTORE JOB NUMBER\r
386         PUSHJ   PDP,SEGSIZ      ;YES, GET SIZE OF HIGH SEG\r
387         ADD     TAC1,TAC        ;ADD LOW SIZE TO HIGH SIZE\r
388         JRST    IPOPJ           ;RESTORE JOB NO. AND RETURN\r
389 \fSUBTTL CORE1 - LOGICAL AND PHYSICAL CORE ALLOCATION\r
390 \r
391 ;ROUTINE TO CHECK FOR SAVE IN PROGRESS FROM A HIGH SEG\r
392 ;ABOUT TO BE SHUFFLED OR SWAPPED, OR CORE REASSIGNED\r
393 ;CALL:  MOVE ITEM,LOW OR HIGH SEG TO BE SHUFFLED OR SWAPPED\r
394 ;       PUSHJ PDP,ANYSAV\r
395 ;       RET1 - THIS IS A HIGH SEG WHICH SOME JOB IS DOING A SAVE OF\r
396 ;       RET2 - THIS IS A HIGH SEG WHICH CAN BE SHUFFLED OR SWAPPED\r
397 ;CALLED FROM ANYACT IN CORE MODULE,TAC1 PRESERVED FOR SWAPPER\r
398 \r
399         INTERN  ANYSAV\r
400         EXTERN  JOBMAX,JBTADR,TPOPJ1,HIGHJB,JOBHCU,JBTSGN,ANYDEV\r
401 \r
402 ANYSAV: CAILE   ITEM,JOBMAX     ;IS THIS A LOW SEG?\r
403         SKIPN   JBTADR(ITEM)    ;NO, IS THIS HIGH SEG IN CORE?\r
404         JRST    CPOPJ1          ;YES, GIVE SINGLE SKIP RETURN\r
405         PUSH    PDP,TAC         ;SAVE T1 FOR SHUFFLER\r
406         PUSH    PDP,ITEM        ;SAVE HIGH SEG NUMBER\r
407         MOVE    ITEM,HIGHJB     ;HIGHEST JOB NUMBER ASSIGNED\r
408 ANYSV0: SKIPE   PROG,JBTADR(ITEM) ;IS JOB IN CORE (R=R)?\r
409         SKIPL   JOBHCU(PROG)    ;YES, IS A SSVE OR GET FOR EITHER SEG IN PROGRESS?\r
410 ANYSV1: SOJG    ITEM,ANYSV0     ;NO, KEEP LOOKING, FINISHED?\r
411         JUMPLE  ITEM,ANYSV2     ;YES, FIND A SAVE OR GET IN PROGRESS\r
412         MOVSI   TAC,SWP         ;JOB SWAPPED OUT OR ON WAY IN OR OUT BIT\r
413         TDNE    TAC,JBTSTS(ITEM) ;IS THIS JOB SWAPPED OUT OR ON WAY IN OR OUT\r
414         JRST    ANYSV1          ;YES, DO NOT LOOK AT JOB DATA AREA\r
415                                 ; SINCE IT MAY NOT HAVE BEEN WRITTEN INTO\r
416                                 ; IF THIS IS A SWAP IN\r
417         HRRZ    TAC,JBTSGN(ITEM) ;NO, GET ITS HIGH NUMBER, IF ANY\r
418         CAIE    TAC,@(PDP)      ;IS IT SAME AS HIGH SEG IN QUESTION?\r
419                                 ; (INDIRECT AND INDEX BITS ALWAYS 0)\r
420         JRST    ANYSV1          ;NO, KEEP LOOKING\r
421         PUSHJ   PDP,ANYDEV      ;YES, DOES THIS JOB HAVE\r
422                                 ; ANY ACTIVE DEVICES(THE SAVE GET DEVICE) OR\r
423                                 ; HAS DEVICE STOPPED DURING SAVE FOR SOME REASON?\r
424         SOSA    -2(PDP)         ;YES, GIVE SAVE ACTIVE RETURN\r
425         JRST    ANYSV1          ;NO, KEEP LOOKING FOR OTHER JOBS\r
426 ANYSV2: POP     PDP,ITEM        ;RESTORE HIGH SEG NUMBER\r
427         MOVE    PROG,JBTADR(ITEM) ;RESTORE ITS RELOC.\r
428         JRST    TPOPJ1          ;GIVE ERROR OR OK RETURN\r
429 \f;ROUTINE TO DEPOSIT USER COMMAND ARG IN HIGH SEG IF USER HAS PRIVILEGES\r
430 ; TO WRITE OR SEG IS NON-SHARABLE\r
431 ;CALL:  MOVE ITEM,JOB NO.\r
432 ;       MOVE PROG,JOB RELOC.\r
433 ;       MOVE TAC1,REL. USER ADR. NOT IN LOW SEG\r
434 ;       MOVE IOS,WORD TO DEPOSIT\r
435 ;       PUSHJ PDP,HGHDEP\r
436 ;       ERROR RETURN\r
437 ;       OK RETURN - JOBEXM SET TO USER ADR IN HIGH SEG, S STORED IN HIGH SEG\r
438 \r
439         INTERN  HGHDEP\r
440         EXTERN  TPOPJ,JOBEXM,IPOPJ1,IPOPJ\r
441 IFN FTSWAP,<EXTERN ZERSWP>\r
442 \r
443 HGHDEP: HRR     UUO,TAC1        ;MOVE REL. ADR. TO UUO FOR HGHWRD ROUT.\r
444         PUSHJ   PDP,HGHWRD      ;SET TAC OT HIGH WORD, TAC1 TO ABS ADR.\r
445         POPJ    PDP,            ;NOT IN  BOUNDS, ERROR RETURN OR NO HIGH SEG\r
446         MOVE    AC2,ITEM        ;SETUP JOB NUMBER FOR CHKHSW ROUT.\r
447         PUSH    PDP,ITEM        ;SAVE JOB NUMBER\r
448         PUSH    PDP,TAC1        ;SAVE ABS. ADR. OF LOC. IN HIGH SEG\r
449         SKIPLE  ITEM,JBTSGN(ITEM) ;GET HIGH SEG NUMBER\r
450         PUSHJ   PDP,CHKHSW      ;CAN JOB(P2) WRITE IN HIGH SEG(ITEM)?\r
451         JRST    HGHDP1          ;NO, ERROR RETURN\r
452         MOVEM   IOS,@(PDP)      ;YES,STORE USER ARG\r
453         HRRZM   UUO,JOBEXM(PROG) ;STORE LOC OF DEPOSIT FOR D,E WITH NO ARG\r
454                                 ; LH=O MEANING D WAS LAST DONE RATHER THAN E\r
455 IFN FTSWAP,<PUSHJ       PDP,ZERSWP      ;DELETE SWAPPING SPACE,IF ANY>\r
456         POP     PDP,TAC1        ;RESTORE PD LIST\r
457         JRST    IPOPJ1          ;RESTORE JOB NUMBER AND SKIP OR ERROR RETURN\r
458 HGHDP1: POP     PDP,TAC1        ;RESTORE ABS,ADR\r
459         JRST    IPOPJ           ;RESTORE JOB NUMBER AND ERROR RETURN\r
460 \f\r
461 ;ROUTINE TO REMOVE HIGH SEGMENT FROM USER'S LOGICAL ADDRESSING SPACE\r
462 ;THIS IS CONTRANSTED WITH REMOVING A HIGH SEGMENT FROM PHYSICAL CORE\r
463 ;WHICH THE SWAPPER DOES EVERY TIME A JOB WITH A HIGH SEG IS SWAPPED OUT (KCORE1)\r
464 ;THE SEGMENT NUMBER ASSOCIATED WITH THE JOB IS ERASED (JBTSGN)\r
465 \r
466 ;IF NO OTHER JOB IS USING HIGH SEG IN CORE(IN CORE COUNT GOES TO 0)\r
467 ; HIGH SEG IS NOT DELETED FROM CORE(UNLESS NOT SHARABLE) BUT RATHER BECOMES 'IDLE'.\r
468 ; WHERE IDLE HAS SNA SET.\r
469 ;IF NO OTHER JOB IS USING HIGH SEG IN LOGICAL ADR. SPACE, HIGH SEG IS\r
470 ; NOT DELETED FROM CORE OR DISK(UNLESS NOT SHARABLE) BUT RATHER BECOMES 'DORMANT'.\r
471 ; WHERE DORMANT HAS SNA TURNED OFF, BUT HAS CORE AND/OR DISK SPACE.\r
472 ;RATHER IT BECOMES DORMANT(UNLESS IT NO LONGER HAS A NAME OR WAS NEVER SHARABLE)\r
473 ;A DORMANT SEGMENT IS LEFT IN SYSTEM ACCORDING TO:\r
474 ;       A. SWAP SYS - LEFT ON BOTH SWAPPING DEVICE AND CORE\r
475 ;       B. NON-SWAP SYS - LEFT IN CORE\r
476 ;DORMANT SEGMENTS HAVE JNA BIT OFF, HOWEVER THEY HAVE DISK SPACE AND/OR CORE\r
477 ;DORMANT SEGMENTS ARE FLUSHED ONLY WHEN DISK OR CORE IS NEEDED\r
478 ; OR HIGH SEGMENT NUMBERS ARE NEEDED\r
479 \r
480 ;KILHGH IS CALLED AT CLOCK AND UUO LEVELS BY:\r
481 ;GET,R,RUN,LOGIN COMMANDS\r
482 ;CORE 0 COMMAND\r
483 ;CORE UUO(0 LESS-THAN LH LESS-THAN 400000)\r
484 ;KJOB COMMAND AT UUO LEVEL\r
485 ;REMAP UUO\r
486 ;CALLER MUST INSURE THAT NEITHER LOW OR HIGH SEG ARE BEING SWAPPED\r
487 \r
488 ;CALL:  MOVE ITEM,JOB NUMBER\r
489 ;       MOVE PROG,LOW SEG RELOC. AND PROT.\r
490 ;       PUSHJ PDP,KILHGH\r
491 ;       OK RETURN - ITEM,PROG RESTORED TO JOB (LOW SEG) RELOCATION\r
492 \r
493         INTERN  KILHGH\r
494         EXTERN  JBTSGN,JBTADR,JBTNAM,JBTSTS,CORTAL,IPOPJ,SEGSIZ\r
495 \r
496 \f;SUB. TO REMOVE SEG FROM LOG. ADR. SPACE, THEN SKIP\r
497 KILHG1: AOS     (PDP)           ;ALWAYS SKIP RETURN\r
498 \r
499 ;SUB TO REMOVE HIGH SEG FROM LOG. ADR. SPACE AND CHANGE HARDWARE RELOC\r
500 KILHSH: PUSHJ   PDP,KILHGC      ;REMOVE HIGH SEG FROM LOG. ADR. SPACE\r
501         JRST    SETREL          ;THEN RESET HARDWARE RELOC.\r
502 \r
503 ;SUB TO REMOVE HIGH SEG FROM LOGICAL ADR. SPACE OF CURRENT JOB\r
504 KILHGC: MOVE    ITEM,JOB        ;CURRENT JOB NO.\r
505 KILHGH: PUSH    PDP,ITEM        ;SAVE JOB NUMBER\r
506         SKIPG   ITEM,JBTSGN(ITEM) ;DOES JOB HAVE A REAL HIGH SEG?\r
507         JRST    KILFIN          ;NO, ZERO HIGH SEG NUMBER FOR THIS JOB IN CASE SPY SEG\r
508 IFN FTSWAP,<\r
509         PUSHJ   PDP,SEGSIZ      ;TAC1=SIZE OF HIGH SEG\r
510         PUSH    PDP,TAC1        ;SAVE SIZE IN CASE NEED TO INCREASE AMOUNT\r
511                                 ;OF FREE VERTICAL CORE LEFT.\r
512 >\r
513         SKIPN   PROG,JBTADR(ITEM) ;YES, IS HIGH SEG ALSO IN CORE?\r
514         JRST    SCNLOG          ;NO, SCAN TO SEE IF OTHER USERS USING THIS HIGH SEG\r
515                                 ; IN THEIR LOGICAL ADDRESSING SPACE\r
516 \r
517 IFE FTSWAP,<\r
518         MOVE    TAC,(PDP)       ;JOB NUMBER\r
519 >\r
520 IFN FTSWAP,<\r
521         MOVE    TAC,-1(PDP)     ;JOB NUMBER\r
522 >\r
523         PUSHJ   PDP,DECCNT      ;YES, DECREMENT HIGH SEG IN CORE COUNT FOR THIS JOB\r
524                                 ; HIGH SEG IN-CORE COUNT TRANSITION TO 0?\r
525         JRST    KILFN1          ;NO, JUST REMOVE HIGH SEG FROM THIS\r
526                                 ; USER'S LOG. ADR SPACE\r
527         SKIPN   JBTNAM(ITEM)    ;YES, COULD NEW USER'S SHARE ON GET\r
528                                 ; (STILL HAVE A NAME)? IE HIGH SEG  GONE TO 0?\r
529         PUSHJ   PDP,KCOREH      ;NO, EITHER NEVER WAS SHARABLE OR SUPERCEDED,\r
530                                 ; SO RETURN CORE AND CLEAR R\r
531         JUMPE   PROG,SCNLOG     ; AND GO SCAN FOR OTHER USER'S WHO MIGHT BE\r
532                                 ; SHARING IT IN THEIR LOGICAL ADR SPACE\r
533         LDB     TAC,PCORSZ      ;YES, LEAVE HIGH SEG IN CORE WITH IN CORE COUNT 0\r
534                                 ; IE IDLE AS OPPOSED TO DORMANT SINCE SNA STILL SET\r
535         ADDI    TAC,1           ;BUT INCREASE COUNT OF FREE+DORMANT+IDLE CORE\r
536         ADDM    TAC,CORTAL      ;IN J WORDS\r
537 IFN FTHALT,<\r
538         PUSHJ   PDP,CHKTAL      ;CHECK CORTAL AGAINST CORTAB, HALT IF BAD\r
539 >\r
540 \fSCNLOG:\r
541 IFN FTSWAP,<EXTERN ZERSWP\r
542         MOVE    TAC,HIGHJB      ;SCAN ALL USERS LOGICAL ADR. SPACE TO SEE IF ANY\r
543                                 ; OTHER USER HAVE THIS HIGH SEG IN THEIR LOG.\r
544                                 ; ADR. SPACE\r
545         HRRZ    AC1,-1(PDP)     ;REMEMBER THIS JOB'S NUMBER\r
546 KILLOP: HRRZ    TAC1,JBTSGN(TAC) ;GET HIGH SEG NUMBER FOR NEXT USER(IF ANY)\r
547         CAIN    TAC1,(ITEM)     ;SAME AS HIGH SEG BEING KILED?\r
548         CAIN    AC1,(TAC)       ;YES, DIFFERENT USER FROM ONE WE ARE REMOVING HI SEG?\r
549         SOJG    TAC,KILLOP      ;NO, KEEP LOOKING, FINISHED?\r
550         JUMPG   TAC,KILFN1      ;YES, FIND SOME OTHER USER WITH SAME HIGH SEG\r
551                                 ; IN HIS LOG. ADR. SPACE TOO?\r
552         SKIPN   JBTNAM(ITEM)    ;NO, COULD NEW USER'S SHARE THIS HIGH SEG\r
553                                 ; ON A GET IF WE LEFT IT ON SWAPPING SPACE?\r
554         PUSHJ   PDP,ZERSWP      ;NO, NO NAME, SO DELETE DISK SPACE(IF ANY)\r
555 >\r
556         MOVSI   TAC,SNA         ;FLAG HIGH SEG AS UNASSIGNED(OR DORMANT\r
557                                 ; IF STILL IN\r
558                                 ; CORE OR DISK). TURN OFF NO SWAP AND NO SHUFFLE\r
559                                 ; IN CASE ON BY ACCIDENT(SAVE NOT GO TO COMPLETION)\r
560         ANDCAM  TAC,JBTSTS(ITEM)\r
561 IFN FTSWAP,<\r
562         EXTERN  VIRTAL\r
563         MOVE    TAC,(PDP)       ;SIZE IN J OF HIGH SEG WHICH IS BECOMING DORMANT\r
564         ADDM    TAC,VIRTAL      ; OR UNASSIGNED, INCREASE AMOUNT OF VIRTUAL CORE LEFT\r
565                                 ; IN SYSTEM,(EVEN THOUGH CORE AND DISK SPACE\r
566                                 ; MAYBE STILL USED)\r
567 >\r
568 KILFN1:\r
569 IFN FTHALT,<\r
570         PUSHJ   PDP,CHKTAL      ;CHECK CORTAL AGAINST CORTAB, HALT IF BAD\r
571 >\r
572 IFN FTSWAP,<\r
573         POP     PDP,TAC         ;REMOVE SIZE OF SEG IN J\r
574 >\r
575 \f       EXTERN  JOBSA,JOBREN\r
576 \r
577 KILFIN: POP     PDP,ITEM        ;RESTORE JOB NUMBER\r
578         SETZM   JBTSGN(ITEM)    ;REMOVE HIGH SEG FROM THIS USER'S LOGICAL ADR. SPACE\r
579         MOVE    PROG,JBTADR(ITEM) ;RESTORE LOW SEG RELOC AND PRTECTION\r
580         HLRZ    AC1,PROG        ;GET LOW-SEG END\r
581         HRRZ    TAC,JOBSA(PROG) ;GET START ADDRESS\r
582         CAMLE   TAC,AC1         ;SEE IF LOW SEG\r
583         HLLZS   JOBSA(PROG)     ;NO - CLEAR IT\r
584         HRRZ    TAC,JOBREN(PROG);GET REENTER ADDRESS\r
585         CAMLE   TAC,AC1         ;SEE IF LOW SEG\r
586         HLLZS   JOBREN(PROG)    ;NO - CLEAR IT\r
587         HRRZS   JOBHRL(PROG)    ;CLEAR OUT SIZE OF HIGH SEG AS SET BY LOADER\r
588                                 ; SO USER'S CAN TEST FOR HIGH SEG BY SKIPN JOBHRL\r
589         POPJ    PDP,            ;RETURN\r
590 \f;ROUTINE TO CLEAR A HIGH SEGMENT NAME SO NO NEW USERS CAN SHARE\r
591 ;AND RETURN BOTH DISK AND CORE SPACE (IF ANY) IF HIGH SEG WAS DORMANT(SNA=0)\r
592 ;IE NO LONGER IN ANY USER'S VIRTUAL ADR. SPACE\r
593 ;CALL:  MOVE ITEM, HIGH SEG NUMBER\r
594 ;       PUSHJ PDP, CLRNAM\r
595 ;       RETURN ITEM AND PROG PRESERVED\r
596 ;CALLED FROM FRESWP,FRECOR,FNDSGN (UREMAP,UCORHI), ASGHGH,RELSEG\r
597 \r
598         EXTERN  JBTNAM,JBTSTS,JBTDIR\r
599 IFN FTDISK,<EXTERN PRJPRG>\r
600 \r
601 CLRNAM: SETZM   JBTDIR(ITEM)    ;CLEAR DEVICE NAME OR STR NAME\r
602 IFN FTDISK,<SETZM PRJPRG(ITEM)  ; CLEAR DIRECTORY NAME >\r
603 CLRNM1: SETZM   JBTNAM(ITEM)    ;AND SEG NAME SO NEW USER'S CAN USE\r
604                                 ; CLRNM2 CALLED PQOM ASGHGH AND RELSEG\r
605                                 ; WHEN FILE SUPERCEDED, BUT LEAVE DIR\r
606                                 ; NAME FOR SYSTAT TO PRINT (OBS)\r
607         SKIPGE  JBTSTS(ITEM)    ;IS SEG DORMANT(IE NOT IN ANY USER'S VIRTUAL\r
608                                 ; ADR. SPACE)?\r
609         POPJ    PDP,            ;NO,(SNA=1) ALLOW USER'S TO CONTINUE TO SHARE\r
610                                 ; UNTIL FINISHED, HOWEVER NO NEW USERS CAN\r
611                                 ; SHARE SINCE NO LONGER A NAME\r
612 IFN FTSWAP,<\r
613         EXTERN  ZERSWP\r
614         PUSHJ   PDP,ZERSWP      ;YES, RETURN DISK SPACE, IF ANY\r
615 >\r
616                                 ;FALL INTO ROUTINE TO KILL DORMANT CORE\r
617 \r
618 ;ROUTINE TO RETURN DORMANT OR IDLE CORE (IF ANY)\r
619 ;CALL:  MOVE ITEM, HIGH SEG NUMBER\r
620 ;       PUSHJ P,KDORCR\r
621 ;       RETURN ITEM,PROG PRESERVED\r
622 ;CALLED FROM CLRNAM AND FRECOR\r
623 \r
624         INTERN  FTHALT\r
625         EXTERN  CORTAL,JBTADR\r
626 \r
627 KDORCR: PUSH    PDP,PROG        ;SAVE R(EITHER HIGH OR LOW RELOC)\r
628         PUSH    PDP,CORTAL      ;SAVE FREE CORE COUNT\r
629         SKIPE   PROG,JBTADR(ITEM) ;DOES DORMANT SEG HAVE CORE?\r
630         PUSHJ   PDP,KCOREH      ;YES, RETURN PHYSICAL COREAND FLAG HIGH SEG\r
631                                 ; AS ON DISK IF IT HAS DISK SPACE(SET SWP=1)\r
632 \r
633         POP     PDP,CORTAL      ;RESTORE FREE CORE COUNT, SINCE DORMANT\r
634                                 ; SEGS ALREADY INCLUDED IN CORTAL\r
635 IFN FTHALT,<\r
636         PUSHJ   PDP,CHKTAL      ;CHECK CORTAL WITH CORTAB, HALT IF BAD\r
637 >\r
638         POP     PDP,PROG        ;RESTORE PROG\r
639         POPJ    PDP,            ;RETURN\r
640 \r
641 \f;ROUTINE TO RETURN HIGH SEGMENT CORE(MUST BE SOME) AND FLAG SEG AS ON DISK\r
642 ; IF HIGH SEG HAS DISK SPACE(IE SET SWP=1 IF IMGOUT NON-ZERO)\r
643 ;CALL:  MOVE ITEM,HIGH SEG NUMBER\r
644 ;       MOVE PROG,HIGH SEG RELOC AND PROTECTION\r
645 ;       PUSHJ P,KCOREH\r
646 ;CALLED FROM KDORCR(FRECOR,CLRNAM,KILHGH) AND FORHGH\r
647 \r
648 IFN FTSWAP,<\r
649         EXTERN  IMGOUT,KCORE1,JBTSTS\r
650 \r
651 KCOREH: LDB     TAC,IMGOUT      ;DOES HIGH SEG HAVE DISK SPACE?\r
652         JUMPE   TAC,KCORE1      ;NO, RETURN CORE\r
653         MOVSI   TAC,SWP         ;YES, FLAG HIGH SEG AS SWAPPED OUT\r
654         IORM    TAC,JBTSTS(ITEM) ;SET SWP=1\r
655         JRST    KCORE1          ;THEN RETURN CORE\r
656 >\r
657 IFE FTSWAP,<\r
658         EXTERN  KCORE1\r
659         KCOREH=KCORE1\r
660 >\r
661 \f;CORE UUO ROUTINE TO ASSIGN OR REASSIGN CORE FOR HIGH SEG\r
662 ;CALLED AFTER LOW SEG SEG IS REASSIGNED IF USER HAS NON-ZERO RH IN AC\r
663 ;CALL:  HRRZ TAC,DESCRED HIGHEST USER ADR. IN HIGH SEG\r
664 ;       MOVE ITEM, JOB NUMBER\r
665 ;       PUSHJ PDP,UCORHI\r
666 ;       ERROR RETURN - SUM OF SEGMENTS EXCEED MAX. PHYSICAL CORE OR\r
667 ;               EXCEED TOTAL SYSTEM VIRTUAL CORE CAPACITY\r
668 ;               SHARABLE PROGRAM MEDDLED WITH(AND NO WRITE PRIV.)\r
669 ;                OR HIGH SEG IS SPY SEG\r
670 \r
671 ;       OK RETURN - CORE ASSIGNED(MAYBE NOT IN MEMORY) OR USER ASKED NO CHANGE(LH=0)\r
672 ;       J AND R RESTORED TO LOW SEG NO AND RELOC\r
673 \r
674 ;IF LH IS NON-ZERO BUT LESS THAN 400000 OR END OF LOW SEG(IF GREATER THAN 400000)\r
675 ;THE HIGH SEGMENT WILL BE REMOVED FROM USERS LOGICAL ADDRESSING SPACE\r
676 \r
677         INTERN  UCORHI\r
678         EXTERN  CPOPJ1,JBTADR,JBTSGN,TWOREG,JBTSTS,SEGPTR\r
679         EXTERN  JBTSTS,JOB,CORE0,JOBADR\r
680 \r
681 UCORHI: JUMPE   TAC,CPOPJ1      ;ASKING FOR ANY CHANGE?\r
682         SUBI    TAC,400000      ;YES, GET LENGTH-1 ASSUMING HIGH SEG START AT 400000\r
683         HLRZ    TAC1,JBTADR(ITEM) ;LENGTH-1 OF LOW SEGMENT\r
684         TRNE    TAC1,400000     ;IS LOW SEG SO LONG AS TO CAUSE HIGH SEG TO START\r
685                                 ; HIGHER UP IN USER ADDRESSING SPACE THAN 400000?\r
686         SUBI    TAC,-400000+1(TAC1);YES, ADD BACK 400000 AND SUBTRACT LENGTH OF LOW SEG\r
687         JUMPL   TAC,KILHG1      ;KILL HIGH SEG IF ITS HIGHEST USER ADR WOULD\r
688                                 ; BE LESS THAN USER ORIGIN OF HIGH SEG\r
689                                 ; ALWAYS SKIP RETURN\r
690         IORI    TAC,1777        ;USER WANTS MORE OR LESS HIGH SEG CORE, \r
691                                 ; MAKE IT EVEN 1K-1\r
692         PUSH    PDP,TAC         ;SAVE CORE ARG(NEW SIZE-1)\r
693         SKIPL   ITEM,JBTSGN(ITEM) ;GET HIGH SEG NUMBER(IF ANY),SPY SEG?\r
694         SKIPN   TWOREG          ;NO, DOES MACHINE HAVE JUST 1 RELOC REG?\r
695         JRST    UCORHE          ;YES, GIVE ERROR RETURN TO USER\r
696         TLNN    ITEM,MEDDLE     ;HAS USER MEDDLED WITH THIS PROGRAM(AND WAS\r
697                                 ; SHARABLE) OR THIS A SPY SEG?\r
698         JRST    UCORH1          ;NO, OK TO CHANGE CORE ASSIGNMENT\r
699         MOVE    AC2,JOB         ;YES, CURRENT JOB NUMBER\r
700         PUSHJ   PDP,CHKHSW      ;CHECK TO SEE IF USER HAS PRIVILEGES TO\r
701                                 ; WRITE HIGH SEG\r
702         JRST    UCORHE          ;NO, ERROR RETURN TO USER\r
703 UCORH1: SKIPN   ITEM            ;YES, DOES JOB HAVE A HIGH SEG YET?\r
704                                 ; OR IS THIS FIRST ASSIGNMENT OF CORE TO HIGH SEG\r
705         PUSHJ   PDP,FNDSGN      ;NO, FIND FREE SEG NUMBER BEFORE ASSIGNING CORE\r
706                                 ; (TAC PRESERVED)\r
707 \fIFN FTSWAP,<\r
708         EXTERN  ZERSWP\r
709         PUSHJ   PDP,ZERSWP      ;RETURN SWAPPING SPACE, IF ANY (NULL JOB NEVER HAS\r
710                                 ; SINCE NEW SIZE MAY BE DIFFERENT FROM OLD SIZE\r
711                                 ; SO IT SHOULD BE WRITTEN NEXT SWAPOUT\r
712                                 ; EVEN IF WRITE PROTECTED.\r
713 >\r
714         POP     PDP,TAC         ;RESTORE AMOUNT OF CORE REQUEST\r
715         MOVE    PROG,JBTADR(ITEM) ;R TO PREVIOUS HIGH SEG CORE ASSIGNMENT(IF ANY)\r
716         PUSHJ   PDP,CORE0       ;TRY TO ASSIGN CORE TO HIGH SEG(ON DISK OR MEMORY)\r
717         JRST    SETREL          ;ERROR, CORE REQUEST TOO BIG, IF NO ONE IS USING\r
718                                 ; (INCLUDING THIS USER) LEAVE SEG NON-EXISTENT,\r
719                                 ; OTHERWISE DORMANT OR STILL IN USE BY THIS AND/OR\r
720                                 ; OTHER USERS\r
721         MOVE    PROG,JOBADR     ;RESTORE LOW SEGMENT ADDRESS, FOR USE BY WSCHED\r
722         JRST    SHARE2          ;OK RETURN, MARK USER AS HAVING THIS HIGH SEG IN LOG.\r
723                                 ; ADR. SPACE(IN CASE IT WAS NOT BEFORE)\r
724                                 ; SET RELOC AND SKIP RETURN\r
725                                 ; AND INCREMENT HIGH SEG IN CORE CONT FOR THIS JOB\r
726                                 ; IF NOT ALREADY DONE SO.\r
727 \r
728 UCORHE: POP     PDP,TAC         ;RESTORE PD LIST\r
729         JRST    SETREL          ;AND SETUP HARDWARE, SET R TO LOW SEG\r
730                                 ; RELOC, J TO CURRENT JOB, AND ERROR RETURN\r
731 \f;UUO TO REMAP TOP PART OF LOW SEGMENT INTO HIGH SEGMENT\r
732 ;PREVIOUS HIGH SEGMENT(IF IT EXISTED) IS REMOVED FROM LOGICAL ADDRESSING SPACE\r
733 ;CALL:  MOVE TAC,HIGHEST DESIRED REL. ADR. IN NEW LOW SEG.\r
734 ;                               (EXEC ORES IN 1777 TO MAKE EVEN 1K-1)\r
735 ;       MOVE PROG,XWD PROTECTION,RELOCATION FOR LOW SEGMENT\r
736 ;       PUSHJ PDP,UREMAP\r
737 ;       ERROR RETURN - DESIRED HIGHEST REL. ADR PAST END OF LOW SEG\r
738 ;                       ;OR 1 REGISTER MACHINE\r
739 ;       OK RETURN - HARDWARE AND SOFTWARE RELOCATION INFO RESET\r
740 ;       ITEM RESET TO CURRENT JOB NUMBER, AND PROG TO RELOC\r
741 ;MUST BE CALLED AT UUO LEVEL ONLY\r
742 \r
743         INTERN  UREMAP\r
744         EXTERN  USRREL,TWOREG,IOWAIT,CPOPJ1,SETREL,JOB\r
745 \r
746 UREMAP: JUMPL   TAC,CPOPJ       ;IS USER ARG NEGATIVE? GIVE ERROR RET IF YES\r
747         IORI    TAC,1777        ;MAKE AN EVEN MULTIPLE OF 1K-1\r
748         SKIPE   TWOREG          ;DOES MACHINE HAVE TWO RELOCATION REG?\r
749         CAMLE   TAC,USRREL      ;YES, IS NEW TOP OF LOW SEG LESS THAN OR EQUAL TO OLD?\r
750         POPJ    PDP,            ;NO, ERROR RETURN - 1 REG MACHINE OR ARG TOO BIG\r
751         PUSH    PDP,TAC         ;YES, SAVE DESIRED HIGHEST ADR OF NEW LOW SEG\r
752         PUSH    PDP,DEVDAT      ;SAVE DEVDAT (IOWAIT CHANGED IT)\r
753         PUSHJ   PDP,IOWAIT      ;WAIT FOR IO TO STOP IN LOW SEG\r
754         POP     PDP,DEVDAT      ;RESTORE DEVDAT\r
755         PUSHJ   PDP,KILHGC      ;KILL PREVIOUS HIGH SEG IF IT EXISTED FOR CUR. JOB\r
756         POP     PDP,TAC1        ;RESTORE DESIRED HIGHEST ADR IN NEW LOW SEG\r
757         HLRZ    TAC,JBTADR(ITEM) ;GET PREVIOUS HIGHEST ADR OF LOW SEG\r
758         HRLM    TAC1,JBTADR(ITEM) ;STORE NEW(LESS THAN OR EQUAL) HIGHEST ADR OF LOW SEG\r
759         SUBI    TAC,1(TAC1)     ;COMPUTE LENGTH-1 OF NEW HIGH SEG\r
760         JUMPL   TAC,SETRL1      ;-1 MEANS NEW LOW SEG=OLD LOW SEG\r
761                                 ; RESET HARDWARE BECAUSE NO HIGH SEG ANY MORE\r
762                                 ; FOR SURE, SET RELOC. HARD. AND SKIP RETURN\r
763         ADD     TAC1,JBTADR(ITEM) ;ADD ABS. ADR. OF LOW SEG TO LENGTH-1 OF LOW SEG\r
764                                 ;TO FORM LENGTH-1 OF NEW HIGH SEG\r
765         HRLI    TAC,1(TAC1)     ;MOVE ABS ADR. OF NEW HIGH SEG TO LH\r
766         PUSHJ   PDP,FNDSGN      ;FIND FREE SEG NUMBER(TAC PRESERVED)\r
767                                 ; AND SET IN CORE COUNT TO 0\r
768         MOVSM   TAC,JBTADR(ITEM) ;STORE LENGTH-1 AND ABS. ADR. OF NEW HIGH SEG\r
769         JRST    SHARE1          ;SET IN CORE COUNT TO 1, FLAG THIS SEG IN CURRENT\r
770                                 ; JOB'S LOG. ADR. SPACE, AND FLAG HIGH SEG NO.\r
771                                 ; AS ASSIGNED(SNA=1)\r
772                                 ; RESET HARD. AND SOFT. RELOC, AND SKIP RETURN\r
773 \f;ROUTINE TO FIND A FREE SEG NUMBER FOR A NEW HIGH SEGMENT FOR CURRENT JOB\r
774 ;CALLED BY CORE UUO AND REMAP UUO(MUST BE CALLED AT UUO LEVEL ONLY)\r
775 ;TRIES TO FIND A FREE SEGMENT WITHOUT DORMANT COPY ON DISK OR CORE\r
776 ;IF NONE, IT FINDS A SEG WHICH IS DORMANT ON DISK AND/OR CORE\r
777 ; DELETES UNUSED DISK AND CORE AND REUSES THAT HIGH SEG NUMBER\r
778 ;(A SEGMENT CANNOT BE DORMANT ON DISK AND USED IN CORE OR VICE VERSA)\r
779 ;NEW HIGH SEG IS FLAGGED AS NON-SHARABLE(SHRSEG=0 IN JBTSTS FOR HIGH SEG)\r
780 ;IN CORE COUNT IS SET TO 0\r
781 ;CALL:  PUSHJ PDP,FNDSGN\r
782 ;       RETURN WITH ITEM SET TO FREE SEG NUMBER\r
783 ;HOWEVER CURENT JOB IS NOT MARKED AS HAVING THIS SEG IN LOGICAL ADR SPACE\r
784 ; SINCE THER MAY NOT BE ENOUGH CORE FOR SEGMENT. THE CALLER MUST FLAG USER\r
785 ; AS HAVEING THIS SEG IN ADDRESSING SPACE IF EVERYTHING OK\r
786 ;THE LH OF ITEM IS SET TO 0(SHRSEG=MEDDLE=UWPOFF=SPYSEG=0)\r
787 ;THE CALLER MUST ALSO FLAG HIGH SEG AS ASSIGNED(SNA=1) IF EVERYTHING OK\r
788 ;TAC IS PRESERVED, TAC1 IS USED\r
789 \r
790         EXTERN  SEGPTR,JBTSTS,JOB,JBTSGN,TPOPJ,UERROR,JBTNAM\r
791 IFN FTDISK,<EXTERN PRJPRG>\r
792 \r
793 FNDSGN: PUSH    PDP,TAC         ;SAVE TAC(HIGHEST REL. ADR. DESIRED\r
794                                 ;IN CALLS TO CORE AND REMAP)\r
795         MOVE    ITEM,SEGPTR     ;SCAN JUST HIGH SEGMENTS(NOT JOBS)\r
796 IFN FTSWAP,<\r
797         EXTERN  JBTSWP,OUTMSK\r
798         MOVEI   TAC1,OUTMSK     ;MASK FOR DISK IMAGE BYTE POINTER\r
799 >\r
800 FND1:   SKIPL   JBTSTS(ITEM)    ;SEG NUMBER ASSIGNED(SNA=1)?\r
801         SKIPE   JBTADR(ITEM)    ;NO, DOES HIGH SEG STILL HAVE CORE ANYWAY?\r
802 IFN FTSWAP,<\r
803         JRST    .+2             ;YES, KEEP LOOKING\r
804         TDNE    TAC1,JBTSWP(ITEM) ;NO, DOES IT HAVE DISK SPACE?\r
805 >\r
806         AOBJN   ITEM,FND1       ;YES, KEEP LOOKING, MORE TO GO?\r
807         JUMPL   ITEM,FNDOK      ;NO, WAS A FREE SEG NUMBER FOUND WITH NO CORE ASSIGNED?\r
808         MOVE    ITEM,SEGPTR     ;NO, FIND  FREE SEG  EVEN IF DORMANT ON DISK OR CORE\r
809 FND2:   SKIPGE  JBTSTS(ITEM)    ;IS THIS HIGH SEG NO. ASSIGNED(SNA=1)?\r
810         AOBJN   ITEM,FND2       ;YES, KEEP LOOKING, MORE TO GO?\r
811         JUMPL   ITEM,FNDOK      ;NO, WAS A FREE ONE FOUND?\r
812         JSP     JBUF,UERROR     ;NO MORE FREE SEG NUMBERS -\r
813                                 ; SHOULD NEVER HAPPEN SINCE THERE ARE THE SAME\r
814                                 ; NUMBER OF SEG NUMBERS AS JOB NUMBERS\r
815                                 ; (COUNTING NULL JOB)\r
816                                 ; BLAME CURRENT USER\r
817 FNDOK:  TLZ     ITEM,777777     ;TURN OFF MEDDLE,SHRSEG,UWPOFF,SPYSEG,CORCNT)\r
818         PUSHJ   PDP,CLRNAM      ;CLEAR HIGH SEG NAME SO NO LONGER\r
819                                 ; SHARABLE TO NEW USERS, DELETE DISK AND CORE(IF ANY)\r
820         SETZM   JBTSTS(ITEM)    ;CLEAR ALL BITS AND IN CORE COUNTS JUST FOR GOOD\r
821                                 ; MEASURE(SHRSEG!JERR COULD BE STILL ON FOR HIGH SEG)\r
822         JRST    TPOPJ           ;RESTORE TAC AND RETURN\r
823 \f;ROUTINE TO INCREMENT HIGH SEG IN CORE COUNT (OCNCE)\r
824 ; FOR A JOB WHICH HAS A REAL HIGH SEG WHICH MUST BE IN CORE\r
825 ;CALL:  MOVE ITEM,XWD JOB HIGH SEG BITS, HIGH SEG NUMBER\r
826 ;       MOVE TAC,JOB NUMBER\r
827 ;       PUSHJ PDP,INCCNT\r
828 ;       ALWAYS RETURN WITH C(ITEM)=JBTSGN(TAC)\r
829 ;CORCNT IS SET TO 1 TO FLAG THIS JOB AS HAVING INCREMENTED IN CORE COUNT\r
830 ;CALLED FROM SHARES(GET,REMAP,CORE) AND FININ\r
831 \r
832         EXTERN  JBTSGN,JBTSTS\r
833 \r
834 INCCNT: TLON    ITEM,CORCNT     ;HAS HIGH SEG IN CORE COUNT ALREADY BEEN\r
835         AOS     JBTSTS(ITEM)    ; INCREMENTED FOR THIS JOB?\r
836                                 ;NO, INCREMENT HIGH SEG IN CORE COUNT\r
837 IFN FTHALT,<\r
838         PUSHJ   PDP,COMIT       ;COMPARE J WITH JBTSGN(TAC)\r
839 >\r
840         MOVEM   ITEM,JBTSGN(TAC) ;STORE CORCNT FLAG FOR THIS JOB?\r
841         POPJ    PDP,\r
842 \r
843 \r
844 ;ROUTINE TO DECREMENT HIGH SEG IN CORE COUNT (ONCE)\r
845 ; FOR A JOB WHICH HAS A REAL HIGH SEG WHICH MUST BE IN CORE\r
846 ;CALL:  MOVE ITEM XWD JOB HIGH SEG BITS, HIGH SEG NUMBER\r
847 ;       MOVE TAC, JOB NUMBER\r
848 ;       PUSHJ P,DECCNT\r
849 ;       RET1 IN CORE COUNT NOT YET 0 OR IN-CORE COUNT NOT UP FOR THIS JOB\r
850 ;       RET2 IN CORE COUNT WENT TO 0\r
851 ;CALLED FROM KILHGH,FORHGH,FINOT\r
852 \r
853         EXTERN  JBTSGN,JBTSTS\r
854 \r
855 DECCNT:\r
856 IFN FTHALT,<\r
857         PUSHJ   PDP,COMIT       ;COMPARE J WITH JBTSGN(TAC)\r
858 >\r
859         TLZN    ITEM,CORCNT     ;HAS HIGH SEG IN CORE COUNT ALREADY BEEN\r
860                                 ;DECREMENTED FOR THIS JOB?\r
861         POPJ    PDP,            ;YES, RETURN\r
862         SOS     JBTSTS(ITEM)    ;NO, DECREMENT HIGH SEG IN CORE COUNT\r
863         MOVEM   ITEM,JBTSGN(TAC) ;CLEAR CORCNT FLAG IN MEMORY FOR THIS JOB\r
864 DECERR: HRRE    TAC,JBTSTS(ITEM) ;GET HIGH SEG IN CORE COUNT\r
865         JUMPG   TAC,CPOPJ       ;STILL GREATER THAN 0?\r
866         JUMPE   TAC,CPOPJ1      ;EQUAL TO 0\r
867         AOS     JBTSTS(ITEM)    ;NO, ERROR ADD BACK TO 0\r
868         HALT    DECERR          ;AND HALT, CONTINUE WILL\r
869 \f;ROUTINE TO COMPARE RH OF ITEM WITH JBTSGN(TAC)\r
870 ;BEFORE STORES INTO JBTSGN(TAC)\r
871 ;WHERE TAC CONTAINS JOB NUMBER AND ITEM IS HIGH SEG NUMBER\r
872 ;USED FOR DEBUGGING.  MONITOR CANNOT RUN VERY LONG IF THIS ERROR GOES UNDETECTED\r
873 \r
874 IFN FTHALT,<\r
875 \r
876 COMIT:  PUSH    PDP,TAC         ;SAVE JOB NUMBER\r
877         SKIPE   TAC             ;JOB NUMBER CANNOT BE 0\r
878         CAILE   TAC,JOBMAX      ;MAKE SURE TAC IS A JOB NUMBER\r
879         HALT    .               ;HALT, DO NOT ALLOW CONTINUE\r
880         HRRZ    TAC,JBTSGN(TAC) ;GET JOBS HIGH SEG NUMBER\r
881         JUMPE   TAC,TPOPJ       ;IF NONE, OK TO RESTORE J\r
882         CAIE    TAC,(ITEM)      ;MAKE SURE RH OF J SAME AS RH OF JBTSGN(TAC)\r
883         HALT    .               ;HALT IF NOT\r
884         JRST    TPOPJ           ;RESTORE TAC AND RETURN\r
885 >\r
886 \f;ROUTINE TO CHANGE RELOC INFO IF SEG JUST ASSIGNED IS A HIGH SEG\r
887 ;WHICH THE CURRENT USER MAY BE USING\r
888 ;CALL:  MOVE ITEM,LOW OR HIGH SEG FOR WHICH CORE WAS JUST ASSIGNED(OR RETURNED)\r
889 ;       PUSHJ PDP,CURHGH\r
890 ;       ALSWAYS RETURN WITH ITEM PRESERVED\r
891 ;       PROG RESET TO RELOC FOR HIGH SEG IF ITEM IS HIGH SEG, OTHERWISE PROG AND\r
892 ;               ITEM UNCHANGED\r
893 \r
894         INTERN  CURHGH\r
895         EXTERN  JBTSGN,SETREL,IPOPJ\r
896 \r
897 CURHGH: MOVE    TAC,JOB         ;CURRENT JOB NUMBER\r
898         HRRZ    TAC,JBTSGN(TAC) ;GET HIGH SEG NUMBER OF CURRENT JOB OR 0\r
899         CAIE    TAC,(ITEM)      ;IS HIGH SEG JUST ASSIGNED SAME AS CURRENT JOB'S\r
900         POPJ    PDP,            ;NO\r
901         PUSH    PDP,ITEM        ;YES, SAVE HIGH SEG NUMBER\r
902         PUSHJ   PDP,SETREL      ;SET HARD. AND SOFT. RELOC INFO FOR CURRENT JOB\r
903                                 ; (EVEN THOUGH THIS CALL TO CURHGH MAY BE FOR SOME\r
904                                 ; OTHER JOB) SONCE HIGH SEG MAY BE IN NEW PLACE IN CORE\r
905         POP     PDP,ITEM                ;RESTORE HIGH SEG NUMBER\r
906         MOVE    PROG,JBTADR(ITEM)       ;RESTORE HIGH RELOCATION\r
907         POPJ    PDP,            ;RETURN\r
908 \f;ROUTINE TO SEE IF SUM OF BOTH SEGMENTS WILL FIT INTO MAXIMUM SIZE\r
909 ;OF PHYSICAL CORE TOGETHER\r
910 ;CALL:  MOVE TAC,REQUESTED LENGTH-1 OF SEG BEING ASSIGNED(LOW OR HIGH)\r
911 ;               TAC IS ASSUMED TO HAVE 1777 ORED IN BEFORE CALL\r
912 ;       MOVE ITEM,JOB OR HIGH SEG NUMBER\r
913 ;       PUSHJ P,SUMSEG\r
914 ;       ERROR RETURN, CAN NEVER FIT\r
915 ;       OK RETURN\r
916 ;PREVIOUS CONTENTS OF TAC AND ITEM PRESERVED ON BOTH RETURNS\r
917 ;IF HIGH SEG, MUST BY CALLED AT UUO LEVEL, IF TAC NON-ZERO\r
918 ;OK TO CALL FOR HIGH SEG AT CLOCK LEVEL, PROVIDED ASKING FOR 0 ONLY.\r
919 ;SHUFFLER MODIFIED  SO IT NEVER CALLS SUMSEG(SINCE IT MIGHT SHUFFLE \r
920 ;HIGH SEGMENT AT CLOCK LEVEL WHICH IS NOT THE CURRENT USERS)\r
921 ;THIS WILL BE TRUE AS LONG AS A CORE COMMAND IS NOT IMPLEMENTED WHICH\r
922 ;ALLOWS USER TO ADJUST HIGH SEG TO ANYTHING BUT 0.\r
923 ;CALLED FROM CORE UUO(CORE0 AND CORE1 ROUTINES)\r
924 \r
925         INTERN  SUMSEG\r
926         EXTERN  CPOPJ1,JOBMAX,JOB,JBTSGN,CORMAX,IPOPJ,SEGSIZ\r
927 \r
928 SUMSEG: JUMPE   TAC,CPOPJ1      ;ASKING FOR 0 CORE(IF YES, COULD BE\r
929                                 ;HIGH SEG AT CLOCK LEVEL)? HAVE NO IDEA WHAT LOW\r
930                                 ; SEG NO. IS HOWEVER, 0 ALWAYS WILL FIT\r
931         PUSH    PDP,ITEM        ;NO, SAVE JOB OR HIGH SEG NUMBER\r
932         CAILE   ITEM,JOBMAX     ;IS THIS A LOW SEG?\r
933         SKIPA   ITEM,JOB        ;NO,(ASSUME AT UUO LEVEL), GET CURRENT JOB NUMBER\r
934         MOVE    ITEM,JBTSGN(ITEM) ;YES, GET HIGH SEG NUMBER, IF ANY\r
935         MOVEI   TAC1,0          ;ASSUME NO HIGH SEG NUMBER\r
936         JUMPLE  ITEM,SUM1       ;IS THERE NO HIGH SEG OR IS THIS A SPY SEG?\r
937         PUSHJ   PDP,SEGSIZ      ;TAC1=SIZE(IN J) OF HIGH OR LOW SEG\r
938         ASH     TAC1,12         ;CONVERT TO NUMBER OF WORDS(SEG NOT BEING ALLOCATED)\r
939 SUM1:   ADD     TAC1,TAC        ;ADD REQUEST(ORED 1777) TO LENGTH-1(OR 0) OF SEG NOT\r
940                                 ; BEING CHANGED\r
941         CAMGE   TAC1,CORMAX     ;WILL TOTAL SIZE-1 BE LESS THAN MAX SIZE\r
942         AOS     -1(PDP)         ;YES, OK RETURN\r
943         JRST    IPOPJ           ;NO, ERROR RETURN, RESTORE J\r
944 \f;ROUTINE TO COMPARE CORTAL(FREE+DORMANT+IDLE CORE) WITH CORTAB(USE BIT TABLE)\r
945 ;AND HALT IF INCONSISTENT.\r
946 ;CALL:  PUSHJ PDP,CHKTAL        -AFTER CORTAL ADJUSTED\r
947 ;       RETURN ONLY IF OK-ALL ACS SAVED\r
948 \r
949         INTERN  FTHALT\r
950 IFN FTHALT,<\r
951         INTERN  CHKTAL          ;PUT IN STORAGE MAP(ONLY CALLED FROM SEGCON\r
952         EXTERN  CORLST,CORTAL,SEGPTR,JBTSTS,JBTADR,PCORSZ,CORE2P\r
953 \r
954 CHKTAL: PUSH    PDP,TAC         ;SAVE ALL ACS USED\r
955         PUSH    PDP,ITEM\r
956         PUSH    PDP,JBUF\r
957         MOVEI   JBUF,0          ;SET FREE+DORMANT+IDLE COUNT TO 0\r
958         MOVE    ITEM,CORE2P     ;POINTER TO CORTAB, 1 BIT BYTES\r
959 CHKT1:  ILDB    TAC,ITEM        ;GET NEXT 1K BIT\r
960         SKIPN   TAC             ;IS THAT ITEM IN USE?\r
961         ADDI    JBUF,1          ;NO, ADD 1 TO FREE COUNT\r
962         CAME    ITEM,CORLST     ;FINISHED CORTAB?\r
963         JRST    CHKT1           ;NO,\r
964         MOVE    ITEM,SEGPTR     ;YES, SCAN ALL HIGH SEGMENTS\r
965 CHKT2:  HRRZ    TAC,JBTSTS(ITEM) ;HIGH SEG IN CORE COUNT\r
966         SKIPN   JBTADR(ITEM)    ;IS HIGH  SEG EVEN IN CORE?\r
967         JRST    CHKT3           ;NO\r
968         JUMPN   TAC,CHKT3       ;YES, IS IN CORE COUNT 0\r
969         LDB     TAC,PCORSZ      ;YES, THEREFORE DORMANT OR IDLE\r
970         ADDI    JBUF,1(TAC)     ;ADD SIZE IN ITEM TO FREE\r
971 CHKT3:  AOBJN   ITEM,CHKT2      ;SCANNED ALL HIGH SEGS?\r
972         CAME    JBUF,CORTAL     ;YES, IS FREE+DORMANT+IDLE = BIT TABLE\r
973         HALT    .               ;NO. HALT, DO NOT ALLOW CONTINUE\r
974         POP     PDP,JBUF        ;YES, RETORE ACS AND RETURN\r
975         POP     PDP,ITEM\r
976         JRST    TPOPJ           ;RETORE TAC AND RETURN\r
977 >\r
978 \fSUBTTL ERRCON - MONITOR DETECTED ERROR ROUTINES\r
979 \r
980 ;ILLEGAL MEMORY(ILM) DETERMINE IF WILD TRANSFER OR NOT\r
981 ;CALL:  HRRZ TAC,USER PC\r
982 ;       PUSHJ PDP,SEGILM\r
983 ;       LEGAL PC RETURN(MUST BE ILLEGAL REF)\r
984 ;       ILLEGAL PC RETURN(MUST BE WILD TRANSFER)\r
985 \r
986         INTERN  SEGILM\r
987         EXTERN  KT10A\r
988 \r
989 SEGILM: LDB     TAC1,[POINT 8,KT10A,16] ;8 BIT PROTECTION FOR CURRENT HIGH SEG\r
990         LSH     TAC1,12         ;LEFT JUSTIFY IN RH\r
991         CAIL    TAC,400000      ;IS PC 400000 OR BIGGER?\r
992         CAILE   TAC,1777(TAC1)  ;YES, IS PC BELOW TOP OF HIGH SEG?\r
993         AOS     (PDP)           ;NO, ILLEGAL PC RETURN\r
994         POPJ    PDP,            ;YES, PC IN HIGH SEG(MUST BE ILLEGAL REF)\r
995 \fSUBTTL SAVGET - SAVE, GET, R, AND RUN COMMANDS\r
996 \r
997 ;THE LOWER CORE LOCATION 0-17 IN USER AREA ARE USED FOR TEMP STORAGE FOR SAVE-GET\r
998 ;THEY ARE DEFINED IN BEGINNING OF SAVGET ROUTINE\r
999 \r
1000         EXTERN  SGAMOD,SGAEXT,SGAHGH,SGALEN,SGALOW,SGANAM,SGAPPN,SGAREN\r
1001 \r
1002 ;ROUTINE TO SET EXTENSION OF HIGH SEG\r
1003 ;SAME CALL AS SETEXT EXCEPT S NOT SETUP\r
1004 ;CALLED FROM GETARG(RUN, GET SEG UUO)\r
1005 \r
1006         INTERN  SETEX1\r
1007         EXTERN  USRREL,JOBPD1\r
1008 \r
1009 SETEX1: TLZ     IOS,NSRBIT      ;TRY SHARABLE SEG FIRST(.SHR) THEN .HGH\r
1010                                 ;FALL INTO SETEXT\r
1011 \r
1012 ;ROUTINE TO SET EXTENSION OF HIGH SEGMENT TO SHR(SSAVE,GET,R) OR HGH(SAVE)\r
1013 ;CALL:  HRLI S,0(GET,SSAVE,RUN) OR NSRBIT(SAVE)\r
1014 ;       MOVE PROG,XWD PROTECT,RELOC FOR LOW SEG\r
1015 ;       MOVEI TAC1, LOW FILE EXTENSION OR 0 IF NONE TYPED IN\r
1016 ;       PUSHJ PDP,SETEXT\r
1017 ;       RETURN TAC PRESERVED(TTY INPUT BYTE POINTER)\r
1018 ;       CALLED FROM COMMAND DECODER ROUTINE SGSET, TAC PRESERVED (INPUT BYTE POINTER)\r
1019 \r
1020         INTERN  SETEXT\r
1021 \r
1022 SETEXT: HRLZM   TAC1,SGALOW(PROG) ;SAVE EXTENSION USER TYPED FOR LOW SEG\r
1023         MOVE    TAC1,[SIXBIT /SHRHGH/] ;ASSUME SSAVE COMMAND(OR  GET)\r
1024         TLNE    IOS,NSRBIT      ;WAS IT?\r
1025         MOVSS   TAC1            ;NO, EXCHANGE ROLES OF EXTENSIONS, MUST\r
1026                                 ; BY SAVE\r
1027 \r
1028         MOVEM   TAC1,SGAHGH(PROG)       ;SAVE FOR ENTER AND RENAME OF HIGH SEGMENT\r
1029 \r
1030         POPJ    PDP,\r
1031 \f;ROUTINE TO SAVE HIGH SEG IF IT EXISTS (AS.SHR(SSAVE) OR .HGH(SAVE))\r
1032 ;AND DETERMINE IF LOW SEG HAS DATA TO BE SAVED, OR NOT(IF YES IT WILL BE WRITTEN\r
1033 ;AS LOW UNLESS USER SPECIFIED DIFFERENTLY RATHER THAN.SAV)\r
1034 ;ALWAYS SAVE LOW SEG IF MAGTAPE OR IF NO HIGH SEG\r
1035 ;CALL:  MOVE ITEM, JOB NUMBER (R,R,F SET UP)\r
1036 ;       PUSHJ PDP,SAVHGH\r
1037 ;       RETURN1 NO DATA IN LOW SEGMENT\r
1038 ;       RETURN2 SAVE LOW SEGMENT\r
1039 ;       ITEM DESTROYED,SGAEXT RESTORED TO SAV OR USERS TYPED EXTENSION\r
1040 ;       SGALLEN RESTORED TO IOWD FOR LOW SEG IF DTA,PROJ R IF DSK\r
1041 ;       DEVICE INITED ON EITHER RETURN\r
1042 \r
1043         INTERN  SAVHGH\r
1044         EXTERN  JBTSGN,JBTSTS,JBTADR,JOBSA,JOB41,JOBCOR,JOBVER,SG4\r
1045         EXTERN  JOBHRL,JOBREN,USRREL,SGIOCK,SAVERR,USRDDT,JOB,JOBHCU,USRHCU\r
1046 \r
1047 SAVHGH: PUSHJ   PDP,SGOPEN      ;TRY TO ASSIGN DEVICE(INIT IN SAVMOD)\r
1048         SKIPG   ITEM,JBTSGN(ITEM) ;DOES CURRENT JOB HAVE A REAL HIGH SEGMENT?\r
1049         JRST    SAVLOW          ;NO, RESTORE SGAEXT,SGALEN AND SKIP\r
1050                                 ;RETURN SO LOW SEG WILL BE SAVED\r
1051                                 ; USER HAS NO CHOICE(MAY BE HAD SPY SEG\r
1052         PUSHJ   PDP,SGH         ;SET EXTENSION IN E+1 OF ENTER BLOCK\r
1053         HLRZ    TAC1,JBTADR(ITEM) ;LENGTH-1 OF HIGH SEG\r
1054         ADDI    TAC1,1          ;LENGTH\r
1055         HLLZ    TAC,JOBHRL(PROG) ;RELATIVE FIRST FREE LOC IN HIGH SEG(SET BY LOADER)\r
1056         TLNE    TAC,777777      ;HAS LOADER SET IT (OR IS THIS SEG CREATED\r
1057                                 ; BY CORE OR REMAP BY USER R)?\r
1058         SKIPE   USRDDT          ;YES, IS USER USING DDT?\r
1059         HRLM    TAC1,JOBHRL(PROG) ;YES, SET FIRST FREE TO BE FIRST WORD BEYOND END(REL)\r
1060         HLRZ    TAC,JOBHRL(PROG) ;GET CORRECT FIRST REL FREE LOC IN HIGH SEG\r
1061         MOVNS   TAC             ;SET RH=-NO. OF WORDS TO WRITE, LH=-1\r
1062         PUSHJ   PDP,SG4         ;SETUP E+3\r
1063         ENTER   0,SGANAM        ;ENTER NAME IN DIRECTORY(SHR OR HGH)\r
1064         JRST    SAVERR          ;CAN'T, PRINT ENTER FAILURE\r
1065         MOVE    ITEM,JOB        ;RESTORE JOB NUMBER\r
1066         MOVE    ITEM,JBTSGN(ITEM) ;GET SEGMENT NUMBER FROM JOB NUMBER\r
1067         TLNE    ITEM,SHRSEG     ;IS HIGH SEG SHARABLE?\r
1068         JRST    SAVSHR          ;YES, DO NOT INITIALIZE VESTIGIAL JOB DATA AREA\r
1069                                 ; SINCE IT MUST HAVE BEEN DONE WHEN HIGH FILE CREATED\r
1070                                 ;  AND USER CANNOT MODIFY NOW\r
1071         MOVE    TAC,JBTADR(ITEM) ;NO, INITIALIZE VESTIGIAL JOB DATA AREA IN HIGH SEG\r
1072         SUBI    TAC,1           ;FROM LOW SEG JOB DATA AREA\r
1073         PUSH    TAC,JOBSA(PROG) ;SAVE JOB STARTING ADDRESS (RH)\r
1074                                 ; AND INITIAL FIRST FREE LOC (LH)\r
1075         PUSH    TAC,JOB41(PROG) ;SAVE USER LOC 41(USER UUO HANDLER JSR)\r
1076         PUSH    TAC,JOBCOR(PROG) ;SAVE USER TYPED THIRD (CORE) ARG (RH) AND\r
1077                                 ; HIGHEST DATA LOC LOADED IN LOW SEG (LH)\r
1078 \f       HRR     TAC1,JOBREN(PROG) ;SAVE REENTER COMMAND STARTING ADDRESS\r
1079         HLL     TAC1,JOBHRL(PROG) ;AND FIRST (REL) FREE LOCATION SET BY LOADER\r
1080         PUSH    TAC,TAC1\r
1081         PUSH    TAC,JOBVER(PROG) ;SAVE BOTH HALVES OF PROGRAM VERSION NUMBER\r
1082                                 ; LH IS USED FOR PROGRAMMER NUMBER LAST MODIFYING\r
1083         PUSH    TAC,SGANAM(PROG) ;SAVE NAME OF SEGMENT FOR DDT\r
1084         AOBJN   TAC,.+1         ;SKIP DDT SYMBOL TABLE POINTER\r
1085         PUSH    TAC,[EXP 0]     ;CLEAR 10 (OCTAL) FOR FUTURE\r
1086 SAVSHR: HLLZ    TAC,JOBHRL(PROG) ;GET CORRECT FIRST REL FREE LOC IN HIGH SEG\r
1087         MOVNM   TAC,SGALEN(PROG) ;SET LH=-NO. WORDS TO WRITE, RH=0\r
1088                                 ; SET AGAIN SINCE ENTER CHANGED E+3\r
1089         HRROS   USRHCU          ;SET LH OF HIGEST CHANNEL USED AS A FLAG THAT\r
1090                                 ; A SAVE IS IN PROGRESS FOR HIGH SEG\r
1091         HRROS   JOBHCU(PROG)    ;ALSO SET IN JOB DATA AREA FOR ANYSAV ROUTINE\r
1092                                 ; TO SEE(CALLED FROM ANYACT)\r
1093         HRRZ    TAC,JBTADR(ITEM) ;ABSOLUTE ADDRESS OF HIGH SEG\r
1094         SUBI    TAC,1(PROG)     ;-ABSOLUTE ADDRESS OF LOW SEG-1\r
1095         HRRM    TAC,SGALEN(PROG) ;=REL ADR. OF HIGH SEG-1 AS SEEN FROM EXPANDED LOW SEG\r
1096         HLRZ    TAC1,JBTADR(ITEM) ;LENGTH-1 OF HIGH SEG\r
1097         ADDI    TAC,1(TAC1)     ;+LENGTH OF HIGH SEG=REL ADR OF LAST LOC IN HIGH SEG\r
1098                                 ; AS SEEN FROM LOW SEGMENT\r
1099         HRL     PROG,TAC        ;INCREASE PROTECTION TO INCLUDE ALL OF HIGH SEGMENT\r
1100                                 ; THIS MAY REACH OVER MONITOR AND OTHER USERS\r
1101                                 ; IF HIGH SEG IS BELOW LOW SEG\r
1102         HLRZM   PROG,USRREL     ;ALSO CHANGE PROTECTION USED FOR ADDRESS CHECKING\r
1103         OUTPUT  0,SGALEN        ;WRITE ALL OF ORIGINAL HIGH SEG FROM EXTENDED LOW SEG\r
1104                                 ; JBTADR FOR LOW SEG REMAINS SAME AS DOES\r
1105                                 ; JOBADR,JOBDAT.  THE UUO HANDLER ASSUMES THAT\r
1106                                 ; R AND P ARE ALREADY SETUP PROPERLY FOR UUOS\r
1107                                 ; FROM MONITOR, AND SO DOES NOT SETUP R AND P\r
1108                                 ; FROM JOBADR, CLOCK ROUTINE SAVES ACS IN JOB DATA\r
1109                                 ; AREA USING JOBDAT, SHUFFLING AND SWAPPING COULD\r
1110                                 ; EVEN TAKE PLACE BECAUSE\r
1111                                 ; R AND P WOULD BE DIDLES PROPERLY\r
1112                                 ; FOR NEW POSITION, IO SERVICE ROUTINES\r
1113                                 ; WHICH CAN DO SAVES(DISK,MTA,U) MUST BE SAVE R\r
1114                                 ; AT UUO LEVEL IN DEVICE DATA BLOCK, FOR\r
1115                                 ; USE AT INTERRUPT LEVEL, INSTEAD OF SETTING\r
1116                                 ; R UP FROM JBTADR WHEN INTERRUPT OCCURS.\r
1117                                 ; IN CASE DUMP IO CANNOT GO TO COMPLETION\r
1118                                 ; IN ONE OPERATION(IE JOB MUST BE RESCHEDULED)\r
1119                                 ; SERVICE ROUTINE MUST CALL SAVDDL EACH TIME\r
1120                                 ; TO DIDDLE RELOCATION IN CASE JOB SHUFFLED\r
1121                                 ; OR SWAPPED AFTER PARTIAL IO COMPLETED\r
1122         MOVE    ITEM,JOB        ;RESTORE JOB NUMBER OF CURRENT JOB\r
1123         MOVE    PROG,JBTADR(ITEM) ;RESTORE XWD,PROT,RELOC FOR LOW SEG\r
1124         HRRZS   USRHCU          ;NOW CLEAR SAVE IN PROGRESS FLAG IN\r
1125                                 ; PROTECTED PART OF MONITOR. JOBHCU WILL\r
1126                                 ; BE CLEARED ON NEXT RESCHEDULE\r
1127         PUSHJ   PDP,SGIOCK      ;CHECK FOR TRANSMISSION ERRORS(RETURN IF OK)\r
1128         CLOSE   0,              ;CLOSE OUTPUT(BEFORE LOOKUP FOR DELETE)\r
1129                                 ; SO SHARABLE SEG WILL BE SUPERCEDE BY NEW FILE\r
1130                                 ; IF SAME NAME\r
1131         HRLZ    TAC,SGAHGH(PROG) ;DELETE HGH IF SHR WRITTEN OR VICE VERSA\r
1132         PUSHJ   PDP,DELET       ;DEPENDING IF THIS WAS A SSAVE OR SAVE COM.\r
1133         PUSHJ   PDP,LOWCHK      ;CHANGE EXTENSION FOR LOW FILE TO .LOW\r
1134                                 ; UNLESS USER SUPPLIED HIS OWN ARG\r
1135         JRST    .+2             ;DO NOT NEED LOW FILE WRITTEN\r
1136                                 ; SO DELETE POSSIBLE PREVIOUS VERSION\r
1137                                 ; SO USER WILL NOT BE CONFUSED\r
1138         JRST    CPOPJ1          ;LOW FILE NEEDED, DO NOT BOTHER TO DELETE\r
1139                                 ; GIVE SKIP RETURN TO CALLER\r
1140         SKIPN   TAC,SGALOW(PROG) ;OBTAIN LOW SEGMENT NAME\r
1141         MOVSI   TAC,(SIXBIT /LOW/) ;FILL IN DEFAULT IF NULL\r
1142         JRST    DELET           ;DELETE FILE AND GIVE NO SKIP RETURN TO CALLER\r
1143 \r
1144 \f;ROUTINE TO DIDDLE RELOCATION DURING DUMP MODE SAVE OPERATION OF HIGH SEGMENT\r
1145 ; WHEN IO OPERATION IS DONE IN MORE THAN ONE STEP\r
1146 ; IE WHEN DEVICE GOES INACTIVE IN MIDDLE(SAY BECAUSE CONTIGUOUS DISK SPACE\r
1147 ; EXHAUSTED) AND HIGH AND/OR LOW SEG MAY HAVE BEEN SHUFFLED OR SWAPPED\r
1148 ;CALLED ONLY AT UUO LEVEL\r
1149 ;CALL:  MOVE TAC,[IOWD N,ADR (BEFORE RELOCATION)]\r
1150 ;       MOVE PROG,LOW SEG RELOC\r
1151 ;       PUSHJ PDP,SAVDDL\r
1152 ;       ALWAYS RETRUN - RH OF AC TAC ADJUSTED FOR NEW POSITION OF HIGH SEG\r
1153 ;       WITH RESPECT TO LOW SEG.  NO OTHER ACS CHANGED, LH AC TAC SAME\r
1154 ;CALLED FOR DISK SERVICE\r
1155 \r
1156         INTERN  SAVDDL\r
1157         EXTERN  JOB,USRHCU,JBTSGN,IPOPJ,JBTADR,SGALEN,USRREL\r
1158 \r
1159 SAVDDL: PUSH    PDP,ITEM        ;SAVE CONTENTS OF J\r
1160         MOVE    ITEM,JOB        ;SETUP CURRENT JOB NUMBER\r
1161         SKIPGE  USRHCU          ;IS A SAVE OR GET IN PROGRESS FOR CURRENT USER?\r
1162         SKIPG   ITEM,JBTSGN(ITEM) ;YES, DOES CURRENT JOB HAVE A HIGH SEG?\r
1163         JRST    IPOPJ           ;NO, NO DIDDLING REQUIRED\r
1164         PUSH    PDP,TAC         ;SAVE TAC\r
1165         HRRZ    TAC,SGALEN(PROG) ;ORIGIN-1 OF HIGH SEG WITH RESPECT TO LOW SEG\r
1166                                 ; (STORED BY SAVGET AS COMMAND LIST)\r
1167         CAMGE   TAC,USRREL      ;IS COMMAND LIST ABOVE LOW SEG?\r
1168         JRST    SAVDLW          ;NO, MUST BE LOW SEG SAVE IN PROGRESS\r
1169         HRRZ    TAC,JBTADR(ITEM) ;YES, ABSOLUTE ADDRESS OF HIGH SEG\r
1170         SUBI    TAC,1(PROG)     ; MINUS ABSOLUTE ADDRESS OF LOW SEG MINUS 1\r
1171                                 ; EQUALS NEW HIGH SEG ORIGIN-1 W.R.T. LOW SEG\r
1172         SUB     TAC,SGALEN(PROG) ;MINUS OLD HIGH SEG ORIGIN-1 WITH RESPECT\r
1173                                 ; TO OLD LOW SEG YIELDS CORRECTION FACTOR\r
1174         ADD     TAC,(PDP)       ;ADD CORRECTION FACTOR TO SAVDDL ARG\r
1175         HRRM    TAC,(PDP)       ;STORE ONLY RH (AVOID RH TO LH CARRY)\r
1176 SAVDLW: POP     PDP,TAC         ;RESTORE MODIFIED SAVDDL ARGUMENT TO TAC\r
1177         JRST    IPOPJ           ;THEN RESTORE J AND RETURN\r
1178 \f;UUO TO GET JUST HIGH SEGMENT, USER CHANNELS 1 THRU 17 UNTOUCHED\r
1179 ;CALL:  MOVEI AC,D      ;WHERE D IS LOCATION OF 5 ARG(SEE RUN UUO)\r
1180 ;                       ;THE 6TH(CORE ARG IS IGNORED) BUT MUST BE IN LEGAL MEMORY\r
1181 ;       CALL AC,[SIXBIT /GETSEG/] OR CALLI AC,40\r
1182 ;       ERROR RETURN UNLESS LH=HALT\r
1183 ;       OK RETURN\r
1184 \r
1185         INTERN  UGETHI\r
1186         EXTERN  GETARG,UGTERR,TWOREG,NOFILE,SGREL,TPOPJ1\r
1187 \r
1188 UGETHI: SKIPN   TWOREG          ;IS HARDWARE 2 RELOC REG\r
1189         JRST    UGTERR          ;NO, ERROR RETURN TO USER UNLESS HALT IN LH\r
1190         PUSHJ   PDP,GETARG      ;YES,GET 6 ARGS FROM USER\r
1191         PUSHJ   PDP,GETSEG      ;TRY TO SHARE HIGH SEG OR READ IN HIGH FILE\r
1192         JRST    NOFILE          ;NO FILE FOUND, PRINT MESSAGE OR ERROR RETURN\r
1193         PUSHJ   PDP,CHKMED      ;CHECK TO SEE IF THIS IS SHARABLE SEG(EXT=SHR)\r
1194                                 ; IF YES, SET MEDDLE BIT FOR THIS USER\r
1195                                 ; SO HE CANNOT TURN OFF UWP OR CHANGE CORE ASSIGNMENT\r
1196         PUSHJ   PDP,SGREL       ;RELEASE JUST CHANNEL 0 IF WAS INIT\r
1197         JRST    TPOPJ1          ;OK(SKIP RETURN TO USER AFTER REMOVING USER ARG+AC\r
1198                                 ;FROM PD LIST WHICH GETARG PUT ON\r
1199 \f;ROUTINE TO ADD CURRENT USER TO A SHARED SEGMENT IF IT EXISTS OR\r
1200 ;TRY TO INITIALIZE A HIGH SEGMENT FROM A FILE AND MAKE IT SHARABLE(-SHR) OR NOT(.HGH)\r
1201 ;DEPENDING ON THE EXTENSION OF THE FILE\r
1202 ;CALL:  MOVE ITEM, CURRENT JOB NUMBER\r
1203 ;       ACS DEVDAT,PROG,PROG,PDP,SETUP\r
1204 ;IFN FTDISK,<MOVE TAC1,DEVMOD(F)>\r
1205 ;       PUSHJ PDP,GETHGH\r
1206 ;       RETURN1-HIGH SEG NOW IN ADDRESSING SPACE AND NO LOW FILE NEED BE GOTTEN\r
1207 ;       RETURN2 - HIGH SEG NOW IN ADDRESSING SPACE, AND LOW FILE NEEDED\r
1208 ;               OR NO HIGH FILES FOUND, TRY LOW FILE\r
1209 ;       ITEM RESTORED TO CURRENT JOB NUMBER\r
1210 ;       USER MODE FLAG CLEARED IN UUO PD LIST IR RUN UUO FROM HIGH SEG\r
1211 ;       WHICH IS NO LONGER SAME(SO NO ATTEMPT TO ERROR RETURN IF ERROR)\r
1212 \r
1213         INTERN  GETHGH\r
1214         EXTERN  TWOREG,JBTSGN,UERROR,JBTADR,JBTSTS,WSCHED,JBTNAM\r
1215         EXTERN  JOB,JOBPOP,JOBREN,JOBHRL,JOBVER,JOBCOR,JOB41,JOBSA,JOBDA,SGERRA\r
1216         EXTERN  SG3,CPOPJ2,JOBSV,JOBDA,JOBDDT,USRDDT\r
1217 IFN FTDISK,<EXTERN PRJPRG>\r
1218 \r
1219 GETHGH: SKIPE   TWOREG          ;IS THIS A 2 RELOC REG. MACHINE?\r
1220         PUSHJ   PDP,GETSEG      ;YES, TRY TO ATTACH TO HIGH SEG OR READ\r
1221                                 ; IN HIGH FILE IF IT EXISTS, HIGH SEG OK?\r
1222         JRST    NOHIGH          ;NO, TRY TO READ IN LOW FILE OLD HIGH\r
1223                                 ; SEG STILL IN ADR SPACE(AF ANY)\r
1224         MOVSI   TAC,JOBSV(PROG) ;CLEAR JOB DATA AREA\r
1225         HRRI    TAC,JOBSV+1(PROG) ;WHERE IO WOULD BE DONE INTO\r
1226         SETZM   JOBSV(PROG)     ;IF A LOW FILE EXISTS\r
1227         BLT     TAC,JOBDA-1(PROG) ;DO THIS IN CASE THERE IS NO LOW FILE\r
1228         SETZM   JOBDDT(PROG)    ;ALSO CLEAR DDT STARTING ADDRESS\r
1229         SETZM   USRDDT          ;IN MONITOR PROTECTED AREA AS WELL AS JOBDAT\r
1230                                 ; IN CASE RETURN TO USER WITHOUT RESCHEDULING\r
1231         PUSHJ   PDP,ADJCOR      ;COMPUTE AMOUNT OF CORE FOR BOTH LO & HI SEGS\r
1232                                 ; FROM USER'S CORE ARG.(IF ANY)\r
1233                                 ; RETURNS WITH HI SEG # IN TAC\r
1234         HRRO    TAC,JBTADR(TAC) ;ABSOLUTE ADDRESS OF HIGH SEG(LH=-1 FOR\r
1235                                 ; POPS SO NO PDL UNDERFLOW)\r
1236         ADDI    TAC,JOBPOP      ;ADD POP OFFSET\r
1237         POP     TAC,JOBVER(PROG) ;RESTORE BOTH HALVES OF PROG. VERSION NO.\r
1238         POP     TAC,TAC1        ;RESTORE\r
1239         HLLM    TAC1,JOBHRL(PROG) ;RELATIVE FIRST FREE LOC IN HIGH SEG\r
1240         HRRZM   TAC1,JOBREN(PROG) ;PROGRAM REENTER ADR, LH=0\r
1241                                 ; SAVED FOR FUTURE USE\r
1242         POP     TAC,JOBCOR(PROG) ;HIGHEST DATA LOC IN LOW SEG(LH)\r
1243                                 ; AMOUNT OF CORE IN RH TO BE ASSIGNED(#J-1)\r
1244         POP     TAC,JOB41(PROG) ;USER UUO HANDLER JSR\r
1245         POP     TAC,JOBSA(PROG) ;FIRST FREE LOC IN LOW SEG(LH), START COMMAND\r
1246                                 ; STARTING ADDRESS(RH)\r
1247 \f                               ;HERE FROM SAVE TOO\r
1248 LOWCHK: HRRZ    TAC,JOBPD1(PROG) ;IS CALL FROM HIGH SEGMENT?\r
1249         CAMLE   TAC,USRREL      ;COMPARE PC WITH LOW SEG PROTECTION\r
1250         HRRZS   JOBPD1(PROG)    ;YES,(OR EXEC) SO CLEAR USRMOD PC FLAG IN LH\r
1251                                 ; SO ERROR MESSAGES WILL NOT ATTEMPT TO ERROR\r
1252                                 ; RETURN TO HIGH SEG WHICH IS NO LONGER\r
1253                                 ; THE ORIGINAL ONE\r
1254         SKIPE   TAC1,SGALOW(PROG) ;DID USER SPECIFY AN EXTENSION?\r
1255         JRST    SETLOW          ;YES, ALWAYS LOAD LOW FILE (HE MAY WANT ONE SEG\r
1256                                 ; VERSION WITH EXTENSION .SAV FOR EXAMPLE)\r
1257         HLRZ    TAC,JOBCOR(PROG) ;DOES THIS JOB NEED A LOW SEG INPUT OR OUTPUT\r
1258         CAIGE   TAC,JOBDA       ;I.E. IT THERE ANY DATA LOADED ABOVE JOB DATA AREA\r
1259         JRST    SG3             ;NO, RETURN AND DO NOT READ IN LOW FILE\r
1260         MOVSI   TAC1,(SIXBIT /LOW/) ;YES, READ OR WRITE LOW FILE WITH EXTENSION .LOW\r
1261         JRST    SETLOW\r
1262 \r
1263 NOHIGH: HRRZ    TAC,JOBPD1(PROG) ;(HERE ON GET COM. OR RUN UUO - NO NEW HIGH SEG\r
1264                                 ; BUT NOT ON GETSEG UUO)\r
1265         CAMLE   TAC,USRREL      ;COMPARE PC WITH LOW SEG PROT.\r
1266         HRRZS   JOBPD1(PROG)    ;YES - CLEAR USRMOD BIT SO ERRORS WON'T\r
1267                                 ;RETURN TO HI SEG WHICH IS NO LONGER\r
1268                                 ;THE ORIGINAL ONE\r
1269         PUSHJ   PDP,KILHSH      ;REMOVE PREVIOUS HI SEG (IF ANY)\r
1270                                 ; AND RESET HARDWARE RELOC\r
1271 SAVLOW: MOVE    TAC1,SGALOW(PROG) ;(HERE ON SAVE)\r
1272                                 ; LOW FILE EXTENSION USER TYPED OR 0 IF HE DIDN'T\r
1273 SETLOW: MOVEM   TAC1,SGAEXT(PROG) ;SET IN E+1 FOR LOOKUP\r
1274         AOS     (PDP)           ;SET FOR NEED LOW READ OR WRITE RETURN\r
1275                                 ; (HERE FROM SAVE IF NO HIGH SEG)\r
1276         JUMPL   DEVDAT,SG3      ;HAS DEVICE ALREADY BEEN INITED?\r
1277                                 ; INITB=1(BIT 0) IF YES\r
1278 SGOPEN: OPEN    0,SGAMOD        ;NO, INIT DEVICE IN SAVMOD\r
1279         JRST    SGERRA          ;ERROR, NOT AVAILABLE\r
1280         JRST    SG3             ;OK RESTORE SGALEN TO IOWD IF DTA,PP IF DSK AND RET\r
1281 \r
1282 \f;ROUTINE TO CREATE A NEW HIGH SEG AND READ IN HIGH FILE OR\r
1283 ;PLACE THE DESIRED SHARABLE HIGH SEGMENT IN CURRENT USER'S LOGICAL ADDRESSING SPACE\r
1284 ;CALL:  MOVE PROG,LOW SEG RELOC\r
1285 ;       MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK\r
1286 ;       MOVE ITEM,JOB NUMBER\r
1287 ;       PUSHJ PDP,GETSEG\r
1288 ;       RETURN 1 - HIGH SEG OR FILE NOT FOUND\r
1289 ;       RETURN 2 - HIGH SEG FOUND AND IN LOG ADR. SPACE(IN FACT ALSO IN CORE)\r
1290 \r
1291         EXTERN  NROOM,DEVPHY,PJOBN,JOB,SGADAT,FNCEXC,JOBPD1,SGADEV\r
1292 \r
1293 GETSEG: PUSHJ   PDP,SGH         ;SET E+3 TO 0 IF DTA,PPN IF DSK\r
1294         MOVE    TAC1,DEVMOD(DEVDAT);IS THIS DEVICE A DECTAPE?\r
1295         TLNN    TAC1,DVDTA\r
1296         JRST    GETH0           ;NO,GO DO OPEN AND LOOKUP SINCE FAST ON DSK,MTA\r
1297         MOVEI   TAC,0           ;YES, SET PPN TO 0\r
1298         MOVE    TAC1,SGANAM(PROG) ;USER SUPPLIED FILE NAME\r
1299         MOVE    JBUF,DEVNAM(DEVDAT) ;DECTAPE PHYSICAL NAME\r
1300         PUSHJ   PDP,SRCSEG      ;SEARCH KNOWN SEGMENT TABLE\r
1301           JRST GETH0            ;NOT FOUND, GO DO OPEN AND LOOKUP IN CASE ON TAPE\r
1302         JRST    GETH1           ;FOUND, CHECK ACCESS PRIVILEGES\r
1303 \r
1304 GETH0:  OPEN    0,SGAMOD        ;NO, TRY TO ASSIGN DEVICE\r
1305           JRST SGERRA           ;CAN'T, GO PRINT ERROR OR RETURN TO USER.\r
1306         MOVE    TAC,DEVMOD(DEVDAT) ;IS THIS MAG TAPE? (MAG TAPE CAN NEVER BE SHARABLE)\r
1307         TLNN    TAC,DVMTA       ;(MAG TAPE LOOKUPS ALWAYS SUCCEED)\r
1308         LOOKUP  0,SGANAM        ;NO, LOOKUP ON HIGH FILE WITH EXT .SHR\r
1309           JRST TRYHGH           ;NOT FOUND, TRY EXTENSION OF .HGH\r
1310         PUSHJ   PDP,FNDSEG      ;DOES SEGMENT ALREADY EXIST?\r
1311           JRST GETH2            ;NO, TRY TO READ IN HIGH FILE\r
1312 GETH1:  MOVEI   AC1,FNCEXC      ;YES, CHECK EXECUTE ONLY ACCESS PRIV.\r
1313         MOVE    AC2,JOB         ;FOR CURRENT JOB\r
1314         PUSHJ   PDP,CHKHSA      ;WITH FILE WHICH INITIALIZED HIGH SEG\r
1315         POPJ    PDP,            ;CAN'T READ-DTA,MTA NOT AVAIL OR DSK ACCESS RIGHTS\r
1316                                 ; NOT PROPER, GIVE HIGH SEG RETURN TO GETSEG\r
1317         PUSH    PDP,ITEM        ;SAVE HIGH SEG NUMBER\r
1318         SKIPN   USRJDA##+0      ;HAS DEVICE BEEN OPENED?\r
1319                                 ; (NOT IF DTA, DO NOT CLOBBER F)\r
1320         JRST    SHARE           ;GO SHARE HIGH SGMENT\r
1321         CLOSE   0,0             ;DO A CLOSE WHICH WILL RETAIN CORE BLOCKS\r
1322                                 ; EVEN THOUGH NO IO.\r
1323         PUSHJ   PDP,FNDSEG      ;AFTER CLOSE, HIGH SEG STILL EXIST ?\r
1324           JRST  GETH2A          ;NO, (RARE) CAN HAPPEN ONLY IF FILE GETS\r
1325                                 ; SUPERSEDED DURING CLOSE BY ANOTHER JOB\r
1326                                 ; OR DORMANT SEG DELETED TO CLEAN UP SWAP SPACE\r
1327         JRST    SHARE           ;CAN READ, GO SHARE HIGH SEGMENT\r
1328 \fGETH2A:        POP     PDP,ITEM        ;REMOVE HIGH SEG.NO.\r
1329         PUSHJ   PDP,SGH2        ;RESET E+3(PPN) FOR LOOKUP\r
1330         LOOKUP  0,SGANAM        ;LOOKUP FILE AGAIN\r
1331           JRST TRYHGH           ;CAN'T FIND IT THIS TIME (RARE) GO TRY .HGH\r
1332 \r
1333 GETH2:  PUSHJ   PDP,INPSEG      ;FOUND, GO READ IN HIGH FILE\r
1334           JSP JBUF,UERROR       ;SHOULD NEVER HAPPEN (RA1 FROM MTA ONLY)\r
1335         PUSHJ   PDP,FNDSEG      ;SEE IF FILE NAME SNUCK INTO SEGMENT TABLE\r
1336                                 ; FOR OTHER USER WHILE IO GOING ON(UNLIKELY)\r
1337           JRST STONAM           ;USUALLY NOT FOUND\r
1338         PUSH    PDP,ITEM        ;FOUND, SAVE SHARABLE+NAMED HIGH SEG NO. TO BE\r
1339                                 ; SHARED BY THIS USER\r
1340 SHARE:  PUSHJ   PDP,KILHGC      ;REMOVE PRESENT HIGH SEG FROM LOGICAL ADR.\r
1341                                 ; SPACE(DELETE CORE SPACE IF JUST ASSIGNED BY\r
1342                                 ; INPSEG SINCE NOT NAMED YET)\r
1343         POP     PDP,ITEM        ;CONNECT THIS USER TO THIS SHARABLE AND NAMED HIGH SEG\r
1344 \fIFN FTSWAP,<\r
1345         EXTERN  SEGSIZ,VIRTAL   ;TAC1=SIZE OF HIGH SEG (WHTHER IN CORE OR DSK)\r
1346         EXTERN  CORMAX\r
1347         PUSH    PDP,ITEM        ;SAVE NEW HIGH SEG. NUMBER\r
1348         MOVE    ITEM,JOB        ;GET LOW SEGMENT NUMBER\r
1349         PUSHJ   PDP,SEGSIZ      ;CALCULATE SIZE OF LOW SEGMENT\r
1350         POP     PDP,ITEM        ;RESTORE HIGH SEG. NUMBER\r
1351         MOVE    TAC,TAC1        ;SAVE LOW SEGMENT SIZE\r
1352         PUSHJ   PDP,SEGSIZ      ;YES, TAC1=SIZE IN J OF HIGH SEGMENT\r
1353         ADDI    TAC,(TAC1)      ;SIZE OF JOB (LOW + HIGH SEGS)\r
1354                                 ;IN J\r
1355         LSH     TAC,12          ;SIZE IN WORDS\r
1356         SKIPL   JBTSTS(ITEM)    ;IS THIS HIGH SEG DORMANT (SNA=0)?\r
1357         CAMG    TAC1,VIRTAL     ;YES, WILL ALLOWING THIS SEGMENT TO BECOME ACTIVE\r
1358                                 ; EXCEED VIRTUAL CORE ?\r
1359         CAMLE   TAC,CORMAX      ;NO, WILL ALLOWING THIS SEGMENT IN ADDRESSING SPACE\r
1360                                 ;EXCEED LARGEST LEGAL JOB SIZE?\r
1361         SOJA    TAC,SHRNRM      ;YES, DO NOT LET HIM SHARE DORMANT COPY, EVEN\r
1362                                 ; THOUGH IT MAY BE ON DISK, BECAUSE THIS\r
1363                                 ; WOULD OVER COMMIT THE SYSTEM AND MEAN\r
1364                                 ; THAT NOT ABLE TO SWAP OUT BIGGEST JOB\r
1365         MOVNS   TAC1            ;NO,-NO. OF J IN DORMANT SEG\r
1366         SKIPL   JBTSTS(ITEM)    ;IS THIS HIGH SEG ALREADY ACTIVE (SNA-1)?\r
1367         ADDM    TAC1,VIRTAL     ;NO, DECREASE COUNT OF VIRTUAL CORE AVAILABLE\r
1368 >\r
1369         PUSHJ   PDP,CHKIDL      ;CHECK TO SEE IF SEG IS IDLE IN CORE\r
1370                                 ; IE IN-CORE COUNT 0 BUT IN SOME USER'S\r
1371                                 ; ADR. SPACE WHO IS SWAPPED OUT OR DORMANT IN CORE\r
1372                                 ; (I.E., IN NO ONE'S LOGICAL ADR. SPACE)\r
1373 SHARE1:                         ;HERE FROM REMAP UUO\r
1374 SHARE2: MOVE    TAC,JOB         ;(HERE FROM CORE UUO)CURRENT JOB NUMBER\r
1375 IFN FTHALT,<\r
1376         PUSHJ   PDP,COMIT       ;COMPARE J TO JBTSGN(TAC), HALT IF DIFF. SEGS\r
1377 >\r
1378         MOVEM   ITEM,JBTSGN(TAC) ;MAKE SURE THIS HIGH SEG IF MARKED AS BEING\r
1379                                 ; IN CURRENT USER'S LOGICAL ADR. SPACE\r
1380         MOVSI   TAC1,SNA        ;MAKE SURE THIS HIGH SEG IS FLAGGED AS IN USE\r
1381                                 ; IE SEG IN SOME USER'S LOG. ADR. SPACE\r
1382         IORB    TAC1,JBTSTS(ITEM) ;MAY HAVE BEEN JUST ASSIGNED OR DORMANT\r
1383 IFN FTSWAP,<\r
1384         MOVE    JBUF,JBTSTS(TAC) ;JOB STATUS WORD\r
1385         TLNN    JBUF,JXPN       ;JOB WAITING TO EXPAND LOW OR HIGH SEG?\r
1386         TLNE    TAC1,JXPN       ;NO, IS HIGH SEG BEING EXPANDED?\r
1387         JRST    SETRL0          ;YES, WAIT TILL HIGH SEG IN CORE TOO\r
1388         TLNN    TAC1,SWP        ;NO, IS HIGH SEG SWAPPED OUT OR ON WAY IN OR OUT?\r
1389         JRST    SHARE3          ;NO, MUST BE IN CORE\r
1390         MOVSI   JBUF,SWP        ;YES, SET SWP BIT SO JOB CANNOT BE RUN\r
1391         IORM    JBUF,JBTSTS(TAC) ; UNTIL HIGH SEG IS SWAPPED IN\r
1392         HRROS   JBTSWP(TAC)     ;CLEAR JOB IS IN CORE PROTECT TIME (SINCE NOT\r
1393                                 ; DECREMENTED IF SWAP IS ON\r
1394         JRST    SETRL2          ;GO CALL SCHEDULER\r
1395 >\r
1396 SHARE3: PUSHJ   PDP,INCCNT      ;NO, INCREMENT HIGH SEG IN-CORE COUNT FOR THIS\r
1397                                 ; JOB(TAC) IF NOT ALREADY INCREMENTED, RETURN\r
1398                                 ; WITH J = HIGH SEG NO.\r
1399 IFN FTHALT,<\r
1400         PUSHJ   PDP,CHKTAL      ;CHECK CORTAL WIT CORTAB, HALT IF DIFF.\r
1401 >\r
1402         JRST    SETRL1          ;SET HARD. AND SOFT. RELOC. AND SKIP RETURN\r
1403 \r
1404 ;HERE WHEN NOT ENOUGH ROOM TO ALLOW USER TO USE SEG\r
1405 SHRNRM: HRRZ    TAC1,JOBPD1(PROG)       ;GET RETURN PC IN CASE THIS IS RUN UUO\r
1406         CAMLE   TAC1,USRREL     ;IS IT IN THE HIGH SEG WHICH IS NOW GONE ?\r
1407         HRRZS   JOBPD1(PROG)    ;YES, TURN OFF USER MODE FLAG, SO ERROR\r
1408                                 ; WILL NOT LOOK FOR HALT AFTER UUO\r
1409         PUSH    PDP,TAC         ;SAVE NO. WORDS-1\r
1410         PUSHJ   PDP,SETREL      ;SET HARDWARE RELOC INFO\r
1411         JRST    NROOM           ;GO PRINT MONITOR MESSAGE AND STOP JOB\r
1412                                 ; OR ERROR RETURN TO LOW SEGMENT\r
1413                                 ; (UNLESS UUO HAS A HALT FOLLOWING IT)\r
1414 \fSTONAM:        MOVE    DSER,JOB        ;CURRENT JOB NUMBER\r
1415         MOVSI   ITEM,SHRSEG     ;FLAG THIS USER AS USING A SHARABLE HIGH SEG\r
1416         IORB    ITEM,JBTSGN(DSER) ;AND SETUP HIGH SEG NUMBER\r
1417 IFN FTDISK,<MOVEM TAC,PRJPRG(ITEM) ;STORE DIRECTORY(OR PHY DEV NAM)>\r
1418         MOVEM   TAC1,JBTNAM(ITEM) ;STORE HIGH SEG FILENAME\r
1419         MOVEM   JBUF,JBTDIR(ITEM) ;STORE DEVICE NAME(STR) FOR HIGH SEG\r
1420         MOVSI   TAC,SHRSEG      ;ALSO FLAG HIGH SEG ASSIGNED\r
1421         IORM    TAC,JBTSTS(ITEM) ;BY INPSEG AS SHARABLE FOR OTHER USERS\r
1422 IFN FTDISK,<\r
1423         LDB     TAC,[POINT 9,SGADAT(PROG),8] ;GET ACCESS RIGHTS FROM LOOKUP E+2\r
1424         DPB     TAC,[POINT 9,JBTSTS(ITEM),HSAPOS] ;AND STORE IN MONITOR WITH HIGH\r
1425                                 ; SEG STATUS\r
1426 >\r
1427 IFN FTSWAP,<\r
1428         EXTERN  XPANDH,WSCHED\r
1429 SETRL0: MOVE    ITEM,JOB        ;CURRENT JOB NUMBER TO BE EXPANDED\r
1430                                 ; (NOT HIGH SEG)\r
1431         PUSHJ   PDP,XPANDH      ;FLAG THIS USER AS TRYING TO EXPAND(SWP=1)\r
1432                                 ; SO THAT THIS NEW HIGH SEG WILL BE SWAPPED IN\r
1433 SETRL2: PUSHJ   PDP,WSCHED      ;WAIT TILL IT IS SWAPPED IN(CALL SCHEDULER)\r
1434 >\r
1435 SETRL1: AOS     (PDP)           ;SKIP RETURN(GETSEG,UCORHI,UREMAP)\r
1436         JRST    SETREL          ;SET HARDWARE AND SOFTWARE RELOC INFO\r
1437                                 ; FOR CURENT JOB AND RESTORE R AND J\r
1438 \r
1439 ;ROUTINE TO ADJUST USER'S CORE ARG. IN GET,R,RUN OR SAVE COMMANDS SO THAT\r
1440 ; THE ARG. SUPPLIED IS THE TOTAL OF BOTH THE LO & HI SEGS. IF THERE IS NO\r
1441 ; HI SEG THEN ARG. IS THE LO SEG SIZE AS IN NON-REENTRANT SYSTEMS.\r
1442 ; IF THERE ARE BOTH LO & HI SEGS AND THE ARG. IS LESS THAN THE HI SEG + 1K\r
1443 ; MANDATORY LO SEG SIZE THEN THE CORE ALLOCATION IS UNCHANGED.\r
1444 \r
1445 ;CALL   MOVE PROG,ADR. OF JOB DATA AREA\r
1446 ;       MOVE ITEM,JOB NO.\r
1447 ;       PUSHJ PDP,ADJCOR\r
1448 ;       ALWAYS RETURN WITH TAC=HI SEG #,TAC1 & U DESTROYED\r
1449 \r
1450 INTERN ADJCOR\r
1451 EXTERN SGANEW\r
1452 \r
1453 ADJCOR: SKIPN   TAC,JBTSGN(ITEM) ;IS THERE A HI SEG ?\r
1454         POPJ    PDP,            ;EVIDENTLY NOT\r
1455         HLRZ    TAC1,JBTADR(TAC) ;GET ITS SIZE\r
1456         SKIPE   JBUF,SGANEW(PROG) ;WAS AN ARG. TYPED OF 0 OR NOT AT ALL ?\r
1457         SUBI    JBUF,1(TAC1)    ;NO - COMPUTE LO SEG SIZE\r
1458         SKIPLE  JBUF            ;MUST BE 1K OR GREATER!\r
1459         MOVEM   JBUF,SGANEW(PROG) ;STORE IT\r
1460         POPJ    PDP,            ;RETURN\r
1461 \f                               ; TO LOW SEG RELOC AND JOB NUMBER\r
1462 ;TRY TO READ IN NON-SHARABLE FILE WITH EXTENSION .HGH\r
1463 \r
1464 TRYHGH: MOVE    TAC,DEVMOD(DEVDAT) ;LOOKUP FAILURE, SEE IF OTHER THAN NOT FOUND\r
1465         TLNN    TAC,DVDSK       ;WAS LOOKUP ON DISK?\r
1466         JRST    TRYHG2          ;NO, MUST BE A NOT FOUND\r
1467         HRRZ    TAC,SGAEXT(PROG) ;PICK UP POSSIBLE ERROR CODE\r
1468         JUMPE   TAC,TRYHG2      ;JUMP IF SIMPLE "NOT FOUND"\r
1469 TRYHG3: POP     PDP,TAC         ;REPORTABLE ERROR\r
1470         POP     PDP,TAC         ;GET BACK TO PROPER PD LEVEL\r
1471         JRST    NOFILE          ;REPORT ERROR\r
1472 \r
1473 TRYHG1: MOVE    TAC,DEVMOD(DEVDAT) ;FAILURE FOR EXTENSTION .HGH\r
1474         TLNN    TAC,DVDSK       ;SAME AS BEFORE?\r
1475         POPJ    PDP,            ;JUST NOT FOUND!\r
1476         HRRZ    TAC,SGAEXT(PROG) ;ERROR CODE\r
1477         JUMPN   TAC,TRYHG3      ;JUMP IF REPORTABLE ERROR\r
1478         POPJ    PDP,            ;FILE NOT FOUND!\r
1479 TRYHG2: MOVSI   TAC,(SIXBIT /HGH/) ;TRY LOOKUP WITH EXTENSION .HGH\r
1480         PUSHJ   PDP,SGH1        ;SET EXT AND E+3 OF LOOKUP BLOCK\r
1481                                 ; FOR DTA OR DSK\r
1482         LOOKUP  0,SGANAM        ;LOOKUP WITH EXT .HGH\r
1483         JRST    TRYHG1          ;NOT FOUND, NO HGIH SEG RETURN FROM GETSEG\r
1484                                 ; FALL INTO INPSEG\r
1485 ;ROUTINE TO READ IN A HIGH FILE INTO TOP OF LOW SEG AND REMAP\r
1486 ;LOOKUP MUST HAVE BEEN ALREADY BEEN DONE\r
1487 ;CALL:  MOVE PROG,XWD PROTECTION, RELOCATION FOR LOW SET\r
1488 ;       PUSHJ PDP,INPSEG\r
1489 ;       RETURN1 - NO HIGH FILE,\r
1490 ;       RETURN2 - HIGH FILE READ IN\r
1491 ;       C(ITEM)=JOB NUMBER\r
1492 ;CALLED FROM TRYHGH AND GETH1\r
1493 \r
1494         EXTERN  USRREL,GETERR,GETCOR,SGIOCK,JOBPD1,UERROR\r
1495 \r
1496 INPSEG: MOVE    TAC,USRREL      ;HIGHEST REL(USER) ADR IN LOW SEG FOR CURRENT USER\r
1497         TRO     TAC,1777        ;MAKE EVEN 1K-1(SHOULD BE 140) SO CAN USE REMAP UUO\r
1498                                 ; OR USER'S LOW SEG IF RUN OR GETSEG UUO\r
1499         HRRM    TAC,SGALEN(PROG) ;STORE ADR-1 OF IOWD FOR READING IN\r
1500                                 ; HIGH FILE JUST ABOVE END OF CURRENT LOW SEG\r
1501         MOVE    DSER,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\r
1502         TLNE    DSER,DVMTA      ;MTA?\r
1503         JRST    INPMAG          ;YES, GO DO SOME SPECIAL STUFF\r
1504         HLRE    TAC1,SGALEN(PROG) ;-FILE LENGTH FROM DIRECTORY LOOKUP\r
1505         JUMPGE  TAC1,GETERR     ;MUST BE NEGATIVE(128K MAX SIZE FOR HIGH FILE)\r
1506 INPSE2: SUB     TAC,TAC1        ;FIRST ADR-1 PLUS(-MINUS) LENGTH YIELDS:\r
1507                                 ; LAST USER LOC TO BE READ INTO\r
1508         PUSHJ   PDP,GETCOR      ;ASSIGN ENOUGH CORE FOR LAST WORD OF HIGH FILE\r
1509                                 ; RETURN ONLY IF OK\r
1510         INPUT   0,SGALEN        ;READIN HIGH FILE\r
1511         PUSHJ   PDP,SGIOCK      ;ANY ERRORS?\r
1512         MOVE    DSER,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\r
1513         TLNE    DSER,DVMTA      ;MTA?\r
1514         JRST    INPMG2          ;YES, DO STUFF WHICH IS DONE ON LOOKUP FOR \r
1515                                 ;DIRECTORY DEVICES\r
1516 INPSE3: HRRZ    TAC,SGALEN(PROG) ;GET HIGHEST USER ADR IN ORIGINAL LOW SEG\r
1517         PUSHJ   PDP,UREMAP      ;DO REMAP UUO\r
1518         JSP     JBUF,UERROR     ;ARGS NOT RIGHT, SHOULD NEVER HAPPEN\r
1519         JRST    CPOPJ1          ;RETURN, CALLI UUO SETS JOB NO IN J\r
1520         EXTERN  MTSIZ,JOBHRN\r
1521 INPMAG: MOVNI   TAC1,MTSIZ      ;LENGTH OF A MAGTAPE RECORD\r
1522         HRLM    TAC1,SGALEN(PROG) ;SET TO READ 1ST RECORD OF FILE\r
1523         JRST    INPSE2          ;GO READ IT\r
1524 \r
1525 INPMG2: TRNE    IOS,IODEND      ;EOF?\r
1526         POPJ    PDP,            ;YES, THER IS NO HIGH SEGMENT\r
1527         MOVE    TAC,SGALEN(PROG) ;NO, THERE IS A HIGH SEGMENT\r
1528         PUSH    PDP,TAC         ;SAVE ORIGINAL IOWD\r
1529         ADDI    TAC,1(PROG)     ;LOC OF 1ST DATA WORD OF THE RECORD\r
1530         HLRZ    TAC,JOBHRN(TAC) ;LENGTH OF HIGH SEG\r
1531         JUMPE   TAC,INPMG4      ;JUMP IF NULL HIGH SEGMENT\r
1532         CAIG    TAC,MTSIZ\r
1533         JRST    INPMG3          ;WHOLE FILE WAS 1 RECORD\r
1534         MOVNM   TAC,TAC1        ;-WORD COUNT\r
1535         HRL     TAC1,(PDP)      ;ADDRESS OF START OF 1ST RECORD\r
1536         ADD     TAC1,[XWD MTSIZ,MTSIZ]  ;INCREMENT OVER 1ST RECORD\r
1537         MOVSM   TAC1,SGALEN(PROG)       ;NEW IOWD\r
1538         HRRZ    TAC1,0(PDP)             ;GET ADDRESS OF FIRST RECORD OF HIGH SEG\r
1539         ADD     TAC,TAC1                ;HIGHEST ADDRESS NEEDED\r
1540         PUSHJ   PDP,GETCOR      ;GET THE CORE\r
1541         INPUT   SGALEN          ;READ THE REST OF THE FILE\r
1542         PUSHJ   PDP,SGIOCK      ;ANY ERRORS?\r
1543 INPMG3: STATO   IOTEND+IODEND   ;MAGTAPE AT END OF TAPE OR END OF FILE?\r
1544         MTAPE   16              ;NO, SKIP OVER THE EOF\r
1545         SETSTS  DR              ;RESET THE EOF BIT\r
1546         POP     PDP,SGALEN(PROG) ;RESTORE THE ORIGINAL IOWD\r
1547         JRST    INPSE3          ;AND CONTINUE\r
1548 \r
1549 INPMG4: POP     PDP,TAC         ;RESTORE ORIGINAL IOWD\r
1550         MTAPE   16              ;SKIP TO EOF\r
1551         POPJ    PDP,            ;RETURN INDICATES THERE IS NO HIGH SEGMENT\r
1552 \f;ROUTINE TO CHECK IF HIGH SEG ABOUT TO BE SHARED WAS IDLE OR DORMANT\r
1553 ;IF YES, THE COUNT OF FREE+DORMANT+IDLE CORE IS DECREASED\r
1554 ;CALL:  MOVE ITEM,HIGH SEG NUMBER\r
1555 ;       PUSHJ PDP,CHKIDL\r
1556 ;CALLED FROM GETSEG AND FININ\r
1557         EXTERN  PCORSZ,JBTSTS,CPOPJ,JBTADR,CORTAL\r
1558 CHKIDL: HRRZ    TAC,JBTSTS(ITEM) ;HAS HIGH SEG IN-CORE COUNT GONE TO 0?\r
1559         JUMPN   TAC,CPOPJ       ;NOT IDLE NON-ZERO\r
1560         LDB     TAC,PCORSZ      ;SIZE IN CORE(ITEM-1)\r
1561         MOVNI   TAC,1(TAC)      ;- NO. OF ITEM IN CORE\r
1562         SKIPE   JBTADR(ITEM)    ;IS HIGH SEG IN CORE AT ALL?\r
1563         ADDM    TAC,CORTAL      ;YES, THEN DECREASE COUNT OF FREE+DORMANT+IDLE\r
1564                                 ; CORE SINCE THIS HIGH SEG WILL NOT BE IDLE \r
1565         POPJ    PDP,            ; ANY MORE\r
1566 \r
1567 \r
1568 ;ROUTINE TO SETUP LOWER CORE FOR LOOKUP OR ENTER FOR HIGH FILE\r
1569 ;CALL:  LH OF SGAHGH(R) SET TO FILE EXT FOR HIGH SEG\r
1570 ;       PUSHJ PDP,SGH\r
1571 ;       SETUP SGALEN TO -1 IF DTA OR MTA, PROJ R IF DSK\r
1572 \r
1573         EXTERN  SG4\r
1574 \r
1575 SGH:    MOVE    TAC,SGAHGH(PROG)        ;SETUP EXTENSION(FOR HIGH FILE SHR OR HGH)\r
1576 SGH1:   HLLZM   TAC,SGAEXT(PROG)        ;STORE EXTENSION FOR LOOKUP ORENTER\r
1577 SGH2:   MOVEI   TAC,-1          ;SET SGALEN TO -1 IF DEVICE NOT DISK\r
1578                                 ; (FIRST REL LOC-1 DUMPED FROR HIGH SEG)\r
1579         JRST    SG4             ;OTHERWISE SET TO PROJ,R NO.\r
1580 \r
1581 ;ROUTINE TO DELETE A FILE, SO SUBSEQUENT GET WILL NOT BE CONFUSED\r
1582 ;USED BY SAVE AND SSAVE (NOT BY GET)\r
1583 ;CALL:  HRLI TAC, EXTENSION (.LOW,.SHR,.HGH, OR USER TYPED ARG)\r
1584 ;       PUSHJ PDP,DELET\r
1585 ;       ALWAYS RETURN\r
1586 \r
1587 DELET:  PUSHJ   PDP,SGH1        ;SETUP EXTENSION, AND E+3 IN DIRECTORY BLOCK\r
1588         LOOKUP  0,SGANAM        ;LOOKUP FILE\r
1589         POPJ    PDP,            ;NOT FOUND\r
1590         CLOSE   0,              ;CLOSE SO RENAME WILL WORK\r
1591         RENAME  0,SGAREN        ;DELETE FILE\r
1592         JFCL                    ;IGNORE IF CAN'T, WE TRIED\r
1593         POPJ    PDP,            ;RETURN\r
1594 \f;ROUTINE CALLED AFTER A HIGH OR LOW SEG SWAP IN READ ERROR\r
1595 ;CLEAR HIGH SEG NAME, SO NO NEW USERS WILL SHARE\r
1596 ;CALL:  MOVE ITEM,HGIH OR LOW SEG NO.\r
1597 ;       PUSHJ PDP,SEGERR\r
1598 ;       ALWAYS RETURN WITH J=JOB NUMBER\r
1599 \r
1600 IFN     FTSWAP,<\r
1601         INTERN  SEGERR\r
1602         EXTERN  SWPREC\r
1603 \r
1604 SEGERR: CAIG    ITEM,JOBMAX     ;LOW SEG?\r
1605         POPJ    PDP,            ;YES\r
1606         MOVE    TAC,JBTSTS(ITEM) ;NO, HAS THE ERROR BEEN DETECTED FOR THIS HIGH SEG\r
1607         TLNN    TAC,JERR        ; ON A PREVIOUS SWAPPING?\r
1608         PUSHJ   PDP,SWPREC      ;NO, RECORD ERROR AND DECREASE OF VIRTUAL CORE\r
1609         MOVSI   TAC,JERR        ;SET HIGH SEG ERROR BIT\r
1610         IORM    TAC,JBTSTS(ITEM) ;SO SPACE WILL NEVER BE RETURNED BY SERSWP\r
1611         SETZM   JBTNAM(ITEM)    ;CLEAR HI SEG NAME SO NO NEW USER WILL SHARE\r
1612         MOVE    ITEM,SWPIN      ;RETURN JOB NUMBER ASSOCIATED WITH HIGH SEG\r
1613         POPJ    PDP,\r
1614 >\r
1615 \fSUBTTL SWAP - USER PROGRAM SWAPPING ROUTINES\r
1616 \r
1617 ;ROUTINE CALLED AFTER A HIGH OR LOW SEG JUST SWAPPED IN\r
1618 ;IT SEES IF A HIGH SEG IS STILL TO BE SWAPPED IN\r
1619 ;DOES POST PROCESSING AFTER HIGH SEG SWAPPEN IN\r
1620 ;CALL:  MOVE ITEM,JOB NUMBER\r
1621 ;       PUSHJ PDP,FININ\r
1622 ;       RETURN1 IF HIGH SEG TO BE SWAPPEN IN(HIGH SEG NO. IN AC J)\r
1623 ;       RETURN2 IF NO HIGH SEG, OR HIGH SEG ALREADY IN, OR THIS WAS HIGH SEG\r
1624 ;               AC ITEM RETURNED WITH JOB NUMBER(IE LOW SEG NO.)\r
1625 \r
1626 ITEM==ITEM      ;CONTAINS JOB OR HIGH SEG NUMBER(SAME AC AS SWAP USES)\r
1627 \r
1628 IFN FTSWAP,<\r
1629         INTERN  FININ\r
1630         EXTERN  JOBMAX,JBTSGN,SWPIN,JBTSTS,CPOPJ1,ZERSWP\r
1631         EXTERN  IMGOUT,JBTSWP\r
1632 \r
1633 FININ:  CAILE   ITEM,JOBMAX     ;WAS A LOW SEG JUST SWAPPED IN?\r
1634         JRST    FINHGH          ;NO, HIGH SEG JUST SWAPPED IN, GO FINISH\r
1635         MOVEM   ITEM,SWPIN      ;YES, SAVE JOB NUMBER(FOR FINHGH AND RETURN)\r
1636         SKIPG   ITEM,JBTSGN(ITEM) ;DOES JOB HAVE A REAL HIGH SEG?\r
1637         JRST    BOTHIN          ;NO, GIVE NOTHING TO DO RETURN(MAYBE SPYSEG)\r
1638         SKIPN   JBTADR(ITEM)    ;YES, IS HIGH SEG ALREADY IN CORE?\r
1639                                 ;(NOT POSSIBLE TO BE IN MIDDLE OF SWAPPING)\r
1640         POPJ    PDP,            ;NO, GIVE "SWAP-IN-HIGH-SEG" RETURN,\r
1641                                 ; AC J SET TO HIGH SEG NO.\r
1642         PUSHJ   PDP,CHKIDL      ;YES, CHECK IF THIS HIGH SEG IS IDLE(IF YES,\r
1643                                 ; DECREASE CORTAL=FREE+DORMANT+IDLE CORE\r
1644                                 ; BY SIZE IN J OF HIGH SEG SINCE IT WILL\r
1645                                 ; NO LONGER BE IDLE(IN CORE COUNT NON-ZERO)\r
1646 \r
1647         MOVE    TAC,SWPIN       ;RESTORE JOB NUMBER\r
1648         PUSHJ   PDP,INCCNT      ;INCREMENT HIGH SEG IN CORE COUNT\r
1649                                 ; FOR THIS JOB\r
1650 IFN FTHALT,<\r
1651         PUSHJ   PDP,CHKTAL      ;CHECK CORTAL WITH CORTAB, HALT IF DIFFER\r
1652 >\r
1653 FINHGH: MOVSI   TAC,SWP         ;CLEAR SWAPPED OUT OR ON WAY FLAG FOR HIGH SEG\r
1654         ANDCAM  TAC,JBTSTS(ITEM) ;AND CLEAR SUPPRESS IN-CORE COUNT INCREMENT FLAG\r
1655 \r
1656         TLNE    ITEM,UWPOFF     ;IS USER MODE WRITE PROTECT(UWP) OFF\r
1657                                 ; FOR THIS USER?\r
1658         PUSHJ   PDP,ZERSWP      ;YES, CHANGE SWAPPING SPACE TO 0 FOR HIGH SEG\r
1659                                 ;0 TO IMGOUT,IMGIN, AND SWP IN JBTSTS(HIGH SEG)\r
1660                                 ;NO, KEEP COPY OF SEG ON DISK(USUAL CASE)\r
1661                                 ; WHETHER SHARABLE OR NOT\r
1662 BOTHIN: MOVE    ITEM,SWPIN      ;RESTORE JOB NUMBER(LOW SEG NUMBER)\r
1663         JRST    CPOPJ1          ;SKIP RETURN\r
1664 >\r
1665 \f\r
1666 ;ROUTINE TO CHECK FOR EXPANDING HIGH SEGMENT ON SWAP IN\r
1667 ;IF A JOB IS USING A SHARABLE HIGH SEGMENT WHICH HAS BEEN\r
1668 ;EXPANDED BY ANOTHER JOB, NONE OF THE SHARERS CAN BE\r
1669 ;SWAPPED IN UNTIL ALL HAVE BEEN SWAPPED OUT (JXPN=0)\r
1670 ;CALL:  MOVE ITEM,JOB NUMBER (OR HI SEG) TO BE SWAPPED IN\r
1671 ;       PUSHJ P,CKXPN\r
1672 ;         RETURN1 IF HIGH SEG IS EXPANDING (J=SAME)\r
1673 ;       RETURN2 ON ALL OTHER CONDITIONS (J=SAME)\r
1674 ;NOTE:  TAC AND TAC1 ARE PRESERVED (HENCE SHORT NAME FOR ROUTINE)\r
1675 \r
1676 IFN FTSWAP,<\r
1677         INTERN  CKXPN\r
1678         EXTERN  JOBMAX,JBTSGN,JBTSTS\r
1679 \r
1680 CKXPN:  CAIG    ITEM,JOBMAX     ;IS THIS A LOW SEG (JOB #)?\r
1681         SKIPG   DSER,JBTSGN(ITEM) ;YES, DOES JOB HAVE A HIGH SEG?\r
1682         JRST    CPOPJ1          ;NO, RETURN IMMEDIATELY AND TRY TO FIT\r
1683         MOVE    DSER,JBTSTS(DSER) ;YES, GET HIGH SEG STATUS WORD\r
1684         TLNN    DSER,JXPN       ;IS THIS HIGH SEG EXPANDING?\r
1685         AOS     (PDP)           ;NO,\r
1686         POPJ    PDP,            ;YES, DO NOT TRY TO SWAP THIS JOB IN\r
1687 >\r
1688 \f;ROUTINE CALLED JUST BEFORE HIGH OR LOW SEG TO BE SWAPPED IN\r
1689 ; AND AFTER CORE HAS BEEN ASSIGNED\r
1690 ;FITHGH SEES IF HIGH SEG AND INCREASES IN-CORE COUNT(USUALLY TO 1)\r
1691 ; FOR JOB BEING SWAPPED IN(SWPIN ALREADY SET TO JOB # BY PREVIOUS CALL\r
1692 ; TO FININ FOR LOW SEGMENT OF THIS JOB\r
1693 \r
1694 IFN FTSWAP,<\r
1695         INTERN  FITHGH\r
1696         EXTERN  SWPIN,JOBMAX\r
1697 \r
1698 FITHGH: CAIG    ITEM,JOBMAX     ;IS THIS A HIGH SEGMENT\r
1699         POPJ    PDP,            ;NO,\r
1700         MOVE    TAC,SWPIN       ;YES, GET JOB NUMBER(SET BY FININ) THAT \r
1701                                 ; GOES WITH THIS HIGH SEG\r
1702         JRST    INCCNT          ;AND INCREMENT INCORE COUNT\r
1703 >\r
1704 \r
1705 \r
1706 ;ROUTINE TO CHECK IF THIS WAS A HIGH SEG JUST SWAPPED OUT\r
1707 ;IF YES, RETURN JOB NUMBER SO LOW SEG CAN BE SWAPPED OUT(IF NOT ACTIVE IO)\r
1708 ;CALL:  MOVE ITEM,HIGH OR LOW SEG NUMBER JUST FINISHED SWAPPING OUT\r
1709 ;       PUSHJ PDP,FINOT\r
1710 ;       RETURN1 - LOW SEG TO BE WRITTEN, C(ITEM) SET TO JOB(LOW SEG) NUMBER\r
1711 ;       RETURN2 - NOTHIGN MORE TO SWAP OUT FOR THIS JOB\r
1712 \r
1713 IFN FTSWAP,<\r
1714         INTERN  FINOT\r
1715         EXTERN  JOBMAX,CPOPJ1\r
1716 \r
1717 FINOT:  CAIG    ITEM,JOBMAX     ;IS SEG JUST WRITTEN A HIGH SEG?\r
1718         JRST    CPOPJ1          ;NO, IT WAS A LOW SEG-NOTHING MORE TO DO\r
1719         MOVSI   TAC,JXPN        ;YES, CLEAR EXPAND BIT FOR THIS HIGH SEG\r
1720         ANDCAM  TAC,JBTSTS(ITEM) ;IN CASE IT WAS ON.\r
1721         SKIPN   TAC,SWPOUT      ;IF LOW SEG NO. IS 0,THIS SWAPOUT WAS\r
1722                                 ;A HIGH IDLE SEG(IF NO ASSOCIATED LOW SEG)\r
1723         JRST    FINOT1          ;YES,ADJUST CORTAL AND GIVE NOTHING MORE TO\r
1724                                 ;SWAPOUT RETURN(ALWAYS SKIP RETURN)\r
1725         HLL     ITEM,JBTSGN(TAC) ;DECREMENT HIGH SEG IN CORE COUNT\r
1726         PUSHJ   PDP,DECCNT      ;WITH CORRECT CORCNT BIT FROM TABLE\r
1727                                 ;FOR JOB FOR WHICH IT WAS JUST SWAPPED OUT\r
1728         JFCL                    ;ALREADY DECREMENTED. IGNORE.\r
1729         JRST     RETJOB         ;YES, RETURN JOB NUMBER(LOW SEG NUMBER)\r
1730                                 ; TO TRY TO BE SWAPPED OUT\r
1731 FINOT1: LDB     TAC,IMGOUT      ;GET SIZE OF SHARABLE HIGH DATA SEG\r
1732         MOVNS   TAC             ;DECREMENT CORTAL SINCE SWAPPING IDLE CORE\r
1733         ADDM    TAC,CORTAL      ;DOESN'T REALLY INCREASE FREE+IDLE+DORMANT COUNT\r
1734         JRST    CPOPJ1          ;SKIP RETURN,NO LOW SEG TO SWAP OUT\r
1735 >\r
1736 \f;ROUTINE TO COMPUTE AMOUNT OF CORE NEEDED TO GET THIS USER INTO CORE\r
1737 ;CALL:  MOVE ITEM,JOB NUMBER OR HIGH SEG NUMBER IF LOW SEG ALREADY IN\r
1738 ;       LDB AC1,IMGIN           ;SIZE OF THIS SEG WHEN SWAPPED IN(OR O IF ALREADY IN)\r
1739 ;       PUSHJ PDP,FITSIZ\r
1740 ;       RET1 - CANNOT FIT THIS USER IN(AC1=SUM OF SEGS NEEDED)\r
1741 ;       RET2 - BOTH WILL FIT(AC1 RESTORED TO SIZE OF THIS SEG)\r
1742 ;       ITEM RESTORED ON BOTH RETURNS\r
1743 \r
1744 IFN FTSWAP,<\r
1745         INTERN  FITSIZ\r
1746         EXTERN  JOBMAX,JBTSGN,IMGIN,JBTADR,CORTAL,CPOPJ1\r
1747 \r
1748 FITSIZ: PUSH    PDP,AC1         ;SAVE SIZE OF THIS SEG FOR RETURN\r
1749         PUSH    PDP,ITEM        ;SAVE LOW OR HIGH SEG NUMBER\r
1750         CAIG    ITEM,JOBMAX     ;IS THIS A LOW SEG(IF NO, LOW SEG ALREADY IN)?\r
1751         SKIPG   ITEM,JBTSGN(ITEM);YES, DOES THIS JOB HAVE A REAL HIGH SEG?\r
1752         JRST    FITCHK          ;NO, GO SEE IF JUST THIS HIGH OR LOW SEG WILL FIT\r
1753         LDB     AC2,IMGIN       ;YES, INCLUDE SIZE OF HIGH SEG WHEN SWAPPED IN\r
1754         SKIPN   JBTADR(ITEM)    ;IS IT IN CORE SO NO SWAP IN NEEDED?\r
1755         ADD     AC1,AC2         ;NO, ADD LENGTH OF HIGH SEG IF NEEDED\r
1756 FITCHK: POP     PDP,ITEM        ;RESTORE LOW OR HIGH SEG NUMBER\r
1757         CAMLE   AC1,CORTAL      ;IS AMOUNT OF CORE REQUIRED, AVAILABLE?\r
1758                                 ; EVEN IF ALL CORE DORMANT SEGS ARE DELETED\r
1759         JRST    TPOPJ           ;NO, POP OFF SIZE OF SEG AND RETURN\r
1760                                 ; AND SCAN FOR JOB TO SWAP OUT\r
1761         POP     PDP,AC1         ;YES, RESTORE SIZE OF THIS SEG FOR RETURN\r
1762         JRST    CPOPJ1          ;RETURN AND TRY SHUFFLING TO GET A HOLE BIG ENOUGH\r
1763                                 ; IF THAT NOT GOOD ENOUGH, DELETE SOME DORMANT\r
1764                                 ; SEGS FROM CORE\r
1765 >\r
1766 \r
1767 \r
1768 \f;ROUTINE TO COMPUTE SIZE OF CORE FREED UP IF A JOB WERE TO BE FORCED OUT\r
1769 ;CALL:  MOVE ITEM,JOBNUMBER\r
1770 ;       MOVE DEVDAT,LOW SEG SIZE IN 1K BLOCKS\r
1771 ;       PUSHJ PDP,FORSIZ\r
1772 ;       RETURN - AC DEVDAT INCREMENTED APPROPRIATELY(C(ITEM)=JOB NUMBER)\r
1773 ;       ACS TAC AND TAC1 ARE PRESERVED BECAUSE THEY ARE IN USE BY\r
1774 ;               QUEUE SCANNING ROUTINES\r
1775 \r
1776 IFN FTSWAP,<\r
1777         INTERN  FORSIZ\r
1778         EXTERN  JBTSGN,JBTSTS,CPOPJ,JBTADR\r
1779 \r
1780 FORSIZ: MOVSI   AC3,SWP         ;SWP BIT SET WHEN HIGH SEG SWAPPED\r
1781         TDNN    AC3,JBTSTS(ITEM) ;HAS HIGH SEG ALREADY BEEN SWAPPED OUT FOR\r
1782                                 ;THIS JOB(OR IN-CORE COUNT DECREMENTED)?\r
1783         SKIPG   AC3,JBTSGN(ITEM) ;NO, DOES JOB HAVE A REAL HIGH SEG?\r
1784         POPJ    PDP,            ;NO, RETURN J STILL SETUP TO JOB NUMBER\r
1785                                 ; (MAYBE SPYSEG)\r
1786         HLRZ    AC2,JBTADR(AC3) ;YES - GET HISEG SIZE\r
1787         JUMPE   AC2,CPOPJ       ;NOT IN CORE - TETURN\r
1788         LSH     AC2,-12         ;COMPUTE SIZE IN 1K BLOCKS\r
1789         ADDI    AC2,1\r
1790         HRRZ    AC3,JBTSTS(AC3) ;GET NO. OF IN CORE USERS\r
1791         IDIV    AC2,AC3         ;COMPUTE HISEG SIZE/NO. OR USERS\r
1792         ADDI    DEVDAT,1(AC2)   ;ADD THIS TO TOTAL JOB SIZE AND ADD 1 FOR LUCK?\r
1793         POPJ    PDP,            ;RETURN\r
1794 >\r
1795 \f\r
1796 ;ROUTINE TO FREE UP CORE FOR NON-SWAPPING SYSTEMS\r
1797 ;BY DELETING 1 DORMANT SEGMENT\r
1798 ;CALL:  MOVE TAC,LENGTH-1 DESIRED(HIGH OR LOW SEG)\r
1799 ;       MOVE ITEM,JOB OR SEG NUMBER\r
1800 ;       PUSHJ PDP,FRECOR\r
1801 ;       RETURN1 - NOT ENOUGH CORE, EVEN IF ALL DORMANT SEG DELETED\r
1802 ;       RETURN2 - 1 DORMANT SEG DELETED, TRY TO ASSIGN CORE AGAIN\r
1803 ;       TAC, AND ITEM PRESERVED\r
1804 ;CALLED FROM CORE ROUTINE (NON-SWAPPING SYSTEMS ONLY) WHEN CORE NEEDED\r
1805 \r
1806 IFE FTSWAP,<\r
1807         INTERN  FRECOR\r
1808 \r
1809 FRECOR: MOVE    TAC1,CORTAL     ;NO. OF FREE & DORMANT 1K BLOCKS OF CORE\r
1810         LSH     TAC1,12         ;CONVERY TO NUMBER OF WORDS\r
1811         CAML    TAC,TAC1        ;WILL REQUEST FIT, EVEN IF ALL DORMANT SEGS DELETED?\r
1812         POPJ    PDP,            ;NO, ERROR (DON'T DELETE DORMANT SEGS FOR NOTHING)\r
1813                                 ; YES, FALL INTO FRECR1\r
1814 >\r
1815 \r
1816 \f;ROUTINE TO FREE UP CORE FOR SWAPPING SYSTEMS\r
1817 ;BY DELETING ONE DORMANT OR IDLE SEGMENT IN CORE (DISK COPY LEFT IF ANY)\r
1818 ;CALL:  PUSHJ PDP,FRECR1\r
1819 ;ERROR RETURN-WITH ITEM=HIGH IDLE SEG WITH NO COPY ON DISK (IT MUST BE \r
1820 ;SWAPPED OUT BEFORE CORE IS FREED SINCE IDLE SEG IS IN SOME SWAPPED OUT USERS\r
1821 ;VIRTUAL ADDRESSING SPACE)\r
1822 ;        SKIP RETURN - ITEM PRESERVED\r
1823 ;CALLED FROM SWAP ONLY WHEN SHUFFLING COMPLETE AND STILL NOT ROOM\r
1824 ;SWAPPER COMPARES AMOUNT NEEDED WITH CORTAL BEFORE CALLING\r
1825 ;CORTAL=SUB OF FREE BLOCKS+DORMANT+IDLE BLOCKS OF CORE\r
1826 \r
1827         INTERN  FRECR1\r
1828         EXTERN  CORTAL,SEGPTR,JBTSTS,JBTADR,OERROR,JBTNAM,TPOPJ1\r
1829 IFN FTDISK,<EXTERN PRJPRG>\r
1830 \r
1831 FRECR1: PUSH    PDP,TAC         ;SAVE CORE ARG(ON CALLS TO FRECOR)\r
1832         PUSH    PDP,ITEM        ; SAVE JOB OR SEG NUMBER\r
1833         MOVE    ITEM,SEGPTR     ;SCAN JUST HIGH SEGMENTS\r
1834         MOVEI   TAC,777777      ;FIELD FOR HIGH SEG IN CORE COUNT\r
1835 FREC1:  SKIPE   JBTADR(ITEM)    ;DOES THIS HIGH SEG HAVE CORE?\r
1836         TDNE    TAC,JBTSTS(ITEM) ;YES, IS IN-CORE COUNT EQUAL TO 0?\r
1837         AOBJN   ITEM,FREC1      ;NO, KEEP LOOKING, FINISHED?\r
1838         JUMPL   ITEM,FREC2      ;YES, DID WE FIND A DORMANT OR IDLE SEG WITH CORE?\r
1839 \r
1840 \r
1841 IFE FTSWAP,<\r
1842         POP     PDP,ITEM        ;RESTORE JOB OR SEG. #\r
1843         JRST    TPOPJ           ;RESTORE CORE REQUEST AND RETURN\r
1844 >\r
1845 \r
1846 \r
1847 IFN FTSWAP,<\r
1848         JSP     JBUF,OERROR     ;NO, ERROR-CORTAB AND CORTAL DO NOT AGREE\r
1849                                 ; PRINT ON OPERATOR'S CONSOLE, DO NOT BLAME \r
1850                                 ; ANY PARTICULAR JOB\r
1851 >\r
1852 FREC2:\r
1853         TLZ     ITEM,-1         ;CLEAR OUT LH OF SEG NUMBER\r
1854 IFN FTSWAP,<\r
1855         EXTERN  IMGOUT\r
1856         LDB     TAC,IMGOUT      ;DOES HIGH SEG ALSO HAVE COPY ON DISK?\r
1857         JUMPN   TAC,FREC4       ;IF NON-ZERO, DO NOT CLEAR NAME SINCE NEW USERS\r
1858                                 ; CAN USE DISK COPY\r
1859         SKIPGE  JBTSTS(ITEM)    ;IS SEG IDLE(SNA=1) AS OPPOSSED TO DORMANT(SNA=0)?\r
1860         JRST    FORH0           ;YES,SWAP IT OUT SINCE IT BELONGS TO A JOB\r
1861                                 ;BUT IS NOT ON THE DISK (SHARABLE DATA SEG)\r
1862 >\r
1863         PUSHJ   PDP,CLRNAM      ;NO, CLEAR SEG NAME SO THIS SEG WILL BE \r
1864                                 ; NON-EXISTENT, RETURN DORMANT CORE\r
1865 IFN FTSWAP,<\r
1866 FREC4:  PUSHJ   PDP,KDORCR      ;YES, JUST RETURN DORMANT OR IDLE CORE(IF NOT ALREADY\r
1867                                 ; RETURNED BY CLRNAM), BUT LEAVE DORMANT DISK COPY\r
1868                                 ; STILL DORMANT ON DISK FOR NEW USERS\r
1869 >\r
1870         POP     PDP,ITEM        ;RESTORE JOB OR SEG NUMBER\r
1871         JRST    TPOPJ1          ;RESTORE CORE REQUEST AND SKIP RETURN\r
1872 IFN FTSWAP,<\r
1873 ;HERE FROM FRECR1 ROUTINE IF FOUND AN IDLE SEGMENT IN CORE WITH NO DISK\r
1874 ;COPY SO CANNOT FREE UP CORE WITHOUT SWAPPING IDLE HIGH SEG FIRST\r
1875 FORH0:  SETZM   SWPOUT          ;SET ASSOCIATED JOB NUMBER TO ZERO \r
1876                                 ;AS A FLAG THAT TERE IS NO LOW SEGMENT\r
1877         POP     PDP,TAC         ;EXIT AS ERROR RETURN FROM FREC1\r
1878         JRST    TPOPJ           ;WITH J=HIGH SEG TO BE SWAPPED OUT BECAUSE\r
1879                                 ;CORE NEEDED AND THERE IS NO COPY\r
1880                                 ;ON DISK (WRITE LOCK OFF)\r
1881 >\r
1882 ;ROUTINE TO CHECK IF JOB HAS A HIGH SEG WHICH NEEDS TO BE SWAPPED OUT\r
1883 ;IF YES, IT IS WRITTEN FIRST BEFORE LOW SEG\r
1884 ;IN THIS WAY THE IO BUFFERS MAY STAY ACTIVE LONGER\r
1885 ;IN FACT, THE HIGH SEG CAN BE BROUGHT BACK IN WITHOUT LOW SEG\r
1886 ;EVER LEAVING CORE.\r
1887 ;SHF BIT IS SET IN JOB STATUS WORD IF JOB ONLY HAS A LOW SEG, SO IO WILL STOP\r
1888 ;ON NEXT BUFFERFUL.  THUS ONLY 2 SEG JOBS HAVE ACTIVE IO LONGER.\r
1889 ;BUFFER ADVANCE ROUTINES LOOK AT SHF BUT NOT SWP FOR JOB\r
1890 ;CALL:  MOVEM FIT SWAP IN JOB NO.,FIT\r
1891 ;       MOVE ITEM,LOW OR HIGH SEG NUMBER\r
1892 ;       PUSHJ PDP,FORHGH\r
1893 ;       ALWAYS RETURN WITH HIGH OR LOW SEG TO BE WRITTEN IN ITEM\r
1894 ;\r
1895 IFN FTSWAP,<\r
1896         INTERN  FORHGH\r
1897         EXTERN  JOBMAX,JBTSTS,SWPOUT,JBTSGN,JBTADR,IMGOUT,CPOPJ,FIT\r
1898 \r
1899 FORHGH: MOVSI   TAC,SWP         ;SET WHEN HIGH SEG SWAPPED OUT OR IN-CORE\r
1900                                 ; COUNT REDUCED\r
1901         CAIG    ITEM,JOBMAX     ;IS THIS A HIGH SEG(ONLY IF WAITING FOR HIGH SEG IO)\r
1902         TDNE    TAC,JBTSTS(ITEM) ;NO, HAS HIGH SEG ALREADY BEEN SWAPPED FOR THIS USER?\r
1903         POPJ    PDP,            ;YES, TRY HIGH SEG AGAIN OR WRITE LOW SEG\r
1904         IORM    TAC,JBTSTS(ITEM) ;NO,SET SWAP BIT IN JOB STATUS WORD TO INDICATE\r
1905                                 ; 1. HIGH SEG SWAPPED IF ANY OR LOW SEG SWAPPED IF NONE\r
1906         SKIPLE  JBTSGN(ITEM)    ;DOES JOB HAVE A REAL HIGH SEG IN CORE OR DISK?\r
1907         JRST    FORH1           ;YES\r
1908         MOVSI   TAC,SHF         ;NO, SET WAITING TO SHUFFLE BIT IN JOB STATUS WORD\r
1909                                 ; SO IO WILL STOP AFTER NEXT BUFFERFUL(MAYBE SPYSEG)\r
1910         IORM    TAC,JBTSTS(ITEM) ;CHECK EVEY BUFFERFUL IN ADVBFF, ADVBFE ROUTINES\r
1911         POPJ    PDP,            ;RETURN AND TRY TO SWAP OUT LOW SEG\r
1912 \f;ROUTINE TO CHECK FOR DANGLING HIGH SEGMENT\r
1913 ; WHEN A JOB CANNOT BE FIT INTO CORE\r
1914 ;CALL:  MOVE ITEM,FIT           ;JOB (OR HIGH SEG NO) WHICH CANNOT FIT\r
1915 ;       SETZM FIT               ;PRETEND WE WEREN'T TRYING TO FIT THE JOB IN WITH THE DANGUNG HIGH SEGMENT\r\r
1916 ;       PUSHJ PDP,NOFITH\r
1917 ;         SWAP OUT THE FITJOB, ITEM=JOB NO. IF HI-SEG ALREADY ON DISK, =HI SEG NO IF NEEDS SWAPOUT\r
1918 ;       NOT A JOB, OR NO HIGH SEG, OR HI-SEG IN CORE COUNT NOT UP FOR\r
1919 ;       THIS JOB (2ND RETURN IS USUAL CASE)\r
1920 \r
1921         INTERN  NOFITH\r
1922 \r
1923 NOFITH: MOVSI   TAC,CORCNT      ;HI-SEG IN CORE COUNT UP FOR THIS JOB\r
1924         CAIG    ITEM,JOBMAX     ;IS THIS A LOW SEG BEING FITTED?\r
1925         TDNN    TAC,JBTSGN(ITEM) ;YES, IS IN CORE COUNT UP FOR THIS JOB\r
1926         JRST    CPOPJ1          ;NO, GIVE USUAL NO ACTION RETURN\r
1927                                 ;YES, FALL INTO FORH1\r
1928 FORH1:  MOVEM   ITEM,SWPOUT     ;REMEMBER THIS JOB NUMBER DURING HIGH SEG SWAPOUT\r
1929         MOVE    TAC,ITEM        ;SET UP JOB NUMBER FOR DECCNT ROUTINE\r
1930         MOVE    ITEM,JBTSGN(ITEM) ;GET HIGH SEG NUMBER FOR THIS JOB\r
1931         SKIPE   PROG,JBTADR(ITEM) ;IS HIGH SEG STILL IN CORE?\r
1932                                 ; MAY NOT BE IF JOB JUST CONNECTED TO HIGH SEG\r
1933                                 ; BY GET(XPANDH) OR HIGH SEG SWAPPED OUT PREVIOUSLY\r
1934                                 ;SETUP R IN CASE KCOREH CALLED\r
1935         PUSHJ   PDP,DECCNT      ;YES, DECREMENT IN CORE USE COUNT\r
1936         JRST    RETJOB          ;STILL GREATER THAN 0(OR NOT IN CORE), SWAP OUT LOW SEG\r
1937 \f\r
1938 \r
1939         MOVE    TAC,FIT         ;IS JOB BEING FITTED IN(0 IF NOT FITTING IN)\r
1940         HRRZ    TAC1,JBTSGN(TAC) ;ABOUT TO USE THIS SAME HIGH SEG?\r
1941         CAIG    TAC,JOBMAX      ;IS SEGMENT BEING FITTED A LOW SEG(JOB #)\r
1942                                 ; (USUALLY SINCE SWAPPER DOES NOT SWAP IN UNTIL\r
1943                                 ; ROOM FOR BOTH HIGH AND LOW SEGS\r
1944         CAIE    TAC1,(ITEM)     ;YES, FIT JOB HIGH SEG SAME?\r
1945         JRST    FORH2           ;NO, EITHER FIT HIGH SEG(RARE) OR NOT SAME\r
1946         HLL     ITEM,JBTSGN(TAC);YES, SETUP PROPER LH FOR JOB BEING FITTED IN.\r
1947                                 ; PRESERVE UWPOFF IN CASE JOB BEING SWAPPED OUT\r
1948                                 ; HAS WRITE LOCK OFF AND JOB BEING SWAPPED IN\r
1949                                 ; HAS IT ON.\r
1950 FORH1A: PUSHJ   PDP,INCCNT      ;YES,INCREMENT HIGH SET IN CORE COUNT FOR JOB\r
1951                                 ; ABOUT TO BE FITTED IN CORE EVEN THOUGH ITS LOW\r
1952                                 ; SEG HAS YET TO BE SWAPPED IN. (COUNT WILL ONLY\r
1953                                 ; BE INCREMENTED ONCE SINCE CORCNT BIT WILL BE SET)\r
1954                                 ; HIGH SEG WILL NOT APPEAR IDLE IN CORE\r
1955                                 ; DURING OTHER SWAPOUTS AND FIT SWAP IN\r
1956                                 ; LEAST FRECOR GRAB IT\r
1957 IFN FTHALT,<\r
1958         PUSHJ   PDP,CHKTAL      ;CHECK CORTAL WITH CORTAB, HALT IF DIFFER\r
1959 >\r
1960         JRST    RETJOB          ;RETURN AND SWAP JUST LOW SEG OUT (LEAVING\r
1961                                 ; HIGH SEG IN CORE FOR FIT USER)\r
1962 \r
1963 ;HERE TO SWAP OUT HIGH SEG UNLESS ALREADY ON DISK\r
1964 FORH2:  MOVE    TAC,SWPOUT      ;JOB NUMBER OF JOB WHICH HAS HIGH SEG\r
1965                                 ; WHICH MAY BE WRITTEN\r
1966         LDB     TAC1,IMGOUT     ;IS A COPY OF SEG ALREADY ON DISK?\r
1967         JUMPE   TAC1,INCCNT     ;IF NOT(0), RETURN AND WRITE HIGH SEG\r
1968                                 ; AFTER INCREMENTING IN-CORE COUNT TO 1\r
1969                                 ; SO IT WILL NOT APPEAR IDLE DURING SWAP OUT\r
1970         PUSHJ   PDP,KCOREH      ;ALREADY ON DISK, JUST RETURN CORE\r
1971                                 ; AND FLAG HIGH SEG AS ON DISK(SET SWP=1)\r
1972 IFN FTHALT,<\r
1973         PUSHJ   PDP,CHKTAL      ;CHECK CORTAL WITH CORTAB, HALT IF DIFFER\r
1974 >\r
1975 RETJOB:\r
1976 IFN FTHALT,<\r
1977         PUSHJ   PDP,CHKTAL      ;CHECK CORTAL WITH CORTAB, HALT IF DIFFER\r
1978 >\r
1979         MOVE    ITEM,SWPOUT     ;RETURN JOB NUMBER(LOW SEG NUMBER)\r
1980         POPJ    PDP,            ;AND TRY TO SWAP IT OUT\r
1981 >\r
1982 \f;SUBROUTINE TO EXPAND A HIGH (SHARABLE) SEGMENT AT UUO LEVEL\r
1983 ;CALL:  MOVE ITEM, JOB OR HIGH SEG NO. EXPANDING\r
1984 ;       PUSHJ P,XPNHGH\r
1985 ;       ALWAYS RETURN WITH J=JOB NUMBER\r
1986 ;CALLED FROM XPANDH IN SCHED1.\r
1987 IFN FTSWAP,<\r
1988 \r
1989         INTERN  XPNHGH\r
1990         EXTERN  SAVE1,JBTSTS,JBTSGN,HIGHJB,XPANDH,JOB\r
1991 \r
1992 XPNHGH: CAIG    ITEM,JOBMAX     ;IS THIS A LOW SEG EXPANDING?\r
1993         POPJ    PDP,            ;YES, RETURN IMMEDIATELY (MAYBE FROM\r
1994                                 ; RECURSIVE CALL BELOW)\r
1995         TLNN    ITEM,SHRSEG     ;NO, IS THIS HIGH SEG NON-SHARABLE?\r
1996         JRST    XPNRET          ;YES, JUST RETURN CURRENT JOB NO.\r
1997         PUSH    PDP,AC1         ;NO, SAVE AC1 ON STACK\r
1998         MOVSI   TAC,JXPN        ;FLAG THIS SHARABLE HIGH SEG AS EXPANDING\r
1999         IORM    TAC,JBTSTS(ITEM) ;SO IF OTHER JOBS GETSEG, THEY WILL BE SWAPPED OUT\r
2000         HRRZ    AC1,ITEM        ;SAVE EXPANDING SHARABLE HIGH SEG NO.\r
2001 \r
2002 ;LOOP TO SCAN ALL JOBS FOR ONES USING THIS SHARABLE HIGH SEG AND FLAG JOBS AS EXPANDING IF IN CORE\r
2003         MOVE    ITEM,HIGHJB     ;SCAN ALL JOBS INITIALIZED\r
2004 XPNLP1: CAIE    AC1,@JBTSGN(ITEM) ;DOES THIS JOB HAVE THE SAME HIGH SEG?\r
2005                                 ; (SPY SEG NO. ALWAYS 1777 OR GREATER)\r
2006         SOJG    ITEM,XPNLP1     ;NO, FINISHED (NULL JOB=0 NEVER HAS HIGH SEG)\r
2007         JUMPLE  ITEM,XPNRET     ;YES, FINISHED?\r
2008         MOVSI   TAC,SWP         ;IS THIS JOB SWAPPED?\r
2009         TDNN    TAC,JBTSTS(ITEM) ;\r
2010         PUSHJ   PDP,XPANDH      ;NO, EXPAND THIS JOB BY SWAPPING OUT\r
2011         SOJG    ITEM,XPNLP1     ;FINISHED?\r
2012 XPNRET: MOVE    ITEM,JOB        ;YES, ALWAYS RETURN CURRENT JOB NO.\r
2013                                 ; AS LOW SEG NO. ASSOCIATED WITH EXPANDING\r
2014                                 ; HIGH SEG NO.\r
2015         POP     PDP,AC1         ;RESTORE AC1\r
2016         POPJ    PDP,            ;RETURN (RESTORE AC1)\r
2017 \r
2018 ;ROUTINE TO CHECK FOR A HIGH SEG WITH SWAP READ ERROR\r
2019 ;CALLED FROM ZERSWP WHENEVER PHYSICAL DISK SPACE IS BEING RECLAIMED\r
2020 ;CALL:  MOVE ITEM,LOW OR HIGH SEG NO.\r
2021 ;       MOVE TAC1,JBTSTS(ITEM)  ;SEG STATUS WORD\r
2022 ;       PUSHJ PDP,ZERSWH\r
2023 ;         LOW SEG OR NO ERROR IN HIGH SEG\r
2024 ;       ERROR IN HIGH SEG (ERROR BIT IS THEN CLEARED)\r
2025 \r
2026         INTERN  ZERSWH\r
2027 \r
2028 ZERSWH: CAILE   ITEM,JOBMAX     ;IS THIS A HIGH SEG?\r
2029         TLNN    TAC1,JERR       ;YES, DOES IT HAVE A SWAP READ ERROR?\r
2030         POPJ    PDP,            ;NO, RETURN AND RECLAIM PHYSICAL DISK SPACE\r
2031         MOVSI   TAC1,JERR       ;YES, SWAP READ ERROR FLAG\r
2032         ANDCAM  TAC1,JBTSTS(ITEM) ;CLEAR IT IN HIGH SEG STATUS WORD\r
2033                                 ; SO BE READY TO COUNT A NEW ERROR\r
2034                                 ; IF IT OCCURS IN A NEW PLACE\r
2035         JRST    CPOPJ1          ;SKIP RETURN AND DO NOT RECLAIM DISK SPACE\r
2036                                 ; SO NO ONE WILL BE ABLE TO USE IT\r
2037 >\r
2038 \f\r
2039 ;SUBROUTINE TO DELETE ENOUGH DORMANT SEGS ON THIS UNIT TO MAKE ROOM\r
2040 ;ARGS   AC2=NUMBER 1K BLOCKS NEEDED\r
2041 ;       DEVDAT=ADDR OF UNIT DATA BLOCK\r
2042 ;PRESERVES AC1,AC2,AC3,P4,U,ITEM\r
2043 ;SKIP RETURN IF OK, NON-SKIP IF NOT\r
2044 \r
2045 IFN     FTSWAP,<\r
2046 INTERNAL        DODELE\r
2047 \r
2048 EXTERNAL        SWPTAB,JBYSUN,UNIFKS\r
2049 \r
2050 DODELE: PUSH    PDP,ITEM\r
2051         PUSH    PDP,AC2\r
2052         MOVE    ITEM,SEGPTR\r
2053 DODEL1: LDB     TAC,IMGOUT      ;GET SPACE ON DISK OF THIS SEG\r
2054         SKIPL   JBTSTS(ITEM)    ;SEG UNUSED? (SNA=0)\r
2055         CAIN    TAC,0           ;YES, SPACE ON DISK?\r
2056         JRST    DODEL3          ;NO, KEEP LOOKING\r
2057         SKIPL   JBTSWP(ITEM)    ;SEE IF THIS SEG HAS SPACE ON OUR UNIT\r
2058         JRST    DODELA          ;NOT FRAGMENTED\r
2059         HLRZ    TAC,JBTSWP(ITEM) ;GET ADDR OF LIST OF PIECES\r
2060         TRZ     TAC,FRGSEG      ;CLEAR FRAGMENTED BIT\r
2061 DODELB: HLRE    TAC1,(TAC)      ;GET ITEM OF THIS PIECE\r
2062         JUMPLE  TAC1,DODELC     ;NOT CORE, POINTER TO NEW LIST\r
2063         LDB     TAC1,[POINT 3,(TAC),23] ;GET INDEX OF UNIT IN SWPTAB\r
2064         CAMN    JBUF,SWPTAB(TAC1) ;SEE IF ITS US\r
2065         JRST    DODEL2          ;YES, WE DO HAVE SPACE HERE!\r
2066         AOJA    TAC,DODELB      ;NO, TRY NEXT PIECE\r
2067 DODELC: SKIPE   TAC,(TAC)       ;SEE IF END OF LIST\r
2068         JRST    DODELB          ;NO, KEEP GOING\r
2069         JRST    DODEL3          ;YES, WE CANT HELP\r
2070 DODELA: LDB     TAC,JBYSUN      ;NOT FRAGMENTED, GET UNIT SEG IS ON\r
2071         CAME    JBUF,SWPTAB(TAC) ;SKIP IF ON THIS UNIT\r
2072         JRST    DODEL3          ;NO\r
2073 DODEL2: HLLM    ITEM,-2(PDP)    ;SAVE LEFT HALF OF TIEM ON P\r
2074         TLZ     ITEM,-1         ;CLEAR LH OF ITEM\r
2075         PUSHJ   PDP,CLRNAM      ;DELETE THE DORMANT SEGMENT\r
2076         MOVE    AC2,(PDP)       ;AC2=NUMBER OF 1K BLOCKS NEEDED\r
2077         CAMG    AC2,UNIFKS(JBUF) ;SKIP IF STILL NOT ENOUGH SPACE\r
2078         JRST    DODELX          ;DONE, EXIT\r
2079         HLL     ITEM,-2(PDP)\r
2080 DODEL3: AOBJN   ITEM,DODEL1     ;JUMP IF MORE SEGS\r
2081         POP     PDP,AC2         ;POP OFF NUMBER 1K BLOCKS NEEDED\r
2082         JRST    IPOPJ           ;THERE'S SUPPOSED TO BE ROOM\r
2083 DODELX: POP     PDP,AC2         ;POP OFF NUMBER 1K BLOCKS NEEDED\r
2084         JRST    IPOPJ1\r
2085 >\r
2086 \f;SUBROUTINE TO SEE IF BY DELETING DORMANT SEGS WILL BE ENOUGH ROOM\r
2087 ; ON THIS UNIT\r
2088 ;ARGS   AC2=NUMBER 1K BLOCKS NEEDED\r
2089 ;       JBUF=ADDR OF UNIT DATA BLOCK\r
2090 ;CALL   MOVEI   AC2,1K BLOCKS NEEDED\r
2091 ;       MOVEI   JBUF,ADDR\r
2092 ;       PUSHJ   PDP,IFDELE\r
2093 ;       ERROR RETURN - CANT CREATE ENOUGH SPACE ON THIS UNIT\r
2094 ;       OK RETURN - CAN CREATE ENOUGH SPACE BY DELETING SEGS\r
2095 ;PRESERVES AC1,AC2,AC3,P4,JBUF,ITEM\r
2096 \r
2097 IFN     FTSWAP,<\r
2098         INTERNAL        IFDELE\r
2099 IFDELE: PUSH    PDP,ITEM\r
2100         MOVE    TAC1,UNIFKS(JBUF) ;TAC1 IS COUNTER OF AVAILABLE SPACE\r
2101         MOVE    ITEM,SEGPTR\r
2102 IFDEL1: LDB     TAC,IMGOUT      ;GET DISK SPACE OF THIS SEG\r
2103         SKIPL   JBTSTS(ITEM)    ;SEG UNUSED? (SNA=0)\r
2104         CAIN    TAC,0           ;YES, SPACE ON DISK?\r
2105         JRST    IFDEL3          ;NO, KEEP LOOKING\r
2106         SKIPL   JBTSWP(ITEM)    ;FRAGMENTED?\r
2107         JRST    IFDEL2          ;NO\r
2108         PUSH    PDP,AC1         ;YES, SAVE AC1\r
2109         HLRZ    TAC,JBTSWP(ITEM)\r
2110         TRZ     TAC,FRGSEG\r
2111 IFDFK:  HRRZ    AC1,TAC         ;AC1=ADDR OF LIST\r
2112 IFDFK1: HRRZ    DSER,(AC1)      ;DISK ADDR\r
2113         HLRE    TAC,(AC1)       ;NUMBER OF J\r
2114         JUMPLE  TAC,IFDFK2      ;JUMP IF NOT DISK SPACE\r
2115         LDB     DSER,[POINT 3,DSER,23]  ;GET UNIT INDEX\r
2116         CAMN    JBUF,SWPTAB(DSER)       ;SEE IF ITS THE RIGHT UNIT\r
2117         ADD     TAC1,TAC                ;YES\r
2118         AOJA    AC1,IFDFK1\r
2119 IFDFK2: SKIPE   TAC,(AC1)       ;SKIP IF END OF LIST\r
2120         JRST    IFDFK\r
2121         POP     PDP,AC1         ;RESTORE AC1\r
2122         JRST    IFDEL4\r
2123 IFDEL2: LDB     DSER,JBYSUN     ;GET SWAPPING UNIT NUMBER\r
2124         CAMN    JBUF,SWPTAB(DSER)\r
2125         ADD     TAC1,TAC        ;IF RIGHT UNIT, COUNT ITS SPACE\r
2126 IFDEL4: CAML    TAC1,AC2        ;HAVE ENOUGH YET?\r
2127         JRST    IPOPJ1          ;YEAH, MAN\r
2128 IFDEL3: AOBJN   ITEM,IFDEL1     ;NO, KEEP ON\r
2129         JRST    IPOPJ           ;CANT DO IT\r
2130 >\r
2131 \fSUBTTL UUOCON - M HANDLING ROUTINES\r
2132 \r
2133 ;ROUTINE TO CHECK TO SEE IF A KNOWN SEGMENT IS BEING SUPERCEDED BY A FILE\r
2134 ;OF THE SAME NAME WITH EXTENSION OF .SHR IN THE SAME DIRECTORY.\r
2135 ;IF YES, THE SHARABLE SEGMENT IF FLAGGED AS NO LONGER SHARABLE FOR\r
2136 ;ADDITIONAL USERS(ITS NAME IS SET TO 0 IN JBTNAM).  THE USERS\r
2137 ;WHO ARE USING IT WILL CONTINUE TO SHARE IT UNTIL ALL OF THEM ARE THROUGH.\r
2138 ;IF NO USERS ARE USING SEGMENT ON DISK OR CORE, ITS DISK SPACE WILL BE RETURNED.\r
2139 ;CALLED FROM CLOSE INPUT AND OUTPUT DUMP AND BUFFERED(RELSEG) AND SUCCESSFUL RENAME(RELSG1)\r
2140 ;CALL:  MOVE DEVDAT,ADR. OF DEVICE DATA BLOCK\r
2141 ;       PUSHJ PDP,RELSEG\r
2142 ;       ALWAYS RETURN (RELSEG)\r
2143 ;       ALWAYS SKIP RETURN (RELSG1)\r
2144 \r
2145         INTERN  RELSEG\r
2146         EXTERN  JOB,JBTNAM\r
2147 \r
2148 RELSEG: TLNE    DEVDAT,ENTRB    ;HAS AN ENTER BEEN DONE(HERE ON CLOSE)?\r
2149                                 ; IS THIS OUTPUT CLOSE?\r
2150                                 ; I.E. WAS A FILE CREATED OR RECREATED?\r
2151         PUSHJ   PDP,FNDSEG      ;YES, DOES A KNOWN SEG ALREADY HAVE THIS NAME?\r
2152                                 ; SEARCH USING OLD (RATHER THAN NEW) IF RENAME\r
2153         POPJ    PDP,            ;NO, NO CONFLICT\r
2154         JRST    CLRNM1          ;YES, CLEAR NAME AND DELETE CORE AND DISK IF\r
2155                                 ; BUT LEAVE DIRECTORY NAME FOR YSTAT\r
2156                                 ; SO IT CAN PRINT (OBS) PDP,PDP\r
2157                                 ; HIGH SEGMENT IS ALREADY DORMANT\r
2158 \r
2159 \r
2160 ;ROUTINE TO RESET HIGH SEG\r
2161 ;CALLED ON RESET UUO\r
2162 ;SETS USER:MODE WRITE PROTECT BIT ON IN HARDWARE AND SOFTWARE FOR THIS\r
2163 ;JOB ONLY(CURRENT JOB). OTHER JOBS MAY HAVE UWP ON OR OFF FOR\r
2164 ;SAME HIGH SEGMENT(EXCEPT THAT INITIALLY SETUWP UUO DOES NOT ALLOW\r
2165 ;TURNING UWP OFF IF HIGH SEG SHARABLE)\r
2166 ;CALL:  MOVE ITEM,CURRENT JOB NUMBER\r
2167 ;       PUSHJ PDP,HRESET\r
2168 ;       RETURN WITH APR RESET AND SOFTWARE RESET\r
2169 \r
2170         INTERN  HRESET\r
2171         EXTERN  JBTSGN,SETREL\r
2172 \r
2173 HRESET: MOVSI   TAC,UWPOFF      ;FLAG THIS USER AS HAVING UWP ON FOR HIGH SEG\r
2174         ANDCAM  TAC,JBTSGN(ITEM) ;SO HE WILL NOT BE ABLE TO WRITE HIGH SEG\r
2175         JRST    SETREL          ;GO DO DATAO APR AND SET UWP ON\r
2176 \f;UUO ROUTINE TO SET OR CLEAR USER-MODE WRITE PROTECT(UWP)\r
2177 ;ON HIGH SEGMENT FOR CURRENT JOB\r
2178 ;CALL:  MOVEI AC,0 OR 1(CLEAR OR SET UWP)\r
2179 ;       MOVE ITEM,CURRENT JOB NUMBER\r
2180 ;       PUSHJ PDP,USTUWP\r
2181 ;       ERROR RETURN - MACHINE OR MONITOR NOT HAVE 2 REG. CAPABILITY OR\r
2182 ;               TRYING TO TURN OFF UWP AFTER R HAS BEEN MEDDLED WITH\r
2183 ;                 AND USER DOES NOT HAVE WRITE PRIV. TO FILE WHICH INIT HIGH SEG\r
2184 ;               OR HIGH SEG IS A SPYSEG(IE PHYSICAL CORE)\r
2185 ;       OK RETURN - WHETHER JOB HAS HIGH SEG OR NOT\r
2186 ;               PREVIOUS SETTING OF UWP RETURNED IN AC(BOTH RETURNS)\r
2187 \r
2188         INTERN  USTUWP\r
2189         EXTERN  TWOREG,RTZER,JBTSGN,JBTSTS,SETREL,STOTAC\r
2190 \r
2191 USTUWP: SKIPN   TWOREG          ;IS THIS A TWO REG MACHINE?\r
2192         JRST    RTZER           ;NO, ERROR RETURN TO USER, WITH 0 IN HIS AC\r
2193         AOS     (PDP)           ;ASSUME OK RETURN\r
2194         SKIPN   ITEM,JBTSGN(ITEM) ;DOES JOB HAVE A REAL OR SPY HIGH SEG?\r
2195         JRST    USTU0           ;NO, GIVE OK RETURN, BUT RETURN 0 AS PREVIOUS\r
2196                                 ; UWP SETTING\r
2197         JUMPN   TAC,UWPON       ;YES, IS USER TRYING TO TURN UWP ON?\r
2198         JUMPL   ITEM,USTUE      ;IS THIS A SPY SEG? (IF YES, GIVE ERROR RETURN)\r
2199         TLNN    ITEM,MEDDLE     ;NO, HAS HE BEEN MEDDLING WITH PROGRAM\r
2200                                 ; (START N,DEPOSIT,GETSEG,RUN +2)?\r
2201         JRST    USTU1           ;NO, ALWAYS ALLOW UWP TO BE TRUNED OFF SINCE\r
2202                                 ; R IS IN COMPLETE CONTROL OF ITS SELF\r
2203         MOVE    AC2,JOB         ;YES, CURRENT JOB NO. FOR CHKHSW ROUT.\r
2204         PUSHJ   PDP,CHKHSW      ;DOES THIS JOB HAVE WRITE PRIVILEGES TO FILE\r
2205                                 ; EVEN THOUGH MEDDLING WITH PROGRAM?\r
2206                                 ; MAYBE SHARED DATA SEGMENT WITH GETSEG UUO\r
2207 USTUE:  SOSA    (PDP)           ;NO, THEN DO NOT ALLOW PROGRAM TO TURN OFF UWP\r
2208 USTU1:  TLOA    ITEM,UWPOFF     ;YES, SO OK TO TURN OFF UWP, EVEN IF THIS\r
2209                                 ; IS SHARABLE HIGH SEG\r
2210 UWPON:  TLZ     ITEM,UWPOFF     ;TURN OFF UWPOFF SO UWP WILL BE ON\r
2211 IFN FTSWAP,<\r
2212         EXTERN  ZERSWP\r
2213         TLNE    ITEM,UWPOFF     ;WILL HIGH SEG BE WRITEABLE?\r
2214         PUSHJ   PDP,ZERSWP      ;YES, RETURN SWAPPING SPACE SO HIGH SEG\r
2215                                 ; WILL HAVE TO BE WRITTEN WHEN JOB\r
2216                                 ; IS SWAPPED OUT\r
2217 >\r
2218         MOVE    TAC,JOB         ;CURRENT JOB NUMBER\r
2219 IFN FTHALT,<\r
2220         PUSHJ   PDP,COMIT       ;COMPARE J WITH JBTSGN(TAC), HALT IF DIFF.\r
2221 >\r
2222         EXCH    ITEM,JBTSGN(TAC) ;MARK NEW UWP SETTING FOR TIS USER AND GET OLD ONE\r
2223         MOVEI   TAC,1           ;ASSUME UWP WAS ON FOR THIS USER\r
2224         TLNE    ITEM,UWPOFF     ;WAS UWP OFF?\r
2225 USTU0:  MOVEI   TAC,0           ;YES, RETURN 0\r
2226         PUSHJ   PDP,STOTAC      ;TO USER'S AC ARG\r
2227         JRST    SETREL          ;GO RESET HARDWARE AND SOFTWARE RELOC.\r
2228                                 ; AND RETURN TO USER\r
2229 \f;ROUTINE TO CHECK ACCESS PRIVILEGES FOR SHARED SEGMENTS\r
2230 ;CALL:  MOVE ITEM,HIGH SEG NUMBER\r
2231 ;       MOVEI AC1,FUNCTION (FNCEXC,FNCRED,FNCUPD)\r
2232 ;       MOVE AC2,JOB NUMBER\r
2233 ;       PUSHJ PDP,CHKHSA\r
2234 ;       CAN'T READ OR WRITE\r
2235 ;       USER HAS PRIV IF SHARABLE, OR HIGH SEG NOT SHARABLE\r
2236 ;DTA READ OK IF DEVICE UNASSIGNED,SYSTEM, OR ASSIGNED TO THIS JOB\r
2237 ;DTA WRITE OK IF DEVICE UNASSIGNED OR ASSIGNED TO THAT JOB, EXCEPT CAN'T\r
2238 ;DEPOSIT SYSTEM TAPE\r
2239 ;CALLED FROM SAVGET TO SEE IF USER HAS READ PRIVILEGES TO SHARE\r
2240 ;CALLED FROM DEPOSIT COMMAND IF IN HIGH SEG TO SEE FI WRITE PROV\r
2241 ;CALLED FROM SETUWP IF TRY TO SET UWP TO 0 AND MEDDLE BIT IS ON TO\r
2242 ; SEE IF WRITE PRIV. OK\r
2243 \r
2244         EXTERN  DEVPHY,PJOBN,CPOPJ1,SYSTAP,FNCUPD,JBTDIR\r
2245 IFN FTDISK,<EXTERN PRJPRG,CHKACC>\r
2246 \r
2247 CHKHSW: MOVEI   AC1,FNCUPD      ;CHECK FOR HIGH SEG UPDATE\r
2248 CHKHSA: TLNN    ITEM,SHRSEG     ;IS THIS HIGH SEG SHARABLE?\r
2249         JRST    CPOPJ1          ;NO, ALWAYS OK TO READ OR WRITE\r
2250 \r
2251 CHKHS3: MOVE    TAC,JBTDIR(ITEM) ;DEVICE NAME OF DTA OR MTA\r
2252         PUSHJ   PDP,DEVPHY      ;YES, SEARCH FOR PHYSICAL DEVICE\r
2253         POPJ    PDP,            ;NO, NOT FOUND\r
2254         CAME    TAC,SYSTAP\r
2255         TLNE    DEVDAT,SYSDEV   ;SYSTEM TAPE?\r
2256         JRST    CHKHS2          ;NO\r
2257         LDB     AC3,PJOBN       ;JOB DEVICE ASSIGNED TO, IF ANY\r
2258         JUMPE   AC3,CPOPJ1      ;IS NON-SYSTEM DEVICE ASSIGNED?\r
2259                                 ; ALWAYS READ OR WRITE IF UNASSIGNED\r
2260         CAMN    AC3,AC2         ;YES, IT IT ASSIGNED TO THIS JOB?\r
2261         AOS     (PDP)           ;YES, CAN READ OR WRITE\r
2262         POPJ    PDP,            ;NO, CANNOT READ OR WRITE\r
2263 CHKHS2: CAIGE   AC1,FNCUPD      ;YES, TRYING TO WRITE(UPDATE)CLEAR UWP OR DEPOSIT)\r
2264         AOS     (PDP)           ;NO, OK TO READ SYSTEM TAPE\r
2265         POPJ    PDP,            ;YES, CAN'T WRITE SYSTEM TAPE\r
2266 \r
2267 \f;UUO TO ALLOW PRIVILEGED USER PROGRAM TO LOOK AT ALL OF CORE\r
2268 ; BY HAVING PHYSICAL CORE APPEAR AS HIGH SEG\r
2269 ; ANY PROGRAMS WRITTEN TO USE THIS UO SHOULD BE PROGRAMMED TO USE THE\r
2270 ; PEEK UUO TOO, IN CASE THIS MACHINE OR MONITOR DOES NOT HAVE 2 RELOC. REG.\r
2271 ; OR INSTALLATION DECIDES TO MAKE THIS UUO RESTRICTED\r
2272 ; THIS UUO IS PROVIDED ONLY FOR EFFICIENT, SINCE IT NEED ONLY BE DONE\r
2273 ; ONCE, WHILE PEEK UUO MUST BE DONE FOR EVERY WORD EXAMINED\r
2274 ;CALL:  HRRI AC,HIGHEST PYHSICAL ADR. TOAPPEAR IN HIGH SEG\r
2275 ;       CALL AC,[SIXBIT /SPY/] OR CALLI AC,42\r
2276 ;       ERROR RETURN, ADR. TOO IGH OR THIS USER CAN'T USE\r
2277 ;        THIS UUO, OR NOT 2 RELOC. REG. MACHINE\r
2278 ;       OK RETURN, HIGH SEG SETUP IN ADDRESSING SPACE\r
2279 ;NOTE: A SPYSEG APPEARS TO THE SYSTEM AS IF TIS USER DOES NOT HAVE A HIGH SEG\r
2280 ; IN ALL CASES EXCEPT WHEN THE RELOC. HARDWARE IS SET. THIS IS BECAUSE\r
2281 ; THE SIGN BIT OF JBTSGN(JOBNUMBER) IS SET TO INDICATE SPY SEG\r
2282 ; AND THE MONITOR CHECK FOR REAL HIGH SEGS SITH SKIPG INSTR.\r
2283 ; THE RH OF JBTSGN(JOBNUMBER) HAS HIGHEST LEGAL PHY. ADR.\r
2284 ; FOR THIS USER TO LOOK AT(CARE IS TAKEN SINCE THIS IS MUCH BIGGER THAN A\r
2285 ; HIGH SEG NUMBER WHICH IS USUALLY IN RH)\r
2286 \r
2287         INTERN  USPY,FTPRV\r
2288         EXTERN  TWOREG,GETWDU,JBTSGN,SYSSIZ,MEMSIZ\r
2289 USPY:   SKIPN   TWOREG          ;DOES MACHINE HAVE 2 REG. HARDWARE?\r
2290         POPJ    PDP,            ;NO, ERROR RETURN TO USER\r
2291 IFN FTPRV,< EXTERN PRVBIT\r
2292         MOVSI   TAC,PVSPYM!PVSPYA\r
2293         PUSHJ   PDP,PRVBIT      ;IS USER PRIVILEGED TO SPY?\r
2294          SKIPA                  ;YES\r
2295         POPJ    PDP,0>          ;NO, ERROR RETURN\r
2296         PUSHJ   PDP,KILHGC      ;YES, REMOVE PREVIOUS HIGH SEG FROM LOGICAL\r
2297                                 ;ADR. SPACE, IF ANY INCLUDING PREVIOUS SPY SEG\r
2298         PUSHJ   PDP,GETWDU      ;GET USER'S COR ARG ON UUO\r
2299         JUMPE   TAC,SETRL1      ;DOES HE WANT TO SPY AT ALL?\r
2300                                 ; IF 0, SET RELOC HARDWARE AND SKIP RETURN\r
2301         TLZN    TAC,-1          ;YES, ANY LH BITS (CLEAR FOR COMPARE)?\r
2302         CAML    TAC,MEMSIZ      ;NO, IS HIGHEST ADR. USER WANTS ABOVE MONITOR?\r
2303         JRST    SETREL          ;YES, ERROR RETURN TO USER (AFTER SETTING HARDWARE)\r
2304 IFN FTPRV, <\r
2305         CAMGE   TAC,SYSSIZ      ;TRYING TO SPY BEYOND END OF MONITOR ?\r
2306         JRST    USPY1           ;NO, O.K.\r
2307         PUSH    PDP,TAC         ;\r
2308         MOVSI   TAC,PVSPYA      ;YES, IS HE PRIVILEGED TO DO SO ?\r
2309         PUSHJ   PDP,PRVBIT      ;\r
2310          JRST USPY2             ;YES, O.K.\r
2311         POP     PDP,TAC         ;NO, ERROR RETURN\r
2312         JRST    SETREL\r
2313 USPY2:  POP     PDP,TAC\r
2314 USPY1:>\r
2315         HRLI    TAC,SPYSEG!MEDDLE ;FLAG THIS USER AS SPYING\r
2316         TRO     TAC,1777        ;INSURE AT LEAST ONE PAGE\r
2317                                 ; (ALSO MAKE SURE RH CAN NOT LOOK LIKE A HIGH SEG NO.)\r
2318         MOVEM   TAC,JBTSGN(ITEM) ;STORE IGHEST PHYSICAL ADR. USER WANTS\r
2319         JRST    SETRL1          ;OK RETURN TO USER AFTER SETTING HARDWARE\r
2320 ;ROUTINE TO SCAN KNOWN SEG TABLE(PRJPRG/JBTNAM) TO SEE IF A SEG IS ALREADY\r
2321 ;IN IT AFTER FILE HAS BEEN WRITTEN OR RENAMED\r
2322 ;CALL:  MOVE DEVDAT,DEVICE DATA BLOCK ADDRESS OF DEVICE WITH FILE\r
2323 ;       PUSHJ PDP,FNDSEG\r
2324 ;       NOT FOUND RETURN, OR FILE EXT WAS NOT SHR, OR DEVICE HAS SHORT DISP TABLE\r
2325                         ;C(ITEM)=GARBAGE\r
2326 ;       FOUND RETURN, C(ITEM)=HIGH SEG NUMBER(LH=0)\r
2327 ;               C(TAC)=DIRECTORY NAME(PROJPROG NO IF DISK, 0 IF MTA OR DTA\r
2328 ;               C(TAC1)=FILE NAME\r
2329 ;               C(JBUF)=DEVICE OR FILE STRUCTURE NAME\r
2330 ;CALLED FROMRELSEG(CLOSE OUTPUT AND SUCCESSFUL RENAME)\r
2331 ;AND GET AFTER INPUT\r
2332 ;MUST BE CALLED AT UUO LEVEL\r
2333 \r
2334         EXTERN  SEGPTR,JBTNAM,CPOPJ,CPOPJ1,JBTDIR\r
2335 IFN FTDISK,<EXTERN PRJPRG>\r
2336 \r
2337 FNDSEG:\r
2338         MOVE    JBUF,DEVNAM(DEVDAT) ;SETUP PHYSICAL DEVICE NAME(DTA,MTA)\r
2339         MOVE    TAC1,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\r
2340         HLRZ    TAC,DEVEXT(DEVDAT) ;FILE EXTENSION\r
2341         TLNE    TAC1,DVLNG      ;IS DEVICE HAVE FILES(MTA,DTA,DSK)?\r
2342         CAIE    TAC,(SIXBIT /SHR/) ;YES, IS EXTENSION SHR?\r
2343         POPJ    PDP,            ;NO, DO NOT LOOK FOR NAME IN KNOWN TABLE\r
2344         MOVEI   TAC,0           ;NO, SET DIR TO 0, MUST BE DTA OR MTA\r
2345         MOVE    TAC1,DEVFIL(DEVDAT) ;GET FILE NAME FROM DEVICE DATA BLOCK\r
2346                                 ; OLD (RATHER THAN NEW) IF RENAME\r
2347                                 ;FALL INTO SECSEG\r
2348 \r
2349 \r
2350 ;ROUTINE SAME AS FNDSEG, EXCEPT DEVICE NOT LOOKED UP(CALLED FROM GET WHEN DEVICE IS DTA)\r
2351 ;USED TO AVOID DOING OPEN AND LOOKUP WHEN DEVICE IS DTA\r
2352 ;SINCE OPEN MAY QUEUE FOR SYS AND LOOKUP SPINS TAPE\r
2353 ;CALL:  MOVE TAC,PROJ,R NO IF DISK, ZERO IF DTA OR MTA\r
2354 ;       MOVE TAC1,FILE NAME\r
2355 ;       MOVE JBUF,DEVICE NAME OR FILE STRUCTURE NAME\r
2356 ;       PUSHJ PDP,SRCSEG\r
2357 ;       NOT FOUND RETURN\r
2358 ;       FOUND RETURN - ITEM SET UP TO HIGH SEG NUMBER\r
2359 ;               LH OF ITEM SET AS SHARABLE(SHRSEG=1)\r
2360 ;               (MEDDLE=UWPOFF=SPYSEG=0)\r
2361 \r
2362 SRCSEG: MOVE    ITEM,SEGPTR     ;POINTER TO JUST HIGH SEGMENTS IN JOB TABLES\r
2363 FNDLOP:\r
2364 IFN FTDISK,<CAMN TAC,PRJPRG(ITEM)       ;YES, DO DIRECTORY NAMES MATCH?>\r
2365         CAME    TAC1,JBTNAM(ITEM)       ;DO FILE NAMES MATCH?\r
2366 FNDLP1: AOBJN   ITEM,FNDLOP             ;NO, KEEP LOOKING,FINISHED?\r
2367         JUMPGE  ITEM,CPOPJ              ;YES, FINISHED?(IF YES, GIVE NOT FOUND RETURN)\r
2368         CAME    JBUF,JBTDIR(ITEM)       ;NO, DO DEVICE(STR) NAMES MATCH?\r
2369         JRST    FNDLP1                  ;NO, GO BACK AND LOOK SOME MORE\r
2370         HRLI    ITEM,SHRSEG             ;YES, THIS MUST BE A MATCH(FLAG SEG AS SHARABLE)\r
2371         JRST    CPOPJ1                  ;FOUND RETURN\r
2372 \r
2373 ;ROUTINE TO GET WORD FROM HIGH SEGMENT IN CORE\r
2374 ;CALL:  MOVE ITEM,JOB NO.\r
2375 ;       HRR UUO,RELATIVE(USER) ADDRESS IN HIGH SEGMENT\r
2376 ;       PUSHJ P,HGHWRD\r
2377 ;       ERROR RETURN, ADR NOT IN HIGH SEG OR NO HIGH SEG\r
2378 ;       OK RETURN, CONTENTS OF LOC RETURNED IN TAC\r
2379 ;               ABS. ADR. OF LOC RETURNED IN AC TAC1(USED BY DEPOSIT)\r
2380 \r
2381 ;CAN BE CALLED AT CLOCK OR UUO LEVELS\r
2382 ;CALLED FROM E COMMAND AND CALL,INIT UUOS,SAVE AND GET JOBS\r
2383 \r
2384         INTERN  HGHWRD\r
2385         EXTERN  JBTSGN,JBTADR,CPOPJ1\r
2386 \r
2387 HGHWRD: TRNE    UUO,400000      ;IS ADDRESS GREATER OR EQUAL TO 400000?\r
2388         SKIPG   TAC1,JBTSGN(ITEM) ;YES, DOES JOB HAVE A HIGH SEG?\r
2389         POPJ    PDP,            ;NO, ERROR RETURN - LESS THAN 400000 OR NO HIGH SEG\r
2390                                 ; OR SPYSEG\r
2391         MOVEI   TAC,377777      ;ASSUME LOW SEG IS LESS THAN 400000 WORDS\r
2392                                 ;SETUP USER ORIGIN-1 OF HIGH SEG\r
2393         SKIPGE  PROG            ;IS IT(LH OF R IS LENGTH-1 OF LOW SEG)?\r
2394         HLRZ    TAC,PROG        ;NO, LENGTH-1 OF LOW SEG IS ORIGIN-1 OF HIGH SEG\r
2395         HLRZ    TAC1,JBTADR(TAC1) ;GET LENGTH-1 OF HIGH SEG\r
2396         ADDI    TAC1,1(TAC)     ;FORM HIGHEST LEGAL USER ADR IN HIGH SEG\r
2397         CAIGE   TAC1,(UUO)      ;IS IT LESS OR EQUAL TO HIGHEST LEGAL ADDRESS?\r
2398         POPJ    PDP,            ;NO, ERROR RETURN\r
2399         MOVE    TAC1,JBTSGN(ITEM) ;YES, GET SEG NUMBER AGAIN\r
2400         HRRZ    TAC1,JBTADR(TAC1) ;ABSOLUTE ADR. OF FIRST WORD OF HIGH SEG\r
2401                                 ;(NOT RELOCATION)\r
2402         SUBI    TAC1,1(TAC)     ;FORM RELOCATION, SUBTRACT 400000(USUAL) OR\r
2403                                 ;LENGTH OF LOW SEG IF GREATER\r
2404         ADDI    TAC1,(UUO)      ;ADD USER ADDRESS TO RELOCATION OF HIGH SEG\r
2405         MOVE    TAC,(TAC1)      ;GET CONTENTS OF THAT WORD\r
2406         JRST    CPOPJ1          ;OK RETURN\r
2407 \r
2408 ;ROUTINE TO FLAG SHARABLE SEGMENT AS NO LONGER SHARABLE AND RETURN\r
2409 ;DISK OR CORE IF POSSIBLE, THEN DISPATCH TO SERVICE ROUTINE TO DO RENAME\r
2410 ;CALL:  MOVE    DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
2411 ;       PUSHJ   PDP,RELSG1\r
2412 ;CALLED FROM RENAME\r
2413         INTERN  RELSG1\r
2414 \r
2415 RELSG1: PUSHJ   PDP,FNDSEG      ;DOES A KNOWN SEGMENT HAVE OLD NAME?\r
2416         JRST    DRN(DSER)       ;NO SO TRY RENAME\r
2417         PUSH    PDP,ITEM        ;YES,SAVE HIGH SEGMENT#\r
2418         PUSHJ   PDP,DRN(DSER)   ;ATTEMPT A RENAME\r
2419         JRST    IPOPJ           ;FAILURE\r
2420         POP     PDP,ITEM\r
2421         AOS     (PDP)           ;GIVE SUCCESS RETURN\r
2422         JRST    CLRNM1          ;CLEAR NAME AND DELETE DISK AND CORE IF ANY\r
2423                                 ;AND RETURN\r
2424 \r
2425 SEGEND: END\r
2426 \f\r