*DECK FDLMMI
          IDENT  FDL.MMI
          ENTRY  FDL.LDC
          ENTRY  FDL.ULC
          ENTRY  FDL.ROS
          ENTRY  FDL.CGD
          ENTRY  FDL.UGD
          ENTRY  FDL=GGD
          ENTRY  FDL=PCL
          ENTRY  FDL=PCU
          ENTRY  FDL=SGD
          SYSCOM B1 
          TITLE  FDL.MMI - FDL MEMORY MANAGER INTERFACE.
          COMMENT FDL MEMORY MANAGER INTERFACE. 
          COMMENT COPYRIGHT CONTROL DATA CORP. 1976, 1977, 1978, 1979, 1
,980, 1981, 1982. 
          SPACE  4,10 
*****     FDL.MMI - FAST DYNAMIC LOADER RESIDENT. 
*         GREGG TOWNSEND.    76/10/19.
* 
*         FDL.MMI LOADS AND UNLOADS CAPSULES INTO / OUT OF CMM BLOCKS,
*         AND HANDLES INTER-CAPSULE LINKING AND DELINKING.
* 
*         WITHIN THIS PROGRAM ANY REFERENCE TO THE TERM *PASSLOC* 
*         TABLES ALSO APPLIES TO *ENTRY* TABLES.
          SPACE  4,10 
***       THE ENTRY POINT FDL.LDC IS CALLED TO LOAD A CAPSULE.  FOR 
*         THE FIRST REQUEST TO LOAD A CAPSULE FROM ANY PARTICULAR 
*         GROUP, A LOADD REQUEST IS ISSUED TO GENERATE A DIRECTORY. 
*         THIS DIRECTORY IS USED FOR ALL SUBSEQUENT LOADING FROM THAT 
*         CAPSULE GROUP.
* 
*         AFTER FINDING THE CAPSULE NAME IN THE DIRECTORY, FDL.MMI
*         ISSUES A LOADQ REQUEST TO READ THE CAPSULE INTO CENTRAL 
*         MEMORY, THEN RELOCATES IT AND DISCARDS THE RELOCATION 
*         INFORMATION.  THE CAPSULE IS LINKED TO ANY PASSLOC TABLES 
*         GIVEN AND TO ANY OTHER CURRENTLY-LOADED CAPSULES IN THE SAME
*         GROUP AS DETAILED IN THE LOADER REFERENCE MANUAL.  THIS 
*         COMPLETES THE LOADING OPERATION.
* 
*         THE ENTRY POINT FDL.ULC IS CALLED TO UNLOAD A CAPSULE.
*         THIS CONSISTS SIMPLY OF DISSOLVING ANY LINKS BETWEEN THE
*         CAPSULE AND PASSLOC TABLES OR OTHER CAPSULES, AND THEN
*         RELEASING THE MEMORY WHICH WAS OCCUPIED BY THE CAPSULE. 
* 
*         THE ENTRY POINT FDL.CGD IS CALLED TO MOVE GROUP 
*         DIRECTORIES DOWN TO THE SMALLEST POSSIBLE CORE ADDRESS. 
*         IF NO DIRECTORIES ARE PRESENT OR ALL DIRECTORIES ARE
*         ALREADY LOWER THAN THE LOWEST ALLOCATABLE BLOCK OF
*         MEMORY, NO ACTION IS TAKEN. 
* 
*         THE ENTRY POINT FDL.UGD IS CALLED TO UNLOAD A GROUP 
*         DIRECTORY AFTER ALL THE CAPSULES IN THAT GROUP HAVE 
*         ALREADY BEEN UNLOADED.  THE LINKS IN THE GROUP DIRECTORY
*         CHAIN ARE DISSOLVED AND THE SPACE RETURNED TO CMM.
*         IF ANY CAPSULES IN THE GROUP REMAIN LOADED, AN ERROR
*         IS GENERATED. 
* 
*         THE COMMON MEMORY MANAGER (CMM) IS CALLED BY FDL.MMI TO 
*         ALLOCATE MEMORY FOR BOTH CAPSULES AND CAPSULE DIRECTORIES.
*         ANY PROGRAM USING FDL MUST BE ABLE TO COEXIST WITH CMM, AND 
*         MUST HAVE NO ACTIVE FIXED-POSITION, GROWING-END BLOCKS WHEN 
*         CALLING FDL.LDC TO LOAD A CAPSULE.
* 
*         THE ENTRY POINT FDL.ROS IS CALLED IN ORDER TO INFORM FDL
*         THAT IT IS NOT IN OVERFLOW MODE.  IT IS USED BY PROCESSORS
*         (SUCH AS CDCS) WHICH SPECIFY AN ERROR EXIT ADDRESS TO CMM 
*         TO PREVENT CMM FROM ABORTING IN CASES WHERE IT WOULD
*         OTHERWISE.  FDL PROVIDES ONE LEVEL OF RECURSION; I.E., IF 
*         CMM IS IN OVERFLOW MODE, ANY OF THE FDL ENTRY POINTS
*         MAY BE CALLED.
          SPACE  4,10 
**        CAPSULE DIRECTORIES ARE KEPT IN FIXED-POSITION BLOCKS 
*         RATHER THAN VARIABLE-POSITION BLOCKS IN ORDER TO REDUCE 
*         THE AMOUNT OF CMM CODE NEEDED.  ALL DIRECTORIES ARE LINKED
*         TOGETHER; THE POINTER TO THE FIRST DIRECTORY BLOCK IS 
*         IN CELL *DC*, THE FIRST WORD OF FDL.MMI.  EACH CMM BLOCK
*         HOLDING A DIRECTORY IS OF THIS FORM:  
* 
*         1.     POINTER TO NEXT DIRECTORY IN CHAIN (ONE WORD). 
*         2.     POINTER TO FIRST CAPSULE BLOCK (ONE WORD). 
*         3.     42/GROUP NAME, 18/DIRECTORY LENGTH.
*         4.     DIRECTORY AS RETURNED BY LOADD (SEVERAL WORDS).
* 
*         A POINTER WORD OF ZERO INDICATES THE END OF A CHAIN.
* 
*         CAPSULES ARE ALSO STORED IN FIXED-POSITION BLOCKS.  ALL 
*         CAPSULES IN A GROUP ARE LINKED TOGETHER IN A CHAIN WHICH
*         STARTS IN THE SECOND WORD OF THE CMM BLOCK CONTAINING THE 
*         DIRECTORY FOR THE GROUP.  EACH CAPSULE BLOCK HAS THE FORM:  
* 
*         1.     POINTER TO NEXT CAPSULE BLOCK (ONE WORD).
*         2.     CAPSULE IMAGE, BEGINNING WITH THE THREE HEADER WORDS.
          SPACE  4,10 
