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