*DECK     CSSTNO
USETEXT TEXTCS
USETEXT TEXTSS
USETEXT TXTAPSS 
USETEXT TXTSMCS 
USETEXT TXTSUSS 
      PROC CSSTNO;
# TITLE - TERMINATE NPU OPERATOR.                                      #
      BEGIN 
# 
**    CSSTNO - TERMINATE NPU OPERATOR.
* 
*     D.K. ENDO    82/03/10 
* 
*     THIS PROCEDURE DOES I-LAYER CLEAN-UP WHEN A CONNECT BROKEN/ 
*     INACTIVE IS DETECTED. 
* 
*     PROC CSSTNO 
* 
*     ENTRY        1. CON/CB, CON/CB WARNING, OR FC/INACT SM
* 
*     EXIT         2. NPUCB-S AND OCB-S ASSOCIATED WITH OPERATOR ON 
*                     CONNECTION ARE CLEARED. 
* 
# 
# 
****  PROC CSSTNO - XREF LIST BEGINS. 
# 
      XREF
        BEGIN 
        PROC SSBCBW;         # CLEAR BIT IN WORD                       #
        PROC SSBTBW;         # TEST BIT IN WORD                        #
        PROC SSTAQE;         # ADD QUEUE ENTRY                         #
        END 
# 
****
# 
  
      ITEM I;                # LOOP INDUCATION VARIABLE                #
      ITEM SEND B;           # SEND PENDING INDICATOR                  #
      ITEM RUNNING B;        # ONLINE DIAGNOSTICS RUNNING FLAG         #
      ITEM TNAME C(10);      # TERMINAL NAME                           #
  
# 
*     FLG$WORD - THIS BASED ARRAY POINTS TO THE SEND AND/OR STATUS
*     REQUEST PENDING BIT MAP.
# 
      BASED ARRAY FLG$WORD [00:00] S(NPCBSZ$);
        BEGIN 
        ITEM FW$WORD    I(00,00,60);
        END 
  
      CONTROL EJECT;
#                                                                      #
#                            CSSTNO CODE BEGINS HERE                   #
#                                                                      #
# 
*     IF THE OCB STATE IS SET AND IT IS NOT THE CASE THAT THIS SM IS
*     FC/INACT WITH THE NO TIME OUT FLAG SET, THEN PROCEED WITH 
*     CLEAN UP OPERATIONS FOR THE CONNECTION. 
* 
# 
      IF OC$STATE[ABHADR[0]] AND
         NOT (WCB$SMID[0] EQ SMID"FCINA" AND OC$NTO[ABHADR[0]]) 
      THEN
        BEGIN 
# 
*     SEARCH THE NPUCB-S TO SEE IF THIS OPERATOR IS A CURRENT ON-LINE 
*     DIAGNOSTICS OPERATOR.  IF SO, THEN SEND AN OLD/TM TO TERMINATE
*     THE PROCESSING AND CLEAR THE CURRENT-OLD-OPERATOR.
# 
        FOR I=0 STEP 1 WHILE I LS CSNPCNT 
        DO
          BEGIN 
          P<FLG$WORD> = LOC(NPU$OVFLGS[I]); 
          SSBTBW(FLG$WORD,ABHADR[0],RUNNING); 
  
          IF RUNNING
          THEN
            BEGIN 
            WCB$WORD[1] = 0;
            WCB$SMID[1] = SMID"OLDTM";
            WCB$WC[1] = 2 + LOLDIN; 
            ABHWORD[1] = 0; 
            ABHABT[1] = APPSUP; 
            ABHDN[1] = NPU$NID[I];
            ABHSN[1] = NPU$HID[I];
            ABHBT[1] = NETCMD;
            ABHACT[1] = CT8ASCII; 
            ABHTLC[1] = NOLDIN; 
            SPMWD[1] = 0; 
            PFCSFC[1] = OLDTM;
            OLDDO[1] = ABHADR[0]; 
            SSBCBW(FLG$WORD,ABHADR[0]); 
            SSTAQE(P<OTQ>,WCBUF[1],ABH[1],CSSM[1]); 
            END 
          END 
# 
*     SEARCH THE NPUCB-S AND FOR EACH NPU CONTROLLED BY THIS
*     OPERATOR, CLEAR THE CONTROLLING NOP FIELD, SEND AN EVENT
*     INDICATING LOSE OF CONTROL, AND IF THERE IS AN OPERATOR WITH
*     AUTO CONTROL STATUS, THEN GIVE THAT OPERATOR CONTROL. 
# 
        IF CSACNOP EQ ABHADR[0] 
        THEN
          BEGIN 
          CSACNOP = 0;
          END 
  
        FOR I=0 STEP 1 WHILE I LS CSNPCNT 
        DO
          BEGIN 
          IF NPU$STAT[I] EQ SUPSTAT"SUP" AND
             NPU$CNOP[I] EQ ABHADR[0] 
          THEN
            BEGIN 
  
            WCB$WORD[1] = 3;
            WCB$SMID[1] = SMID"CTRLOFF";
            ABHSN[1] = I; 
            TNAME = OC$TNAM[NPU$CNOP[I]]; 
            SSTAQE(P<EVQ>,WCBUF[1],ABH[1],TNAME); 
  
            NPU$CNOP[I] = 0;
  
            IF CSACNOP NQ 0 
            THEN
              BEGIN 
              NPU$CNOP[I] = CSACNOP;
  
              WCB$WORD[1] = 3;
              WCB$SMID[1] = SMID"CTRLON"; 
              ABHSN[1] = I; 
              TNAME = OC$TNAM[CSACNOP]; 
              SSTAQE(P<EVQ>,WCBUF[1],ABH[1],TNAME); 
              END 
            END 
          END 
