*DECK DB$MCAP 
USETEXT CUGBATX 
USETEXT CDCSCTX 
      PROC DB$MCAP; 
  
 #
  
  *   DB$MCAP - GET A MAPPING CAPSULE FROM MD    PAGE  1
  *   STEVEN P. LEVIN                            DATE  12/16/76 
  
  DC  PURPOSE 
  
      THIS MODULE GETS A MAPPING CAPSULE FROM THE MASTER DIRECTORY
      FILE AND CALLS DC$MREL TO HAVE IT RELOCATED AND LINKED BY FDL.
  
  DC  ENTRY CONDITIONS
  
      THE FOLLOWING BASED ARRAYS IN CDCSCOMMN MUST BE VALIDLY POINTED:  
      ACL - ACTIVE CAPSULE LIST (POINT TO CURRENT MAP CAPSULE ENTRY)
      ASL - ACTIVE SUBSCHEMA LIST (POINT TO CURRENT SUBSCHEMA ENTRY)
      THE MASTER DIRECTORY FILE AND ITS FIT DB$FTMD SHOULD BE USABLE. 
  
  DC  EXIT CONDITIONS 
  
      ON NORMAL RETURN FROM DB$MCAP, THE MAPPING CAPSULE INDICATED BY 
      THE CURRENT ACTIVE CAPSULE LIST (ACL) ENTRY WILL HAVE BEEN READ 
      FROM THE MASTER DIRECTORY FILE TO A BLOCK IN MANAGED MEMORY AND 
      WILL HAVE BEEN RELOCATED AND LINKED BY THE FAST DYNAMIC LOADER. 
      APPROPRIATE FIELDS IN THE ACTIVE CAPSULE LIST (ACL) AND ACTIVE
      SUBSCHEMA LIST (ASL) WILL HAVE BEEN UPDATED FOR THIS CAPSULE. 
      IF DC$MREL INDICATES TO DB$MCAP THAT THERE WAS A FAST DYNAMIC 
      LOADER (FDL) ERROR, DB$PUNT WILL BE CALLED TO PROCESS THE ERROR.
      IF OTHER ERRORS ARE FOUND BY MODULES SUBORDINATE TO DB$MCAP 
      THROUGH CALLS, THEY WILL BE HANDLED BY THE SUBORDINATE MODULES. 
  
  DC  CALLING ROUTINES
  
      DB$KMIF - KEY MAPPER INTERFACE BETWEEN CDCS AND KEY MAP CAPSULES
      DB$RMIF - RECORD MAPPER INTERFACE BETWEEN CDCS AND REC CAPSULES 
  
  DC  CALLED ROUTINES 
  
      DB$FLOP - GENERATE A FLOW POINT 
      DB$MFA  - ALLOCATE A FIXED-POSITION MANAGED MEMORY BLOCK
      DB$PUNT - PROCESS A CDCS INTERNAL ERROR (ABORT) 
      DB$WGET - CALL CYBER RECORD MANAGER TO DO A WORD ADDRESSABLE GET
      DC$MREL - CALL FDL.REL TO RELOCATE AND LINK A MAPPING CAPSULE 
  
  DC  NON-LOCAL VARIABLES 
  
      DB$MCAP AND/OR CALLED MODULES MAY MODIFY THE FOLLOWING ITEMS: 
      DB$MERR - ERROR INDICATOR FOR NON-CAPSULE PROCESSING ERRORS 
      DB$MFWA - FIRST WORD ADDRESS OF THE MAPPING CAPSULE IN CORE 
      FIELDS IN THE FOLLOWING CDCSCOMMN BASED ARRAYS MAY BE MODIFIED: 
      ACL - ACTIVE CAPSULE LIST (CURRENT MAPPING CAPSULE ENTRY FIELDS)
      ASL - ACTIVE SUBSCHEMA LIST (CURRENT SUBSCHEMA ENTRY FIELDS)
      IN ADDITION, A MEMORY BLOCK WILL BE ALLOCATED FOR THE CAPSULE.
      THE CAPSULE WILL BE READ FROM THE MASTER DIRECTORY FILE TO THIS 
      MAMAGED MEMORY BLOCK AND WILL BE RELOCATED IN THIS MEMORY BLOCK.
  
  DC  DESCRIPTION 
  
      CALL DB$MFA TO ALLOCATE A FIXED-POSITION BLOCK FOR THE CAPSULE. 
      UPDATE THE ACL FOR THE NEW MAPPING CAPSULE TO BE READ TO CORE.
      UPDATE THE ASL FOR THE NEW MAPPING CAPSULE TO BE READ TO CORE.
      CALL DB$WGET TO GET THE CAPSULE FROM THE MASTER DIRECTORY FILE. 
      SET THE ERROR INDICATOR FOR NON-CAPSULE PROCESSING ERRORS TO 0. 
      CALL DC$MREL TO HAVE FDL.REL RELOCATE AND LINK THE CAPSULE. 
      IF DB$MERR INDICATES A RELOCATE/LINK ERROR, CALL DB$PUNT. 
      RETURN FROM DB$MCAP WITH THE CAPSULE NOW IN CORE AND RELOCATED. 
  
 #
        CONTROL EJECT;
  
        BEGIN                # DB$MCAP #
  