**        THROUGHOUT THIS PROGRAM:  
*                (B1) = 1.
*                (X0) = -0 IF LOADING CAPSULE, +0 IF UNLOADING. 
* 
*         AFTER CAPSULE FOUND OR LOADED:  
*                (A0) = FWA OF CAPSULE = FWA+1 OF CAPSULE BLOCK.
          SPACE  4,10 
*CALL FDLCOM
 LDC      TITLE  LDC - LOAD CAPSULE - MAIN LOOP.
***       FDL.LDC - LOAD CAPSULE. 
* 
*         ENTRY  (X1) = 42/GROUP NAME, 18/SIZE ESTIMATE.
*                (X2) = CAPSULE NAME. 
*                (X3) = LIBRARY LIST ADDRESS. 
*                (X4) = PASSLOC LIST ADDRESS. 
* 
*         EXIT   (B1) = 1.
*                (X6) = ERROR CODE: 
*                            0 = NO ERROR.
*                            1 = BAD LIBRARY LIST.
*                            2 = UNKNOWN GROUP NAME.
*                            3 = UNKNOWN CAPSULE NAME.
*                            4 = BAD CAPSULE FORMAT.
*                            5 = BAD PASSLOC FORMAT.
*                            6 = CAPSULE ALREADY IN MEMORY. 
*                            7 = CAPSULE / OVCAP CONFUSION. 
* 
*         SAVES  A0, X0, B2, B3, X5.
* 
*         CALLS  CMM.ALF, CMM.CSF, CMM.FRF, CMM.SLF, SYS=.
 LDC      SPACE  4,10 
**        INITIALIZATION. 
* 
*         EXIT   TO *FDL=PCL*.
* 
*         CALLS  GGD, PRS, SGD. 
  
  
 FDL.LDC  SUBR   =           ENTRY
          SB4    FDL.LDC     EXIT ADDRESS 
          RJ     =XFDL=PRS   PRESET PROGRAM 
          MX6    0           INDICATE ATTEMPT BEFORE DIRECTORY RELOAD 
          SA6    T5 
          MX0    60          (X0) = -0 TO INDICATE CAPSULE LOAD 
          RJ     GGD         GET GROUP DIRECTORY
 LDC1     RJ     SGD         SEARCH GROUP DIRECTORY 
          SX6    A0+B1       SET LINK ADDRESS 
          SB2    B0          INDICATE CAPSULE, NOT OVCAP
 PCL      SPACE  4,10 
**        FDL=PCL - PERFORM CAPSULE LOAD. 
* 
*         ENTRY  REGISTERS SET FOR CALL TO *LCM*. 
*                (X6) = ADDRESS OF CAPSULE CHAIN LINK.
* 
*         EXIT   TO *RSC*.
* 
*         CALLS  CMM.CSF, CMM.SLF, LCM, RCI, RSC, SCC, SPL. 
  
  
 FDL=PCL  SA6    CC          SAVE CAPSULE CHAIN LINK ADDRESS
          RJ     LCM         LOAD CAPSULE TO MEMORY 
          RJ     =XFDL=RCI   RELOCATE CODE IMAGE
          MX0    60          RESTORE X0 
          SA1    A0 
          SA2    A0+2 
          SX1    X1 
          SX2    X2 
          IX2    X1-X2       (X2) = SHRINK COUNT
          SX1    A0-B1       (X1) = BLOCK FWA 
          SX2    X2-1        RETAIN ONE WORD AS EXTERNAL CHN TERMINATOR 
          RJ     =XCMM.SLF   SHRINK BLOCK TO THROW AWAY RELOCATION INFO 
          SX1    A0-B1       (X1) = BLOCK FWA 
          SX2    B0          (X2) = SIZE-CODE 
          RJ     =XCMM.CSF   SET BLOCK TO FIXED SIZE
          RJ     =XFDL=SPL   SCAN PASSLOC LIST
          RJ     SCC         SCAN CAPSULE CHAIN 
          SX6    ERR.AOK     ALL OK 
          EQ     =XFDL=RSC   RETURN STATUS CODE 
 ULC      TITLE  ULC - UNLOAD CAPSULE - MAIN LOOP.
***       FDL.ULC - UNLOAD CAPSULE. 
* 
*         ENTRY  (X1) = 42/GROUP NAME, 18/IGNORED.
*                (X2) = CAPSULE NAME. 
*                (X4) = PASSLOC LIST ADDRESS. 
* 
*         EXIT   (B1) = 1.
*                (X6) = ERROR CODE: 
*                            0 = NO ERROR.
*                            2 = UNKNOWN GROUP NAME.
*                            3 = UNKNOWN CAPSULE NAME.
*                            4 = BAD CAPSULE FORMAT.
*                            5 = BAD PASSLOC FORMAT.
* 
*         SAVES  A0, X0, B2, B3, X5.
* 
*         CALLS  CMM.FRF. 
 ULC      SPACE  4,10 
**        INITIALIZATION. 
* 
*         EXIT   TO *FDL=PCU*.
* 
*         CALLS  GGD, PRS.
  
  
 FDL.ULC  SUBR   =           ENTRY
          SB4    FDL.ULC     EXIT ADDRESS 
          RJ     =XFDL=PRS   PRESET PROGRAM 
          MX6    42          ** DELETE THESE TWO LINES WHEN *BAM* 
          BX2    X6*X2       ** FIXES *SW1XXXX* (ASK JACQUES).
          BX6    X2 
          MX0    0           (X0) = 0 TO INDICATE UNLOADING OPERATION 
          SA6    CM+1        SAVE NAME
          RJ     GGD         GET GROUP DIRECTORY
          SX6    A0+B1       SET LINK ADDRESS 
          SX7    B1+B1       INDICATE CAPSULE 
 PCU      SPACE  4,10 
