*COMDECK LDV
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.LDV - LOAD OVERLAY
          IPARAMS 
 OPSYS    MICRO  1,7,*"OS.NAME"_"OS.VER"* 
*CALL CMMCOM
          COMMENT  "SUBSYS"LOAD OVERLAY.
          B1=1
 CMM.LDV  SPACE  4
***       CMM.LDV - LOAD OVERLAY. 
* 
* 
*              FIRST, IF THE FWA FIELD OF THE PARAMETER AREA IS 
*         NON-ZERO, THE AREA FROM THIS FWA TO HHA IS REGARDED AS
*         BEING -UNLOADED- BY THIS CALL, AND ANY UNLOAD-ACTION
*         SUBROUTINES PENDING UPON ANY PORTION OF THIS AREA ARE CALLED. 
*              NEXT, THE OVERLAY LOADING OPERATION AS SPECIFIED BY
*         THE PARAMETER AREA IS PERFORMED.  CMM ASSURES THAT THE
*         CONTENTS OF ALL ACTIVE BLOCKS ARE UNAFFECTED BY THIS
*         OPERATION.  FOLLOWING THE OVERLAY LOADING, DABA IS RESET
*         JUST PAST THE LOADED OVERLAY (I.E., DABA IS SET TO THE
*         MINFL FROM THE LOADED OVERLAY PLUS -DELTA-, WHERE DELTA IS
*         ZERO IF THERE IS NO PARAMETER AREA FWA, OR IS THE PARAMETER 
*         AREA FWA MINUS THE FWA FROM THE OVERLAY OTHERWISE).  IN 
*         ADDITION, IF A (0,0) OVERLAY WAS LOADED, THEN HHA IS RESET
*         TO THE VALUE FROM THE LOADED OVERLAY. 
*              CONTROL RETURNS TO THE USER FOLLOWING THE COMPLETION 
*         OF THESE ACTIONS (I.E., EVEN IF RECALL IS NOT SPECIFIED 
*         ON THE ORIGINAL MACRO, THE EFFECT IS AS IF IT HAD BEEN
*         SPECIFIED).  THE -E- BIT IN THE PARAMETER AREA IS HONORED,
*         I.E. IF SET, CONTROL WILL BE TRANSFERRED TO THE LOADED
*         OVERLAY, NOT RETURNED TO THE CALLER.  THE -LWA- PARAMETER 
*         IS ALSO HONORED, I.E. AN ERROR WILL RESULT IF THE OVERLAY 
*         DOES NOT FIT. 
* 
*         ENTRY  (X1) = PARAMETER AREA FWA. 
*                THE PARAMETER AREA IS SET UP AS SPECIFIED. 
* 
*         EXIT   THE PARAMETER AREA IS SET UP WITH THE SPECIFIED
*                RETURNS. 
* 
*         SAVES  X - 0, 2, 3, 4, 5, 7.
*                B - ALL. 
*                A - 0. 
  
  
          CMMENT  LDV 
 CMM.LDV  EQ     *+400000B   ENTRY / EXIT 
  
