*DECK DB$CPUT 
USETEXT UTCITTX 
USETEXT UTCDFTX 
USETEXT CUGBATX 
      PROC DB$CPUT(LOCWSA,LENGTH);
 #
  *   DB$CPUT - PUT WORDS IN MASTER DIRECTORY    PAGE  1
  *   STEVEN P. LEVIN                            DATE  12/18/75 
  
  DC  PURPOSE 
  
      BY ULTIMATELY USING CRM PUT, WRITE TO THE MASTER DIRECTORY FILE 
      FROM A WORKING STORAGE AREA OF A SPECIFIED LOCATION AND LENGTH. 
  
  DC  ENTRY CONDITIONS
  
      THE PARAMETER LOCWSA IS THE WORKING STORAGE AREA LOCATION.
      THE PARAMETER LENGTH IS THE WORD LENGTH OF WHAT IS TO BE PUT. 
      THE FOLLOWING COMMON ITEMS SHOULD HAVE BEEN GIVEN VALID VALUES: 
      CHECKSUM - EXCLUSIVE-OR CHECKSUM OF WORDS OF THE NEW CST
      LENTHCST - WORD LENGTH OF THE CST IN THE MASTER DIRECTORY FILE
      MASWACST - WORD ADDRESS IN THE MASTER DIRECTORY OF NEW CST ENTRY
      THE MASTER DIRECTORY FILE AND ITS FIT DB$FTMD SHOULD BE USABLE. 
  
  DC  EXIT CONDITIONS 
  
      ON NORMAL DB$CPUT RETURN, LENGTH WORDS FROM THE WORKING STORAGE 
      AREA (IN MANAGED MEMORY OR AT A FIXED LOCATION) INDICATED BY
      LOCWSA WILL BE WRITTEN TO THE MASTER DIRECTORY AT THE ADDRESS 
      MASWACST PLUS LENTHCST.  THE EXCLUSIVE-OR CHECKSUM OF WORDS IN
      THE CST AND LENTHCST, THE CST LENGTH IN THE MD, WILL BE RESET.
      MANAGED MEMORY BLOCK FIRST-USABLE-ADDRESS WORDS WILL BE UPDATED.
      ALTHOUGH DB$CPUT DOES NOT DIRECTLY DETECT ERRORS, IT DOES PASS
      AN ERROR PROC ADDRESS TO DB$WPUT WHICH DB$WPUT PUTS IN THE FIT. 
  
  DC  CALLING ROUTINES
  
      DB$CARE - BUILD AN AREA WORK BLOCK IN THE WORK BLOCK CORE BLOCK 
      DB$CCON - BUILD A CONSTRAINT WORK BLOCK IN WORK BLOCK CORE BLOCK
      DB$CEND - END CST BUILD BY WRITING PARTS OTHER THAN WORK BLOCKS 
      DB$CPRE - PREPARE TO BUILD WORK BLOCKS WITH NEEDED INITIALIZING 
      DB$CREC - BUILD A RECORD WORK BLOCK IN THE WORK BLOCK CORE BLOCK
      DB$CREL - BUILD A RELATION WORK BLOCK IN WORK BLOCK MEMORY BLOCK
  
  DC  CALLED ROUTINES 
  
      DB$UADR - UPDATE MANAGED MEMORY BLOCK FIRST-USABLE-ADDRESS WORDS
      DB$WPUT - CALL CYBER RECORD MANAGER TO DO A WORD ADDRESSABLE PUT
  
  DC  NON-LOCAL VARIABLES 
  
      CHECKSUM - EXCLUSIVE-OR CHECKSUM OF WORDS OF THE NEW CST
      LENTHCST - WORD LENGTH OF THE CST IN THE MASTER DIRECTORY FILE
      DB$WPUT CALLS CRM PUT, WHICH WILL MODIFY THE MASTER DIRECTORY.
  
  DC  DESCRIPTION 
  
      PREPARE TO CALL DB$WPUT, INCLUDING CHECKSUM AND LENTHCST RESETS.
      CALL DB$WPUT TO PUT IN THE MD. CALL DB$UADR TO UPDATE ADDRESSES.
      RETURN FROM DB$CPUT WITH NEW WORDS NOW IN THE MASTER DIRECTORY. 
 #
        CONTROL EJECT;
  
        BEGIN                # DB$CPUT #
  
# THE FOLLOWING ARE FORMAL PARAMETERS IN THE ORDER THEY ARE PASSED #
  
        ITEM LOCWSA U;       # LOCATION OF THE WORKING STORAGE AREA # 
        ITEM LENGTH I;       # WORD LENGTH OF WHAT IS TO BE WRITTEN # 
  
# THE FOLLOWING ARE EXTERNALLY REFERENCED PROCEDURES AND ARRAYS # 
  
        XREF PROC DB$CEMD;   # MASTER DIRECTORY CRM ERROR HANDLER # 
        XREF PROC DB$UADR;   # UPDATE MANAGED MEMORY USABLE ADDRESSES#
        XREF PROC DB$WPUT;   # CALL CRM TO DO A WORD ADDRESSABLE PUT #
        XREF ARRAY DB$FTMD;; # MASTER DIRECTORY FILE INFORMATN. TABLE#
  
        CONTROL NOLIST;      # COMDECKS UTCDFDCLS UTCITDCLS CUGBADCLS#
        CONTROL LIST;        # RESUME THE LISTING OF THE SOURCE CODE #
  
        ITEM INDEX I;        # A GENERAL INDEX AND INDUCTION VARIABLE#
  
# ******************************************************************** #
  
# PREPARE TO CALL DB$WPUT, INCLUDING CHECKSUM AND LENTHCST RESETTING #
  
        P<GETENTRY> = LOCWSA - 1;      # -1 BECAUSE GETENTRY STARTS 0#
        FOR INDEX = 1 THRU LENGTH DO   # LOOP THROUGH WORDS TO BE PUT#
          CHECKSUM = CHECKSUM LXR GETUNSIG[INDEX];         # EXCLU-OR#
        P<GETENTRY> = LOCWSA;          # POINT TO LOCATION OF WSA # 
        INDEX = MASWACST + LENTHCST;   # WORD ADDRESS IN MASTER DIREC#
        LENTHCST = LENTHCST + LENGTH;  # CST WORD LENGTH IN MAST DIRE#
  
# CALL DB$WPUT TO PUT IN THE MD, AND CALL DB$UADR TO UPDATE ADDRESSES#
  
        XCALL DB$WPUT(DB$FTMD,GETENTRY,LENGTH,INDEX,DB$CEMD); 
        XCALL DB$UADR;       # UPDATE MANAGED MEMORY USABLE ADDRESSES#
  
# RETURN FROM DB$CPUT WITH NEW WORDS NOW IN THE MASTER DIRECTORY FILE#
  
        RETURN;              # NEW WORDS NOW IN MASTER DIRECTORY FILE#
  
        END                  # DB$CPUT #
  
      TERM
