*DECK     CSSADI
USETEXT TEXTCS; 
USETEXT TEXTSS; 
USETEXT TXCMDCS;
USETEXT TXTAPSS;
USETEXT TXTSMCS;
USETEXT TXTSUSS;
PROC CSSADI;
# TITLE CSSADI - ACTION DISABLE COMMAND # 
  
      BEGIN  # CSSADI # 
# 
**    CSSADI - ACTION DISABLE COMMAND.
* 
*     C. BRION          82/04/21. 
* 
*     PROC CSSADI 
* 
*     ENTRY:  
* 
*       HDRCMD = COMMAND HEADER WORD. 
* 
*       PARMS = COMMAND PARAMETER ARRAY THAT CONTAINS THE COMMAND TEXT, 
*               SYNTAX PARAMETER LIST AND THE ADDRESS PARAMETER LIST. 
* 
*     EXIT: 
* 
*       A DISABLE ELEMENT SUPERVISORY MESSAGE WILL BE SENT TO A NPU.
* 
*       THE COMMAND TEXT WILL BE ENTERED INTO THE LOG FILE. 
* 
*       A READY.. MESSAGE WILL BE CAUSED TO BE SENT TO THE ORIGIN 
*       OPERATOR. 
* 
# 
  
# 
****  PROC CSSADI XREF LIST.
# 
  
      XREF
        BEGIN 
        FUNC SSDCDA;                     #SS-CONVERT DISPLAY TO ASCII#
        PROC SSBEBF;                     #SS-EXTRACT BIT FIELD# 
        PROC MOVE;                       #MACREL MOVE MEMORY# 
        PROC SSBSBF;                     #SS-STORE BIT FIELD# 
        PROC SSTAQE;                     #SS-ACCEPT QUEUE ENTRY#
        PROC CSESLE ; 
        END 
  
# 
****
# 
  
      ITEM NPUORD       U;
      ITEM ADIX         U;
      ITEM BEGAPIX      U;
      ITEM FINAPIX      U;
      ITEM DORD,DBIT    U;
      ITEM AORD,ABIT    U;
      ITEM SINGCHAR     U;
      ITEM ELINDX       U;
      ITEM I            U;
  
# 
*     INFOELM - ARRAY THAT HOLDS INFORMATION RE: AN ELEMENT.
# 
  
      ARRAY INFOELM [00:01] S(1); 
        BEGIN 
        ITEM INF$WORD   U(00,00,60);     # FULL WORD 0 REF #
        ITEM INF$ORD    U(00,00,12);     # NPU ORDINAL #
        ITEM INF$ADIX   U(00,12,08);     # INDEX VALUE FOR ADDR PARM #
        ITEM INF$ORDIN  B(00,59,01);     # NPU ORDINAL PRESENT FLAG # 
        END 
  
      ARRAY IGNOREMSG S(6) ;
        BEGIN 
        ITEM IGMSGW        U(00,00,60) ;
        ITEM IGMSG1        C(00,00,26) =[" COMMAND IGNORED- VERSION "] ;
        ITEM IGMSG2        U(02,36,12) ;
        ITEM IGMSG3        C(02,48,30) =
                           [" CCP UNABLE TO ACTION COMMAND "] ; 
        ITEM IGMSG4        U(05,48,12) =[0] ; 
        END 
  
  
  
  
  
  
  
  
# 
*     INITIAILIZE INDICES AND LOCAL STORAGE.
# 
  
      BEGAPIX =  HDR$SPCNT[0] + HDR$TXWCNT[0];   # BEGIN ADDR LIST #
      FINAPIX = BEGAPIX + HDR$APCNT[0] - 1; 
      INF$WORD[0] = 0;
      INF$WORD[1] = 0;
  
