*DECK     CSESES
USETEXT TEXTOV
USETEXT TEXTCS
USETEXT TEXTSS
USETEXT TXTAPSS 
USETEXT TXTSMCS 
      PROC CSESES;
# TITLE - SEND ELEMENT STATISTICS.                                     #
      BEGIN 
# 
**    CSESES - SEND ELEMENT STATISTICS. 
* 
*     D.K. ENDO    82/03/30 
* 
*     THIS PROCEDURE FORMATS STATISTICS INFORMATION FROM THE INCOMING 
*     SM.  IT THEN SENDS IT OUT TO THE SYSTEM ACCOUNT FILES.
*     FOR STI/NP/U, CHECK FOR CPU AND BUFFER THRESHOLD. 
*     IF EXCEEDED, SEND ALM/OP SM.
* 
*     PROC CSESES 
* 
*     ENTRY        1. STI/NP/U, STI/TR/U, OR STI/LI/U SM FROM THE EVENT 
*                     QUEUE.
* 
*     EXIT         1. STATISTICS INFO SENT TO THE SYSTEM ACCOUNT FILES. 
*                  2. ALM/OP SM SENT TO * EVQ* .
* 
* 
*     ACCOUNT DAYFILE MESSAGE FORMATS:  
* 
*     *SCLI, NODE, C1, PORT, TTTTTTLLLLLL.
*     *SCLI, NODE, C2, SSSSSSCCCCCC.
*     *SCLI, NODE, C3, BBBBBBPPPPPPAAAAAA.
*                  NUMBER OF BLOCKS AND CHARACTERS TRANSMITTED AND
*                  RECEIVED ON NODE NUMBER *NODE* AND LINE NUMBER 
*                  *PORT*.  ALSO NUMBER OF PAD AND A-A REJECTS. 
* 
*     *SCNQ, NODE, C1, CCCCCCDDDDDDLLLLLL.
*     *SCNQ, NODE, C2, GGGGGGRRRRRRSSSSSS.
*     *SCNQ, NODE, C3, PPPPPPIIIIIINNNNNN.
*     *SCNQ, NODE, C4, WWWWWW.
*                  VARIOUS STATISTICS FOR NODE NUMBER *NODE*. 
* 
*     *SCTU, NODE, C1, PORT, TTTTTTLLLLLL.
*     *SCTU, NODE, C2, SSSSSSCCCCCC.
*     *SCTU, NODE, C3, BBBBBB.
*                  NUMBER OF BLOCKS AND CHARACTERS TRANSMITTED AND
*                  RECEIVED ON NODE NUMBER *NODE* AND PORT NUMBER 
*                  *PORT*.
* 
# 
# 
****  PROC CSESES - XREF LIST BEGINS. 
# 
      XREF
        BEGIN 
        PROC MESSAGE;        # SEND TEXT TO SYSTEM ACCOUNT FILE        #
        PROC SSBEBF;         # EXTRACT BIT FIELD                       #
        PROC SSBSBF;         # STORE BIT FIELD                         #
        PROC SSTAQE;         # ACCEPT A QUEUE ENTRY                    #
        FUNC SSDCDA U;       # CONVERT DISPLAY CODE TO ASCII           #
        FUNC XCDD U;         # CONVERT DECIMAL INTEGER TO DISPLAY CODE #
        FUNC XCHD U;         # CONVERT HEX INTEGER TO DISPLAY CODE     #
        END 
# 
****
# 
      DEF ACCT # 5 #;        # IDENTIFIER FOR ACCOUNT FILE             #
      DEF ERRLOG # 4 #;      # IDENTIFIER FOR ERROR LOG FILE           #
      ITEM CNST1;            # CONSTANT ---> 1                         #
      ITEM CNST2;            # CONSTANT ---> 2                         #
      ITEM CNST3;            # CONSTANT ---> 3                         #
      ITEM I;                # LOOP INDUCTION VARIABLE                 #
      ITEM ITEMP U;          # UNSIGNED INTEGER TEMPORARY              #
      ITEM LEN       U;      # LENGTH OF TEXT                          #
      ITEM NP        U;      # NPUCB INDEX                             #
# 
      THIS ARRAY DEFINES THE STATISTICS TEXT FORMAT THAT IS SENT WHEN 
      THIS PROC IS INVOKED. 