**        FDL=PCU - PERFORM CAPSULE UNLOAD. 
* 
*         ENTRY  (X6) = ADDRESS OF CAPSULE CHAIN LINK.
*                (X7) = 1 UNLOADING OVCAP.
*                     = 2 UNLOADING CAPSULE.
* 
*         EXIT   TO *RSC*.
* 
*         CALLS  CMM.FRF, RSC, SCC, SCM, SPL. 
  
  
 FDL=PCU  SA3    CM+1        GET CAPSULE NAME 
          BX7    X7+X3       42/0LNAME,12/0,6/L2
          SA6    CC          SAVE CAPSULE CHAIN LINK
          SA7    A3 
          SA1    SVX2 
          MX7    0
          SA2    X6 
          SA7    A3-B1       SET LUL = UNLOAD 
          SB7    3
          SA7    A3+B1       ZERO ENTRY AND FWA 
          RJ     SCM         FIND CAPSULE 
          SX6    ERR.UCN     UNKNOWN CAPSULE NAME 
          ZR     X2,=XFDL=RSC  IF NOT FOUND, RETURN STATUS CODE 
          SA1    X2+B1       LOAD CAPSULE HEADER
          SX6    ERR.BCF     BAD CAPSULE FORMAT 
          PL     X1,=XFDL=RSC  IF HEADER WORD BAD, RETURN STATUS CODE 
          DF     X1,=XFDL=RSC  IF HEADER WORD BAD, RETURN STATUS CODE 
          SA0    X2+B1       (A0) = CAPSULE FWA 
          SA1    X2 
          BX6    X1 
          SA6    A2          DELINK IT
          RJ     SCC         SCAN CAPSULE CHAIN 
          RJ     =XFDL=SPL   SCAN PASSLOC LIST
          SX1    A0-1 
          RJ     =XCMM.FRF   FREE *CMM* BLOCK 
          SX6    ERR.AOK     ALL OK 
          EQ     =XFDL=RSC   RETURN STATUS CODE 
 ROS      TITLE  ROS - RESET OVERFLOW STATUS. 
***       FDL.ROS - RESET OVERFLOW STATUS.
* 
*         ENTRY  NONE.
* 
*         EXIT   OVERFLOW STATUS IS CLEARED SO THAT A SUBSEQUENT
*                CALL TO FDL WILL NOT BE IN OVERFLOW MODE.
* 
*         SAVES  ALL EXCEPT A6, X6. 
* 
*         CALLS  NONE.
  
  
 FDL.ROS  SUBR               ENTRY/EXIT 
          MX6    0           CLEAR OVERFLOW MODE
          SA6    OVERFL 
          EQ     EXIT.       RETURN 
 CGD      TITLE  CGD - COMPACT GROUP DIRECTORIES - MAIN LOOP. 
***       FDL.CGD - COMPACT GROUP DIRECTORIES.
* 
*         ENTRY  NONE.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  A0, X0, B2, B3, X5.
* 
*         CALLS  CMM.CSF, CMM.FRF, CMM.SLF, DUD, FDC, FHG, MVE. 
          SPACE  4
**        INITIALIZATION. 
* 
*         EXIT   TO *FDL=PGC*.
* 
*         CALLS  DUD, PRS.
  
  
 FDL.CGD  SUBR   =           ENTRY
          SB4    FDL.CGD     EXIT ADDRESS 
          RJ     =XFDL=PRS   PRESET 
          RJ     DUD         DELETE UNUSED DIRECTORIES
          SA2    DC          CHECK FOR DIRECTORIES
          ZR     X2,=XFDL=RSC  IF NO DIRECTORIES
 PGC      SPACE  4
**        FDL=PGC - PERFORM GROUP COMPACTION. 
* 
*         ENTRY  NONE.
* 
*         EXIT   TO *RSC*.
* 
*         CALLS  CMM.CSF, CMM.FRF, CMM.SLF, FDC, FHG, MVE.
  
  
 FDL=PGC  RJ     FDC         FIND DEALLOCATED CMM BLOCK 
          ZR     X1,=XFDL=RSC  IF NO BLOCKS TO BE HAD 
          SX6    X1          SAVE FWA 
          SA6    T1 
          SX6    X2          SAVE LENGTH
          SA6    T2 
          RJ     FHG         FIND HIGHEST GROUP DIRECTORY 
          NZ     X3,PGC1     IF SUITABLE GROUP DIR FOUND
          RJ     =XCMM.FRF   DEALLOCATE THE BLOCK 
          EQ     =XFDL=RSC   RETURN 
  
 PGC1     BX6    X3          SAVE FWA OF GROUP DIR
          SA6    T3 
          BX6    X4          SAVE DIRECTORY LENGTH
          SA6    T4 
          BX6    X1          PATCH LINK IN CHAIN
          SA6    B2 
          BX2    X3          SET UP CALL TO *MVE* - SOURCE BLOCK
          BX3    X1          DESTINATION BLOCK
          BX1    X4          WORD COUNT 
          RJ     =XMVE=      MOVE BLOCK 
          SA1    T3 
          RJ     =XCMM.FRF   DEALLOCATE OLD DIRECTORY 
          SA1    T1          TRIM BLOCK TO CORRECT SIZE 
          SA2    T2          LENGTH 
          SA3    T4          DIRECTORY LENGTH 
          IX2    X2-X3       WORDS TO TRIM
          RJ     =XCMM.SLF   SHRINK BLOCK 
          SA1    T1 
          SX2    B0 
          RJ     =XCMM.CSF   CHANGE SIZE CODE TO FIXED
          EQ     FDL=PGC     LOOP TILL ALL POSSIBLE BLOCKS MOVED
 UGD      TITLE  UGD - UNLOAD GROUP DIRECTORY - MAIN LOOP.
***       FDL.UGD - UNLOAD GROUP DIRECTORY. 
* 
*         ENTRY  (X1) = 42/GROUP NAME, 18/IGNORED.
* 
*         EXIT   (B1) = 1.
*                (X6) = ERROR CODE@D
*                            0 = NO ERROR.
*                            2 = UNKNOWN GROUP NAME.
*                            10 = GROUP HAS CAPSULES. 
* 
*         SAVES  A0, X0, B2, B3, X5.
* 
*         CALLS  CMM.FRF. 
          SPACE  4
**        INITIALIZATION. 
* 
*         EXIT   TO *FDL=PGU*.
* 
*         CALLS  GGD, PRS.
  
  
 FDL.UGD  SUBR   =           ENTRY
          SB4    FDL.UGD     EXIT ADDRESS 
          RJ     =XFDL=PRS   PRESET 
          MX0    0           (X0) = 0 TO INDICATE UNLOADING OPERATION 
          RJ     GGD         GET GROUP DIRECTORY
