*DECK     CSSAST
USETEXT TEXTCS; 
USETEXT TEXTSS; 
USETEXT TXTSMCS;
USETEXT TXTAPSS;
USETEXT TXTSUSS;
USETEXT TXCMDCS;
PROC CSSAST;
# TITLE CSSAST - ACTION STATUS COMMAND. # 
  
      BEGIN # CSSAST #
  
# 
**    CSSAST - ACTION STATUS COMMAND. 
* 
*     C. BRION          82/04/23. 
* 
*     THIS PROCEDURE PERFORMS THE PROCESSING OF ALL STATUS COMMANDS.
* 
*     PROC CSSAST 
* 
*     ENTRY:  
*       WCBUF = WORD COUNT WORD OF ENTRY THAT CONTAINS THE STATUS 
*               COMMAND THAT HAS BEEN RESOLVED INTO A ROUTED
*               COMMAND.
*       HDRCMD = ONE WORD ARRAY THAT CONTAINS PERTINENT INFORMATION 
*                ABOUT THE COMMAND. 
*       PARMS = ARRAY THAT CONTAINS THE COMMAND TEXT, THE SYNTAX
*               PARAMETER LIST AND THE ADDRESS PARAMETER LIST.
* 
*     EXIT: 
*       THE APPROPRIATE SUPERVISORY MESSAGE OR MESSAGES WILL BE SENT
*       TO THE APPROPRIATE NPUS.
* 
*       AN INFORMATIVE MESSAGE MAY BE SENT TO THE ORIGIN OPERATOR IN
*       CASE OF AN ERROR WITH THE COMMAND PROCESSING. 
* 
*       THE APPROPRIATE NPUCB AND OCB TABLE ENTRIES WILL BE UPDATED 
*       AS APPROPRIATE. 
* 
# 
  
# 
****  PROC CSSAST XREF LIST.
# 
  
      XREF
  
        BEGIN 
        PROC SSTAQE;                     # SS- ACCEPT QUEUE ENTRY # 
        FUNC SSDCDA;                     # SS- CONVERT DISPLAY CODE # 
                                         #     TO ASCII CHARACTER   # 
        PROC SSBEBF;                     # SS- EXTRACT BIT FIELD #
        PROC SSBSBF;                     # SS- STORE BIT FIELD   #
        PROC SSBSBW;                     # SS- SET BIT IN WORD #
        PROC MESSAGE;                    # MACREL MSG TO DAYFILE #
        PROC MOVEI;                      # MOVE WORDS INDIRECT #
        PROC ABORT;                      # MACREL PROGRAM ABORT # 
        END 
  
# 
****
# 
  
# 
*     PROC CSSAST DEFINITIONS 
# 
  
      DEF ASCBLNK2$     # O"040040" #;   # 2 ASCII BLANKS # 
  
  
# 
*     STATUS AND SWITCH DEFINITIONS.
# 
  
# 
*     STATLST - LIST OF ELEMENT STATUS VALUES.
# 
  
      STATUS STATLST
        ALL,
        NC, 
        DI, 
        DN, 
        EN, 
        ACT;
  
# 
*     CMDLST - LIST OF TYPE OF COMMANDS.
# 
  
      STATUS CMDLST 
        SINGLE, 
        MULTIPLE; 
  
  
# 
*     ELMLST - LIST OF COMMAND ELEMENT VALUES.
# 
  
      STATUS ELMLST 
        TERM, 
        TERMS,
        LINE, 
        LINES,
        CUPLR,
        CUPLRS, 
        TRUNK,
        TRUNKS, 
        NPU,
        NPUS, 
        LLINK,
        LLINKS, 
        SVC,
        SVCS; 
  
# 
*     BLDSM - SWITCH FOR BUILDING THE APPROPRIATE SM. 
# 
  
      SWITCH BLDSM:ELMLST 
        BLDTERM:TERM, 
        BLDTERMS:TERMS, 
        BLDLINE:LINE, 
        BLDLINES:LINES, 
        BLDCUPLR:CUPLR, 
        BLDCUPLRS:CUPLRS, 
        BLDTRUNK:TRUNK, 
        BLDTRUNKS:TRUNKS, 
        BLDNPU:NPU, 
        BLDNPU:NPUS,
        BLDLLINK:LLINK, 
        BLDLLINKS:LLINKS, 
        BLDSVC:SVC, 
        BLDSVCS:SVCS; 
  
  
