*COMDECK LOADREL
 REL      TITLE  SELF-RELOCATION ROUTINE. 
**        + + + + + + + + + + + + + + + 
*         + SELF-RELOCATION ROUTINE.  + 
*         + + + + + + + + + + + + + + + 
* 
* 
*              THE COMMON DECK *LOADREL* IS CALLED TO GENERATE THE SELF-
*         RELOCATION CODE WHICH IS NEEDED AT THE END OF THE USER-CALL 
*         PROGRAMS *LOADU*, *LOADUC*, AND *LOADUM*.  REFER TO THE 
*         SECTION ON THE SELF-RELOCATION MACROS AT THE BEGINNING OF THE 
*         *LOAD* IMS. 
* 
*              THIS CODE IS ENTERED IMMEDIATELY AFTER THE LOADING OF
*         ANY OF THE ABOVE PROGRAMS.  ON ENTRY, THE B7 REGISTER 
*         CONTAINS THE BASE ADDRESS OF THE PROGRAM.  NOTE THAT THE
*         REGISTERS A0, X0, AND X6 CONTAIN ENTRY INFORMATION FOR
*         *LOADU* AND MUST BE PRESERVED.
* 
*              PROCESSING IS AS FOLLOWS 
* 
  
 RELTABLE RMT 
          CON    0
 RELTABLE RMT 
  
**        1)   THE FIELDS NECESSARY TO BE RELOCATED IN ORDER TO EXECUTE 
*              A SEQUENCE OF CODE WHICH FETCHES THE CPU TIME ARE
*              RELOCATED.  THEN THE CODE IS EXECUTED AND THE TIME IS
*              SAVED. 
* 
  
 REL      SX5    B7-OVLYFWA+BASE   SET BASE ADDRESS 
          SA1    X5+TIME1    RELOCATE 1ST INSTRUCTIONS
          IX7    X1+X5
          SA2    X5+TIME2 
          SA7    A1 
          SB2    X5          (B2) = BASE ADDRESS
          IX7    X2+X5
          SA3    X5+TIME3 
          SA7    A2 
          IX7    X3+X5
          SA1    X5+TIME4 
          SA7    A3 
          IX7    X1+X5
          SA2    X5+REL2
          SA7    A1 
          SB1    1           (B1) = 1 
          IX7    X2+X5
          SA7    A2 
          JP     B2+TIME1    VOID INSTRUCTION STACK 
  
*         NOTE - THE FETCHING OF THE TIME HAS BEEN PLACED IN THIS 
*         SEEMINGLY AWKWARD PLACE IN ORDER THAT IT INCLUDE THE TIME TO
*         PERFORM THE SELF-RELOCATION FUNCTION.  AS A RESULT, THERE 
*         ARE 5 LOCATIONS BELOW WHICH MUST HAVE THEIR ONE RELOCATABLE 
*         ADDRESS FIELD IN THE LOWER 18 BITS - TIME1, TIME2, TIME3, 
*         TIME4, REL2.
  
 TIME1    SX4    3RTIM       FORM CALL TO FETCH ELAPSED CPU TIME
          SX7    TM 
          LX4    42 
          SB7    LTAB1       (B7) = LENGTH OF 1ST RELOCATION TABLE
          BX7    X4+X7       (CODE TO BITS 24-35 = 0) 
          IFEQ   LOADREL',0,1 
 TIME2    SA7    B1          MAKE *TIM* REQUEST 
          IFNE   LOADREL',0,1 
 TIME2    NO                 NOT INITIAL ENTRY - DO NOT ISSUE 
          SX1    B1          FORM CALL TO FETCH REAL-TIME 
          SX7    RTM
 TIME3    SA2    B1          WAIT RA+1
          BX7    X4+X7
          NZ     X2,TIME3 
          LX1    26          (CODE TO BITS 24-35 = 4) 
          BX7    X7+X1
          IFEQ   LOADREL',0,1 
          SA7    B1          MAKE *TIM* REQUEST 
          IFNE   LOADREL',0,1 
          NO                 NOT INITIAL ENTRY - DO NOT ISSUE 
 TIME4    SA2    B1          WAIT RA+1
          MX1    6
          NZ     X2,TIME4 
  