PGU       SPACE  4
**        FDL=PGU - PERFORM GROUP DIRECTORY UNLOAD. 
* 
*         ENTRY  (A0) = FWA OF *CMM* BLOCK CONTAINING DIRECTORY.
*                (X5) = ADDRESS OF LINK TO DIRECTORY. 
* 
*         EXIT   TO *RSC*.
* 
*         CALLS  CMM.FRF. 
  
  
 FDL=PGU  SX6    ERR.GHC     GROUP HAS CAPSULES 
          SA3    A0+B1       READ CAPSULE POINTER 
          NZ     X3,=XFDL=RSC  IF NOT ALL CAPSULES UNLOADED 
          SA3    A0          SNIP AND PATCH DIRECTORY CHAIN 
          SX6    X3 
          SA6    X5 
          SX1    A0 
          RJ     =XCMM.FRF   DEALLOCATE CMM BLOCK 
          SX6    ERR.AOK     ALL IS WELL
          EQ     =XFDL=RSC   RETURN STATUS CODE 
 ALF      TITLE  ALF - ALLOCATE FIXED BLOCK.
**        ALF - ALLOCATE FIXED BLOCK. 
* 
*         SAVES FDL COMMON BLOCK BEFORE CALLING CMM.ALF IN ORDER TO 
*         ALLOW POSSIBLE RECURSIVE CALL OF FDL FROM OVERFLOW-ACTION 
*         SUBROUTINES CALLED BY CMM.  SINCE IT IS PERMITTED TO
*         CALL *FDL.LDC* WHILE CMM IS IN OVERFLOW MODE, THE RETURN
*         ADDRESS OF CERTAIN SUBROUTINES MUST ALSO BE SAVED.  THESE 
*         ARE:  FDL.LDC, GGD, AND ALF.
*         IF ALREADY IN OVERFLOW MODE WHEN CALLED (*OVERFL* NE 0),
*         NO SAVING OR RESTORING IS DONE. 
* 
*         ENTRY  AS FOR CMM.ALF.
* 
*         EXIT   AS FOR CMM.ALF.
* 
*         SAVES  A0, X0, B2, B3, X5.
*                /FDL.COM/, RETURN ADDRESS FROM *FDL.LDC*, *GGD*, *ALF*.
* 
*         CALLS  CMM.ALF. 
  
  
 ALF      SUBR               ENTRY/EXIT 
          SA1    OVERFL      IF ALREADY IN OVERFLOW MODE, 
          NZ     X1,ALF3      DO NOT SAVE THINGS
          SX6    B1          SET OVERFLOW MODE
          SA6    A1 
          SB4    0           (B4) = OFFSET
          SB5    COML-COMF   (B5) = LENGTH
 ALF1     SA4    COMF+B4
          BX6    X4 
          SB4    B4+B1
          SA6    ALFA+B4-1   SAVE WORD
          LT     B4,B5,ALF1  IF MORE, LOOP
          SA4    FDL.LDC     SAVE *FDL.LDC* RETURN ADDRESS
          BX6    X4 
          SA6    A6+B1
          SA4    GGD         SAVE *GGD* RETURN ADDRESS
          BX6    X4 
          SA6    A6+B1
          SA4    ALF         SAVE *ALF* RETURN ADDRESS
          BX6    X4 
          SA6    A6+B1
          RJ     =XCMM.ALF   CALL CMM 
          SB4    0           (B4) = OFFSET
          SB5    COML-COMF   (B5) = LENGTH
 ALF2     SA4    ALFA+B4
          BX6    X4 
          SB4    B4+B1
          SA6    COMF+B4-1   RESTORE WORD 
          LT     B4,B5,ALF2  IF MORE
          SA4    A4+B1       RESTORE *FDL.LDC* RETURN ADDRESS 
          BX6    X4 
          SA6    FDL.LDC
          SA4    A4+B1       RESTORE *GGD* RETURN ADDRESS 
          BX6    X4 
          SA6    GGD
          SA4    A4+B1       EXIT *ALF* VIA SAVED RETURN ADDRESS
          AX4    30 
          SB7    X4 
          MX6    0           CLEAR OVERFLOW MODE
          SA6    OVERFL 
          JP     B7          EXIT 
  
 ALF3     RJ     =XCMM.ALF   CALL *CMM* IN OVERFLOW MODE
          EQ     EXIT.       EXIT 
  
  
 ALFA     BSS    COML-COMF+3 SAVE AREA
 OVERFL   CON    0           NZ IF IN OVERFLOW MODE 
 DUD      TITLE  DUD - DELETE UNUSED DIRECTORIES. 
**        DUD - DELETE UNUSED DIRECTORIES.
* 
*         DUD SEARCHES THE GROUP DIRECTORY CHAIN DELETING 
*         DIRECTORIES WHICH HAVE NO CAPSULES ASSIGNED.
*         ALSO THE SIZE OF THE SMALLEST DIRECTORY IS PLACED 
*         IN LOCATION *FDCB*. 
* 
*         ENTRY  NONE.
* 
*         EXIT   (FDCB) = SIZE OF SMALLEST DIRECTORY. 
*                TO *RSC* IF NO DIRECTORIES.
* 
*         USES   A0, A1, A2, A3, A5, A6.
*                X1, X2, X3, X5, X6.
* 
*         CALLS  CMM.FRF. 
  
  
 DUD      SUBR               ENTRY/EXIT 
          SA2    DC          READ CAPSULE CHAIN 
          ZR     X2,=XFDL=RSC  IF NO DIRECTORIES
          SX6    377777B     PRESET *FDCB*
          SA6    FDCB 
 DUD1     ZR     X2,EXIT.    IF END OF CHAIN
          SA3    X2+1        READ CAPSULE POINTER 
          ZR     X3,DUD2     IF NO CAPSULES ASSIGNED
          SA1    FDCB        READ SMALLEST DIRECTORY SIZE 
          SA3    X2+2        READ DIRECTORY SIZE
          SX3    X3+3        ADJUST SIZE TO INCLUDE HEADER
          SA2    X2          READ NEXT LINK IN CHAIN
          IX1    X1-X3
          MI     X1,DUD1     IF THIS DIRECTORY LARGER 
          BX6    X3          STORE SMALLER DIRECTORY SIZE 
          SA6    A1 
          EQ     DUD1        CHECK NEXT BLOCK 
  
 DUD2     SA5    X2          READ NEXT POINTER AND SAVE IN X5 
          BX6    X5          SNIP CHAIN 
          SA6    A2 
          SA0    X2          SAVE FORWARD POINTER 
          SX1    X2 
          RJ     =XCMM.FRF   DEALLOCATE BLOCK 
          SA2    A0          RESTORE ADDRESS OF FORWARD POINTER 
          BX2    X5          RESTORE FORWARD POINTER
          EQ     DUD1        CHECK NEXT BLOCK 
 FDC      TITLE  FDC - FIND DEALLOCATED CMM BLOCK.