# 
*     PROC CSSAST ITEM DEFINITIONS. 
# 
  
      ITEM OCBORD       U;               # OCB ORDINAL #
      ITEM NPUORD       U;               # NPUCB ORDINAL #
      ITEM BEGSYIX      U;               # INDEX VARIABLES #
      ITEM FINSYIX      U;
      ITEM BEGAPIX      U;
      ITEM FINAPIX      U;
      ITEM ELMIDX       U;
      ITEM NORIDX       U;
      ITEM QELIDX       U;
      ITEM K,L,I,M,Y    U;               # LOOP VARIABLES # 
      ITEM DORD,DBIT    U;               # CONVERSION VARS #
      ITEM AORD,ABIT    U;
      ITEM SINGCHR      U;               # CHARACTER HOLDING VAR #
      ITEM SENT         B;
      ITEM DONE         B;
      ITEM MATCH        B;
      ITEM NPSFLAG      B;               # SET WHEN NPUS IS SPECIFED #
  
      $BEGIN
      ITEM DBVAR        U;               # DEBUG VARIABLE # 
      $END
  
  
  
  
  
  
  
# 
*     PROC CSSAST ARRAY DEFINITIONS.
# 
  
# 
*     LLINFO - LLINK INFORMATION PACKET.
# 
  
      ARRAY LLINFO [00:01] S(1);
  
        BEGIN 
        ITEM LLI$WORD   U(00,00,60);     # FULL WORD REF #
        ITEM LLI$LLAIX  U(00,00,08);     # LLINK ADDRESS PARAMETER #
                                         # WORD INDEX              #
        ITEM LLI$NORIX  U(00,08,08);     # NPU ORDINAL PARAMETER   #
                                         # WORD INDEX              #
        ITEM LLI$NPORD U(00,16,12);      # NPU NODE ID OF ORDINAL NPU # 
        END 
  
# 
*     CMDPKT - COMMAND DESCRIPTION PACKET.
# 
  
      ARRAY CMDPKT [00:00] S(1);
  
        BEGIN 
        ITEM CMD$WORD   U(00,00,60);     # FULL WORD REF #
        ITEM CMD$ELMID  U(00,00,08);     # CMD ELEMENT ID # 
        ITEM CMD$TYPE   S:CMDLST (00,08,02); # TYPE, SINGLE, MULTIPLE # 
        ITEM CMD$PFC    U(00,10,08);     # CMD SM PFC # 
        ITEM CMD$SFC    U(00,18,08);     # CMD SM SFC # 
        ITEM CMD$STATUS S:STATLST (00,26,08); # CMD DESIRED STATUS #
        END 
  
# 
*     BADRCMD - DAYFILE MSG FOR BAD ROUTED COMMAND FORMAT.
# 
  
      ARRAY BADRCMD [00:00] S(3); 
  
        BEGIN 
        ITEM BAD$TXT1   C(00,00,25) = ["CSSAST-INVALID CMD FORMAT"];
        ITEM BAD$ZERO   U(02,30,30) = [0];
        END 
  
  
# 
*     HHMSG - ERROR MESSAGE FOR TERMINAL STATUS ON HOST/HOST LLINK. 
# 
  
      ARRAY HHMSG [00:00] S(6); 
  
        BEGIN 
        ITEM HH$TXT1    C(00,00,20) = ["TERMINALS CANNOT CON"]; 
        ITEM HH$TXT2    C(02,00,20) = ["NECT ON HOST-HOST LO"]; 
        ITEM HH$TXT3    C(04,00,10) = ["GICAL LINK"]; 
        ITEM HH$ZERO    U(05,00,60) = [0];
        END 
  
# 
*     NOSUPM - ERROR MESSAGE FOR UNSUPERVISED LLINK NODE. 
# 
  
      ARRAY NOSUPM [00:00] S(5);
  
        BEGIN 
        ITEM NO$TXT1    C(00,00,20) = ["TERMINAL NODE OF LLI"]; 
        ITEM NO$TXT2    C(02,00,03) = ["NK "];
        ITEM NO$NAME    C(02,18,07);
        ITEM NO$TXT3    C(03,00,16) = [" NOT SUPERVISED "]; 
        ITEM NO$ZERO    U(04,36,24) = [0];
        END 
  
  
# 
*     FLG$WORD - BASED ARRAY THAT POINTS TO THE PENDING STATUS REQUEST
*     WORD OF THE NPUCB.
# 
  
      BASED ARRAY FLG$WORD [00:00] S(NPCBSZ$);
        BEGIN 
        ITEM FW$WORD    I(00,00,60);
        END 
  
  
  
  
  