# 
      ARRAY ELS$TXT [00:00] S(4); 
        BEGIN 
        ITEM ELS$SC     C(00,00,02) = ["SC"]; 
        ITEM ELS$TYP    C(00,12,02);
        ITEM ELS$C1     C(00,24,02) = [", "]; 
        ITEM ELS$SN     U(00,36,24);
        ITEM ELS$C2     C(01,00,03) = [", C"];
        ITEM ELS$CNUM   C(01,18,01);
        ITEM ELS$C3     C(01,24,02) = [", "]; 
        ITEM ELS$PRM1   C(01,36,06);
        ITEM ELS$P      U(01,36,24);
        ITEM ELS$C4     C(02,00,02);
        ITEM ELS$PRM2   U(02,12,36);
        ITEM ELS$P1     C(02,48,01);
        ITEM ELS$ZBYT11 U(02,54,06);
        ITEM ELS$ZBYT12 U(03,00,12);
        ITEM ELS$PRM3   C(02,48,06);
        ITEM ELS$PER    C(03,24,01) = ["."];
        ITEM ELS$ZBYT   U(03,30,30) = [ 0 ];
        END 
# 
      THIS ARRAY DEFINES THE SECOND BUFFER WHICH ONLY CONTAINS ONE
      PARAMETER.
# 
      ARRAY ES1$TXT [00:00] S(3); 
        BEGIN 
        ITEM ES1$SC     C(00,00,02) = ["SC"]; 
        ITEM ES1$TYP    C(00,12,02);
        ITEM ES1$C1     C(00,24,02) = [", "]; 
        ITEM ES1$SN     U(00,36,24);
        ITEM ES1$C2     C(01,00,03) = [", C"];
        ITEM ES1$CNUM   C(01,18,01);
        ITEM ES1$C3     C(01,24,02) = [", "]; 
        ITEM ES1$PRM1   C(01,36,06);
        ITEM ES1$PER    C(02,12,01) = ["."];
        ITEM ES1$ZBYT   U(02,18,42) = [0];
        END 
  
# 
*     THE FOLLOWING ARRAY DEFINES THE TEXT PORTION OF CPU UTILIZATION 
*     ALARM MESSAGE.
# 
  
      ARRAY CPUMSG [00:00] S(3);
        BEGIN 
        ITEM CPU$MSG    C(00,00,22) = 
                      ["CPU THRESHOLD EXCEEDED"]; 
        END 
  
# 
*     THE FOLLOWING ARRAY DEFINES THE BUFFER AVAILABILITY ALARM MESSAGE.
# 
  
      ARRAY BUFMSG [00:00] S(3);
        BEGIN 
        ITEM BUF$MSG     C(00,00,25) =
                         ["BUFFER THRESHOLD EXCEEDED"]; 
        END 
  
# 
*     THE FOLLOWING BASED ARRAY IS FOR GENERAL PURPOSE USAGE. 
# 
  
      BASED ARRAY GENPBUF[00:00] S(1);; 
  
  
  
  
  
      CONTROL EJECT;
#                                                                      #
#                            CSESES CODE BEGINS HERE                   #
#                                                                      #
# 
*     CONVERT THE SOURCE NODE I.D. AND APPEND IT TO THE TEXT. 
# 
      ELS$SN[0] = XCDD(ABHSN[0] );