# THE FOLLOWING EXTERNALLY DEFINED ITEMS AND ARRAYS ARE USED FOR #
# COMMUNICATION BETWEEN CDCS MODULES, DDL CAPSULE-CONNECTED MODULES, #
# AND THE MAPPING CAPSULES.  THEY ARE DEFINED IN DB$MCAP, THOUGH THEY#
# ARE USED MORE EXTENSIVELY IN OTHER MODULES.  THIS IS BECAUSE (1) IT#
# WAS FELT THAT THESE ITEMS AND ARRAYS SHOULD BE DEFINED WITHIN A # 
# CDCS MODULE, AND (2) DB$MCAP CONNOTES NEITHER KEY MAPPER NOR RECORD#
# MAPPER USE EXCLUSIVELY, SINCE DB$MCAP IS CALLED FOR BOTH OF THESE. #
  
        XDEF ITEM DB$MBUF U; # SCRATCH BUFFER FIRST WORD ADDRESS #
        XDEF ITEM DB$MDNA U; # DATA NAME ITEM FIRST WORD ADDRESS #
        XDEF ITEM DB$MERF U = 0;       # MAPPING ERROR FLAG (CAPSULE)#
        XDEF ITEM DB$MERP U = 0;       # APLIST FWA OF ITEM ERROR DBP#
        XDEF ITEM DB$MERR U = 0;       # ERROR INDICATOR (NONCAPSULE)#
        XDEF ITEM DB$MFIT U; # FILE INFORMATION TABLE WORD ADDRESS #
        XDEF ITEM DB$MFWA U; # FIRST WORD ADDRESS OF CAPSULE IN CORE #
        XDEF ITEM DB$MIOR U; # ITEM ORDINAL IN THE SUBSCHEMA #
        XDEF ITEM DB$MKEY B; # KEY MAP MODE: FALSE=DATA NAME,TRUE=KEY#
        XDEF ITEM DB$MLEN U; # WORD LENGTH OF SUBSCHEMA-FORMAT RECORD#
        XDEF ITEM DB$MMOD U; # MODE:0=WRITE, 1=REWRITE, 2=READ, 3=KEY#
        XDEF ITEM DB$MRBF B; # RESULT IN BUFFER:TRUE=MAPPED IN BUFFER#
        XDEF ITEM DB$MROR U; # RECORD ORDINAL IN THE SUBSCHEMA #
        XDEF ITEM DB$MSSO U; # SUBSCHEMA ITEM ORDINAL                  #
        XDEF ITEM DB$MSUB U; # SUBSCHEMA-FORMAT RECORD WORD ADDRESS # 
  