# 
*     PRESET THE ORDINALS AND INDICES TO BE USED. 
# 
  
      WCB$WORD[1] = 0;
      ABHWORD[1] = 0; 
      SPMSG0[1] = 0;
      SPMSG1[1] = 0;
      SPMSG2[1] = 0;
      OCBORD = HDR$OPORD[0];             # OCB ORDINAL #
      BEGSYIX = HDR$TXWCNT[0] + 1;       # BEGINNING SYNTAX LIST INDEX# 
      FINSYIX =  HDR$TXWCNT[0] + HDR$SPCNT[0] - 1;  # FINAL SYN INDX #
      BEGAPIX = FINSYIX + 1;             # BEGINNING ADDRESS LIST INDX# 
      IF HDR$APCNT[0] EQ 0
      THEN                   # IF THERE IS NO NPU ORD OR ELMNT ADDR    #
        BEGIN 
        FINAPIX = BEGAPIX;   # SET FINAL AP INDEX = BEGINNING AP INDEX #
        END 
      ELSE                   # THERE ARE NPU ORD OR ELMNT ADDR         #
        BEGIN 
        FINAPIX = BEGAPIX + HDR$APCNT[0] - 1; # FINAL ADDR LIST INDEX  #
        END 
      ELMIDX = BEGSYIX ;              # ELEMENT INDEX # 
      CMD$WORD[0] = 0;                   # CMD PACKET CLEAR # 
      CMD$TYPE[0] = CMDLST"SINGLE";      # PRESET CMD TYPE #
  
      WCB$SMID[1] = SMID"TTEXT";         # ENTRY IDENTIFIER FOR TTEXT # 
      WCB$IAF[1] = FALSE;                # INPUT ALLOWED TRUE # 
      ABHADR[1] = OCBORD;                # PRESET ADDR FOR TTEXT MSG #
  
  
# 
*     CHECK IF NOP KEYWORD PRESENT. IF SO, BUMP ELEMENT INDEX AND THE 
*     BEGINNING SYNTAX PARAMETER LIST INDEX.
# 
  
      IF PAR$PCODE[BEGSYIX] EQ "NOP"
      THEN
  
        BEGIN 
        BEGSYIX = BEGSYIX + 1;
        ELMIDX = ELMIDX + 1;
        END 
  
# 
*     DETERMINE IF NPUS WAS SPECIFIED.  IF SO, THEN SET FLAG. 
# 
      NPSFLAG = FALSE;
      FOR I=BEGSYIX STEP 1 UNTIL FINSYIX
      DO
        BEGIN 
        IF PAR$PCODE[I] EQ "NPS"
        THEN
          BEGIN 
          NPSFLAG = TRUE; 
          END 
        END 
# 
*     DETERMINE THE TYPE OF COMMAND ELEMENT OF COMMAND. THE SECOND
*     CHARACTER OF EACH COMMAND ELEMENT KEYWORD IS UNIQUE EXCEPT FOR
*     THE P IN NPUS (NP0 OR NPS) AND COUPLERS (CP0 OR CPS). ONCE
*     THE ELEMENT TYPE IS DETERMINED, THE PFC/SFC OF A RESULTING SM IS
*     SET AS WELL AS THE ELEMENT IDENTIFIER. NOTE THAT THE ELEMENT
*     IDENTIFIER IS SET TO THE MULTIPLE VALUE OF THE ID LIST. 
*     THE ORDER OF ELMLST IS CRUCIAL TO THE PROPER ID ASSIGNMENT. 
*     IF LATER EXAMINATION SHOWS A MULTIPLE ELEMENT TYPE OF COMMAND,
*     THEN THE CMD ELEMENT ID HAS TO ONLY BE BUMPED BY 1. 
*     NOTE THAT THE ORDER OF THE SYNTAX PARAMETER LIST IS ALSO A
*     CRUCIAL ASSUMPTION OF CSSAST. THE COMMAND ELEMENT, OR THE ELEMENT 
*     TYPE BEING STATUSED, IS ALWAYS THE FIRST PARAMETER CODE/VALUE 
*     PAIR AFTER THE VERB AND IF PRESENT THE NOP PARAMETERS.
# 
  
      IF PAR$PCHR2[BEGSYIX] EQ "E"       # TERMINAL # 
      THEN
  
        BEGIN 
        CMD$PFC[0] = TES; 
        CMD$SFC[0] = TE;
        CMD$ELMID[0] = ELMLST"TERM";
        END 
  
      ELSE IF PAR$PCHR2[BEGSYIX] EQ "I"  # LINE # 
      THEN
  
        BEGIN 
        CMD$PFC[0] = LIS; 
        CMD$SFC[0] = LI;
        CMD$ELMID[0] = ELMLST"LINE";
        END 
  
      ELSE IF PAR$PCHR2[BEGSYIX] EQ "P"  # NPU OR COUPLER # 
      THEN
  
        BEGIN 
        IF PAR$PCHR1[BEGSYIX] EQ "C"     # COUPLER #
        THEN
  
          BEGIN 
          CMD$PFC[0] = CPS; 
          CMD$SFC[0] = CP;
          CMD$ELMID[0] = ELMLST"CUPLR"; 
          END 
  
        ELSE
  
          BEGIN                          # MUST BE NPU #
          CMD$PFC[0] = NPS; 
          CMD$SFC[0] = NP;
          CMD$ELMID[0] = ELMLST"NPU"; 
          END 
        END 
  
      ELSE IF PAR$PCHR2[BEGSYIX] EQ "R"  # TRUNK #
      THEN
  
        BEGIN 
        CMD$PFC[0] = TRS; 
        CMD$SFC[0] = TR;
        CMD$ELMID[0] = ELMLST"TRUNK"; 
        END 
  
      ELSE IF PAR$PCHR2[BEGSYIX] EQ "L"  # LOGICAL LINK # 
      THEN
  
        BEGIN 
        CMD$PFC[0] = LLS; 
        CMD$SFC[0] = LL;
        CMD$ELMID[0] = ELMLST"LLINK"; 
        END 
  
      ELSE IF PAR$PCHR2[BEGSYIX] EQ "C"  # SVC #
      THEN
  
          BEGIN 
          CMD$PFC[0] = VCS; 
          CMD$SFC[0] = VC;
          CMD$ELMID[0] = ELMLST"SVC"; 
          END 
  
  
      ELSE
  
        BEGIN 
        MESSAGE(BADRCMD[0],0);
        ABORT;
        END;
  
  
