*DECK,CHOOSE
USETEXT CYBRDEF 
USETEXT MISC$ 
USETEXT CHN$COM 
      PROC CHOOSE;
      BEGIN # CHOOSE #
*IF DEF,IMS 
 #
*1DC  CHOOSE
* 
*     1. PROC NAME           AUTHOR              DATE 
         CHOOSE              SEYUNG OH           NOV 14,1979
* 
*     2. FUNCTIONAL DESCRIPTION.
*        CHOOSE DETERMINES WHICH OVERLAY CHAIN TO PROCESS IF ANY, 
*        PROCESSES IT IF ITS OVERLAY IS IN OR REQUESTS THE OVERLAY TO 
*        BE READ. CHOOSE PROCESSES THE BACKGROUND CHAIN BEFORE IT 
*        RETURNS. 
* 
*     3. METHOD USED. 
*        IF CHOOSE IS WAITING FOR A CHAIN"S OVERLAY TO BE READ IN AND 
*        IT IS NOT YET IN, CHOOSE WILL PROCESS THE BACKGROUND CHAIN AND 
*        RETURN.
* 
*        IF THE OVERLAY CHOOSE IS WAITING FOR IS IN, CHOOSE PROCESSES 
*        ITS CHAIN THEN PROCESSES THE BACKGROUND CHAIN BEFORE IT
*        RETURNS. 
* 
*        IF CHOOSE IS NOT WAITING FOR AN OVERLAY TO READ IN, IT 
*        WILL EXAMINE THE RING OF OVERLAY CHAINS FROM WHERE IT LAST 
*        LEFT OFF SEARCHING FOR THE FIRST NON-EMPTY CHAIN. IF NONE IS 
*        FOUND THEN CHOOSE WILL PROCESS THE BACKGROUND CHAIN AND RETURN.
*        IF A NON-EMPTY CHAIN IS FOUND AND ITS OVERLAY IS IN, CHOOSE
*        WILL PROCESS IT THEN PROCESS THE BACKGROUND CHAIN AND RETURN.
*        IF A NON-EMPTY CHAIN IS FOUND AND ITS OVERLAY IS NOT IN, 
*        CHOOSE WILL CALL LOADRBF TO INITIATE LOADING OF THE OVERLAY
*        AND PROCESS THE BACKGROUND CHAIN THEN RETURN.
* 
*     4. ENTRY PARAMETERS.
*        NONE.
* 
*     5. EXIT PARAMETERS. 
*        NONE 
* 
*     6. COMDECKS USED. 
*        RBF$COM
* 
*     7. ROUTINES CALLED. 
*        PROCESS
*        LOADRBF
*        OVLISIN
* 
*     8. DAYFILE MESSAGES. NONE.
* 
 #
*ENDIF
      CONTROL LIST; 
  
      XREF PROC PROCESS;     # PROCESS CHAIN                           #
      XREF ITEM OLDTIM I;    # LAST SEARCH TIME                        #
      XREF ITEM NEWTIM I;    # NEW SEARCH TIME                         #
      XREF ARRAY LDRCALL1;
         ITEM 
            LDR$STATUS       U (0,42,17),  #LDR STATUS                 #
            LDR$PRIMARY      U (1,0,6),    #PRIMARY OVERLAY NUMBER     #
            LDR$SECOND       U (1,6,6),    #SECONDARY OVERLAY NUMBER   #
            LDR$EPTADDR      U (1,42,18),  #ENTRY POINT ADDR OF OVERLAY#
            LDR$NE           B (1,22,1),   #NON-FATAL ERROR FLAG       #
            LDR$FE           B (1,23,1),   #FATAL ERROR FLAG           #
            LDR$OVLNAME      C (2,0,7);    #OVERLAY NAME               #
      ITEM CURRENT$CHN I = CHAINS"SMP$";    # CURRENT CHAIN            #
      ITEM N I; 
      ITEM NOTHINGTODO B; 
      ITEM NTERMINAL I;                    # NUMBER OF ACTIVE TERMINAL #
      ITEM I I;                             # LOOP VARIALBE            #
      CONTROL EJECT;
      XDEF PROC LOADRBF;
      PROC LOADRBF (P1);
      BEGIN 