# 
*     CHECK FOR TWO NPU ORDINALS PRESENT IN THE ADDRESS PARAMETER LIST
*     OF COMMAND. IF PRESENT, THEN A DISABLE OF A TRUNK OR LOGICAL LINK 
*     COMMAND ATTEMPTED.
* 
*     SET THE LOCAL INFO ACCORDING TO THE NPU ORDINALS FOUND. 
# 
  
      FOR I = BEGAPIX STEP 1 UNTIL FINAPIX
      DO
  
        BEGIN 
        IF PAR$PCODE[I] EQ "NOR"
        THEN
  
          BEGIN 
          IF NOT INF$ORDIN[0]            # FIRST NPU ORDINAL SEEN # 
          THEN
  
            BEGIN 
            INF$ORDIN[0] = TRUE;
            INF$ORD[0] = PAR$ORD[I];
            INF$ADIX[0] = I+1;           # SET INDEX FOR ADDR PARM# 
            END 
  
          ELSE                           # SECOND NPU ORDINAL SEEN #
  
            BEGIN 
            INF$ORDIN[1] = TRUE;
            INF$ORD[1] = PAR$ORD[I];
            INF$ADIX[1] = I+1;
            END 
  
          END  # IF PAR$PCODE EQ NOR #
  
        END  # FOR I LOOP # 
  
# 
*     CHECK TO SEE IF MORE THAN 1 NPU ORDINAL IN COMMAND .
# 
  
      IF INF$ORDIN[0] AND INF$ORDIN[1]
      THEN
  
# 
*     THERE ARE 2 NPU ORDINALS IN COMMAND. THE OUTGOING DISABLE SM CAN
*     ONLY BE SENT TO 1 NPU. THE SM IS SENT EITHER TO THE LOCAL NPU 
*     OR IF BOTH ARE REMOTE THEN THE SM IS SENT TO THE NPU WITH THE 
*     LOWEST NODE NUMBER. 
# 
  
        BEGIN 
  
        IF ((NPU$RIND[INF$ORD[0]] AND NPU$RIND[INF$ORD[1]]) 
          OR (NOT NPU$RIND[INF$ORD[0]]
              AND NOT NPU$RIND[INF$ORD[1]]))
        THEN
  
          BEGIN 
  
          IF NPU$NID[INF$ORD[0]] LS NPU$NID[INF$ORD[1]] 
          THEN
  
            BEGIN 
            NPUORD = INF$ORD[0];
            ADIX = INF$ADIX[0]; 
            END 
  
          ELSE
  
            BEGIN 
            NPUORD = INF$ORD[1];
            ADIX = INF$ADIX[1]; 
            END 
  
          END 
  
        ELSE  # ONE NPU LOCAL # 
  
          BEGIN 
  
          IF NPU$RIND[INF$ORD[0]] 
          THEN
  
            BEGIN 
            NPUORD = INF$ORD[1];
            ADIX = INF$ADIX[1]; 
            END 
  
          ELSE
  
            BEGIN 
            NPUORD = INF$ORD[0];
            ADIX = INF$ADIX[0]; 
            END 
  
          END 
  
        END 
  
      ELSE
  
# 
*     ONLY ONE NPU ORDINAL IS IN THE COMMAND. SET ORDINAL AND ADDRESS 
*     INDEX VALUE.
# 
  
        BEGIN 
        NPUORD = INF$ORD[0];
        ADIX = INF$ADIX[0]; 
        END 
  
# 
*     SET THE INDEX VALUE FOR THE ELEMENT KEEPING IN MIND THAT THE NOP
*     KEYWORD MAY CAUSE ADJUSTMENT. 
# 
  
      ELINDX = HDR$TXWCNT[0] + 1; 
      IF PAR$PCODE[ELINDX] EQ "NOP" 
      THEN
        ELINDX = ELINDX + 1;
  
# 
*     INITIALIZE THE OUTGOING SM AND THE QUEUE ENTRY STORAGE AREAS. 
# 
  
      WCB$WORD[1]= 0; 
      ABHWORD[1] = 0; 
      SPMSG0[1] = 0;
      PFC[1] = DIB; 
      ABHACT[1] = ACTCSNP$; 
      ABHABT[1] = APPSUP; 
      ABHBT[1] = APPSUP;
      ABHDN[1] = NPU$NID[NPUORD];        # DESTINATION NODE # 
      ABHSN[1] = NPU$HID[NPUORD];        # SOURCE NODE #
  
  