# 
*     THE ELEMENT TYPE BEING STATUSED MAY BE A MUTIPLE TYPE (I.E A
*     STATUS OF TERMINALS ON A LINE (ST,TES,LI=XXXXXXX)). IF SO,
*     THE THIRD CHARACTER OF THE PARAMETER CODE WILL ALWAYS BE "S". 
*     IF TRUE, THEN THE QUALIFIER ELEMENT (I.E. LI=XXXXXXX) HAS TO
*     BE DETERMINED AND THE SFC ADJUSTED. ALSO THE CMD TYPE MUST
*     BE CHANGED TO INDICATE A MULTIPLE TYPE. 
*     THE ELEMENT IDENTIFIER SET TO THIS POINT IS FOR THE SINGLE
*     ELEMENT TYPE OF THE COMMAND. IF MULTIPLE, SIMPLY BUMP THE 
*     VALUE BY 1 AND THE PROPER ID VALUE IS SET. NOTE THE ORDER OF
*     THE ID VALUES IN THE STATUS LIST ELMLST.
*     NOTE THAT THE ASSUMPTION THAT THE QUALIFIER ELEMENT PARAMETER 
*     WORD FOLLOWS THE STATUSED ELEMENT PARAMETER WORD OF THE 
*     SYNTAX PARAMETER LIST.
# 
  
      QELIDX = BEGSYIX ;              # BUMP PARAMETER WORD INDEX # 
  
      IF PAR$PCHR3[QELIDX] EQ "S" 
      THEN
        BEGIN 
        QELIDX = QELIDX + 1;             # BUMP TO QUALIFIER ELM #
  
        CMD$TYPE[0] = CMDLST"MULTIPLE"; 
        CMD$ELMID[0] = CMD$ELMID[0] + 1;
  
  
        IF PAR$PCHR2[QELIDX] EQ "I"      # LI= QUALIFIER #
        THEN
          CMD$SFC[0] = LI;
  
        ELSE IF PAR$PCHR2[QELIDX] EQ "P" # NP= QUALIFIER #
        THEN
          CMD$SFC[0] = NP;
  
        ELSE IF PAR$PCHR2[QELIDX] EQ "L" # LL= QUALIFIER #
        THEN
          CMD$SFC[0] = LL;
  
        END 
  
# 
*     CHECK IF A STATUS OF ALL TERMINALS ON A HOST TO HOST LOGICAL
*     LINK HAS BEEN ATTEMPTED. IF SO, SEND ERROR MESSAGE TO OPERATOR, 
*     THEN EXIT PROCESS. OTHERWISE, CHECK THAT THE NPU NODE ID OF 
*     THE NPU ORDINAL DOES IN FACT MATCH THE NPU NODE ID OF THE 
*     ASSOCIATED LOGICAL LINK ADDRESS. IF NOT, DELETE THE NPU 
*     ORDINAL AND LLA FROM THE ADDRESS PARAMETER LIST OF THE COMMAND. 
# 
  
      IF CMD$ELMID[0] EQ ELMLST"TERMS"
         AND CMD$SFC[0] EQ LL 
      THEN
  
        BEGIN 
        NORIDX = ELMIDX + 2;             # SET NOR INDEX #
  
# 
*     FOR EACH POSSIBLE NPU ORDINAL SPECIFIED ( MAX IS 2) 
# 
  
  
        FOR K = 0 STEP 1 UNTIL 1
        DO
  
          BEGIN 
          LLI$WORD[K] = 0;               # CLEAR LLINK INFO WORD #
  
# 
*     SEARCH THE ADDRESS PARAMETER LIST FOR A NOR PARAMETER.
# 
  
          FOR L = BEGAPIX STEP 1 UNTIL FINAPIX
          DO
  
            BEGIN 
            IF PAR$PCODE[L] EQ "NOR"
            THEN
  
              BEGIN 
              LLI$LLAIX[K] = L + 1;      # SET LLA INDEX FOR NOR #
              LLI$NORIX[K] = L;          # SET NOR INDEX #
              LLI$NPORD[K] = PAR$ORD[L]; # SET NPU ORDINAL #
  
