*DECK DB$ADDP 
USETEXT CDCSCTX 
      FUNC DB$ADDP; 
      BEGIN 
 #
* *   DB$ADDP - OBTAIN ADDRESS OF DBP            PAGE  1
* *   W P CEAGLIO                                DATE  11/05/80 
* 
* DC  PURPOSE 
* 
*     OBTAIN ADDRESS OF DATA BASE PROCEDURE 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
* 
*     NONE
* 
*     ASSUMPTIONS 
* 
*     THE FOLLOWING CELLS IN CDCSCOMMN -- 
* 
*     SALX         SET TO SAL ENTRY INVOLVED
*     APLX         SET TO DBP APL ENTRY ORDINAL 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL   - ADDRESS OF DBP RETURNED AS FUNCTION
* 
*     ABNORMAL - FDL ERROR NUMBER TIMES -1 RETURNED AS FUNCTION RESULT. 
* 
*                DB$PUNT IS CALLED TO REPORT AN INTERNAL ERROR AND TO 
*                ABORT CDCS IF CDCS IS NOT IN SYSTEM RECOVERY MODE AND
*                THE DBP HAS NOT BEEN LOADED CORRECTLY ALREADY. 
* 
* DC  CALLING ROUTINES
* 
*     DB$OCAR      OPEN AND CHECK AREA
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$DBPL;     # LOAD DATA BASE PROCEDURE                #
      XREF PROC DB$FLOP;     # GENERATE A FLOW POINT                   #
      XREF PROC DB$PUNT;     # CDCS INTERNAL ERROR PROCESSOR           #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     -  IF THE ADDRESS PORTION OF THE ENTRY IN THE APL INDICATED BY
*        APLX IS ZERO, CALL DB$DBPL TO LOAD THE PROCEDURE AND RETURN
*        ITS ADDRESS IN CM.  (IF THE DBP HAS NOT ALREADY BEEN LOADED
*        AND CDCS IS NOT IN SYSTEM RECOVERY MODE, CALL DB$PUNT TO ABORT 
*        CDCS.) 
* 
*     -  IF THE APL ENTRY ADDRESS INDICATES AN FDL ERROR OCCURRED IN
*        THE LOAD, SET THE FUNCTION RESULT TO THE FDL ERROR NUMBER TIMES
*        -1.  (IF THE DBP HAD AN OLD FDL ERROR AND CDCS IS NOT IN 
*        SYSTEM RECOVERY MODE, CALL DB$PUNT TO ABORT CDCS.) 
* 
*     -  OTHERWISE, TIME-STAMP THE APL ENTRY AND SET THE FUNCTION TO
*        THE ADDRESS IN THE ENTRY.
* 
 #
  
      CONTROL EJECT;
  
# S T A R T   O F   D B $ A D D P   E X E C U T A B L E   C O D E      #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("ADDP");     # GENERATE A FLOW POINT                   #
      CONTROL ENDIF;
  
  
#     IF PROCEDURE NOT LOADED (ADDRESS IN ENTRY = ZERO), CALL DB$DBPL  #
#     TO LOAD IT AND RETURN ITS ADDRESS.                               #
#     IF AN ERROR IN LOADING THE PROCEDURE, SET THE FUNCTION TO THE    #
#     FDL ERROR NUMBER TIMES -1.                                       #
  
      IF APEPADD[APLX] EQ 0 
      THEN
        BEGIN 
        IF NOT SYSRECOVERY   # IF NOT IN SYSTEM RECOVERY MODE          #
        THEN                 # ERROR IF DBP NOT ALREADY LOADED         #
          BEGIN 
          DB$PUNT("DB$ADDP  1");  # ABORT CDCS - NO RETURN             #
  
          END 
        DB$DBPL(APWORD0[0],LOC(APDBPNAM[APLX]));  # LOAD DBP           #
        END 
  
  
      IF APEPADD[APLX] LQ DFMAXDBPERR  #FDL LOAD ERROR                 #
      THEN
        BEGIN 
        IF NOT SYSRECOVERY   # IF NOT IN SYSTEM RECOVERY MODE          #
        THEN                 # ERROR IF OLD FDL ERROR                  #
          BEGIN 
          DB$PUNT("DB$ADDP  2");  # ABORT CDCS - NO RETURN             #
  
          END 
        DB$ADDP = -APEPADD[APLX];  # RETURN NEGATIVE OF FDL ERROR CODE# 
        END 
  
#     OTHERWISE, TIME-STAMP THE APL ENTRY AND RETURN THE ADDRESS OF    #
#     THE PROCEDURE IN THE ENTRY AS THE VALUE OF THE FUNCTION.         #
  
      ELSE
        BEGIN 
        APDBPAGE[APLX] = TIMESTAMP; 
        DB$ADDP = APEPADD[APLX];
        END 
  
      END 
      TERM; 