# 
*     DETERMINE THE ELEMENT TYPE AND SET UP THE OUTGOING SM WITH THE
*     APPROPRIATE SM VALUES.
# 
  
      IF PAR$PCODE[ELINDX] EQ "TE0"      # DISABLE TERMINAL # 
      THEN
  
        BEGIN 
        SFC[1] = TE;
  
# 
*     CONVERT THE TERMINAL NAME FROM THE ELEMENT PARAMETER VALUE IN 
*     THE COMMAND TO ASCII FORMAT INTO THE OUTGOING DISABLE SM. 
# 
  
        DORD = ELINDX;
        DBIT = 0; 
        AORD = 1; 
        ABIT = 4;                        # SET TO PLACE IN SM WORD 1 #
  
        FOR I = 1 STEP 1 UNTIL 7
        DO
  
          BEGIN 
          SSBEBF(PARMS[0],DORD,DBIT,6,SINGCHAR);
          SINGCHAR = SSDCDA(SINGCHAR);
          SSBSBF(CSSM[1],AORD,ABIT,8,SINGCHAR); 
          END 
  
# 
*     SET UP THE REST OF THE DISABLE TERMINAL SMAND QUEUE ENTRY.
# 
  
        ABHTLC[1] = NDIBTE; 
        WCB$SMID[1] = SMID"DIBTE";
        DIBP[1] = PAR$ELADDR[ADIX]; 
        WCB$WC[1] = LDIBTE + 2; 
  
        END  # IF TE0 # 
  
      ELSE IF PAR$PCODE[ELINDX] EQ "LI0"  # DISABLE LINE #
      THEN
  
        BEGIN 
        SFC[1] = LI;
        DIBP[1] = PAR$ELADDR[ADIX];      # SET PORT NUMBER IN SM #
        ABHTLC[1] = NDIBLI; 
        WCB$SMID[1] = SMID"DIBLI";
        WCB$WC[1] = LDIBLI + 2; 
        END 
  
      ELSE IF PAR$PCODE[ELINDX] EQ "TR0"  # DISABLE TRUNK # 
      THEN
  
  
        BEGIN 
        SFC[1] = TR;
        DIBP[1] = PAR$ELADDR[ADIX];      # SET PORT NUMBER IN SM #
        IF PAR$PCODE[ELINDX+1] EQ "LD0" 
        THEN
          BEGIN                          # LD PARAM SPECIFIED          #
          IF V24FLAG
          THEN                           # AND RUNNING WITH 2.4 CCP    #
            DIBLDF[1] = TRUE ;           # SET THE LOAD FLAG           #
          ELSE
            BEGIN                        # NOT RUNNING WITH 2.4 CCP    #
                                         # SEND MESSAGE TO OPERATOR    #
            ABHWORD[1] = 0 ;
            ABHTLC[1] = 6 ; 
            ABHADR[1] = AUDGR4$ ; 
  
  
            CSESLE(NPU$NID[NPUORD],8,IGMSGW[0]) ; 
            IGMSG2[0] = CCPVERS      ;   # STORE VERSION TO MSG        #
            WCB$WC[1] = 8 ; 
  
            SSTAQE(P<ORQ>,WCBUF[1],ABH[1],IGMSGW[0]) ;
  
            RETURN ;
  
            END                          # SEND  MESSAGE               #
          END                            # LD PARAM SPECIFIED          #
        ABHTLC[1] = NDIBLI; 
        WCB$SMID[1] = SMID"DIBTR";
        WCB$WC[1] = LDIBLI + 2; 
        END 
  
      ELSE IF PAR$PCODE[ELINDX] EQ "VC0"  # DISABLE ARCHETYPE SVC # 
      THEN
  
        BEGIN 
        SFC[1] = VC;
  
