-FTHALT==-1\r
-TITLE SEGCON - HIGH SEGMENT CONTROL FOR REENTRANT USER PROGRAMMING V435\r
+TITLE SEGCON - HIGH SEGMENT CONTROL FOR REENTRANT USER PROGRAMMING V427\r
SUBTTL T. HASTINGS/TW/TNM/TH/AF/CHW/TW/RCC TS 22 DEC 69\r
-XP VSEGCN,434\r
+XP VSEGCN,427\r
;PUT VERSION NUMBER IN GLOB LISTING AND LOADER MAP\r
\r
;ALL OF THE CODE DEALING WITH THE SECOND RELOCATION REGISTER HAS BEEN ISOLATED\r
ASG3: AOBJN ITEM,ASG1 ;NO, KEEP LOOKING, FINISHED?\r
JUMPG ITEM,IPOPJ ;RETURN IF FINISHED AND RESTORE JOB NUMBER\r
TLZ ITEM,-1 ;CLEAR OUT LH BITS OF HIGH SEG NO.\r
- PUSHJ PDP,CLRNAM ;NOT FINISHED, CLEAR SEG NAME\r
+ PUSHJ PDP,CLRNM1 ;NOT FINISHED, CLEAR SEG NAME\r
;AND RETURN DISK SPACE IF NOT IN USE\r
JRST ASG3 ;CONTINUE SCAN, RESTORE TAC TO DEVICE NAME\r
\r
SKIPL JOBHCU(PROG) ;YES, IS A SSVE OR GET FOR EITHER SEG IN PROGRESS?\r
ANYSV1: SOJG ITEM,ANYSV0 ;NO, KEEP LOOKING, FINISHED?\r
JUMPLE ITEM,ANYSV2 ;YES, FIND A SAVE OR GET IN PROGRESS\r
- HRRZ TAC,JBTSGN(ITEM) ;NO, GET ITS HIGH NUMBER, IF ANY\r
- CAIE TAC,@(PDP) ;IS IT SAME AS HIGH SEG IN QUESTION?\r
+ HRRZ AC1,JBTSGN(ITEM) ;NO, GET ITS HIGH NUMBER, IF ANY\r
+ CAIE AC1,@(PDP) ;IS IT SAME AS HIGH SEG IN QUESTION?\r
; (INDIRECT AND INDEX BITS ALWAYS 0)\r
JRST ANYSV1 ;NO, KEEP LOOKING\r
PUSHJ PDP,ANYDEV ;YES, DOES THIS JOB HAVE\r
; ON A GET IF WE LEFT IT ON SWAPPING SPACE?\r
PUSHJ PDP,ZERSWP ;NO, NO NAME, SO DELETE DISK SPACE(IF ANY)\r
>\r
- MOVSI TAC,SNA ;FLAG HIGH SEG AS UNASSIGNED(OR DORMANT\r
+ MOVSI TAC,SNA!NSHF!NSWP! ;FLAG HIGH SEG AS UNASSIGNED(OR DORMANT\r
; IF STILL IN\r
; CORE OR DISK). TURN OFF NO SWAP AND NO SHUFFLE\r
; IN CASE ON BY ACCIDENT(SAVE NOT GO TO COMPLETION)\r
; RETURN ITEM,PROG PRESERVED\r
;CALLED FROM CLRNAM AND FRECOR\r
\r
- INTERN FTHALT\r
EXTERN CORTAL,JBTADR\r
\r
KDORCR: PUSH PDP,PROG ;SAVE R(EITHER HIGH OR LOW RELOC)\r
; (EVEN THOUGH THIS CALL TO CURHGH MAY BE FOR SOME\r
; OTHER JOB) SONCE HIGH SEG MAY BE IN NEW PLACE IN CORE\r
POP PDP,ITEM ;RESTORE HIGH SEG NUMBER AND RELOC FOR HIGH SEG IN CORE\r
- POPJ PDP, ;RETURN\r
+ JRST RPOG ;RETURN\r
\f;ROUTINE TO SEE IF SUM OF BOTH SEGMENTS WILL FIT INTO MAXIMUM SIZE\r
;OF PHYSICAL CORE TOGETHER\r
;CALL: MOVE TAC,REQUESTED LENGTH-1 OF SEG BEING ASSIGNED(LOW OR HIGH)\r
MOVEI TAC1,0 ;ASSUME NO HIGH SEG NUMBER\r
JUMPLE ITEM,SUM1 ;IS THERE NO HIGH SEG OR IS THIS A SPY SEG?\r
PUSHJ PDP,SEGSIZ ;TAC1=SIZE(IN J) OF HIGH OR LOW SEG\r
- ASH TAC1,12 ;CONVERT TO NUMBER OF WORDS(SEG NOT BEING ALLOCATED)\r
-SUM1: ADD TAC1,TAC ;ADD REQUEST(ORED 1777) TO LENGTH-1(OR 0) OF SEG NOT\r
+ LSH TAC1,12 ;CONVERT TO NUMBER OF WORDS(SEG NOT BEING ALLOCATED)\r
+SUM1: ADDI TAC1,(TAC) ;ADD REQUEST(ORED 1777) TO LENGTH-1(OR 0) OF SEG NOT\r
; BEING CHANGED\r
CAMGE TAC1,CORMAX ;WILL TOTAL SIZE-1 BE LESS THAN MAX SIZE\r
AOS -1(PDP) ;YES, OK RETURN\r
JUMPL ITEM,FREC2 ;YES, DID WE FIND A DORMANT OR IDLE SEG WITH CORE?\r
\r
\r
-IFE FTSWAP,<\r
- POP PDP,ITEM ;RESTORE JOB OR SEG. #\r
- JRST TPOPJ ;RESTORE CORE REQUEST AND RETURN\r
->\r
+;IFE FTSWAP,<\r
+; POP PDP,ITEM ;RESTORE JOB OR SEG. #\r
+; JRST TPOPJ ;RESTORE CORE REQUEST AND RETURN\r
+;>\r
\r
\r
-IFN FTSWAP,<\r
JSP DAT,OERROR ;NO, ERROR-CORTAB AND CORTAL DO NOT AGREE\r
; PRINT ON OPERATOR'S CONSOLE, DO NOT BLAME \r
; ANY PARTICULAR JOB\r
->\r
FREC2:\r
TLZ ITEM,-1 ;CLEAR OUT LH OF SEG NUMBER\r
IFN FTSWAP,<\r
\r
INTERN SETEXT\r
\r
-SETEXT: HRLZM TAC1,SGALOW(PROG) ;SAVE EXTENSION USER TYPED FOR LOW SEG\r
+SETEXT: HLLZM TAC1,SGALOW(PROG) ;SAVE EXTENSION USER TYPED FOR LOW SEG\r
MOVE TAC1,[SIXBIT /SHRHGH/] ;ASSUME SSAVE COMMAND(OR GET)\r
TLNE IOS,NSRBIT ;WAS IT?\r
MOVSS TAC1 ;NO, EXCHANGE ROLES OF EXTENSIONS, MUST\r
; BY CORE OR REMAP BY USER R)?\r
SKIPE USRDDT ;YES, IS USER USING DDT?\r
HRLM TAC1,JOBHRL(JDAT) ;YES, SET FIRST FREE TO BE FIRST WORD BEYOND END(REL)\r
- HLRZ TAC,JOBHRL(JDAT) ;GET CORRECT FIRST REL FREE LOC IN HIGH SEG\r
+ HLLZ TAC,JOBHRL(JDAT) ;GET CORRECT FIRST REL FREE LOC IN HIGH SEG\r
MOVNM TAC,SGALEN(PROG) ;SET LH=-NO. OF WORDS TO WRITE. RH=0\r
HLLOS SGALEN(PROG) ;SET RH=-1 IN CASE DECTAPE(USES RH TO COMPUT\r
; LENGTH=FIRST REL LOC-1\r
SETZM JOBDDT(JDAT) ;ALSO CLEAR DDT STARTING ADDRESS\r
SETZM USRDDT ;IN MONITOR PROTECTED AREA AS WELL AS JOBDAT\r
; IN CASE RETURN TO USER WITHOUT RESCHEDULING\r
- PUSHJ PDP,ADJCOR ;COMPUTE AMOUNT OF CORE FOR BOTH LO & HI SEGS\r
- ; FROM USER'S CORE ARG.(IF ANY)\r
- ; RETURNS WITH HI SEG # IN TAC\r
+ MOVE TAC,JBTSGN(ITEM)\r
HRRO TAC,JBTADR(TAC) ;ABSOLUTE ADDRESS OF HIGH SEG(LH=-1 FOR\r
; POPS SO NO PDL UNDERFLOW)\r
ADDI TAC,JOBPOP ;ADD POP OFFSET\r
; RETURN 1 - HIGH SEG OR FILE NOT FOUND\r
; RETURN 2 - HIGH SEG FOUND AND IN LOG ADR. SPACE(IN FACT ALSO IN CORE)\r
\r
- EXTERN NROOM1,DEVPHY,PJOBN,JOB,SGADAT,JOBPD1\r
+ EXTERN NROOM1,DEVPHY,PJOBN,JOB,SGADAT,sganew,JOBPD1\r
\r
GETSEG:\r
IFN FTDISK,<\r
MOVSI TAC1,SNA ;MAKE SURE THIS HIGH SEG IS FLAGGED AS IN USE\r
; IE SEG IN SOME USER'S LOG. ADR. SPACE\r
IORB TAC1,JBTSTS(ITEM) ;MAY HAVE BEEN JUST ASSIGNED OR DORMANT\r
+ PUSHJ PDP,INCCNT\r
+ JRST SETRL1\r
IFN FTSWAP,<\r
MOVE DAT,JBTSTS(TAC) ;JOB STATUS WORD\r
TLNN DAT,JXPN ;JOB WAITING TO EXPAND LOW OR HIGH SEG?\r
; OR WAITING TO EXPAND?\r
JRST SETRL0 ;YES, WAIT TILL HIGH SEG IN CORE TOO\r
>\r
-SHARE3: PUSHJ PDP,INCCNT ;NO, INCREMENT HIGH SEG IN-CORE COUNT FOR THIS\r
- ; JOB(TAC) IF NOT ALREADY INCREMENTED, RETURN\r
- ; WITH J = HIGH SEG NO.\r
-IFN FTHALT,<\r
- PUSHJ PDP,CHKTAL ;CHECK CORTAL WIT CORTAB, HALT IF DIFF.\r
->\r
- JRST SETRL1 ;SET HARD. AND SOFT. RELOC. AND SKIP RETURN\r
-\r
-SHRNRM: HRRZ TAC1,JOBPD1(JDAT) ;GET RETURN PC IN CASE THIS IS RUN UUO\r
- CAMLE TAC1,USRREL ;IS IT IN THE HIGH SEG WHICH IS NOW GONE ?\r
- HRRZS JOBPD1(JDAT) ;YES, TURN OFF USER MODE FLAG, SO ERROR\r
- ; WILL NOT LOOK FOR HALT AFTER UUO\r
- MOVE TAC,TAC1 ;SETUP NO. OF K NEEDED FOR MESSAGE\r
- JRST NROOM1 ;GO PRINT MONITOR MESSAGE AND STOP JOB\r
- ; OR ERROR RETURN TO LOW SEGMENT\r
- ; (UNLESS UUO HAS A HALT FOLLOWING IT)\r
\fSTONAM: MOVE DAT,JOB ;CURRENT JOB NUMBER\r
MOVSI ITEM,SHRSEG ;FLAG THIS USER AS USING A SHARABLE HIGH SEG\r
- IORB ITEM,JBTSGN(DSER) ;AND SETUP HIGH SEG NUMBER\r
+ IORB ITEM,JBTSGN(DAT) ;AND SETUP HIGH SEG NUMBER\r
MOVEM TAC,JBTDIR(ITEM) ;STORE DIRECTORY(OR PHY DEV NAM)>\r
MOVEM TAC1,JBTNAM(ITEM) ;STORE HIGH SEG FILENAME\r
MOVSI TAC,SHRSEG ;ALSO FLAG HIGH SEG ASSIGNED\r
SETRL1: AOS (PDP) ;SKIP RETURN(GETSEG,UCORHI,UREMAP)\r
JRST SETREL ;SET HARDWARE AND SOFTWARE RELOC INFO\r
; FOR CURENT JOB AND RESTORE R AND J\r
-\r
-;ROUTINE TO ADJUST USER'S CORE ARG. IN GET,R,RUN OR SAVE COMMANDS SO THAT\r
-; THE ARG. SUPPLIED IS THE TOTAL OF BOTH THE LO & HI SEGS. IF THERE IS NO\r
-; HI SEG THEN ARG. IS THE LO SEG SIZE AS IN NON-REENTRANT SYSTEMS.\r
-; IF THERE ARE BOTH LO & HI SEGS AND THE ARG. IS LESS THAN THE HI SEG + 1K\r
-; MANDATORY LO SEG SIZE THEN THE CORE ALLOCATION IS UNCHANGED.\r
-\r
-;CALL MOVE PROG,ADR. OF JOB DATA AREA\r
-; MOVE ITEM,JOB NO.\r
-; PUSHJ PDP,ADJCOR\r
-; ALWAYS RETURN WITH TAC=HI SEG #,TAC1 & U DESTROYED\r
-\r
-INTERN ADJCOR\r
-EXTERN SGANEW\r
-\r
-ADJCOR: SKIPN TAC,JBTSGN(ITEM) ;IS THERE A HI SEG ?\r
- POPJ PDP, ;EVIDENTLY NOT\r
- HLRZ TAC1,JBTADR(TAC) ;GET ITS SIZE\r
- SKIPE DAT,SGANEW(JDAT) ;WAS AN ARG. TYPED OF 0 OR NOT AT ALL ?\r
- SUBI DAT,1(TAC1) ;NO - COMPUTE LO SEG SIZE\r
- SKIPLE DAT ;MUST BE 1K OR GREATER!\r
- MOVEM DAT,SGANEW(PROG) ;STORE IT\r
- POPJ PDP, ;RETURN\r
-\f ; TO LOW SEG RELOC AND JOB NUMBER\r
-;TRY TO READ IN NON-SHARABLE FILE WITH EXTENSION .HGH\r
+ ; TO LOW SEG RELOC AND JOB NUMBER\r
+; skipn dat,jbtsgn(item)\r
+; popj pdp,\r
+; hlrz tac1,jbtadr(dat)\r
+; skipe dat,SGAnew(prog)\r
+; subi dat,1(tac1)\r
+; skiple dat\r
+; movem dat,SGAnew(tac1)\r
+; popj pdp,\r
+\f;TRY TO READ IN NON-SHARABLE FILE WITH EXTENSION .HGH\r
\r
TRYHGH: MOVSI TAC,(SIXBIT /HGH/) ;TRY LOOKUP WITH EXTENSION .HGH\r
PUSHJ PDP,SGH1 ;SET EXT AND E+3 OF LOOKUP BLOCK\r
J=ITEM ;CONTAINS JOB OR HIGH SEG NUMBER(SAME AC AS SWAP USES)\r
\r
IFN FTSWAP,<\r
- INTERN FININ\r
EXTERN JOBMAX,JBTSGN,SWPIN,JBTSTS,CPOPJ1,ZERSWP\r
- EXTERN IMGOUT,JBTSWP,FXSAT\r
-\r
-FININ: CAILE J,JOBMAX ;WAS A LOW SEG JUST SWAPPED IN?\r
- JRST FINHGH ;NO, HIGH SEG JUST SWAPPED IN, GO FINISH\r
- MOVEM J,SWPIN ;YES, SAVE JOB NUMBER(FOR FINHGH AND RETURN)\r
- SKIPG J,JBTSGN(J) ;DOES JOB HAVE A REAL HIGH SEG?\r
- JRST BOTHIN ;NO, GIVE NOTHING TO DO RETURN(MAYBE SPYSEG)\r
- SKIPN JBTADR(J) ;YES, IS HIGH SEG ALREADY IN CORE?\r
- ;(NOT POSSIBLE TO BE IN MIDDLE OF SWAPPING)\r
- POPJ PDP, ;NO, GIVE "SWAP-IN-HIGH-SEG" RETURN,\r
- ; AC J SET TO HIGH SEG NO.\r
- PUSHJ PDP,CHKIDL ;YES, CHECK IF THIS HIGH SEG IS IDLE(IF YES,\r
- ; DECREASE CORTAL=FREE+DORMANT+IDLE CORE\r
- ; BY SIZE IN J OF HIGH SEG SINCE IT WILL\r
- ; NO LONGER BE IDLE(IN CORE COUNT NON-ZERO)\r
-\r
- MOVE TAC,SWPIN ;RESTORE JOB NUMBER\r
- PUSHJ PDP,INCCNT ;INCREMENT HIGH SEG IN CORE COUNT\r
- ; FOR THIS JOB\r
-IFN FTHALT,<\r
- PUSHJ PDP,CHKTAL ;CHECK CORTAL WITH CORTAB, HALT IF DIFFER\r
->\r
-FINHGH: MOVSI TAC,SWP ;CLEAR SWAPPED OUT OR ON WAY FLAG FOR HIGH SEG\r
+\r
+FINHGH: MOVE J,SEGPTR\r
+ MOVSI TAC,SWP ;CLEAR SWAPPED OUT OR ON WAY FLAG FOR HIGH SEG\r
ANDCAM TAC,JBTSTS(J) ;AND CLEAR SUPPRESS IN-CORE COUNT INCREMENT FLAG\r
+ AOBJN J,SEGINI+2\r
+ POPJ PDP,\r
\r
TLNE J,UWPOFF ;IS USER MODE WRITE PROTECT(UWP) OFF\r
; FOR THIS USER?\r
\r
SRCSEG: MOVE ITEM,SEGPTR ;POINTER TO JUST HIGH SEGMENTS IN JOB TABLES\r
FNDLOP: CAMN TAC1,JBTNAM(ITEM) ;DO FILE NAMES MATCH?\r
- CAME TAC,PRJPRG(ITEM) ;YES, DO DIRECTORY NAMES MATCH?\r
+ CAME TAC,JBTDIR(ITEM) ;YES, DO DIRECTORY NAMES MATCH?\r
AOBJN ITEM,FNDLOP ;NO, KEEP LOOKING,FINISHED?\r
JUMPGE ITEM,CPOPJ ;YES, FINISHED?(IF YES, GIVE NOT FOUND RETURN)\r
HRLI ITEM,SHRSEG ;YES, THIS MUST BE A MATCH(FLAG SEG AS SHARABLE)\r