*         SAVE REGISTERS IN THE SECONDARY AREA (I.E., THE AREA THEY 
*         ARE TO BE SAVED IF IN OVERFLOW MODE.  AFTER CMM.ICM HAS 
*         BEEN CALLED AND A0 IS SET = FL, IT IS THEN, AND ONLY THEN,
*         POSSIBLE TO DETERMINE WHETHER OR NOT IN OVERFLOW MODE.  IF
*         NOT, THE SAVED REGISTER CONTENTS ARE MOVED TO PRIMARY SAVE
*         AREA IN HIGH CORE.  THESE MUST BE PUT THERE, SINCE, LIKE
*         ANYTHING ELSE AT THIS TIME, THEY MIGHT GET OVERLAID BY THE
*         OVERLAY LOAD. 
  
          SA7    SECREGSV+14  SAVE X7 
          SX7    B1-B0       HOLD B1 IN X7
          SB1    1           (B1) = 1 
          SX6    B2-B0       SAVE B2
          SA6    A7-B1
          SX6    B3-B0       SAVE B3
          SA6    A6-B1
          SX6    B4-B0       SAVE B4
          SA6    A6-B1
          SX6    B5-B0       SAVE B5
          SA6    A6-B1
          SX6    B6-B0       SAVE B6
          SA6    A6-B1
          SX6    B7-B0       SAVE B7
          SA6    A6-B1
          BX6    X0          SAVE X0
          SA6    A6-B1
          BX6    X2          SAVE X2
          SA6    A6-B1
          BX6    X3          SAVE X3
          SA6    A6-B1
          BX6    X4          SAVE X4
          SA6    A6-B1
          BX6    X5          SAVE X5
          SA6    A6-B1
          SX6    A0-B0       SAVE A0
          SA6    A6-B1
          SA7    A6-B1       SAVE B1
          SX7    X1          SAVE ENTRY INFORMATION 
          SA7    A7-B1
          RJ     =XCMM.ICM   INITIALIZE AND SET A0
          SA1    SECREGSV    SAVE ARG IN PROPER PLACE 
          BX6    X1 
          SB2    X1          (B2) = PARAM 
          SA6    A0-PARAM 
          SA2    A0-OVERFLOW
          NZ     X2,LDV2     IF IN OVERFLOW MODE
          SX1    14           ? (X1) = NUMBER OF REGISTERS TO MOVE
          SX2    A1+B1        ? (X2) = LOWEST SAVED REG EXCLUDING X1
          SX3    A0-REGSAVE-13  ? (X3) = LOWEST OF 14 SAVE WORDS
          RJ     =XMVE=      -- MOVE DATA --
 LDV2     SA1    CMM.LDV     SAVE RETURN ADDRESS
          LX1    30 
          BX6    X1 
          SA6    A0-MNRETURN
          SX7    3RLDV       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
  
*         INITIAL ERROR CHECKS. 
  
 IS       IFSAFE
          SA1    A0-IMAPM 
          SA2    A0-IMAUA 
          ZR     X1,LDV202
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 LDV202   ZR     X2,LDV204
          UERR   CMEUAR,0    CALLED FROM UNLOAD-ACTION SUBR 
  
 LDV204   BSS    0
 IS       ENDIF 
  
*         PROCESS UNLOAD-ACTION.
  
          SA4    B2+B1
          SX4    X4          (X4) = FWA FROM REQUEST
          SX1    CMEZFWA     SET FOR ERROR -- 
          MX2    0            FWA = 0 WITH PENDING UNLOAD-ACTION
          ZR     X4,LDV10    IF FWA NOT SPECIFIED IN REQUEST
          SA5    HHA         (X5) = HHA 
          SX5    X5 
  
 IS       IFSAFE
          IX6    X4-X5
          MI     X6,LDV206
          UERR   CMEHHA      FWA GE HHA 
  
 LDV206   BSS    0
 IS       ENDIF 
  
          SX7    =YCMM.PUA
  
          IFSAFE  2 
          SX1    CMENEED     SET FOR ERROR -- 
          SX2    3RPUA        CMM.PUA NEEDED, BUT NOT PRESENT 
          MI     X7,LDV10    IF UNLOAD-ACTION CODE NOT PRESENT
          BX1    X4           ? (X1) = FWA FROM REQUEST 
          SX2    X5+B1        ? (X2) = LWA OF UNLOADED AREA = HHA+1 
          RJ     =YCMM.PUA   -- PROCESS UNLOAD ACTION --
          EQ     LDV14
  
 LDV10    BSS    0
  
 IS       IFSAFE
          SA4    A0-P.UAS 
          AX4    18 
          ZR     X4,LDV14    IF NO UNLOAD-ACTION SUBRS
          UERR   X1,X2       ONE OF TWO ERRORS
  
 IS       ENDIF 
  
*         MAKE SURE NO BLOCKS ARE PRESENT BELOW HHA.  THERE WILL NOT
*         BE ANY FIXED BLOCKS, UNLESS THEY ARE OF GROUP-TYPE 1, AND 
*         THIS IS AN ERROR, SINCE THEY ARE SUPPOSED TO BE FREED BEFORE
*         AN INCREASE IN DABA.  ANY GROUP-TYPE 0 VARIABLE BLOCKS
*         MUST BE MOVED UP. 
  
 LDV14    SA1    HHA
          SX6    A0          SET FL UP ABOVE HHA, IF CURRENTLY LESS 
          SX4    X1+B1
          SA2    A0-B1       MINIMUM ALLOWABLE
          SX3    A0           = (HHA+1) + (INTERNAL AREA SIZE)          000110
          IX2    X3-X2
          IX4    X4+X2
          IX6    X6-X4       (CURRENT FL) - (MINIMUM ALLOWABLE) 
          BX4    -X6         NEEDED INCREASE IF PL
          PL     X6,LDV15    IF INCREASE NOT NECESSARY
          RJ     =XCMM.CFL   -- CHANGE FIELD LENGTH --
 LDV15    SA1    HHA
          SA2    RA65 
          SX1    X1 
          SX2    X2 
          IX3    X1+X2
          ZR     X3,LDV20    IF DABA = HHA
  
 IS       IFSAFE
          SA3    A0-P.GID    VERIFY NO GROUP-TYPE 1 PRESENT 
          SA4    X3+B1
          AX3    18 
          SB7    X3 
 LDV210   ZR     B7,LDV211   IF ALL GROUP-ID ENTRIES EXAMINED 
          SA4    A4-B1
          SB7    B7-B1
          PL     X4,LDV210   IF GROUP-TYPE 0
          SB4    X4 
          ZR     B4,LDV210   JP IF GROUP EMPTY - IS OK
          UERR   CMENGT1     GROUP-TYPE 1 BLOCKS ILLEGALLY ACTIVE 
  
 LDV211   BSS    0
 IS       ENDIF 
  
          BX2    -X2
          SB7    X1+B1       (B7) = HHA+1 
          SA3    X2+B1
          MI     X3,LDV16    IF LOWEST REGION NOT FREE
          SB4    X3          (B4) = LWA+1 OF REGION 
          GE     B4,B7,LDV18  IF FREE REGION EXTENDS PAST HHA+1 
 LDV16    BSS    0
  
 IS       IFSAFE
          SX2    =YCMM.RLS
          PL     X2,LDV213
          UERR   CMENEED,3RRLS  CMM.RLS NEEDED, BUT NOT PRESENT 
  
 LDV213   BSS    0
 IS       ENDIF 
  
          SX1    B7          (X1) = HHA+1 
          RJ     =YCMM.RLS   -- RELEASE LOWER SPACE --
  
*         SET DABA = HHA AND SET HEADERS ACCORDINGLY. 
  
 LDV18    SA2    RA65        SET DABA = HHA 
          MX4    42 
          BX6    X4*X2
          SX2    X2 
          SA1    HHA         (B7) = HHA+1 
          SB7    X1+B1
          BX3    -X1
          BX3    -X4*X3 
          BX6    X6+X3
          SA6    A2 
          SX7    A0          SET FL AT NEW DABA 
          MX3    2
          BX6    -X2         OLD DABA 
          SA5    X6+B1       HEADER AT (OLD DABA) + 1 
          BX7    X3+X7
          SA7    X1 
          SA3    B7          ADJUST BKD OF HDR IN CASE AT HHA+1 
          LX4    18 
          BX6    X4*X3
          SX0    X1 
          LX0    18 
          BX6    X6+X0
          SA6    A3 
          SB4    X5          LWA+1 OF 1ST REGION
          EQ     B4,B7,LDV20  IF NEXT REGION STARTS EXACTLY AT HHA+1
          SX6    B4          FORM NEW FREE REGION HEADER TO GO AT HHA+1 
          BX6    X6+X0
          SA6    B7 
          SA3    B4          ADJUST BKD IN NEXT HEADER
          IX2    X1+X2       (NEW DABA) - (OLD DABA)
          LX2    18 
          IX7    X3+X2
          SA7    A3 
  
*         NOTE - MUCH OF THE FOLLOWING PROCESSING, INCLUDING THE SETTING
*         UP OF THE EXTENSION WORD, IS NEEDED ONLY ON THE NOS-BE
*         SYSTEM, BUT IS DONE THE SAME ON ALL SYSTEMS FOR 
*         THE SAKE OF COMMONALITY, AND SHOULD NOT HURT ANYTHING ON
*         THE OTHER SYSTEMS.
* 
*         BEGIN PREPARATION FOR ISSUING THE OVERLAY LOAD REQUEST. 
*         ANYTHING THAT IS WANTED TO BE SAVED AFTER THE CALL IS MADE
*         MUST BE STORED EITHER IN THE STANDARD HIGH-CORE STORAGE 
*         OR IN THE BOOTSTRAP CODE WHICH WILL BE MOVED INTO THE 
*         CMM INTERNAL BLOCK P.BOOT AND EXECUTED FROM THERE.  THE 
*         BOOTSTRAP MUST INCLUDE ALL CODE EXECUTED IN COMPLETING
*         THE CMM.LDV REQUEST AFTER THE OVERLAY LOAD HAS BEEN ISSUED, 
*         SINCE THE INCOMING OVERLAY MAY OVERWRITE EVERYTHING.
*         HOWEVER, AS WILL BE THE CASE THE MAJORITY OF THE TIME, THE
*         BOOTSTRAPPING WILL NOT TAKE PLACE IF THE FWA IS KNOWN AND 
*         IS GREATER THAN THE UPPER BOUND OF THE CMM.LDV ROUTINE. 
*         NOTE THAT THE UPPER BOUND OF CMM.LDV AS THE CRITERIA MEANS
*         THAT NO EXTERNALS MAY BE CALLED AFTER THE LOAD, SINCE THE 
*         VALUES AS SET MAY NO LONGER BE VALID. 
  
 LDV20    SA1    HHA         SAVE HHA 
          SX6    X1 
          SB7    X1          (B7) = HHA 
          SA6    A0-PREVHHA 
          SA1    B2          MOVE USER REQUEST TO BOOTSTRAP AREA
          BX7    X1 
          SA7    BSPARAM
          SA2    B2+B1       (X6) = WORD 1
          BX6    X2 
          SA3    A2+B1       WORD 2, IF PRESENT 
          BX7    X3 
          SA7    A7+2 
          SA4    A3+B1       WORD 3, IF PRESENT 
          BX7    X4 
          SA7    A7+B1
          MX7    0           SET FOR E-BIT = 0
          LX2    59-36
          PL     X2,LDV22    IF E-BIT = 0 
          SX7    B1          SET FOR E-BIT = 1
          MX1    1           CLEAR E-BIT IN REQUEST TO BE ISSUED
          BX6    -X1*X2 
          LX6    36-59
 LDV22    SX1    B1          SET D-BIT
          SA7    A0-EBIT     SAVE E-BIT FLAG
          LX1    43-0 
          BX6    X6+X1
          LX1    44-43       CLEAR S-BIT
          BX6    -X1*X6 
          LX6    -46         (X0) = N FROM REQUEST
          MX0    -2 
          BX0    -X0*X6 
          LX6    46-18       LOOK AT LWA FROM REQUEST 
          SB6    X6 
          ZR     B6,LDV24    IF LWA NOT SPECIFIED 
          LE     B6,B7,LDV25  IF LWA @ HHA
 LDV24    SX3    B7          SET LWA = HHA
          MX7    42 
          BX6    X7*X6
          BX6    X6+X3
 LDV25    LX6    18 
          SA6    BSPARAM+1   STORE WORD 1 
  
*         DETERMINE WHETHER OR NOT IT IS NECESSARY TO USE THE BOOTSTRAP.
*         IF SO, SET ASIDE THE SPACE FOR IT IN P.BOOT.
  
          MX7    0           SET FOR NO BOOTSTRAPPING 
          SB5    X6          (B5) = FWA FROM REQUEST
          SB3    LDV9999     END OF CMM.LDV ROUTINE 
          GE     B5,B3,LDV26  IF ENTIRE LOADABLE AREA > ROUTINE END 
          SA2    A0-OVERFLOW
          NZ     X2,LDV26    IF IN OVERFLOW MODE, CANNOT OVERWRITE
          SX1    P.BOOT       ? BLOCK NUMBER
          SX2    BOOTFN-BOOTST  ? SIZE OF BOOTSTRAP CODE
          SX7    X2 
          RJ     =XCMM.CIA   -- CHANGE INTERNAL AREA -- 
 LDV26    SA7    A0-BS       SET BOOTSTRAP SIZE OR ZERO 
          SA1    BSPARAM+1   REQUEST WORD 1 
          SB5    X1          (B5) = FWA FROM REQUEST
          NZ     B5,LDV40    IF NOT TO USE EXTENSION WORD 
  
*         SEARCH ENTIRE DYNAMIC AREA TO FIND THE LARGEST FREE AREA
*         AND SET UP EXTENSION WORD SO AS TO INFORM THE OVERLAY LOADER
*         THAT THIS AREA MAY BE USED AS A WORK-SPACE, IF NECESSARY. 
  
          SX6    B1          SET S-BIT TO INDICATE THAT EXTENSION 
          LX6    44-0         WORD BEING USED 
          BX6    X6+X1
          SA6    A1 
          MX4    0           SET INITIAL LARGEST WORK-SPACE 
          SA2    HHA         START AT HHA+1 
          SB3    X2+B1
 LDV28    ZR     B3,LDV35    IF ALL REGIONS EXAMINED
          SA1    B3 
          SB3    X1 
          SB5    A1+B1       (B5) = FWA OF AVAILABLE SPACE
          MI     X1,LDV29    IF NOT A FREE REGION 
          SX3    B3-B5       (X3) = (FREE REGION SIZE) - 1
          EQ     LDV32       GO COMPARE FOR LARGEST 
  
 LDV29    ID     X1,LDV28    IF FIXED BLOCK 
          LX1    -36         INITIALIZE VP REGION SEARCH
          SB4    X1 
          LX1    36 
          SX3    B4-B5       (X3) = FREE SPACE BEFORE 1ST VP BLOCK
          SX3    X3-1 
          EQ     LDV32       GO COMPARE FOR LARGEST 
  
 LDV30    ZR     B4,LDV28    IF ALL GAPS IN VP REGION EXAMINED
          SA2    B4 
          SB4    X2 
          SB5    A2+4        (B5) = FWA OF AVAIL SPACE
          SX3    B4-B5       (X3) = FREE SPACE BETWEEN BLOCKS 
          NZ     B4,LDV31    IF NOT LAST BLOCK IN REGION
          SX3    B3-B5       (X3) = FREE SPACE AFTER LAST BLOCK 
 LDV31    AX2    36          REDUCE BY BLOCK LENGTH 
          SX2    X2 
          IX3    X3-X2
 LDV32    IX6    X3-X4
          MI     X6,LDV33    IF THIS ONE NOT LARGEST SO FAR 
          BX4    X3          SET SIZE OF LARGEST WORK-SPACE 
          SX5    B5          SET ADR OF LARGEST WORK-SPACE
 LDV33    MI     X1,LDV30    IF CHECKING WITHIN A VP REGION 
          EQ     LDV28       DO NEXT REGION 
  
 LDV35    LX4    30          FORM EXTENSION WORD
          BX7    X4+X5
          MX2    1           SET R-BIT = 1 TO MEAN 2ND TRY
          BX7    X2+X7
          SA7    X0+BSPARAM+2  STORE AT WORD 2, 3, OR 4 
  
*         IF THE BOOTSTRAP IS TO BE USED, IT IS NOW RELOCATED, MOVED, 
*         AND ENTERED.  OTHERWISE, THE SAME CODE IS SIMPLY EXECUTED IN
*         PLACE AS IS.
  
 LDV40    SA1    A0-BS        ? SIZE OF BOOTSTRAP CODE OR ZERO
          ZR     X1,LDV50    IF NOT USING BOOTSTRAP 
          SB3    BOOTST      (B3) = FWA OF BOOTSTRAP BEFORE BEING MOVED 
          SA2    A0-B1       (B4) = FWA AFTER MOVE = ENTRY ADDRESS
          SB4    X2+B1
          SX2    B3           ? (X2) = FWA BEFORE MOVE
          SX3    B4           ? (X3) = FWA AFTER MOVE 
          RJ     =XMVE=      -- MOVE DATA --
          SX0    B4-B3       (X0) = (B7) = RELOCATION AMOUNT
          SB7    X0 
          SA2    RELOC-1     RELOCATE BOOTSTRAP 
 LDV45    SA2    A2+B1       NEXT TABLE ENTRY 
          ZR     X2,LDV46    IF DONE
          SA3    X2+B7       WORD BEING RELOCATED 
          AX2    18 
          SB5    X2          POSITION DESIGNATOR
          LX6    X0,B5
          IX6    X6+X3       RELOCATE 
          SA6    A3 
          EQ     LDV45       LOOP 
  
 LDV46    JP     B4          ENTER BOOTSTRAP CODE 
  
*         MACRO TO FORM ENTRY IN RELOCATION TABLE.
  
 R        MACRO 
          LOCAL  POS#,LOC#
 POS#     SET    $-29 
 LOC#     SET    *
          IFEQ   $,14,2 
 POS#     SET    30 
 LOC#     SET    *+1
 RELOC    RMT 
          VFD    42/POS#,18/LOC#
 RELOC    RMT 
 R        ENDM
  
*         -- BEGINNING OF BOOTSTRAP CODE. 
  
 BOOTST   BSS    0
 LDV50    R 
          SX4    BSPARAM
 OS       IFC    NE,*"OPSYS"*SCOPE 2* 
          SX6    3RLDV       FORM LDV REQUEST AND ISSUE IT
          PX6    X6 
          LX6    42 
          BX6    X6+X4
          R 
          RJ     SYS
 OS       ELSE
 S2       IFNE   $,59 
 LDV50#   SET    *+1
 S2       ELSE
 LDV50#   SET    *
 S2       ENDIF 
 RELOC    RMT 
          VFD    42/0,18/LDV50# 
 RELOC    RMT 
          LOADREQ  BSPARAM,RCL  ISSUE LOADER REQUEST
 OS       ENDIF 
          SA1    X4+B1
          LX1    59-36
          R 
          PL     X1,LDV52    IF NO FATAL ERROR
          SA2    A0-EBIT
          R 
          ZR     X2,LDV120   IF E-BIT WAS NOT SET IN ORIGINAL REQUEST 
 OS       IFC    NE,*"OPSYS"*SCOPE 2* 
          SX6    4RABTP/16   FORM ABT REQUEST AND ISSUE IT
          LX6    40 
          R 
          RJ     SYS
 OS       ELSE
          ABORT              LOADER WOULD ABORT IN THIS CASE
 OS       ENDIF 
  
 LDV52    BSS    0
  
 IS       IFSAFE
          SA3    RA66        (X3) = FWA OF NEW OVERLAY
          SA4    X3          (X4) = OVERLAY HEADER
          MX6    6
          BX6    X6*X4
          LX6    6
          SX6    X6-54B 
          R 
          ZR     X6,LDV215   IF 54-TABLE PRESENT
          UERR   CMEN54,0    NON-54-TABLE OVERLAY LOADED
  
 LDV215   BSS    0
 IS       ENDIF 
  
          SA2    RA65        (X2) = NEW MINFL  (WAS SET BY LOADER)
          BX6    X2 
          SX2    X2 
  
 IS       IFSAFE
          IX3    X1-X2
          R 
          PL     X3,LDV217
          UERR   CMEHHA,0    LWA GT HHA 
  
 LDV217   BSS    0
 IS       ENDIF 
  
          MX7    42          SET NEW DABA IN RA+65 (-)
          BX6    X7*X6
          BX3    -X2
          BX3    -X7*X3 
          BX6    X6+X3
          SA6    A2 
          SA1    A0-PREVHHA  (X1) = PREVIOUS (OR SAME) HHA
          IX5    X1-X2
          R 
          ZR     X5,LDV120   IF NEW DABA = HHA
          SX6    A0          STORE FL AT NEW DABA 
          MX3    2
          BX6    X3+X6
          SA6    X2 
          SA4    X1+B1
          R 
          MI     X4,LDV118   IF 1ST REGION NOT FREE 
          SA3    X4          ADJUST BKD IN NEXT HEADER TO POINT TO
          LX5    18           NEW, SINGLE FREE REGION BEGINNING AT
          IX6    X3-X5         NEW DABA+1 
          SA6    A3 
          SX7    X4          SET NEW FREE REGION HEADER AT NEW DABA+1 
          BX3    X2 
          LX3    18 
          BX7    X7+X3
          SA7    X2+B1
          R 
          EQ     LDV120 
  
 LDV118   SX5    X5-1        SET BKD TO POINT TO NEW FREE REGION
          LX5    18 
          IX6    X4-X5
          SA6    A4 
          SX7    A4          SET NEW FREE REGION HEADER AT DABA+1 
          BX6    X2 
          LX6    18 
          BX7    X6+X7
          SA7    X2+B1
  
*         IF THE BOOTSTRAP WAS USED, SET THE INTERNAL TABLE POINTERS
*         SO AS TO MAKE P.BOOT LENGTH = 0.  NOTE THE FOLLOWING: 
* 
*         1) CMM.CIA IS NOT USED, SINCE IT MAY HAVE BEEN OVERLAYED BY 
*            THE NEW OVERLAY.  THIS STEP ALSO HAPPENS TO BE EASY. 
*         2) IT DOES NOT HURT TO FREE THE P.BOOT SPACE, EVEN THOUGH 
*            THE BOOTSTRAP IS STILL EXECUTING, SINCE NO ADDITIONAL
*            SPACE WILL BE REQUESTED BEFORE THE COMPLETION OF THIS
*            ROUTINE. 
  
 LDV120   SA2    A0-B1
          ERRNZ  P.BOOT-2 
          SA1    A2-B1       SET P.BOOT LENGTH = 0
          SX6    X1 
          SA6    A1 
          IX1    X6-X2
          R 
          ZR     X1,LDV125   IF BOOTSTRAP NOT USED
          SA6    A2          ADVANCE P.ENDZ BY BOOTSTRAP SIZE 
          SA3    X2          CURRENT TRAILER
          BX7    X3          MOVE UP TO NEW POSITION
          LX3    -18         FETCH PREVIOUS HEADER
          SA4    X3 
          SA7    X6 
          R 
          ID     X4,LDV122   IF HIGHEST REGION IS A FIXED BLOCK 
          IX7    X4+X1       ADVANCE FWD IN PREVIOUS HEADER 
          SA7    A4 
          R 
          EQ     LDV123 
  
 LDV122   SX7    A4          FORM FREE REGION AT PREV LOC OF TRAILER
          LX7    18 
          BX7    X7+X6
          MX0    2
          SA7    A3 
          LX2    18          FORM NEW TRAILER 
          BX7    X0+X2
          SA7    X6 
 LDV123   SA2    A0-CURALL   REDUCE CURRENT AMOUNT ALLOCATED
          IX6    X2-X1
          SA6    A2 
          SA3    A0-MAXALL   SET MAXALL = MAX(CURALL,MAXALL)
          IX6    X3-X2
          BX3    X3-X2
          AX6    59 
          BX3    -X6*X3 
          BX6    X3-X2
          SA6    A3 
  
