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