# 
*     CHECK THE LINK TYPE FOR HOST TO HOST. IF SO, SEND MESSAGE AND 
*     EXIT THE PROCESS. 
# 
  
              IF PAR$LLTYPE[LLI$LLAIX[K]] 
              THEN
  
                BEGIN 
                WCB$WC[1] = 8 ;          # SET MSG ENTRY SIZE # 
                ABHTLC[1] = 60;          # SET MSG CHARACTER LEN #
                SSTAQE(P<CNQ>,WCBUF[1],ABH[1],HHMSG[0]);
                GOTO ENDEXIT; 
                END 
  
              ELSE                       # LOGICAL LINK HOST TO NPU # 
  
                BEGIN 
  
# 
*     CHECK TO SEE IF UNMATCHED NPU NODE ID OF NPU AT NOR ORDINAL AND 
*     NPU NODE ID OF LOGICAL LINK ADDRESS IS PRESENT. IF SO, A RESULT-
*     ING STATUS REQUEST CAN NOT BE SENT TO THAT NPU SINCE IT IS NOT
*     THE TERMINAL NODE OF THE LINK. THEREFORE, DELETE THE NPU ORDINAL
*     PARAMETER AS WELL AS THE LOGICAL LINK ADDRESS PARAMETER WORD. 
# 
  
                IF PAR$LLNID2[LLI$LLAIX[K]] NQ NPU$NID[LLI$NPORD[K]]
                THEN
  
                  BEGIN 
                  PAR$PCODE[LLI$NORIX[K]] = "NUL";
                  PAR$PCODE[LLI$LLAIX[K]] = "NUL";
                  LLI$NORIX[K] = 0; 
                  END 
  
                END # IF PAR$LLTYPE # 
  
              END # IF PAR$PCODE EQ NOR # 
  
            END # FOR L=BEGAPIX LOOP #
  
          END # FOR K = 0 LOOP #
  
# 
*     IF THERE IS NOT AN NOR PARAMETER WORD PRESENT IN THE COMMAND
*     AFTER THE PREVIOUS ACTIONS, THEN CS IS NOT SUPERVISING THE
*     TERMINAL NODE OF THE LOGICAL LINK QUALIFIER ELEMENT. A
*     MESSAGE IS SENT TO THE OPERATOR.
# 
  
          IF (LLI$NORIX[0] EQ 0 
             AND LLI$NORIX[1] EQ 0) 
          THEN
  
            BEGIN 
            NO$NAME[0] = PAR$ELNAME[BEGSYIX + 1]; # SET NPU NAME #
            WCB$WC[1] = 7;                   # SET MSG ENTRY SIZE # 
            ABHTLC[1] = 50;                  # SET MSG CHAR LENGTH #
            SSTAQE(P<CNQ>,WCBUF[1],ABH[1],NOSUPM[0]); 
            GOTO ENDEXIT; 
            END 
  
        END # IF CMD$ELMID #
  
      OC$NCNT[OCBORD] = 0;               # CLEAR AFFECTED NPU COUNT # 
  
# 
*     FOR EACH NPU ORDINAL IN COMMAND (MAX IS TWO), CHECK TO SEE IF 
*     THE NPU IS BUSY WITH ANOTHER STATUS COMMAND. IF SO, INFORM THE
*     REQUESTING OPERATOR AND EXIT. OTHERWISE, CONTINUE PROCESSING
*     THE CURRENT STATUS COMMAND. 
# 
  
      SENT = FALSE; 
  
      FOR I = BEGAPIX STEP 1 UNTIL FINAPIX
      DO
  
        BEGIN 
        IF PAR$PCODE[I] EQ "NOR" OR 
           NPSFLAG
        THEN
  
          BEGIN 
          NPUORD = PAR$ORD[I];           # SET LOCAL NPU ORDINAL #
  
  