**        FDC - FIND DEALLOCATED CMM BLOCK. 
* 
*         FDC SEARCHES THE CMM CHAIN FOR A DEALLOCATED BLOCK
*         WHICH *PGC* CAN USE TO RELOCATE GROUP DIRECTORIES.
* 
*         ENTRY  (FDCB) = SIZE OF SMALLEST GROUP DIRECTORY. 
* 
*         EXIT   (X1) = ADDRESS OF THE BLOCK. 
*                ZERO IF NO BLOCKS TO BE HAD. 
*                (X2) = BLOCK LENGTH. 
* 
*         USES   A1, A2, A3, A6.
*                X0, X3, X4, X6.
*                B3.
* 
*         CALLS NONE. 
  
  
 FDC      SUBR               ENTRY/EXIT 
          SA1    RA65        READ POINTER TO CMM CHAIN
          SX1    X1          EXTRACT POINTER TO DABA
          BX1    -X1
          SX1    X1+1        POINTER TO FIRST CMM BLOCK 
          SA2    RA104       READ HHA 
          SB2    X2 
 FDC1     SX1    X1          CHECK POINTER
          ZR     X1,EXIT.    IF END OF CHAIN
          SA1    X1          READ NEXT POINTER
          MI     X1,FDC1     IF BLOCK ALLOCATED 
          SB3    A1 
          LT     B3,B2,FDC1  IF BLOCK BELOW HHA 
          MX0    -36
          BX6    -X0*X1      EXTRACT POINTERS 
          SA2    FDCA        ALLOCATE BLOCK 
          BX6    X6+X2
          SX2    X1 
          SX4    A1+B1       BLOCK FWA
          IX2    X2-X4       BLOCK LENGTH 
          SA3    FDCB        READ MINIMUM BLOCK SIZE
          IX3    X2-X3
          MI     X3,FDC1     IF BLOCK TOO SMALL 
          SX1    X4 
          SA6    A1          REWRITE POINTER
          EQ     EXIT.       RETURN 
  
  
 FDCA     VFD    3/6,9/0,3/2,9/0,18/0,18/0  CHAIN HEADER AND SIZE CODE
 FDCB     CON    0           MINIMUM DIRECTORY SIZE 
 FHG      TITLE  FHG - FIND HIGHEST GROUP DIRECTORY.
**        FHG - FIND HIGHEST GROUP DIRECTORY. 
* 
*         FHG SEARCHES THE GROUP DIRECTORY CHAIN FOR THE
*         HIGHEST ADDRESS GROUP DIRECTORY WHICH WILL FIT THE
*         CMM BLOCK IN X1.
* 
*         ENTRY  (X1) = ADDRESS OF CMM BLOCK. 
*                (X2) = LENGTH OF CMM BLOCK.
* 
*         EXIT   (X3) = ADDRESS OF DIRECTORY TO BE MOVED. 
*                (X4) = LENGTH OF DIRECTORY TO BE MOVED.
*                (B2) = ADDRESS OF POINTER TO DIRECTORY.
* 
*         USES   A5.
*                X5, X6.
*                B2, B4, B5.
* 
*         CALLS  NONE.
  
  
 FHG      SUBR               ENTRY/EXIT 
          SX3    0
          SB4    DC          DIRECTORY CHAIN
 FHG1     SA5    B4          CHECK NEXT GROUP DIRECTORY 
          SB4    X5 
          ZR     X5,EXIT.    IF END OF CHAIN
          IX6    X1-X5       COMPARE ADDRESS WITH CMM BLOCK 
          PL     X6,FHG1     IF THIS DIRECTORY BELOW CMM BLOCK
          IX6    X3-X5       COMPARE ADDRESS WITH LAST BLOCK FOUND
          PL     X6,FHG1     IF PREVIOUS BLOCK HIGHER 
          SB5    A5          SAVE POINTER 
          SA5    X5+2        READ LENGTH MINUS HEADER 
          SX5    X5+3        BLOCK LENGTH 
          IX6    X2-X5
          MI     X6,FHG1     IF DIRECTORY TOO BIG 
          SB2    B5          KEEP POINTER 
          SX4    X5          KEEP LENGTH
          SX3    B4          KEEP ADDRESS 
          EQ     FHG1        KEEP LOOKING 
 GEA      TITLE  GEA - GET ENTRY ADDRESS. 
**        GEA - GET ENTRY ADDRESS.
* 
*         ENTRY  (X1) = OVCAP/CAPSULE NAME (0L FORMAT). 
*                (B2) = ADDRESS OF *6000* TABLE.
* 
*         EXIT   (X6) = ADDRESS OF ENTRY MATCHING NAME, 
*                       OR ZERO IF NO MATCH.
* 
*         USES   A3, A5, X0, X2, X3, X5, X6.
* 
*         CALLS  NONE.
  
  
 FDL=GEA  BSS    0
 GEA      SUBR
  
          SA3    B2+B1       ENTRY POINTER ADDRESS
          MX0    42 
          SA5    B2+X3       FIRST ENTRY TABLE ENTRY
          BX2    X0*X5       EXTRACT FIRST NAME 
  
 GEA10    SX6    X5          ENTRY ADDRESS OFFSET 
          IX3    X1-X2
          ZR     X6,GEA      IF NO MORE ENTRIES 
          SA5    A5+B1       NEXT ENTRY 
          SX6    X6+B2       ENTRY ADDRESS
          ZR     X3,GEA      IF MATCH 
          BX2    X0*X5       EXTRACT NEXT NAME
          EQ     GEA10
 GGD      TITLE  GGD - GET GROUP DIRECTORY. 
