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