*         SET RETURN FOR THE CASE WHERE THE E-BIT WAS SET.
  
 LDV125   R 
          SA4    BSPARAM+1   SET RETURN TO ENTRY ADDRESS FROM REPLY WORD
          SX4    X4 
          LX4    30 
          R=     X3,2 
          LX3    54 
          BX6    X3+X4
          R 
          SA6    LDV140 
  
*         IF THE E-BIT WAS NOT SET, SET THE RETURN ACCORDINGLY AND
*         MOVE THE REPLY WORDS BACK TO THE USER AREA. 
  
          SA1    A0-EBIT
          R 
          NZ     X1,LDV130   IF E-BIT WAS SET 
          SA2    A0-MNRETURN  SET FOR RETURN THRU ENTRY POINT 
          BX6    X2 
          LX6    30 
          SA6    A6 
          SA3    A0-PARAM 
          SA4    A4-B1       1ST WORD 
          BX6    X4 
          SA6    X3 
          SA4    A4+B1       2ND WORD 
          BX6    X4 
          SA6    A6+B1
          AX4    46-0        N FIELD
          MX0    -2 
          BX0    -X0*X4 
          SB7    X0 
 LDV127   R 
          ZR     B7,LDV130   WORDS 3, 4, IF PRESENT 
          SA4    A4+B1
          BX6    X4 
          SA6    A6+B1
          SB7    B7-B1
          R 
          EQ     LDV127 
  