**        GGD - GET GROUP DIRECTORY.
* 
*         ENTRY  (X0) = -0 IF LOADING, +0 IF UNLOADING. 
*                       MI, NZ IF TO RELOAD DIRECTORY.
*                (X1) = GROUP NAME AND SIZE ESTIMATE. 
* 
*         EXIT   (A0) = FWA OF *CMM* BLOCK CONTAINING DIRECTORY.
*                IF UNLOADING - (X5) = LINK ADDRESS.
* 
*         USES   ALL BUT X0.
* 
*         CALLS  ALF, SCM, SYS=, CMM.SLF, CMM.CSF, CMM.FRF. 
  
  
 FDL=GGD  BSS    0
 GGD      SUBR               ENTRY/EXIT 
          SA2    DC          (A2/X2) = LINK 
          SB7    B1+B1       (B7) = OFFSET
          SB3    B7+B1       (B3) = 3 
          RJ     SCM         SEARCH FOR CORRECT DIRECTORY 
          SA0    X2          (A0) = BLOCK FWA 
          SX5    A2          (X5) = LINK ADDRESS
          NZ     X2,GGD3     IF FOUND 
          SX6    ERR.UGN     UNKNOWN GROUP NAME 
          SB2    X1+B3       ADD FUDGE FACTOR TO ESTIMATE TO ALLOW LIBS 
          PL     X0,=XFDL=RSC  IF UNLOADING, RETURN STATUS CODE 
          SB2    B2+B2       (B2) = ESTIMATE IN WDS OF REQD DIR LENGTH
          MX6    0           SET FOR ZERO LINK FIELDS AFTER INITIAL LOAD
          SA6    T3 
          SA6    A6+B1
 GGD1     SX2    B2+3        (X2) = BLK SIZE (DIRECTORY + 3 HDR WDS)
          SX3    200B        (X3) = SIZE CODE (LWA CAN SHRINK)
          RJ     ALF         ALLOCATE BLOCK 
          SA0    X1          (A0) = BLOCK FWA 
          SA3    T3          ZERO OR SAVED NEXT-GROUP LINK
          SA4    A3+B1       ZERO OR SAVED NEXT-CAPSULE LINK
          BX6    X3 
          LX7    X4 
          SA2    SVX1 
          SA6    A0          SET LINK FIELDS ZERO IF 1ST LOAD, OR TO
          SA7    A0+B1        VALUES FROM PREVIOUS DIRECTORY IF RELOAD
          MX7    42 
          BX7    X7*X2
          SA7    A7+B1       GROUP NAME FOR BLOCK HEADER
          SA7    T1          GROUP NAME FOR *LOADD* 
          SA3    SVX3        LIBRARY LIST POINTER 
          SX2    B2          DIRECTORY LENGTH 
          SX1    X1+B3       DIRECTORY FWA
          LX3    30 
          LX2    18 
          BX6    X3+X2
          BX6    X6+X1
          SA6    A7+B1       SET SECOND WORD OF *LOADD* PARAMETERS
          LOADD  A7,RCL      LOAD DIRECTORY 
          SA1    X6 
          SA2    A1+B1
          MX6    -3 
          AX1    9
          MX4    -12
          BX6    -X6*X1      ISOLATE FATAL ERROR CODE 
          LX1    55 
          AX2    18 
          BX4    -X4*X2      ISOLATE DIRECTORY LENGTH 
          MX7    0           FLAG *LDD* IN CASE OF INTERNAL ABORT 
          NZ     X6,GGD4     IF FATAL ERROR 
          PL     X1,GGD2     IF DIRECTORY AREA WAS BIG ENOUGH 
          SB2    X4          SAVE REQUIRED DIRECTORY LENGTH 
          SX1    A0 
          RJ     =XCMM.FRF   DEALLOCATE TOO-SMALL BLOCK 
          EQ     GGD1        GO TRY AGAIN 
  
 GGD2     =X6    ERR.UGN     UNKNOWN GROUP NAME 
          ZR     X4,GGD5     IF DIRECTORY EMPTY 
          SX2    B2 
          SA1    A0+2 
          BX7    X1+X4       PUT DIRECTORY LENGTH IN BLOCK HEADER 
          SA7    A1 
          SX1    A0          (X1) = BLOCK FWA 
          IX2    X2-X4       (X2) = SHRINK COUNT
          RJ     =XCMM.SLF   SHRINK TO FIT
          SX1    A0          (X1) = FWA 
          SX2    B0          (X2) = SIZE-CODE 
          RJ     =XCMM.CSF   SET FIXED SIZE 
 GGD3     PL     X0,EXIT.    IF UNLOADING 
          NZ     X0,GGD6     IF TO RELOAD THE SAME DIRECTORY
          SX6    A0 
          SA6    X5          LINK INTO CHAIN
          EQ     EXIT.
  
*         COME HERE IF ERROR RETURNED FROM LOADD. 
  
 GGD4     SB2    X6          ONLY POSSIBLE ERROR SHOULD BE 3 (BAD LIBS) 
          NE     B2,B3,IIE   IF UNEXPECTED ERROR, INTERNAL ABORT
          =X6    ERR.BLL     BAD LIBRARY LIST 
  
*         COME HERE IF ERROR AFTER BLOCK ALLOCATED. 
  
 GGD5     SB2    X6          SAVE ERROR CODE
          SX1    A0 
          RJ     =XCMM.FRF   DEALLOCATE CMM BLOCK 
          SX6    B2          RESTORE ERROR CODE 
          EQ     =XFDL=RSC   RETURN STATUS CODE 
  
*         COME HERE IF THE SPECIFIED DIRECTORY IS TO BE RE-LOADED.
  
 GGD6     SA1    A0          SAVE CURRENT NEXT-GROUP AND NEXT-CAPSULE 
          SA2    A1+B1        POINTERS; THEY WILL BE RESTORED IN THE
          BX6    X1            RELOADED DIRECTORY 
          LX7    X2 
          SA6    T3 
          SA7    A6+B1
          SX1    A0          FREE CURRENT COPY OF DIRECTORY 
          SA3    A2+B1       (B2) = CURRENT DIRECTORY LENGTH
          SB2    X3 
          RJ     =XCMM.FRF
          MX0    60          INDICATE LOADING 
          EQ     GGD1        GO ALLOCATE AND LOAD DIRECTORY AGAIN 
 IIE      TITLE  IIE - ISSUE INTERNAL ERROR.
**        IIE - ISSUE INTERNAL ERROR. 
* 
*         ENTRY  (X6) = ERROR CODE FROM *LDD* OR *LDQ*. 
*                (X7) = 0 - ERROR FROM *LDD*. 
*                       1 - ERROR FROM *LDQ*. 
* 
*         EXIT   TO *ABT*.
* 
*         CALLS  MSG=, SYS=.
  
  
 IIE      SA1    =10H- LDD ERR   SET FOR *LDD*
          MX2    -3          CONVERT ERROR NUMBER 
          BX4    -X2*X6 
          ZR     X7,IIE1     IF ERROR WAS FROM *LDD*
          SA1    =10H- LDQ ERR   INDICATE FROM *LDQ*
 IIE1     BX7    X1 
          SA7    ABTMSG1
          AX6    3           FINISH CONVERTING ERROR NUMBER 
          BX6    -X2*X6 
          LX6    6
          BX6    X6+X4
          SX6    X6+2R00
          LX6    8*6
          SA6    A7+B1
          MESSAGE  ABTMSG,,RCL  ISSUE MESSAGE AND ABORT 
          ABORT 
  
 ABTMSG   DATA   20H INTERNAL FDL ABORT 
 ABTMSG1  DATA   0,0
 LCM      TITLE  LCM - LOAD CAPSULE TO MEMORY.
