*DECK FOLRES
          IDENT  FOL.RES
          ENTRY  FOL.LOV
          ENTRY  FOL.GDE
          ENTRY  FOL.LOD
          SYSCOM B1 
          TITLE  FOL.RES - FAST OVERLAY LOADER RESIDENT.
          COMMENT FAST OVERLAY LOADER RESIDENT. 
          COMMENT COPYRIGHT CONTROL DATA CORP. 1976, 1977, 1978, 1979, 1
,980, 1981, 1982. 
          SPACE  4,10 
*****     FOL.RES - FAST OVERLAY LOADER RESIDENT. 
*         GREGG TOWNSEND.    76/11/03.
*         C. J. LABATE.      77/05/16.
* 
*         FOL.RES LOADS OVERLAYS THROUGH USE OF A DIRECTORY IN THE
*         MAIN OVERLAY. 
          SPACE  4,10 
***       THE ENTRY POINT FOL.GDE WILL SEARCH THE DIRECTORY IN THE MAIN 
*         OVERLAY FOR THE ENTRY CORRESPONDING TO A PARTICULAR OVERLAY.
*         THIS INFORMATION CAN BE USED TO DETERMINE THE SIZE OF THE 
*         OVERLAY OR OTHER DATA NEEDED TO PERFORM HOUSEKEEPING TASKS
*         (SUCH AS MOVING TABLES) BEFORE ACTUALLY LOADING IT. 
* 
*         THE ENTRY POINT FOL.LOV WILL LOAD AN OVERLAY, GIVEN EITHER
*         ITS NAME OR LEVEL NUMBERS, AND WILL RETURN ITS ENTRY POINT
*         AND FIRST WORD ADDRESS.  THIS MAKES IT EASY TO JUMP RIGHT 
*         INTO THE OVERLAY OR TO EXAMINE THE TABLE HEADER, IF 
*         NECESSARY, FOR ALTERNATE ENTRY POINTS OR OTHER INFORMATION. 
* 
*         THE ENTRY POINT FOL.LOD WILL LOAD AN OVERLAY AS DATA, 
*         GIVEN THE OVERLAY NAME AND SPECIFIED FWA.  IT FUNCTIONS 
*         EXACTLY AS FOL.LOV EXCEPT THAT THE LOAD MUST BE BY
*         OVERLAY NAME AND THE FWA IS SPECIFIED BY THE CALLER.
*         IT CAN PERFORM SUCH A LOAD WHETHER CMM IS ACTIVE OR 
*         INACTIVE.  THE CALLER MUST ENSURE THAT THE LOAD WILL
*         NOT DESTROY ANY NEEDED INFORMATION, AS THE LOAD MAY 
*         OCCUR AT ANY LOCATION IN THE FIELD LENGTH.
* 
*         IF THE CONTENTS OF RA+64 AND RA+65 INDICATE THAT THE MAIN 
*         OVERLAY WAS LOADED FROM THE *CLD* (NOS) OR THE *NUCLEUS*
*         LIBRARY (NOS/BE), THE RESIDENT WILL ISSUE A *LOADREQ* CALL
*         (LDV PP CALL) TO LOAD THE OVERLAY.  IN THIS SITUATION,
*         *LOADQ* CANNOT BE USED BECAUSE RA+106 AND RA+107 DO NOT 
*         CONTAIN THE NECESSARY DISK ADDRESS INFORMATION (NOS, AND MOST 
*         NOS/BE CASES) OR THE OVERLAYS ARE NOT CONTIGUOUS BUT ARE
*         INSTEAD IN *SYSOVL* (NOS/BE).  IN ALL OTHER SITUATIONS, A 
*         *LOADQ* CALL (LDQ PP CALL) IS ISSUED TO LOAD OVERLAYS.
          SPACE  4,10 
          LIST   -L          *CALL LDRCOM AT THIS IDENT + 1 
*CALL LDRCOM
          LIST   *
          SPACE  4,10 
****      ERROR CODES.
  
  
 ERR.ONF  EQU    777001B     OVERLAY NOT FOUND IN DIRECTORY 
 ERR.LDQ  EQU    777100B     ERROR RETURNED FROM *LOADQ*
 ERR.LDV  EQU    777200B     ERROR RETURNED FROM *LOADREQ*
****
          SPACE  4,10 
*         LOCAL VARIABLES.
  
 EA       CON    **          EXIT ADDRESS 
  
*         LOADQ (LDQ) PARAMETER BLOCK.
  
 LDQB     CON    **          42/FILESPEC, 9/STATUS, 9/FUNCTION
          CON    **          UNUSED 
          CON    **          42/OVLNAME, 18/FWA 
          CON    **          42/ADDRESS, 18/LWA+1 
  