# 
*     IF THE CURRENT COMMAND IS -STATUS-, THEN IF CURRENT COMMAND NPU1
*     IS NON-ZERO, CLEAN UP THINGS FOR NPU1, IF CURRENT COMMAND NPU2 IS 
*     NON-ZERO, CLEAN UP THINGS FOR NPU2.  CLEAR THE AFFECTED NPU COUNT 
*     AND CURRENT COMMAND VERB.  MAKE AN ENTRY IN THE EVENT QUEUE WITH
*      THE EVENT CODE SET TO -STATUS FINISHED-. 
# 
        IF OC$VERB[ABHADR[0]] EQ "ST0"
        THEN
          BEGIN 
          IF OC$CNPU[ABHADR[0]] NQ 0
          THEN
            BEGIN 
            NPU$OPST[OC$CNPU[ABHADR[0]]] = MAXACN$ + 1; 
            OC$CNPU[ABHADR[0]] = 0; 
            END 
  
          P<FLG$WORD> = LOC(NPU$STFLGS[0]); 
          FOR I=0 STEP 1 WHILE I LS CSNPCNT 
          DO
            BEGIN 
            SSBCBW(FLG$WORD[I],ABHADR[0]);
            END 
  
          OC$VERB[ABHADR[0]] = " "; 
          OC$NCNT[ABHADR[0]] = 0; 
          WCB$WORD[1] = 0;
          WCB$SMID[1] = SMID"STUFIN"; 
          WCB$WC[1] = 2;
          ABHWORD[1] = ABHWORD[0];
          ABHTLC[1] = 0;
          SSTAQE(P<EVQ>,WCBUF[1],ABH[1],CSSM[1]); 
          END 
# 
*     IF THE CURRENT COMMAND VERB IS -SE0-, THEN CLEAR THE CURRENT SEND 
*     OPERATOR, CURRENT COMMAND NPU1, AND COMMAND VERB, AND SEND A NULL 
*     TEXT TO THE TERMINAL WITH INPUT ALLOWED FLAG SET. 
# 
        ELSE IF OC$VERB[ABHADR[0]] EQ "SE0" 
        THEN
          BEGIN 
          P<FLG$WORD> = LOC(NPU$SDFLGS[0]); 
          FOR I=0 STEP 1 WHILE I LS CSNPCNT 
          DO
            BEGIN 
            SSBTBW(FLG$WORD[I],ABHADR[0],SEND); 
  
            IF SEND 
            THEN
              BEGIN 
              SSBCBW(FLG$WORD[I],ABHADR[0]);
              NPU$OPSD[I] = MAXACN$ + 1;
              END 
            END 
  
          OC$CNPU[ABHADR[0]] = 0; 
          OC$NCNT[ABHADR[0]] = 0; 
          OC$VERB[ABHADR[0]] = " "; 
          WCB$WORD[1] = 0;
          WCB$SMID[1] = SMID"TTEXT";
          WCB$IAF[1] = TRUE;
          WCB$WC[1] = 2;
          ABHWORD[1] = 0; 
          ABHADR[1] = ABHADR[0];
          SSTAQE(P<CNQ>,WCBUF[1],ABH[1],CSSM[1]); 
          END 
# 
*     IF THIS SM IS A CON/CB WARNING, THEN SET THE CB PENDING FLAG IN 
*     THE OCB FOR THIS OPERATOR, OTHERWISE PUT A CON/END/R SM IN THE
*     PROTOCOL RESPONSE QUEUE.  CLEAR THE OCB.
# 
        IF WCB$SMID[0] EQ SMID"CONCBW"
        THEN
          BEGIN 
          OC$CBPD[ABHADR[0]] = TRUE;
          END 
        ELSE
          BEGIN 
          WCB$WORD[1] = 0;
          WCB$SMID[1] = SMID"CONENDR";
          WCB$WC[1] = 2;
          ABHWORD[1] = 0; 
          ABHADR[1] = ABHADR[0];
          SSTAQE(P<CNQ>,WCBUF[1],ABH[1],CSSM[1]); 
  
          OC$WORD[ABHADR[0]] = 0; 
          OC$ORD[ABHADR[0]] = ABHADR[0];
          I = OC$TYPE[ABHADR[0]]; 
          OC$WORD1[ABHADR[0]] = 0;
          OC$TYPE[ABHADR[0]] = I; 
          OC$WORD2[ABHADR[0]] = 0;
          END 
        END 
  
  
      RETURN;                # **** RETURN ****                        #
  
      END # CSSTNO #
      TERM
