*DECK PROCESS 
USETEXT MISC$ 
USETEXT TSB$COM 
USETEXT ACN$COM 
USETEXT CHN$COM 
USETEXT GLOBALI 
USETEXT RBF$COM 
      PROC PROCESS (CHAIN); 
      BEGIN # PROCESS # 
 #
*1DC  PROCESS 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        PROCESS             B. M. WEST          9 MARCH 1977 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        PROCESS GOES DOWN A CHAIN LINK BY LINK, CALLING THE MODULE 
*        SPECIFIED IN ACN$MOD OF THE CONNECTION UNLESS IT IS THE
*        EVENT CHAIN IN WHICH CASE THE MODULE WHOSE ADDRESS IS
*        SPECIFIED IN CCB$EVENT IS CALLED. IT IS THE RESPONSIBILITY 
*        OF NON-EVENT MODULES TO PLACE THE CONNECTION BACK ONTO A 
*        CHAIN. EVENT LINKS ARE NOT REMOVED FROM THE CHAIN BY PROCESS.
*        (EVENT MODULES WILL REMOVE THE LINK FROM THE CHAIN IF THE
*        EVENT HAS OCCURRED AND PLACE THE LINK ON THE DESTINATION CHAIN 
*        SPECIFIED BY ACN$CHN OF THE CONNECTION.) 
* 
*     3. METHOD USED. 
*        PROCESS GETS THE NEXT ELEMENT ON A CHAIN. IF A NON-EVENT 
*        CHAIN, THEN PROCESS REMOVES THE LINK FROM THE CHAIN AND CALLS
*        THE MODULE 
*        SPECIFIED BY ACN$MOD AFTER CALLING SETACN WITH THE ACN OF THE
*        CONNECTION TO SET UP THE CONTROL BLOCK(S). IF AN EVENT CHAIN 
*        IS BEING PROCESSED THE LINK IS NOT REMOVED FROM THE CHAIN
*        AND PROCESSING IS THE SAME AS FOR THE NON-EVENT CHAIN LINK.
*        CALLED MODULE WILL RETURN TO PROCESS WHICH WILL CONTINUE 
*        PROCESSING LINKS UNTIL ALL CALLED. 
* 
*     4. ENTRY PARAMETERS.
* 
*        CHAIN - CHAIN TO BE PROCESS (INDEX TO ENTRY IN CHN$TABLE)
* 
*     5. EXIT PARAMETERS. NONE. 
* 
*     6. COMDECKS CALLED. 
* 
*        RBF$COM, TSBMDEFS, TSBMBASE
* 
*     7. ROUTINES CALLED. 
* 
*        REMOVE, CALL$, SETACN
* 
*     8. DAYFILE MESSAGES. NONE.
* 
 #
      XREF PROC SETUPACN;    # SET UP CONTROL BLOCKS                # 
      XREF PROC REMOVE;      # REMOVE LINK FROM CHAIN                  #
      XREF PROC CALL$;       # CALLS MODULE                            #
# 
      LOCAL PARAMETERS
# 
      ITEM I I;              # INDEX VARIABLE                          #
      ITEM NEXT$LINK;        # POINTER TO LINK TO BE PROCESSED         #
      ITEM CHAIN I;          # CHAIN TO BE PROCESSED                   #
      ITEM MODULEADDR U;     # ADDRESS OF MODULE                       #
      ITEM CONTINUEADDR U;   # ADDRESS TO CONTINUE AT IN EVENT CALL    #
# 
      INITIALISE NEXT$LINK POINTER
# 
      NEXT$LINK = CHN$FIRST[CHAIN]; 
# 
      PROCESS LINKS 
# 
      FOR I = I WHILE NEXT$LINK NQ 0 DO 
        BEGIN # LINK PROCESSING # 
        SETUPACN (NEXT$LINK); 
        NEXT$LINK = ACN$NEXT [ACN];  # POINT TO NEXT LINK # 
        IF CHAIN EQ CHAINS"EVENT" 
           OR 
           CHAIN EQ CHAINS"BACKGROUND"
        THEN
          BEGIN # EVENT CHAIN LINK #
          P<CCBHDR> = ADDRESS[ACN$CB[ACN]]; 
          CONTINUEADDR = 0; 
          MODULEADDR = CCB$EVENT; 
          END  # EVENT CHAIN LINK # 
        ELSE
          BEGIN  # NON-EVENT CHAIN LINK # 
          REMOVE (CHAIN); 
          IF ACN$CB [ACN] EQ 0
          THEN
            BEGIN # NO CONTROL BLOCK #
            CONTINUEADDR = 0; 
            END   # NO CONTROL BLOCK #
          ELSE
            BEGIN # CONTROL BLOCK # 
            P<CCBHDR> = ADDRESS [ACN$CB [ACN]]; 
            CONTINUEADDR = CCB$LINK;
            CCB$LINK = 0; 
            END   # CONTROL BLOCK # 
          MODULEADDR = CHN$ENTRYPT [ACN$CHAIN[ACN]];
          END  # NON-EVENT CHAIN LINK # 
        CALL$ (MODULEADDR,CONTINUEADDR);
      XDEF LABEL CALLRTN; 
      CALLRTN:  
        END  # LINK PROCESSING #
      RETURN; 
      END  # PROCESS #
      TERM; 