# 
*     IF THIS SM IS STI/NP/U, THEN CONVERT THE MG, MP, AND MB VALUES TO 
*     DISPLAY CODE AND APPEND THEM TO THE MESSAGE TEXT.  SEND THE TEXT
*     TO THE ACCOUNT FILE.  CONVERT THE BD, BF, AND L3 VALUES AND APPEND
*     THEM TO THE TEXT.  SEND THE MESSAGE OUT TO THE ACCOUNT FILE.
*     CONVERT THE L2, L1, AND L0 VALUES AND APPEND THEM TO THE TEXT.
*     SEND THE MESSAGE OFF TO THE ACCOUNT FILE. 
# 
      IF WCB$SMID[0] EQ SMID"STINP" 
      THEN
        BEGIN 
        ELS$TYP[0] = "NQ";
        ELS$CNUM[0] = "1";
        ITEMP = XCDD(STIMG[0]); 
        CNST1 = 1;
        CNST2 = 36; 
        CNST3 = 36; 
        SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);
        ELS$PRM2[0] = XCDD(STIMP[0]); 
        ITEMP = 0;
        B<44,12>ITEMP = STIMB1[0];
        B<56,4>ITEMP = STIMB2[0]; 
        ITEMP = XCDD(ITEMP);
        CNST1 = 2;
        CNST2 = 48; 
        CNST3 = 36; 
        SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);
        MESSAGE(ELS$TXT,ACCT);
        MESSAGE(ELS$TXT,ERRLOG);
        ELS$CNUM[0] = "2";
        ITEMP = XCDD(STIBD[0]); 
        CNST1 = 1;
        CNST2 = 36; 
        CNST3 = 36; 
        SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);
        ELS$PRM2[0] = XCDD(STIBF[0]); 
        ITEMP = XCDD(STIL3[0]); 
        CNST1 = 2;
        CNST2 = 48; 
        CNST3 = 36; 
        SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);
        MESSAGE(ELS$TXT,ACCT);
        MESSAGE(ELS$TXT,ERRLOG);
        ELS$CNUM[0] = "3";
        ITEMP = 0;
        B<44,8>ITEMP = STIL21[0]; 
        B<52,8>ITEMP = STIL22[0]; 
        ITEMP = XCDD(ITEMP);
        CNST1 = 1;
        CNST2 = 36; 
        CNST3 = 36; 
        SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);
        ELS$PRM2[0] = XCDD(STIL1[0]); 
        ITEMP = XCDD(STIL0[0]); 
        CNST1 = 2;
        CNST2 = 48; 
        CNST3 = 36; 
        SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);
        MESSAGE(ELS$TXT,ACCT);
        MESSAGE(ELS$TXT,ERRLOG);
        ES1$TYP[0] = ELS$TYP[0];
        ES1$SN[0] = ELS$SN[0];
        ES1$CNUM[0] = "4";
        ITEMP = XCDD(STIAW[0]); 
        CNST1 = 1;
        CNST2 = 36; 
        CNST3 = 36; 
        SSBSBF(ES1$TXT,CNST1,CNST2,CNST3,ITEMP);
        MESSAGE(ES1$TXT,ACCT);
        MESSAGE(ES1$TXT,ERRLOG);
# 
*     SEARCH THE *NPUCBS* FOR THE NPU.  IF NOT FOUND, IGNORE THE SM.
*     IF FOUND, CHECK FOR CPU AND BUFFER THRESHOLD, AND 
*     SEND THE APPROPRIATE ALARM MESSAGE(S) TO THE *EVQ* IF NECESSARY.
# 
  
        FOR I = 0 STEP 1 WHILE     (ABHSN[0] NQ NPU$NID[I]) 
                               AND (I LS CSNPCNT) 
        DO
          BEGIN 
          END 
  
        NP = I; 
        IF NP GQ CSNPCNT
        THEN
          BEGIN 
          GOTO EXIT;
          END 
  
        IF NPU$CP[NP] NQ DEFCP$ 
        THEN
          BEGIN                        # CP NOT DEFAULT VALUE          #
          IF STIMG[0] GR (NPU$CP[NP] * 10)
          THEN
            BEGIN                      # CP IN STI/NP GR CP VALUE      #
            P<GENPBUF> = LOC(CPUMSG[0]);  # SEND ALM/OP SM             #
            LEN = 22; 
            CONVERT;
            END 
          END 
        IF NPU$BU[NP] NQ DEFBU$ 
        THEN
          BEGIN                        # BU IN STI/NP GR BU VALUE      #
          IF STIMP[0] LS NPU$BU[NP] 
          THEN
            BEGIN                      # BU IN STI/NP GR BU VALUE      #
            P<GENPBUF> = LOC(BUFMSG[0]); # SEND ALM/OP SM              #
            LEN = 25; 
            CONVERT;
            END 
          END 
        END 
