*DECK     CSTSCT
USETEXT TEXTCS
USETEXT TXTCTCS 
USETEXT TXTSMCS 
USETEXT TXTAPSS 
USETEXT TXTSUSS 
PROC CSTSCT;
# TITLE CSTSCT - SELECT CORRECT TERMINAL.                              #
  
      BEGIN  # CSTSCT # 
# 
**    CSTSCT - SELECT CORRECT TERMINAL. 
* 
*     D. G. DEPEW.           81/10/12.
* 
*     CSTSCT SELECTS APPROPRIATE TERMINAL ENTRIES FROM THE LINE RECORDS 
*     CONTAINED IN THE NCF DATA QUEUE, AND FOR EACH SUCH TERMINAL CALLS 
*     PROC CSTSCD TO CONFIGURE ALL DEVICES WHICH ARE APPROPRIATE FOR
*     THAT TERMINAL.
* 
*     PROC CSTSCT 
* 
*     ENTRY   THE NCF DATA QUEUE CONTAINS ONE OR MORE COMPLETE ENTRIES, 
*             WHICH MAY BE FOLLOWED BY AN INCOMPLETE ENTRY. 
* 
*     EXIT    ALL NCF DATA QUEUE ENTRIES WHICH WERE COMPLETE HAVE BEEN
*               DELETED (AN INCOMPLETE ENTRY, IF THERE WAS ONE, REMAINS 
*               UNALTERED AND UNPROCESSED). 
*             ALL CONFIGURE TERMINAL RESPONSE SM'S (NORMAL OR ABNORMAL),
*               CORRESPONDING TO THE NCF DATA QUEUE ENTRIES THAT WERE 
*               PROCESSED, HAVE BEEN PLACED IN THE OUTGOING TRAFFIC 
*               QUEUE.
* 
*     NOTES   THIS ROUTINE ALONG WITH PROC CSTSCD PERFORMS THE MATCHING 
*               LOGIC FOR AUTORECOGNITION.
*             THE LOGIC OF THE INNER LOOPS OF THIS ROUTINE (INDUCTION 
*               VARIABLE J) ARE BASED ON THE FACT THAT NDL GUARANTEES AT
*               LEAST ONE TERMINAL DEFINITION FOR A LINE. 
# 
  
# 
****  PROC CSTSCT - XREF LIST.
# 
      XREF
        BEGIN 
        PROC CSTSCD;         #SELECT AND CONFIGURE CORRECT DEVICES     #
        PROC MOVE;           #MOVE STORAGE DIRECT ADDRESSING (MACREL)  #
        PROC SSTAQE;         #ACCEPT QUEUE ENTRY                       #
        PROC SSTRTS;         #REMOVE STORAGE ANYWHERE IN TABLE         #
        END 
# 
****
# 
  
  
      ITEM I, J;             #LOOP INDUCTION VARIABLES                 #
      ITEM LASTERM  B;       #LAST TERMINAL FLAG                       #
      ITEM LTES;             #LEN OF ALL TRM NTRYS IN A LINREC (CM WDS)#
  
  
  
  
  
        BEGIN 
  
#     WE BEGIN THE PROCESSING OF A SINGLE NCF DATA QUEUE ENTRY BY      #
#     INITIALIZING A WHOLE BUNCH OF STUFF.                             #
#     THE MEMORY MANAGEMENT ROUTINES GUARANTEE ONE ADDITIONAL WORD AT  #
#     THE END OF EACH MANAGED TABLE (ABOVE AND BEYOND THE LENGTH OF THE#
#     TABLE).  SETTING THIS WORD NON-ZERO FOR THE NCF DATA QUEUE       #
#     INSURES THAT THE INNER LOOPS OF THIS ROUTINE AND PROC CSTSCD DO  #
#     NOT ACT UPON STORAGE BEYOND THE END OF THE NCF DATA QUEUE.       #
  
        NDQ$WORD[NDQL] = 1;  # INSURE CORRECT LOOP TERMINATION         #
        NRDEV = 0;           # INITIALIZE NUMBER OF DEVICES CONFIGURED #
        LASTERM = FALSE;
        LTES = NDQ$LRSIZE[0] - LRHDRL$;      # WORD COUNT OF TRM NTRYS #
        P<LINEREC> = P<NDQ> + NDQ$TCSIZE[0];  # BEGINNING OF LINE REC  #
        ABHWORD[0] = NDQ$WORD[1];          # BREAK OUT CNF/TE/R SM ABH #
        MOVE (NDQ$TCSIZE[0]-2, NDQ[2], CSSM[0]);        # AND SM BODY  #
  