# THE ARRAY DB$MDCA IS USED FOR DISPLAY TO ASCII COLLATING SEQUENCE # 
  
        XDEF ARRAY DB$MDCA[0:7];       # DISPLAY TO ASCII COLLATE SEQ#
          ITEM DBMDCA U(0,0,60) =      # ITEM USED TO PRESET VALUES # 
            [O"32414243444546470000",  # CODES FOR :ABCDEFG   # 
             O"50515253545556570000",  # CODES FOR HIJKLMNO   # 
             O"60616263646566670000",  # CODES FOR PQRSTUVW   # 
             O"70717220212223240000",  # CODES FOR XYZ01234   # 
             O"25262730311315120000",  # CODES FOR 56789+-*   # 
             O"17101104350014160000",  # CODES FOR /()$= ,.   # 
             O"03737505027701060000",  # CODES FOR  []%"_!&   # 
             O"07373436407476330000"]; # CODES FOR '?<>@\^    # 
  
# THE ARRAY DB$MDCC IS USED FOR DISPLAY TO COBOL COLLATING SEQUENCE # 
  
        XDEF ARRAY DB$MDCC[0:7];       # DISPLAY TO COBOL COLLATE SEQ#
          ITEM DBMDCC U(0,0,60) =      # ITEM USED TO PRESET VALUES # 
            [O"65313233343536370000",  # CODES FOR :ABCDEFG   # 
             O"40414344454647500000",  # CODES FOR HIJKLMNO   # 
             O"51525355565760610000",  # CODES FOR PQRSTUVW   # 
             O"62636466677071720000",  # CODES FOR XYZ01234   # 
             O"73747576771722210000",  # CODES FOR 56789+-*   # 
             O"23251520260024140000",  # CODES FOR /()$= ,.   # 
             O"05035402270442060000",  # CODES FOR  []%"_!&   # 
             O"07103011011213160000"]; # CODES FOR '?<>@\^    # 
        CONTROL EJECT;
  
# THE ARRAY DB$MDCU IS USED FOR A DISPLAY TO USER INSTALLATION #
# COLLATING SEQUENCE.  BY CHANGING THE PRESET LIST FOR ITEM DBMDCU, A#
# USER INSTALLATION CAN INTRODUCE ITS OWN USER COLLATING SEQUENCE. #
  
        XDEF ARRAY DB$MDCU[0:7];       # DISPLAY TO USER COLLATE SEQ #
          ITEM DBMDCU U(0,0,60) =      # ITEM USED TO PRESET VALUES # 
            [O"00010203040506070000",  # CODES FOR :ABCDEFG   # 
             O"10111213141516170000",  # CODES FOR HIJKLMNO   # 
             O"20212223242526270000",  # CODES FOR PQRSTUVW   # 
             O"30313233343536370000",  # CODES FOR XYZ01234   # 
             O"40414243444546470000",  # CODES FOR 56789+-*   # 
             O"50515253545556570000",  # CODES FOR /()$= ,.   # 
             O"60616263646566670000",  # CODES FOR  []%"_!&   # 
             O"70717273747576770000"]; # CODES FOR '?<>@\^    # 
  
# THE ARRAY DB$MDCX IS USED FOR DISPLAY TO DISPLAY COLLATING SEQUENCE#
  
        XDEF ARRAY DB$MDCX[0:7];       # DISPLAY TO DISPLAY COLLATING#
          ITEM DBMDCX U(0,0,60) =      # ITEM USED TO PRESET VALUES # 
            [O"00010203040506070000",  # CODES FOR :ABCDEFG   # 
             O"10111213141516170000",  # CODES FOR HIJKLMNO   # 
             O"20212223242526270000",  # CODES FOR PQRSTUVW   # 
             O"30313233343536370000",  # CODES FOR XYZ01234   # 
             O"40414243444546470000",  # CODES FOR 56789+-*   # 
             O"50515253545556570000",  # CODES FOR /()$= ,.   # 
             O"60616263646566670000",  # CODES FOR  []%"_!&   # 
             O"70717273747576770000"]; # CODES FOR '?<>@\^    # 
  
