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