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