**        LCM - LOAD CAPSULE TO MEMORY. 
* 
*         ENTRY  (X1) = CAPSULE NAME. 
*                (X2) = GROUP NAME. 
*                (X3) = FILE SPECIFICATION. 
*                (X4) = RANDOM ADDRESS AND LENGTH.
*                (B2) = 0 IF CAPSULE, -1 IF OVCAP.
* 
*         EXIT   (A0) = CAPSULE FWA.
* 
*         USES   ALL BUT X0, B2, B3.
* 
*         CALLS  ALF, SCM, CMM.FRF. 
  
  
 LCM10    MX0    42 
          SA1    CM+1 
          SB2    A0          *6000* TABLE ADDRESS 
          BX1    X0*X1       OVCAP/CAPSULE NAME 
          SX7    A0          CAPSULE FWA
          RJ     GEA         GET ENTRY ADDRESS
          LX6    30 
          BX7    X7+X6
          =X6    ERR.AOK
          SA7    A1+B1
  
 LCM      SUBR               ENTRY/EXIT 
          SX7    B2+2        CID OVCAP/CAPSULE FLAG 
          SX6    B1          CID *LOAD* FLAG
          BX7    X1+X7       42/0LNAME,12/0,6/L2
          SA6    CM 
          SA7    A6+B1
          BX6    X3 
          LX7    X2 
          SA6    T1          BUILD *LOADQ* BLOCK MINUS LOAD ADDRESS 
          SA7    A6+B1
          MX6    42 
          LX7    X4 
          BX6    X6*X1
          SA6    A7+B1
          SA7    A6+B1
          SB7    3           OFFSET 
          SA2    CC          LINK POINTER 
          SA2    X2 
          RJ     SCM         SEE IF CURRENTLY LOADED
          ZR     X2,LCM0.5   IF NOT LOADED
          SB2    X2+B1       ADDRESS OF CAPSULE/OVCAP 
          RJ     GEA         GET ENTRY ADDRESS
          SX5    B2 
          LX6    30 
          BX7    X5+X6
          SX6    ERR.CIM     CAPSULE IN MEMORY
          SA7    CM+2 
          EQ     =XFDL=RSC   RETURN STATUS CODE 
  
 LCM0.5   SX2    X4+B1       BLOCK LENGTH NEEDED
          SX3    200B        SIZE-CODE (LWA CAN SHRINK) 
          RJ     ALF         ALLOCATE BLOCK 
          SX6    X1 
          SA3    CC          CAPSULE CHAIN POINTER
 LCM1     SA3    X3          READ NEXT CHAIN ENTRY
          NZ     X3,LCM1     IF NOT AT END OF CHAIN 
          SA6    A3          LINK INTO CHAIN
          SX7    B0 
          SB4    A6          SAVE ADDRESS OF NEW LINK 
          SA7    X1          ZERO NEW LINK WORD 
          SX2    X1+B1
          SA0    X1+B1       (A0) = CAPSULE FWA 
          SA3    T3 
          SA4    A3+B1
          IX6    X3+X2       ADD ADDRESS INTO *LOADQ* PARAMS
          IX7    X4+X2
          SA6    A3 
          SA7    A4 
          LOADQ  T1,RCL      READ CAPSULE 
          SA1    X6 
          SX6    X1 
          AX6    9
          SA2    A0 
          SX7    B1          FLAG *LDQ* IN CASE OF INTERNAL ABORT 
          NZ     X6,LCM2     IF *LDQ* ERROR RETURNED
          SX1    B2 
          LX2    59-18
          BX1    X1-X2
          PL     X1,LCM10    IF BINARY MATCHES REQUEST
          SA6    B4          ZERO LINK
          SX1    A0-B1
          RJ     =XCMM.FRF   RETURN BLOCK 
          SX6    ERR.COC     OVCAP WITH CAPSULE REQUEST, OR REVERSE 
          EQ     =XFDL=RSC   RETURN STATUS CODE 
  
 LCM2     SA1    T5 
          NZ     X1,IIE      IF THIS WAS THE 2ND ATTEMPT
          SX2    X6-5 
          NZ     X2,IIE      IF NOT LDQ ERROR 5 
          SX7    B2          SAVE CAPSULE/OVCAP FLAG ACROSS *GGD* CALL
          SA7    A1 
          MX6    0           ZERO LINK
          SA6    B4 
          MX0    1           INDICATE A RELOAD OF THE SAME DIRECTORY
          SX1    A0-B1       FREE BLOCK INTENDED FOR CAPSULE
          RJ     =XCMM.FRF
          SA1    SVX1        GROUP NAME AND SIZE ESTIMATE 
          RJ     GGD         RELOAD THE SAME DIRECTORY
          SA3    T5          RESTORE CAPSULE/OVCAP FLAG 
          SB2    X3 
          SX7    B1          INDICATE ATTEMPT AFTER DIRECTORY RELOAD
          SA7    A3 
          ZR     B2,LDC1     IF CAPSULE, RETRY CAPSULE LOAD 
          EQ     =YFDL=ROL   RETRY OVCAP LOAD 
 SCC      TITLE  SCC - SCAN CAPSULE CHAIN.
**        SCC - SCAN CAPSULE CHAIN. 
* 
*         ENTRY  (A0) = FWA OF CAPSULE. 
*                (X0) = -0 IF TO LINK, +0 IF TO DELINK. 
*                (CC) = CAPSULE CHAIN POINTER.
* 
*         EXIT   INTER-CAPSULE LINKS ESTABLISHED/BROKEN.
* 
*         USES   ALL BUT A0, X0.
* 
*         CALLS  SEE. 
  
  
 SCC      SUBR               ENTRY/EXIT 
          SB2    A0          (B2) = FWA OF PRIMARY CAPSULE
          SA1    CC 
          SB3    X1+B1
 SCC1     SA1    B3-B1       GET LINK TO NEXT CAPSULE IN GROUP
          ZR     X1,EXIT.    IF NO MORE, QUIT 
          SB3    X1+B1       (B3) = FWA OF OTHER CAPSULE
          EQ     B2,B3,SCC1  IF SAME CAPSULE, SKIP IT 
          RJ     SEE         SCAN EXTERNALS AND ENTRIES 
          PL     X0,SCC1     IF DELINKING, DONT BOTHER WITH DYING CAPS
          SB2    B3          SWAP B2, B3
          SB3    A0 
          RJ     SEE         LINK THE OTHER WAY 
          SB3    B2          SWAP BACK
          SB2    A0 
          EQ     SCC1        LOOP 
 SCM      TITLE  SCM - SEARCH CHAIN FOR MATCH.