# 
*     IF THE COMMAND TYPE IS MULTIPLE, THEN THE STATUS DESIRED FOR
*     THE STATUSED ELEMENT GROUP MUST BE DETERMINED. A SEARCH OF THE
*     SYNTAX PARAMETER LIST FOR THE ELEMENT STATUS QUALIFIER IS DONE. 
*     THE COMMAND STATUS QUALIFIER IS THEN SET ACCORDINGLY. 
# 
  
          IF CMD$TYPE[0] EQ CMDLST"MULTIPLE"
          THEN
  
            BEGIN 
            CMD$STATUS[0] = STATLST"ALL"; 
            DONE = FALSE; 
  
            FOR M = BEGSYIX STEP 1 WHILE (M LQ FINSYIX
              AND CMD$STATUS[0] EQ STATLST"ALL" 
              AND NOT DONE) 
            DO
  
              BEGIN 
  
              IF PAR$PCODE[M] EQ "EN1"   # ENABLED ELEMENTS # 
              THEN
  
                CMD$STATUS[0] = STATLST"EN";
  
              ELSE IF PAR$PCODE[M] EQ "AC0" # ACTIVE ELEMENTS # 
              THEN
  
                CMD$STATUS[0] = STATLST"ACT"; 
  
              ELSE IF PAR$PCODE[M] EQ "DI1" # DISABLED ELEMENTS # 
              THEN
  
                CMD$STATUS[0] = STATLST"DI";
  
              ELSE IF PAR$PCODE[M] EQ "DN0" # DOWNED ELEMENTS # 
              THEN
  
                CMD$STATUS[0] = STATLST"DN";
  
              ELSE IF PAR$PCODE[M] EQ "MSG" 
              THEN
  
                DONE = TRUE;
  
  
              END # FOR M LOOP #
  
            END # IF CMD$TYPE # 
  
# 
*     INITIALIZE THE OUTGOING SM MEMORY AREAS.
# 
  
          ABHABT[1] = APPSUP;            # ABH BLOCK TYPE # 
          ABHBT[1] = APPSUP;
          ABHACT[1] = ACTCSNP$;          # SET ACT FOR OUTGOING SM #
  
# 
*     BASED ON THE DETERMINED COMMAND ELEMENT IDENTIFIER, BRANCH TO 
*     THE APPROPRIATE CASE AND BUILD THE OUTGOING SM. 
# 
  
          GOTO BLDSM[CMD$ELMID[0]]; 
  
  
  
BLDTERM:                                 # ST,TE=XXXXXXX COMMAND #
  
# 
*     CONVERT THE DISPLAY CODED TERMINAL NAME TO ASCII. 
# 
  
          DORD = ELMIDX;
          DBIT = 0; 
          AORD = 1; 
          ABIT = 4; 
          FOR Y = 1 STEP 1 UNTIL 7
          DO
  
            BEGIN 
            SSBEBF(PARMS[0],DORD,DBIT,6,SINGCHR); 
            SINGCHR = SSDCDA(SINGCHR);
            SSBSBF(CSSM[1],AORD,ABIT,8,SINGCHR);
            END 
  
# 
*     SET UP REST OF TES/TE SM
# 
  
          ABHTLC[1] = NTESTE; 
          TESP[1] = PAR$ELADDR[I+1];     # ADD PORT NUMBER #
          WCB$WC[1] = LTESTE + 2; 
          WCB$SMID[1] = SMID"TESTE";
          GOTO SENDSM;
  
  
  
BLDTERMS:                                # ST,TES,YY=XXXXXXX COMMAND #
  
# 
*     THE MULTIPLE TES STATUS COMMAND MAY BE REQUESTED WITH THE NP, LL
*     OR LI QUALIFIER ELEMENTS (NPU,LOGICAL LINK, LINE). THE GENERATED
*     SM DIFFERS SLIGHTLY FOR EACH VARIATION. DETERMINE THE QUALIFIER 
*     AND SET UP THE APPROPRIATE SM.
# 
  
          IF CMD$SFC[0] EQ NP            # NPU QUALIFIER ELEMENT #
          THEN
  
            BEGIN 
            TESSTL[1] = CMD$STATUS[0];   # SET STATUS DESIRED#
            ABHTLC[1] = NTESNP; 
            WCB$WC[1] = LTESNP + 2; 
            WCB$SMID[1] = SMID"TESNP";
            END 
  
          ELSE IF CMD$SFC[0] EQ LL       # LLINK QUALIFIER ELEMENT #
          THEN
  
            BEGIN 
            TESN1[1] = PAR$LLNID1[I+1]; 
            TESN2[1] = PAR$LLNID2[I+1]; 
            ABHTLC[1] = NTESLL; 
            WCB$WC[1] = LTESLL + 2; 
            WCB$SMID[1] = SMID"TESLL";
            END 
  
          ELSE                           # LINE QUALIFIER ELEMENT # 
  
            BEGIN 
            TESP[1] = PAR$ELADDR[I+1];
            ABHTLC[1] = NTESLI; 
            WCB$WC[1] = LTESLI + 2; 
            WCB$SMID[1] = SMID"TESLI";
            END 
  
          TESST[1] = CMD$STATUS[0]; 
          GOTO SENDSM;
  
  
  
  
BLDLINE:                                 # ST,LI=XXXXXXX COMMAND #
  
          LISP[1] = PAR$ELADDR[I+1];
          ABHTLC[1] = NLISLI; 
          WCB$WC[1] = LLIS + 2; 
          WCB$SMID[1] = SMID"LISLI";
          GOTO SENDSM;
  
  
  