#     SET UP FIXED FIELDS OF CONFIGURE TERMINAL RESPONSE SM.           #
  
        ABHWORD[1] = NDQ$WORD[1]; 
        ABHSN[1] = ABHDN[0];       # REVERSE DN AND SN FOR RESPONSE SM #
        ABHDN[1] = ABHSN[0];
        SPMSG0[1] = 0;       # START CNF/TE RESPONSE SM BODY           #
        PFCSFC[1] = CNFTEN;  # DEFINED IN TXTSUSS                      #
        CNFP[1] = CNFP[0];   # PORT NUMBER.  THAT'S IT FOR NOW         #
  
        IF CNFTTA[0] EQ LR$AUTO[0]
        THEN                 # LINE REC AND CNF/TE/R AGREE ON AUTOREC  #
          BEGIN 
          P<TRMINFO> = P<LINEREC> + LRHDRL$;  # 1ST TERM NTRY IN LINREC#
          IF CNFTTA[0] NQ 0 
  
  
          THEN               # AUTORECOGNITION LINE                    #
            FOR J=TE$WC[0]  STEP TE$WC[0] 
              WHILE J LQ LTES  AND NOT LASTERM
            DO               # LOOP TIL END OF LINREC OR TERMINAL MATCH#
              IF (TE$TIP[0] EQ CNFTTT[0]  OR  TE$TIP[0] EQ 0) 
                AND (TE$STIP[0] EQ CNFSTIP[0]  OR  TE$STIP[0] EQ 0) 
                AND (TE$TSPD[0] EQ CNFLCLS[0]  OR  TE$TSPD[0] EQ 0) 
                AND (TE$CSET[0] EQ CNFLCCD[0]  OR  TE$CSET[0] EQ 0) 
                AND (TE$A1[0] EQ CNFA1[0]  OR  TE$A1[0] EQ 0) 
              THEN           # THIS IS IT (THE CORRECT TERMINAL)       #
                BEGIN        # GO FOR DEVICES                          #
                LASTERM = TRUE;    # ONLY ONE TERM ALLOWED FOR AUTOREC #
  
#     INSURE VALUES REQUIRED FOR CNF/TE/N ARE IN LINE RECORD FIELDS.   #
  
                TE$STIP[0] = CNFSTIP[0];
                TE$CSET[0] = CNFLCCD[0];
                TE$A1[0] = CNFA1[0];
                CSTSCD (LASTERM);       # SELECT AND CONFIGURE DEVICES #
                END 
              ELSE           # THIS IS NOT IT                          #
                P<TRMINFO> = P<TRMINFO> + TE$WC[0];    # NXT TERM NTRY #
  
  
          ELSE               # FIXED CONFIGURATION LINE                #
            FOR J=TE$WC[0]  STEP TE$WC[0] 
              WHILE NOT LASTERM 
            DO               # LOOP UNTIL END OF LINE RECORD           #
              BEGIN 
              IF J GQ LTES   # NOTE - *J* SHOULD NEVER EXCEED *LTES*   #
              THEN           # THIS IS LAST TERM ENTRY IN LINE RECORD  #
                LASTERM = TRUE; 
              CSTSCD (LASTERM);                # CONFIGURE ALL DEVICES #
              P<TRMINFO> = P<TRMINFO> + TE$WC[0];      # NXT TERM NTRY #
              END 
          END 
  
        IF NRDEV EQ 0 
        THEN                 # NOTHING GOT CONFIGURED                  #
          BEGIN              # ISSUE CNF/TE/A                          #
          ABHTLC[1] = NCNFA;       # DEFINED IN TXTSMCS.  ABH COMPLETE #
          PFCSFC[1] = CNFTEA;      # DEFINED IN TXTSUSS.  SM COMPLETE  #
          SSTAQE (P<OTQ>, CTEAQL$, ABH[1], CSSM[1]);   # QUEUE CNF/TE/A#
          END 
        SSTRTS (P<NDQ>, 0, NDQ$ESIZE[0]);  # DEL 1ST NTRY IN NCF DATA Q#
        END 
  
      END  # CSTSCT # 
  
      TERM