# THE FOLLOWING ARE EXTERNALLY REFERENCED PROCEDURES AND ARRAYS # 
  
        XREF PROC DB$FLOP;   # GENERATE A FLOW POINT                 #
        XREF PROC DB$MDER;   # MASTER DIRECTORY CRM ERROR PROCESSOR # 
        XREF PROC DB$MFA;    # ALLOCATE A FIXED-POSITION MEMORY BLOCK#
      XREF ITEM DB$MFX B;    #ABORT-USER-OK FLAG# 
        XREF PROC DB$PUNT;   # PROCESS A CDCS INTERNAL ERROR (ABORT) #
        XREF PROC DB$WGET;   # CALL CRM TO DO A WORD ADDRESSABLE GET #
        XREF PROC DC$MREL;   # CALL FDL TO RELOCATE AND LINK CAPSULE #
        XREF ARRAY DB$FTMD;; # MASTER DIRECTORY FILE INFORMATN. TABLE#
  
  
# THE FOLLOWING DEFS ARE LOCAL TO DB$MCAP # 
  
        DEF DFCAPPRE #15#;   # MAPPING CAPSULE PREFIX TABLE WD LENGTH#
        DEF XCALL # #;       # USED FOR EXTERNAL MODULE CALLS # 
        CONTROL EJECT;
  
        CONTROL IFGR DFFLOP,0;
          DB$FLOP("MCAP   ");          # GENERATE FLOW POINT - ENTRY   #
        CONTROL ENDIF;
  
# CALL DB$MFA TO ALLOCATE A FIXED-POSITION BLOCK FOR THE CAPSULE #
# ALLOW CDCS TO ABORT USER ON CMM OVERFLOW# 
  
        XCALL DB$MFA(ACLENCAP[0] - DFCAPPRE, DB$MFWA);     # ALLOCATE#
  
# UPDATE THE ACL FOR THE NEW MAPPING CAPSULE TO BE READ TO CORE # 
  
        ACCMLOC[0] = DB$MFWA;          # FIRST WRD ADDRESS OF CAPSULE#
        ACNUMCLS[0] = 0;               # NUMBER OF CALLS OF CAPSULE # 
  
# UPDATE THE ASL FOR THE NEW MAPPING CAPSULE TO BE READ TO CORE # 
  
        ASACLNCP[0] = ASACLNCP[0] + 1; # NUMBER OF CAPSULES IN CORE # 
  
# CALL DB$WGET TO GET THE CAPSULE FROM THE MASTER DIRECTORY FILE #
  
        P<GETENTRY> = DB$MFWA;         # POINT TO FWA OF CORE CAPSULE#
        XCALL DB$WGET(DB$FTMD, GETENTRY, ACLENCAP[0] - DFCAPPRE,
                      ACWACAP[0] + DFCAPPRE, DB$MDER);     # WA GET # 
  
# SET THE ERROR INDICATOR FOR NON-CAPSULE PROCESSING ERRORS TO ZERO # 
  
        DB$MERR = 0;         # ERROR INDICATOR FOR NON-CAPSULE ERRORS#
  
# CALL DC$MREL TO HAVE FDL.REL RELOCATE AND LINK THE CAPSULE #
  
        XCALL DC$MREL;                 # RELOCATE AND LINK CAPSULE #
  
# IF DB$MERR INDICATES A RELOCATE/LINK ERROR, CALL DB$PUNT TO ABORT # 
  
        IF DB$MERR NQ 0 THEN XCALL DB$PUNT("DB$MCAP  1");  # ABORT #
  
# RETURN FROM DB$MCAP WITH THE CAPSULE NOW IN CORE AND RELOCATED #
  
        RETURN;              # CAPSULE NOW IN CORE AND RELOCATED #
  
        END                  # DB$MCAP #
  
      TERM