BLDLINES:                                # ST,LIS,YY=XXXXXXX COMMAND #
  
          LISST[1] = CMD$STATUS[0]; 
          ABHTLC[1] = NLISNP; 
          WCB$WC[1] = LLIS + 2; 
          WCB$SMID[1] = SMID"LISNP";
          GOTO SENDSM;
  
  
  
BLDCUPLR:                                # ST,CP=XXXXXXX COMMAND #
  
          CPSN1[1] = PAR$ELADDR[I+1]; 
          ABHTLC[1] = NCPS; 
          WCB$WC[1] = LCPS + 2; 
          WCB$SMID[1] = SMID"CPSCP";
          GOTO SENDSM;
  
  
  
BLDCUPLRS:                               # ST,CPS,NP=XXXXXXX COMMAND #
  
          CPSST[1] = CMD$STATUS[0]; 
          ABHTLC[1] = NCPS; 
          WCB$WC[1] = LCPS + 2; 
          WCB$SMID[1] = SMID"CPSNP";
          GOTO SENDSM;
  
  
  
  
BLDTRUNK:                                # ST,TR=XXXXXXX COMMAND #
  
          TRSP[1] = PAR$ELADDR[I+1];
          ABHTLC[1] = NTRSTR; 
          WCB$WC[1] = LTRS + 2; 
          WCB$SMID[1] = SMID"TRSTR";
          GOTO SENDSM;
  
  
  
BLDTRUNKS:                               # ST,TRS,NP=XXXXXXX COMMAND #
  
  
          TRSST[1] = CMD$STATUS[0]; 
          ABHTLC[1] = NTRSNP; 
          WCB$WC[1] = LTRS + 2; 
          WCB$SMID[1] = SMID"TRSNP";
          GOTO SENDSM;
  
  
  
BLDNPU:                                  # ST,NP=XXXXXXX COMMAND #
  
          ABHTLC[1] = NNPS; 
          WCB$WC[1] = LNPS + 2; 
          WCB$SMID[1] = SMID"NPSNP";
          GOTO SENDSM;
  
  
  
  
BLDLLINK:                                # ST,LL=XXXXXXX COMMAND #
  
          LLSN1[1] = PAR$LLNID1[I+1]; 
          LLSN2[1] = PAR$LLNID2[I+1]; 
          ABHTLC[1] = NLLSLL; 
          WCB$WC[1] = LLLS + 2; 
          WCB$SMID[1] = SMID"LLSLL";
          GOTO SENDSM;
  
  
  
  
BLDLLINKS:                               # ST,LLS,NP=XXXXXXX COMMAND #
  
          LLSST[1] = CMD$STATUS[0]; 
          ABHTLC[1] = NLLSNP; 
          WCB$WC[1] = LLLS + 2; 
          WCB$SMID[1] = SMID"LLSNP";
          GOTO SENDSM;
  
  
BLDSVC:                                  # ST,SVC=XXXXX COMMAND        #
  
# 
          CONVERT THE DISPLAY CODE ARCHETYPE NAME TO ASCII
# 
          DORD = ELMIDX;                 # BITFIELD START POSITION     #
          DBIT = 0; 
          AORD = 1; 
          ABIT = 4; 
          FOR Y = 1 STEP 1 UNTIL 5
          DO
  
            BEGIN 
            SSBEBF(PARMS[0],DORD,DBIT,6,SINGCHR);  # EXTRACT BITFIELD  #
            SINGCHR = SSDCDA(SINGCHR);
            SSBSBF(CSSM[1],AORD,ABIT,8,SINGCHR);  # STORE BITFIELD     #
            END 
  
# 
          SET UP REST OF VCS/VC SM
# 
  
          VCSP[1] = PAR$ELADDR[I+1];     # PORT NUMBER                 #
          VCSSP[1] = 0;                  # SUBPORT ALWAYS 0            #
          VCSBL[1] = X"2020";            # INSERT TWO BLANKS           #
          ABHTLC[1] = NVCSVC;            # LENGTH IN CHAR              #
          WCB$WC[1] = LVCSVC + 2; 
          WCB$SMID[1] = SMID"VCSVC";
          GOTO SENDSM;
  
  
  
BLDSVCS:  # ST,SVS,YY=XXXXXXX COMMAND # 
  
# 
*         THE MULTIPLE SVC STATUS COMMAND MAY BE REQUESTED WITH 
*         THE NP OR LI QUALIFIER ELEMENT.  THE GENERATED SM 
*         DIFFERS SLIGHTLY FOR EACH VARIATION.  DETERMINE QUALIFIER 
*         AND SET UP APPROPRIATE SM.
# 
  
          IF CMD$SFC[0] EQ NP            # NPU QUALIFIER ELEMENT       #
          THEN
  
            BEGIN 
            ABHTLC[1] = NVCSNP;          # LENGTH IN CHAR              #
            WCB$WC[1] = LVCSNP + 2; 
            WCB$SMID[1] = SMID"VCSNP";
            END 
  
          ELSE                           # LINE QUALIFIER ELEMENT      #
  
            BEGIN 
            VCSP[1] = PAR$ELADDR[I+1];   # PORT NUMBER                 #
            VCSSP[1] = 0;                # SUBPORT ALWAYS 0            #
            ABHTLC[1] = NVCSLI;          # LENGTH IN CHAR              #
            WCB$WC[1] = LVCSLI + 2; 
            WCB$SMID[1] = SMID"VCSLI";
            END 
  
          GOTO SENDSM;
  
  