# 
*     IF THIS SM IS STI/TR/U OR STI/LI/U, THEN CONVERT THE PORT AND 
*     APPEND IT TO THE TEXT.  IF THIS SM IS STI/LI/U, SET THE SUB-PORT
*     VALUE TO ZERO, ELSE SEARCH THE PHYSICAL LINK XREF TABLE FOR THE 
*     NODE AT THE OTHER END OF TRUNK, IF FOUND, SAVE THE NODE I.D., ELSE
*     SET IT TO ZERO.  CONVERT THE SUB-PORT OR NODE I.D. AND APPEND IT
*     TO THE TEXT. CONVERT THE BT VALUE AND APPEND IT TO THE TEXT.  SEND
*     THE MESSAGE TO THE ACCOUNT FILE.  CONVERT THE BR, CT, AND CR VALUE
*     AND APPEND THEM TO THE TEXT.  SEND THE MESSAGE TO THE ACCOUNT 
*     FILE.  CONVERT THE BB VALUE AND APPEND IT TO THE TEXT.  SEND THE
*     TEXT TO THE ACCOUNT FILE. 
# 
      ELSE
        BEGIN 
        IF WCB$SMID[0] EQ SMID"STILI" 
        THEN
          BEGIN 
          ELS$TYP[0] = "LI";
          ITEMP = 0;
          END 
        ELSE
          BEGIN 
          ELS$TYP[0] = "TU";
          END 
        ELS$CNUM[0] = "1";
        ELS$P[0] = XCHD(STIP[0]); 
        ELS$C4[0] = ", "; 
        ELS$PRM2[0] = XCDD(STIBT[0]); 
        ITEMP = 0;
        B<44,12>ITEMP = STIBR1[0];
        B<56,4>ITEMP = STIBR2[0]; 
        ITEMP = XCDD(ITEMP);
        CNST1 = 2;
        CNST2 = 48; 
        CNST3 = 36; 
        SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);
        MESSAGE(ELS$TXT,ACCT);
        MESSAGE(ELS$TXT,ERRLOG);
        ELS$CNUM[0] = "2";
        ITEMP = XCDD(STICT[0]); 
        CNST1 = 1;
        CNST2 = 36; 
        CNST3 = 36; 
        SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);
        ELS$PRM2[0] = XCDD(STICR[0]); 
        ELS$P1[0] = ".";
        ELS$ZBYT11[0] = 0;
        ELS$ZBYT12[0] = 0;
        MESSAGE(ELS$TXT,ACCT);
        MESSAGE(ELS$TXT,ERRLOG);
        IF WCB$SMID[0] EQ SMID"STILI" 
        THEN
          BEGIN                      # PROCESS SCLI C3 TEXT            #
          ELS$CNUM[0] = "3";
          ITEMP = XCDD(STIBB[0]);    # CONVERT NO. BAD BLKS TRANSMITTED#
          CNST1 = 1;                 # WORD ORDINAL OF BITFIELD        #
          CNST2 = 36;                # STARTING BIT POSITION           #
          CNST3 = 36;                # NO. OF BITS TO STORE            #
          SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);  # STORE BITFIELD   #
          ITEMP = 0;
          B<44,8>ITEMP = STIRP1[0]; 
          B<52,8>ITEMP = STIRP2[0]; 
          ELS$PRM2[0] = XCDD(ITEMP); # CONVERT NO. PAD REJECTS         #
          ITEMP = XCDD(STIRA[0]);    # CONVERT NO. A-A REJECTS         #
          CNST1 = 2;                 # WORD ORDINAL OF BITFIELD        #
          CNST2 = 48;                # STARTING BIT POSITION           #
          CNST3 = 36;                # NO. OF BITS TO STORE            #
          SSBSBF(ELS$TXT,CNST1,CNST2,CNST3,ITEMP);  # STORE BITFIELD   #
          MESSAGE(ELS$TXT,ACCT);     # SEND TEXT TO ACCOUNT FILE       #
          MESSAGE(ELS$TXT,ERRLOG);   # SEND TEXT TO ERRLOG FILE        #
          END                        # PROCESS SCLI C3 TEXT            #
        ELSE
          BEGIN                      # PROCESS SCTU C3 TEXT            #
          ES1$TYP[0] = ELS$TYP[0];   # MOVE *TU* TO TEXT ARRAY         #
          ES1$SN[0] = ELS$SN[0];     # MOVE SOURCE NODE TO TEXT ARRAY  #
          ES1$CNUM[0] = "3";
          ITEMP = XCDD(STIBB[0]);    # CONVERT NO. BAD BLKS TRANS      #
          CNST1 = 1;                 # WORD ORDINAL OF BITFIELD        #
          CNST2 = 36;                # STARTING BITPOSITION            #
          CNST3 = 36;                # NO. OF BITS TO STORE            #
          SSBSBF(ES1$TXT,CNST1,CNST2,CNST3,ITEMP);  # STORE BITFIELD   #
          MESSAGE(ES1$TXT,ACCT);     # SEND TEXT TO ACCOUNT FILE       #
          MESSAGE(ES1$TXT,ERRLOG);   # SEND TEXT TO ERRLOG FILE        #
          END                        # PROCESS SCTU C3 TEXT            #
        END 