**        SCM - SEARCH CHAIN FOR MATCH. 
* 
*         ENTRY  (X1) = NAME TO CHECK FOR.
*                (X2) = ADDRESS OF FIRST TABLE IN CHAIN.
*                (A2) = ADDRESS OF POINTER TO FIRST TABLE.
*                (B7) = OFFSET INTO TABLE GIVING WORD TO BE CHECKED.
* 
*         EXIT   (X2) = ADDRESS OF TABLE IF MATCH, ELSE ZERO. 
*                (A2) = ADDRESS OF LINK TO TABLE, OR OF ZERO LINK.
* 
*         USES   A3, X3, X5.
* 
*         CALLS  NONE.
  
  
 SCM      SUBR               ENTRY/EXIT 
 SCM1     ZR     X2,EXIT.    IF END OF CHAIN REACHED, EXIT
          SA3    X2+B7       WORD TO TEST 
          MX5    42 
          BX3    X3-X1
          BX3    X5*X3
          ZR     X3,EXIT.    IF MATCH, EXIT 
          SA2    X2          GET NEXT TABLE ADDRESS 
          EQ     SCM1        GO CHECK IT
 SEE      TITLE  SEE - SCAN EXTERNALS AND ENTRIES.
**        SEE - SCAN EXTERNALS AND ENTRIES. 
* 
*         ENTRY  (X0) = -0 IF TO LINK, +0 IF TO DELINK. 
*                (B2) = FWA OF CAPSULE WITH ENTRY POINTS. 
*                (B3) = FWA OF CAPSULE WITH EXTERNAL REFERENCES.
* 
*         EXIT   MATCHING ENTRY POINTS LINKED OR DELINKED.
* 
*         USES   ALL BUT A0, X0, B2, B3.
* 
*         CALLS  SEA. 
  
  
 SEE      SUBR               ENTRY/EXIT 
          SA2    B2 
          SA1    B2+B1
          SB4    B2+X1       (B4) = FWA OF ENTRY POINT LIST 
          AX2    36 
          SB6    X2          (B6) = LENGTH OF ENTRY POINT LIST
          SA3    B3 
          SA4    B3+B1
          LX3    -36
          SB5    B3+X3
          SB5    B5+X4       (B5) = FWA OF EXTERNAL REFERENCE LIST
          LX3    12 
          MX4    -12
          BX7    -X4*X3 
          SB7    X7          (B7) = LENGTH OF REFERENCE LIST
 SEE1     SB6    B6-B1       DECREMENT ENTRY POINT COUNT
          MI     B6,EXIT.    IF NO MORE, EXIT 
          SA4    B4+B6       LOAD NEXT ENTRY
          BX2    X4          SAVE 
          AX4    18          POSITION FOR COMPARE 
          MI     X1,SEE3     IF CURRENT EXTERNAL REF IS TO BE CHECKED 
 SEE2     SB7    B7-B1       DECREMENT REFERENCE COUNT
          MI     B7,EXIT.    IF NO MORE, EXIT 
          SA5    B5+B7       LOAD NEXT ENTRY
          MX7    -17
          BX3    -X7*X5 
          AX5    18          POSITION FOR COMPARE 
          SA3    B3+X3       LOAD FIRST WORD OF CHAIN 
 SEE3     IX1    X5-X4       COMPARE
          BX6    X3 
          MI     X1,SEE1     IF ENTRY .GT. EXTERNAL 
          NZ     X1,SEE2     IF ENTRY .LT. EXTERNAL 
          SX4    B2+X2       (X4) = ENTRY POINT ADDRESS 
          AX6    40          (X6) = TOP 20 BITS FROM CHAIN
          MX7    -18
          BX5    -X7*X4      (X5) = 42/0, 18/ADDRESS
          BX7    -X0*X5 
          IX7    X6-X7
          NZ     X7,SEE1     IF ALREADY LINKED/DELINKED 
          LX5    40 
          BX7    X3-X5       SET/CLEAR ADDRESS IN FIRST CHAIN PACKET
          SA7    A3 
          SX6    B6          SAVE REGISTERS 
          SX7    B7 
          LX6    18 
          BX6    X6+X7
          SX7    B4 
          LX6    18 
          BX6    X6+X7
          SA6    SEEA 
          RJ     =XFDL=SEA   LINK/DELINK
          SA1    SEEA 
          SB4    X1          RESTORE REGISTERS
          AX1    18 
          SB7    X1 
          AX1    18 
          SB6    X1 
          EQ     SEE1 
  
 SEEA     BSS    1           SAVE AREA
 SGD      TITLE  SGD - SEARCH GROUP DIRECTORY.
**        SGD - SEARCH GROUP DIRECTORY. 
* 
*         ENTRY  (A0) = FWA OF *CMM* BLOCK CONTAINING DIRECTORY.
*                (SVX2) = CAPSULE NAME. 
* 
*         EXIT   (X1) = CAPSULE NAME. 
*                (X2) = GROUP NAME AND DIRECTORY LENGTH.
*                (X3) = FILE SPECIFICATION AS RETURNED BY *LOADD*.
*                (X4) = RANDOM ADDRESS AND LENGTH FROM *LOADD*. 
* 
*         USES   A1, A2, A3, A4, X6, X7, B6, B7.
* 
*         CALLS  NONE.
  
  
 FDL=SGD  BSS    0
 SGD      SUBR               ENTRY/EXIT 
          SA1    SVX2        LOAD CAPSULE NAME
          SB6    A0+3 
          SA2    B6-B1       GET GROUP NAME AND DIRECTORY LENGTH
          SB7    X2          (B7) = INDEX 
          SX6    ERR.UCN     UNKNOWN CAPSULE NAME 
          MX7    42          (X7) = NAME MASK 
 SGD1     SB7    B7-B1
          MI     B7,=XFDL=RSC  IF NO MORE, RETURN STATUS CODE 
          SA4    B6+B7       GET NEXT ENTRY 
          BX3    X4-X1       COMPARE
          BX3    X7*X3
          NZ     X3,SGD1     IF NO MATCH, TRY AGAIN 
          SA3    B6+X4       (X3) = FILE SPECIFICATION
          SA4    A4+B1       (X4) = RANDOM ADDRESS
          EQ     EXIT.       EXIT 
          SPACE  4
          END 