SENDSM: 
  
# 
*     SET THE PFC AND SFC OF THE OUTGOING SM. 
# 
  
          PFC[1] = CMD$PFC[0];
          SFC[1] = CMD$SFC[0];
  
# 
*     IF THIS STATUS REQUEST GOES TO ALL NPUS, FOR EACH SUPERVISED NPU
*     SET THE STATUS REQUEST PENDING FLAG FOR THIS OPERATOR AND INCRE-
*     MENT THE AFFECTED NPU COUNT, AND SAVE THE NPU ORDINAL.  FIND THE
*     FIRST NPU THAT IS NOT BUSY WITH A STATUS REQUEST. 
# 
  
          P<FLG$WORD> = LOC(NPU$STFLGS[0]); 
          IF NPSFLAG
          THEN
            BEGIN 
  
            FOR Y=0 STEP 1 WHILE Y LS CSNPCNT 
            DO
              BEGIN 
              IF NPU$STAT[Y] EQ SUPSTAT"SUP"
              THEN
                BEGIN 
                SSBSBW(FLG$WORD[Y],OCBORD); 
                OC$NCNT[OCBORD] = OC$NCNT[OCBORD] + 1;
                NPUORD = Y; 
                END 
              END 
  
            MATCH = FALSE;
            FOR Y=0 STEP 1 WHILE NOT MATCH AND
                                 Y LS CSNPCNT 
            DO
              BEGIN 
              IF NPU$STAT[Y] EQ SUPSTAT"SUP" AND
                 NPU$OPST[Y] EQ 0 
              THEN
                BEGIN 
                MATCH = TRUE; 
                NPUORD = Y; 
                END 
              END 
            END 
  
# 
*     STATUS REQUEST IS JUST TO ONE NPU.  SET THE STATUS REQUEST PENDING
*     FLAG IN THE NPU AND INCREMENT THE AFFECTED NPU COUNT. 
# 
  
          ELSE
            BEGIN 
            SSBSBW(FLG$WORD[NPUORD],OCBORD);
            OC$NCNT[OCBORD] = OC$NCNT[OCBORD] + 1;
            END 
  
# 
*     IF THE NPU IS NOT BUSY AND THIS IS THE FIRST NPU THEN, SET THE
*     NPUORD IN THE OCB, SAVE THE CURRENT STATUS OPERATOR ORD IN THE
*     NPUCB, AND SEND THE SM. 
# 
  
          IF NPU$OPST[NPUORD] EQ 0 AND
             NOT SENT 
          THEN
            BEGIN 
            OC$CNPU[OCBORD] = NPUORD; 
            NPU$OPST[NPUORD] = OCBORD;
  
            ABHDN[1] = NPU$NID[NPUORD]; 
            ABHSN[1] = NPU$HID[NPUORD]; 
            SSTAQE(P<OTQ>,WCBUF[1],ABH[1],CSSM[1]); 
          SENT = TRUE;
            END 
  
          END # IF PAR$PCODE EQ NOR # 
  
        END # FOR I = BEGAPIX LOOP #
  
ENDEXIT:  
  
  
# 
*     IF AFFECTED NPU COUNT OF THE OCB IS ZERO, CAUSE A READY.. MSG 
*     TO THE OPERATOR VIA A NULL TERMINAL TEXT ENTRY. 
# 
  
      IF OC$NCNT[OCBORD] EQ 0 
      THEN
  
        BEGIN 
        WCB$WC[1] = 2;
        WCB$SMID[1] = SMID"TTEXT";
        ABHADR[1] = HDR$OPORD[0]; 
        WCB$IAF[1] = TRUE;               # SET INPUT ALLOWED #
        ABHTLC[1] = 0;
        SSTAQE(P<CNQ>,WCBUF[1],ABH[1],CSSM[1]); 
        END 
  
      ELSE
  
        BEGIN 
        OC$VERB[OCBORD] = HDR$VERB[0];
  
        OC$WC[OCBORD] = WCB$WC[1] - 2;
        OC$TLC[OCBORD] = ABHTLC[1]; 
        MOVEI(OC$WC[OCBORD],LOC(CSSM[1]),LOC(OC$SM[OCBORD])); 
        END 
  
  
      $BEGIN
  
      DBVAR = 1;
  
      $END
  
      END # CSSAST #
  
  
 TERM 