*IF DEF,IMS 
 #
*1DC  LOADRBF 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        LOADRBF             SEYUNG OH          NOV 14,1979 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        LOADRBF DOES THE SETUP NECESSARY FOR THE COMPASS PROC -LOADO-
*        TO INITIATE THE LOAD OF AN OVERLAY. THE SETUP CONSISTS OF
*        SETTING -PRIMARY- AND -SECOND- AND CALLING -LOADO-. -OVLISIN-
*        IS A FUNCTION THAT CHECKS TO SEE IF AN OVERLAY HAS BEEN
*        LOADED AND SETS UP THE ENTRY ADDRESS IF IT IS LOADED.
* 
*     3. METHOD USED. 
* 
*     4. ENTRY PARAMETERS.
*        P1 IS THE INDEX INTO THE -CHN- TABLE.
* 
*     5. EXIT PARAMETERS. 
*        OVLISIN IS TRUE IF THE OVERLAY LOAD HAS COMPLETED, FALSE IF NOT
*        COMPLETE.
* 
*     6. COMDECKS USED. 
*        SEE CHOOSE 
* 
*     7. ROUTINES CALLED. 
*        LOADO
* 
*     8. DAYFILE MESSAGES.
*        NONE 
* 
 #
*ENDIF
      XREF ITEM PRIMARY;
      XREF ITEM SECOND; 
      XREF PROC LOADO;
      XREF ARRAY RA67;                     #OVERLAY LOAD COMPLETE FLAG #
             ITEM LDR$COMPLETE B (0,30,1);
      ITEM P1;                             #ENTRY PARAMETER            #
      PRIMARY = CHN$PRIMARY [P1];          #SETUP PRIMARY LEVEL        #
      SECOND = CHN$SECOND [P1];            #SETUP SECONDARY LEVEL      #
      LOADO;                               #CALL LOADO TO DO HARD PART #
      CHN$ENTRYPT [P1] = LDR$EPTADDR;      #SET ENTRY POINT ADDRESS#
      RETURN; 
# 
  
# 
      END  # LOADRBF #
      CONTROL EJECT;
      NOTHINGTODO = FALSE;
      CURRENT$CHN = CHAINS"BACKGROUND"; 
      FOR N=N WHILE NOT NOTHINGTODO DO           # PROCESS ALL YOU CAN #
        BEGIN 
        IF CURRENT$CHN EQ CHAINS"BACKGROUND"     # REACHED LAST CHAIN  #
        THEN
          BEGIN                                  # SEARCH FOR ACTIVE   #
          PROCESS ( CHAINS"EVENT" );             # PROCESS EVENT CHAINS#
          CURRENT$CHN = CHAINS"SMP$";            # TERMINAL            #
          NTERMINAL = ZERO; 
          FOR I = CURRENT$CHN STEP 1 UNTIL CHAINS"BACKGROUND" - 1 DO
            BEGIN 
            NTERMINAL = NTERMINAL + CHN$NENTRIES [I]; 
            END 
          IF NTERMINAL EQ ZERO                   # NO ACTIVE TERMINALS #
          THEN
            BEGIN                                # PROCESSED ALL THE   #
            NOTHINGTODO = TRUE;                  # CONNECTIONS WHICH ON#
            END                                  # NON EVENT CHAIN     #
          END 
        ELSE
          BEGIN 
          IF CHN$NENTRIES [CURRENT$CHN] GR ZERO 
          THEN
            BEGIN                                #NON-EMPTY CHAIN FOUND#
            IF CHN$SECOND [CURRENT$CHN] NQ LDR$SECOND 
            THEN
              LOADRBF (CURRENT$CHN);             # LOAD OVERLAY      #
            PROCESS (CURRENT$CHN);               #PROCESS CURRENT CHAIN#
            END                                  #NON-EMPTY CHAIN FOUND#
          CURRENT$CHN = CHN$NEXTCHN [CURRENT$CHN];
          IF CURRENT$CHN EQ CHAINS"BACKGROUND"
          THEN
            BEGIN 
            NEWTIM = ZERO+1;
            END 
          END 
        END 
      END  # CHOOSE # 
      TERM; 