**        2)   A SMALL TABLE OF ADDRESS FIELDS TO BE RELOCATED IN 
*              THE MAIN RELOCATION PROGRAM IS PROCESSED.
  
          SA3    X5+TAB1     1ST TABLE WORD 
          BX4    X1*X3
          LX4    6           1ST SHIFT COUNT
 REL1     SB6    X4          SHIFT COUNT (0, 15, OR 30) 
          SB7    B7-B1
          LX7    X5,B6       POSITION BASE ADDRESS FOR RELOCATION 
          SA4    B2+X3       GET WORD TO RELOCATE 
 REL2     SA3    A3+B1       NEXT TABLE ENTRY 
          IX7    X7+X4       RELOCATE ADDRESS 
          NG     B7,REL3     IF ALL ENTRIES DONE
          BX4    X1*X3
          NO
          SA7    A4          STORE WORD 
          LX4    6           NEXT SHIFT COUNT 
          JP     B2+REL1     LOOP 
  
  
**
*              THE TABLE IS OF THE FOLLOWING FORMAT 
* 
*         VFD    6/POS,30/0,18/ADR
* 
*         POS = POSITION OF 18-BIT ADDRESS = 0, 15, OR 30.
*         ADR = ADDRESS OF WORD CONTAINING ADDRESS. 
* 
*              THIS TABLE IS NOT GENERATED AUTOMATICALLY AS IS THE
*              MAIN TABLE OF RELOCATIONS FOR ALL OF *LOADU*.  IF ANY
*              CHANGES ARE MADE TO THE MAIN RELOCATION PROGRAM, THIS
*              TABLE MUST BE MODIFIED ACCORDINGLY TO REFLECT ANY
*              CHANGES IN RELOCATABLE ADDRESS FIELDS.  ONLY POSITIVE
*              RELOCATION IS ALLOWED HERE.
* 
  
 TAB1     BSS    0
          VFD    6/15,36/0,18/REL6
          VFD    6/30,36/0,18/REL7
          VFD    6/15,36/0,18/REL8
          VFD    6/15,36/0,18/REL10 
          VFD    6/15,36/0,18/REL12 
          VFD    6/30,36/0,18/REL13 
          VFD    6/00,36/0,18/REL14 
          VFD    6/00,36/0,18/REL15 
          VFD    6/00,36/0,18/REL16 
          VFD    6/00,36/0,18/REL17 
          VFD    6/30,36/0,18/REL19 
 LTAB1    EQU    *-TAB1      LENGTH OF TABLE
          CON    0           PREVENT MODE ERROR ON FETCH AHEAD
  
  
**        3)   THE MAIN RELOCATION PROGRAM IS NOW ENTERED.  IT
*              PROCESSES ALL ENTRIES IN THE MAIN RELOCATION TABLE 
*              *RELTABLE*.  THIS INVOLVES TWO DIFFERENT TYPES 
*              OF PROCESSING:                                                  .
* 
  
 REL3     SA6    B2+REGSAVE  SAVE X6
          BX7    X5          (X7) = BASE ADDRESS
          BX6    X0          SAVE X0
          SA6    A6+B1
          SX6    B2+RELTABLE-1     INITIALIZE POINTER TO MAIN TABLE 
          SA6    B2+RELPOINT
 REL4     SX0    B0          FLAG FOR FWA OF CODE FIELD 
 REL5     SA1    B2+RELPOINT NEXT TABLE ENTRY 
          SA2    X1+B1
          SX6    A2          ADVANCE POINTER
 REL6     SA6    A1 
          ZR     X2,REL21    IF END OF TABLE
          MX3    -6 
          SB7    X2 
          LX2    6           ISOLATE WIDTH FIELD
          BX4    -X3*X2 
 REL7     ZR     X4,REL12    IF NOT A VARIABLE-WIDTH FIELD
  
**             A)   THE RELOCATION OF ONE VARIABLE-POSITION, VARIABLE-
*                   WIDTH ADDRESS FIELD.
* 
  
          SA1    B7+X7       GET WORD TO RELOCATE 
          LX2    6           (B3) = FIELD POSITION
 REL8     BX5    X7          RELOCATION 
          PL     X2,REL9     IF POSITIVE RELOCATION 
          BX5    -X5         SET FOR NEGATIVE RELOCATION
 REL9     BX2    -X3*X2 
          SB3    X2 
          SB7    60 
          SB4    X4          (B4) = FIELD WIDTH 
          MX4    1           FORM MASK (60-WIDTH) 
          SB5    B7-B4       (60-WIDTH) 
          SB5    B5-B1       (59-WIDTH) 
 REL10    AX4    X4,B5
          NE     B4,B7,REL11 ABOVE FAILS IF WIDTH = 60
          MX4    0           ZERO MASK IF WIDTH = 60
 REL11    SB5    B7-B4       (B5) = (60-WIDTH)
          SB7    B7-B3       (B7) = (60-POSITION) 
          LX1    X1,B7       SHIFT FIELD TO LOWER PART OF WORD
          LX2    X1,B5       EXTEND SIGN OF FIELD 
          AX2    X2,B5
          IX2    X2+X5       RELOCATE FIELD 
          BX6    -X4*X2      REMOVE SIGN EXTENSION
          BX1    X4*X1       REMOVE OLD ADDRESS 
          BX1    X1+X6       INSERT RELOCATED ADDRESS 
          LX6    X1,B3       RESTORE POSITION OF WORD 
          SA6    A1          STORE WORD 
          JP     B2+REL5     LOOP TO NEXT TABLE ENTRY 
  
 REL12    MX4    -18         SET MASK FOR 18-BIT FIELD
          NZ     X0,REL13    IF THIS IS LWA+1 OF A CODE AREA
          SB6    B7          SAVE FWA OF CODE AREA
          SX0    B1          REVERSE FLAG 
          JP     B2+REL5     GET NEXT TABLE ENTRY 
  