*         LOADREQ (LDV) PARAMETER BLOCK.
  
 LDVB     CON    0LSYSOVL    42/LIBNAME, 18/STATUS
          CON    **          12/LEVEL, 12/FLAGS, 18/LWA+1, 18/FWA 
          CON    **          42/OVLNAME, 18/0 
  
          IPARAMS 
  
          IFMACS             DEFINE *IFNOS* AND *IFSCOPE* 
 GDE      TITLE  GDE - GET DIRECTORY ENTRY. 
***       FOL.GDE - GET DIRECTORY ENTRY.
* 
*         ENTRY  (X1) = 42/OVLNAME, 6/0, 12/LEVEL.
*                            (LEVEL IS USED ONLY IF OVLNAME = 0.) 
* 
*         EXIT   (B1) = 1.
*                (X6) = 42/OVLNAME, 18/FWA. 
*                            (ZERO IF ENTRY NOT FOUND.) 
*                (X7) = 12/LEVEL,6/UNDEFINED,24/RELATIVE PRU,18/LWA+1 
* 
*         SAVES  A0, A5, X0, X5, B2, B3.
  
  
 GDE3     SX6    0           ERROR EXIT 
  
 FOL.GDE  SUBR   =           ENTRY/EXIT 
          SB1    1           (B1) = 1 
          SA2    RA.ORG 
          SA3    RA.ORG+6 
          SA4    RA.ORG+7+X2 (A4) = FWA-1 OF DIRECTORY
          MX7    42          (X7) = NAME MASK 
          SB5    X3          (B5) = WORD COUNT
          SX2    X1          (X2) = LEVEL NUMBER
          BX1    X7*X1       (X1) = NAME
 GDE1     LE     B5,GDE3     IF NO MORE DIRECTORY ENTRIES, ERROR
          SA3    A4+B1       GET NEXT ENTRY 
          SA4    A3+B1
          BX6    X1-X3       COMPARE NAMES
          BX6    X7*X6
          NZ     X1,GDE2     IF LOADING BY NAME 
          MX6    12 
          BX6    X6*X4
          LX6    -48
          BX6    X6-X2       COMPARE LEVELS 
 GDE2     SB5    B5-2        DECREMENT WORD COUNT 
          NZ     X6,GDE1     IF MISMATCH, TRY AGAIN 
          BX6    X3          RETURN VALUES
          BX7    X4 
          EQ     EXIT.
 LOD      TITLE  LOD - LOAD OVERLAY AS DATA.
***       FOL.LOD - LOAD OVERLAY AS DATA. 
* 
*         ENTRY  (X1) = 42/OVLNAME, 18/FWA. 
* 
*         EXIT   (B1) = 1.
*                (B6) = FWA OF 54-TABLE OF NEWLY-LOADED OVERLAY.
*                (B7) = ADDRESS OF FIRST ENTRY POINT. 
* 
*                IF AN ERROR OCCURS, (B6) = (B7) = ERROR CODE:  
*                            777001 = OVERLAY NOT IN DIRECTORY. 
*                            7771NN = ERROR NN RETURNED FROM *LOADQ*. 
*                            7772NN = ERROR NN RETURNED FROM *LOADREQ*. 
* 
*         SAVES  A0, A5, X0, X5, B2, B3.
* 
*         CALLS  NONE.
* 
*         NOTE   SAVES AND RESTORES RA+65B WHEN NECESSARY.
  
  
 FOL.LOD  SUBR   =           ENTRY/EXIT 
          SX7    FOL.LOD
          SA7    EA          SET EXIT ADDRESS 
          SB4    X1          (B4) = FWA SPECIFIED BY CALLER 
          SA2    RA.LWP 
          BX7    X2 
          SA7    LODA        SAVE RA+65B
          RJ     FOL.GDE     GET DIRECTORY ENTRY
          SB7    ERR.ONF
          ZR     X6,ERR      IF NOT FOUND IN DIRECTORY, EXIT
          SX3    X6          FWA FROM FOL DIRECTORY 
          SX2    B4          FWA SPECIFIED BY USER
          IX2    X2-X3       BIAS FWA 
          IX6    X2+X6       BIAS FWA IN X6 
          IX7    X2+X7       BIAS LWA IN X7 
          RJ     PPL         PERFORM PHYSICAL LOAD
          SA2    LODA 
          BX7    X2 
          SA7    RA.LWP      RESTORE RA+65B 
          EQ     EXIT.
  
 LODA     BSS    1           SAVE AREA FOR RA+65B 
 LOV      TITLE  LOV - LOAD OVERLAY.