EXIT: 
      RETURN;                # **** RETURN ****                        #
  
  
CONTROL EJECT;
  
      PROC CONVERT; 
# TITLE CONVERT - CONVERTS DISPLAY CODE TEXT TO ASCII.                 #
  
      BEGIN    # CONVERT #
# 
**    CONVERT - CONVERTS DISPLAY CODE TEXT TO ASCII.
* 
*     A. LIM    83/02/24
* 
*     THIS PROCEDURE IS INTERNAL TO *CSESES* AND IS ONLY CALLED BY
*     *CSESES*.  ITS MAIN FUNCTION IS TO CONVERT DISPLAY CODE TEXT
*     TO ASCII AND STORE IT INTO TEXT PORTION OF AN ALM/OP SM ( WITH
*     PFC/SFS, PORT AND SUBPORT PRESET TO ZERO).  THEN THE SM IS
*     SENT TO THE *EVQ*.
* 
*     PROC CONVERT
* 
*     ENTRY:    TEXT IN AREA POINTED TO BY *GENPBUF*
*               LEN = LENGTH IN CHARACTERS OF TEXT
* 
*     EXIT:     TEXT CONVERTED TO ASCII, AND AN ALM/OP SENT TO *EVQ*
* 
# 
  
  
  
  
  
      ITEM CHAR       U;               # CHARACTER                     #
      ITEM I          U;               # LOOP INDUCTION VAR            #
      ITEM EBIT       U;               # STARTING BIT OF EXTRACTION    #
      ITEM EORD       U;               # STARTING WORD OF EXTRACTION   #
      ITEM SBIT       U;               # STARTING BIT OF STORING       #
      ITEM SORD       U;               # STARTING WORD OF STORING      #
  
  
  
  
# 
*     CLEAR BUFFER AREAS. 
# 
  
      WCB$WORD[1] = 0;
      ABHWORD[1] = 0; 
      FOR I = (NMSGBUF$ + 1)/2 STEP 1 UNTIL NMSGBUF$
      DO
        BEGIN 
        MSG$WORD[I] = 0;               # CLEAR 2ND HALF OF *MSGBUF*    #
        END 
  
# 
*     INITIALIZE INDICES. 
# 
  
      EBIT = 0; 
      EORD = 0; 
      SBIT = 32;
      SORD = 0; 
  
# 
*     CONVERT MESSAGE INTO ASCII AND STORE IT INTO THE TEXT PORTION OF
*     AN ALM/OP SM. 
# 
  
      FOR I = 0 STEP 1 UNTIL LEN-1
      DO
        BEGIN 
        SSBEBF(GENPBUF[0],EORD,EBIT,6,CHAR);  # EXTRACT A CHAR         #
        CHAR = SSDCDA(CHAR);                  # CONVERT IT TO ASCII # 
        SSBSBF(CSSM[1],SORD,SBIT,8,CHAR);     # STORE IT IN ALM/OP  # 
        END 
  
# 
*     BUILD ABH, WC AND SEND SM TO *EVQ*. 
# 
  
      ABHSN[1] = ABHSN[0];
      ABHTLC[1] = 4 + LEN;             # PFC + SFC + P + SP + TEXT     #
      WCB$SMID[1] = SMID"ALMOP";
      WCB$WC[1] = (((ABHTLC[1]*8)+59)/60) + 2;
      SSTAQE(P<EVQ>, WCBUF[1], ABH[1], CSSM[1]);
  
      END    # CONVERT #
  
      END # CSESES #
      TERM