**             B)   THE RELOCATION, WITHIN AN AREA SPECIFIED BY THE 
*                   TABLE, OF THE ADDRESS FIELDS OF ALL 30-BIT
*                   OPERATION CODES IN THE STANDARD THREE POSITIONS OF
*                   A CM WORD.  THE ADDRESS FIELD OF *PS* INSTRUCTIONS
*                   IS NOT RELOCATED. 
  
 REL13    EQ     B6,B7,REL4  IF COMPLETED IN THIS CODE AREA 
          SA1    B6+B2       GET NEXT WORD
          SB6    B6+B1       ADVANCE POINTER
          SB5    30          (B5) = POSITION (30, 15, 0)
          BX2    X1          INITIALIZE FOR CHECKING OPCODE 
          LX2    -9 
 REL14    LX2    15          ISOLATE UPPER 6 BITS OF OPCODE 
          BX6    -X3*X2 
          ZR     X6,REL17A   IF PS (NO DESIRE TO RELOCATE THESE)
 REL15    SX5    X6-10B 
          NG     X5,REL20    IF 30-BIT INSTRUCTION
 REL16    SX6    X6-50B 
          PL     X6,REL18    IF MAYBE A 30-BIT INSTRUCTION
 REL17    SB5    B5-15       ADVANCE ONE PARCEL 
          PL     B5,REL14    IF ROOM FOR ANOTHER 30-BITS
 REL17A   BX6    X1          STORE WORD 
          SA6    A1 
          JP     B2+REL13    LOOP THROUGH AREA OF CODE
  
 REL18    MX6    -3          LOOK AT Z FOR 5Z, 6Z, OR 7Z OPCODE 
          BX6    -X6*X2 
          SX6    X6-3 
 REL19    PL     X6,REL17    IF NOT A 30-BIT INSTRUCTION
  
*         RELOCATE ONE 18-BIT ADDRESS.
  
 REL20    SB4    60          SET 60-POSITION (30, 15, 0)
          SB4    B4-B5
          LX1    X1,B4       PLACE ADDRESS FIELD TO LOW POSITION
          SX5    X1          EXTEND SIGN
          IX5    X5+X7       RELOCATE ADDRESS 
          BX5    -X4*X5      REMOVE SIGN EXTENSION
          BX1    X4*X1       REMOVE OLD ADDRESS 
          BX1    X1+X5       INSERT RELOCATED ADDRESS 
          LX1    X1,B5       RESTORE POSITION OF WORD 
          SB5    B5-15       ADVANCE ONE PARCEL 
          LX2    15 
          JP     B2+REL17    LOOP 
  
 REL21    SA2    B2+REGSAVE  RESTORE X6 
          BX6    X2 
          SA1    A2+B1       RESTORE X0 
          BX0    X1 
          JP     B2+REL-1    EXIT FROM RELOCATOR
  
 REGSAVE  EQU    TAB1 
 RELPOINT EQU    REGSAVE+2
  
  
*         THE FOLLOWING IS A TABLE OF RELOCATIONS TO BE PERFORMED ON THE
*         CODE COMPRISING THE OVERLAY WHICH THE ABOVE ROUTINE IS A
*         PART.  IT HAS BEEN GENERATED AS REMOTE CODE BY OPDEFS 
*         WHICH REDEFINED ALL 30-BIT INSTRUCTIONS EXCEPT PS AND BY
*         MACROS WHICH ALLOW VARIABLE-POSITION, VARIABLE-WIDTH
*         RELOCATABLE FIELDS.  ITS FORMAT IS GIVEN IN DETAIL JUST 
*         PRIOR TO THE MACRO DEFINITIONS WHICH APPEAR AT THE VERY 
*         BEGINNING OF THE LISTING. 
  
 RELTABLE BSS    0
 RELTABLE HERE