# 
*     CONVERT THE ARCHETYPE SVC NAME FROM THE ELEMENT VALUE IN
*     THE COMMAND TO THE ASCII FORMAT INTO THE OUTGOING DISABLE SM. 
# 
  
          DORD = ELINDX;                 # BITFIELD START POSITION #
          DBIT = 0; 
          AORD = 1; 
          ABIT = 4; 
          FOR I = 1 STEP 1 UNTIL 5
          DO
  
            BEGIN 
            SSBEBF(PARMS[0],DORD,DBIT,6,SINGCHAR);  # EXTRACT BITFIELD #
            SINGCHAR = SSDCDA(SINGCHAR);
            SSBSBF(CSSM[1],AORD,ABIT,8,SINGCHAR);  # STORE BITFIELD # 
            END 
  
# 
*     SET UP THE REST OF THE DISABLE ARCHETYPE SVC SM 
# 
  
      ABHTLC[1] = NDIBVC;                # LENGTH IN CHAR # 
      DIBP[1] = PAR$ELADDR[ADIX];        # SET PORT NUMBER IN SM #
      FOR  I = ELINDX STEP 1 UNTIL BEGAPIX
      DO
        BEGIN 
        IF PAR$PCODE[I] EQ "NC0"         # FOUND NCIR PARAMETER CODE #
        THEN
          DIBNC[1] = PAR$NCIR[I];        # STORE NO. OF SVCS TO DISABLE#
        END  # FOR LOOP # 
      DIBBL[1] = X"2020";                # INSERT TWO BLANKS #
      WCB$SMID[1] = SMID"DIBVC";
      WCB$WC[1] = LDIBVC + 2; 
  
      END  # IF VC0 # 
  
      ELSE                               # DISABLE LLINK #
  
        BEGIN 
        SFC[1] = LL;
        DIBN1[1] = PAR$LLNID1[ADIX];     # SET SM COUPLER NODE NUMBER # 
        DIBN2[1] = PAR$LLNID2[ADIX];     # SET SM NPU NODE NUMBER # 
        ABHTLC[1] = NDIBLL; 
        WCB$SMID[1] = SMID"DIBLL";
        WCB$WC[1] = LDIBLL + 2; 
        END 
  
# 
*     THE OUTGOING DISABLE SM READY FOR QUEUING TO OUTPUT TRAFFIC 
*     QUEUE.
# 
  
      SSTAQE(P<OTQ>,WCBUF[1],ABH[1],CSSM[1]); 
  
# 
*     THE COMMAND TEXT IS TO BE LOGGED INTO THE LOG FILE VIA A
*     SUPERVISION EVENT TO THE EVENT PROCESSOR. 
# 
  
      WCB$WORD[1] = 0;
      ABHWORD[1] = 0; 
      WCB$SMID[1] = SMID"CMDTXT"; 
      CMD$TNAM[0] = OC$TNAM[HDR$OPORD[0]]; # SET OP TERMINAL NAME # 
      P<MSCMD> = LOC(CMD$TEXT[0]);         # SET UP FOR TEXT MOVE # 
      MOVE(HDR$TXWCNT[0],PARMS[0],MSCMD[0]);
      WCB$WC[1] = HDR$TXWCNT[0] + 4;
      ABHTLC[1] = (HDR$TXWCNT[0] + 2) * 10;  # SET CHAR LENGTH #
      SSTAQE(P<EVQ>,WCBUF[1],ABH[1],CMDLINE[0]);
  
# 
*     SEND THE NULL TERMINAL TEXT TO THE ORIGIN OPERATOR SO AS TO 
*     CAUSE THE READY.. MESSAGE TO BE ISSUED. 
# 
  
      WCB$WORD[1] = 0;
      ABHWORD[1] = 0; 
      WCB$SMID[1] = SMID"TTEXT";
      WCB$WC[1] = 2;
      ABHADR[1] = HDR$OPORD[0]; 
      WCB$IAF[1] = TRUE;                 # INPUT ALLOWED TRUE # 
      SSTAQE(P<CNQ>,WCBUF[1],ABH[1],CSSM[1]); 
  
      END  # CSSADI # 
 TERM 