*         RESTORE REGISTERS.
  
 LDV130   SA2    A0-OVERFLOW
          R 
          SA1    SECREGSV+14  SECONDARY SAVE AREA 
          R 
          NZ     X2,LDV131   IF IN OVERFLOW MODE
          SA1    A0-REGSAVE  PRIMARY SAVE AREA
 LDV131   BX7    X1          RESTORE X7 
          SA1    A1-B1       RESTORE B2 
          SB2    X1-0 
          SA1    A1-B1       RESTORE B3 
          SB3    X1-0 
          SA1    A1-B1       RESTORE B4 
          SB4    X1-0 
          SA1    A1-B1       RESTORE B5 
          SA2    A1-B1       RESTORE B6 
          SB5    X1-0 
          SB6    X2-0 
          SA1    A2-B1       RESTORE B7 
          SB7    X1-0 
          SA1    A1-B1       RESTORE X0 
          BX0    X1 
          SA2    A1-B1       RESTORE X2 
          SA3    A2-B1       RESTORE X3 
          SA4    A3-B1       RESTORE X4 
          SA5    A4-B1       RESTORE X5 
          SA1    A5-B1       RESTORE A0 
          SA0    X1-0 
          SA1    A1-B1       RESTORE B1 
          SB1    X1-0 
          R 
          RJ     *+1         VOID INSTRUCTION STACK 
 +        EQ     *
  