***       FOL.LOV - LOAD OVERLAY. 
* 
*         ENTRY  (X1) = 42/OVLNAME, 6/0, 12/LEVEL.
*                            (LEVEL IS USED ONLY IF OVLNAME = 0.) 
* 
*         EXIT   (B1) = 1.
*                (B6) = FWA OF 54-TABLE OF NEWLY-LOADED OVERLAY.
*                (B7) = ADDRESS OF FIRST ENTRY POINT. 
* 
*                IF AN ERROR OCURRS, (B6) = (B7) = ERROR CODE:  
*                            777001 = OVERLAY NOT IN DIRECTORY. 
*                            7771NN = ERROR NN RETURNED FROM *LOADQ*. 
*                            7772NN = ERROR NN RETURNED FROM *LOADREQ*. 
* 
*         SAVES  A0, A5, X0, X5, B2, B3.
* 
*         CALLS  NONE.
  
  
 FOL.LOV  SUBR   =           ENTRY/EXIT 
          SX7    FOL.LOV
          SA7    EA          SET EXIT ADDRESS 
          SB7    ERR.ONF
          RJ     FOL.GDE     GET DIRECTORY ENTRY
          ZR     X6,ERR      IF NOT FOUND IN DIRECTORY, EXIT
          RJ     PPL         PERFORM PHYSICAL LOAD
          EQ     EXIT.
 PPL      TITLE  PPL - PERFORM PHYSICAL LOAD. 
**        PPL - PERFORM PHYSICAL LOAD.
* 
*         ENTRY  (X6) AND (X7) AS SET BY FOL.GDE AND POSSIBLY BIASED
*                IF ENTRY WAS AT FOL.LOD. 
* 
*         EXIT   OVERLAY LOADED OR ERROR STATUS RETURNED. 
* 
*         SAVES  A0, A5, X0, X5, B2, B3.
* 
*         CALLS  SYS=.
  
  
 PPL      SUBR               ENTRY/EXIT 
          RJ     BPB         BUILD PARAM BLOCK
          SA1    RA.PGN 
          AX1    18 
          SA2    A1+B1
          SA3    =7RNUCLEUS 
          LX2    59-18       (X2) MINUS IF MAIN OVL LOADED FROM LIBRARY 
          IX1    X3-X1       (X1) ZERO IF FROM *NUCLEUS*
          PL     X2,LOV3     IF NOT FROM LIBRARY
          NZ     X1,LOV2     IF FROM LIBRARY OTHER THAN *NUCLEUS* 
 LOV1     RJ     LLV         LOAD OVERLAY VIA LDV 
          EQ     EXIT.
  
 LOV2     SA3    RA.ORG+7 
          ZR     X3,LOV1     IF PRU NUMBER WASNT SET WHEN LOADED
 LOV3     RJ     LLQ         LOAD OVERLAY VIA LDQ 
          EQ     EXIT.
 ERR      SPACE  4,10 
**        ERR - RETURN ERROR CODE.
* 
*         ENTRY  (B7) = ERROR CODE. 
* 
*         EXIT   (B6) = (B7) = ERROR CODE.
  
  
 ERR      SB6    B7 
          SA1    EA          EXIT ADDRESS 
          SB4    X1 
          JP     B4          EXIT TO USER 
 BPB      TITLE  BPB - BUILD PARAMETER BLOCK. 
**        BPB - BUILD PARAMETER BLOCK.
* 
*         ENTRY  (X6) AND (X7) AS FROM FOL.GDE AND POSSIBLY BIASED
*                IF ENTRY WAS AT FOL.LOD. 
* 
*         EXIT   (LDQB - LDQB+3) SET UP FOR *LOADQ* CALL. 
* 
*         USES   A1, A3, A6, A7, X1, X2, X3, X6, X7.
* 
*         CALLS  NONE.
  
  
 BPB      SUBR               ENTRY/EXIT 
          SA6    LDQB+2      SAVE NAME, FWA 
  
 IN       IFNOS 
          MX2    -24-18 
          BX2    -X2*X7      RELATIVE PRU AND LWA+1 
          MX3    12 
          BX7    X3*X7       SET LEVEL NUMBERS IN *LDV* REQUEST 
          SA7    LDVB+1 
          BX7    X2          (X7) = 18/0, 24/REL PRU, 18/LWA+1
 IN       ENDIF 
  
 IS       IFSCOPE 
          MX2    -36
          BX2    -X2*X7      ISOLATE RELATIVE PRU AND LWA+1 
          MX3    12 
          BX7    X3*X7       SET LEVEL NUMBERS IN *LDV* REQUEST 
          SA7    LDVB+1 
          BX6    X2 
          AX6    18 
          LX6    36 
          BX7    X6+X2       (X7) = 24/REL PRU, 18/REL PRU, 18/LWA+1
 IS       ENDIF 
  
          SA1    RA.ORG+7 
          MX2    42 
          BX1    X2*X1
          SA3    A1-B1       GET FILE SPECIFICATION 
          SX6    B1+B1       FUNCTION CODE
          NZ     X1,BPB1     IF PRU OF (0,0) GIVEN
          SX1    B1          ELSE ASSUME PRU 1
          LX1    18 
          SA3    RA.PGN      AND USE FILE NAME FROM RA+64 
 BPB1     IX7    X7+X1       CALCULATE TRUE PRU ADDRESS(ES) 
          SA7    A6+B1       SAVE IN PARAMETER BLOCK
          BX3    X2*X3       CLEAN UP FILE SPEC 
          BX6    X3+X6       ADD FUNCTION CODE
          SA6    LDQB        SAVE 
          EQ     EXIT.
 LLQ      TITLE  LLQ - LOAD VIA LDQ.
**        LLQ - LOAD VIA LDQ. 
* 
*         ENTRY  (LDQB - LDQB+3) SET UP FOR *LOADQ* CALL. 
* 
*         EXIT   (B6) = FWA.
*                (B7) = ADDRESS OF FIRST ENTRY POINT. 
*                RA COMMUNICATION AREA UPDATED AS PER LDV/LDR SPECS.
* 
*         USES   A1, A2, A6, X1, X2, X6.
* 
*         CALLS  SYS=.
  
  
 LLQ      SUBR               ENTRY/EXIT 
          LOADQ  LDQB,RCL    LOAD OVERLAY 
          SA1    LDQB        GET STATUS 
          SA2    LDQB+2      GET FWA
          SX1    X1 
          AX1    9
          SB7    ERR.LDQ+X1  SET CODE 
          NZ     X1,ERR      IF ERRORS
          SB6    X2          (B6) = FWA 
          SX2    B1 
          SA1    B6+4 
          SB7    X1          (B7) = ADDRESS OF FIRST ENTRY POINT
          LX2    29-0 
          SA1    RA.LDR 
          BX6    X1+X2
          SA6    A1          SET LDR COMPLETE BIT IN RA.LDR 
          SA2    RA.FWP 
          MX1    42 
          BX6    X1*X2
          SX2    B6 
          BX6    X6+X2
          SA6    A2          SET FWA OF LOAD INTO RA.FWP
          SA2    RA.LWP 
          SX6    X2 
          MI     X6,EXIT.    IF *CMM* ACTIVE DON-T CHANGE RA.LWP
          BX6    X1*X2
          SA2    B6+B1       READ *MINFL* FROM 54-TABLE HEADER
          BX2    -X1*X2 
          BX6    X6+X2
          SA6    RA.LWP      SET *MINFL* INTO RA.LWP
          EQ     EXIT.
 LLV      TITLE  LLV - LOAD VIA LDV.
**        LLV - LOAD VIA LDV. 
* 
*         ENTRY  (LDQB - LDQB+3) SET UP FOR *LOADQ* CALL. 
* 
*         EXIT   (B6) = FWA.
*                (B7) = ADDRESS OF FIRST ENTRY POINT. 
* 
*         USES   A1, A2, A6, X1, X2, X3, X4, X6, X7.
* 
*         CALLS  SYS=.
  
  
 LLV      SUBR               ENTRY/EXIT 
          SA1    LDVB        CLEAN UP *LOADREQ* PARAM BLOCK 
          MX7    42 
          BX6    X7*X1
          SA6    A1 
          SA1    LDQB+2 
          SA2    A1+B1
          SX6    X1          FWA
          SX2    X2          LWA+1
          LX2    18 
          BX6    X2+X6       (X6) = 24/0, 18/LWA+1, 18/FWA
          SA2    RA.LWP 
          LX2    43-36-17    POSITION CMM BIT 
          SX3    200B 
          SX4    2140B
          BX3    X3*X2       ISOLATE CMM BIT
          BX4    X4+X3       COMBINE WITH OTHER FLAGS 
          LX4    36          POSITION 
          SA3    A6+B1       GET LEVEL NUMBERS (SET BY *BPB*) 
          BX4    X3+X4       COMBINE WITH OTHER FLAGS 
          BX6    X4+X6       (X6) = 24/FLAGS, 18/LWA+1, 18/FWA
          SA6    A6+B1       SAVE FLAGS, FWA
          BX6    X7*X1
          SA6    A6+B1       SAVE NAME
          SB6    X1          (B6) = FWA 
          LOADREQ LDVB,RCL   LOAD OVERLAY 
          SA1    X6 
          SA2    X6+B1
          SX1    X1 
          LX2    59-36
          AX1    1
          SB7    X1+ERR.LDV  SET ERROR CODE 
          MI     X2,ERR      IF ERRORS ON LOADREQ CALL
          SA1    B6+4 
          SB7    X1          SET ENTRY POINT ADDRESS
          EQ     EXIT.
          SPACE  4
          END 