*         THE FOLLOWING JUMP HAS BEEN PLUGGED TO HANDLE THE FINAL EXIT. 
  
 LDV140   JP     *+1         RETURN TO CALLER 
  
 OS       IFC    NE,*"OPSYS"*SCOPE 2* 
 SYS      PS
 SYS1     SA1    B1          WAIT RA+1
          R 
          NZ     X1,SYS1
          SA6    A1          ISSUE SYSTEM REQUEST 
 SYS2     SA1    A1          WAIT RA+1
          R 
          NZ     X1,SYS2
          R 
          EQ     SYS
  
 OS       ENDIF 
  
  
 PARAM    EQU    MNARG1      SAVE AREA FOR PARAMETER ADDRESS
 EBIT     EQU    MNARG2      NZ IF E-BIT WAS SET IN REQUEST 
 BS       EQU    MNARG3      SIZE OF BOOTSTRAP OR ZERO IF NOT USED
 PREVHHA  EQU    MNARG4      HHA BEFORE OVERLAY LOAD
 SECREGSV BSS    15          SECONDARY REGISTER SAVE AREA 
 BSPARAM  BSS    5           PARAMETER AREA USED TO ISSUE REQUEST 
 RELOC    BSS    0           RELOCATION TABLE 
 RELOC    HERE
          CON    0           END OF TABLE 
          CON    0           WORD OF PADDING WHERE TRAILER GETS STORED
 BOOTFN   BSS    0           END OF BOOTSTRAP CODE
 LDV9999  BSS    0           END OF CMM.LDV 
  
