*DECK CSSAMS
USETEXT TEXTSS; 
USETEXT TEXTCS; 
USETEXT TXCMDCS;
USETEXT TXTAPSS;
USETEXT TXTSUSS;
USETEXT TXTSMCS;
PROC CSSAMS;
# TITLE  CSSAMS - ACTION MULTIPLE SEND COMMAND. # 
      BEGIN # CSSAMS #
  
# 
**    CSSAMS - ACTION MULTIPLE SEND COMMAND.
* 
*     C. BRION          82/09/16. 
* 
*     THIS PROCEDURE PROCESSES THE SEND,NPS COMMAND.
* 
*     PROC CSSAMS 
* 
*     ENTRY      HDRCMD - COMMAND HEADER WORD.
* 
*     EXIT       NPUCB - MAY BE UPDATED FOR EACH SUPERVISED NPU.
*                OCB - THE OCB FOR THE COMMAND OPERATOR MAY BE UPDATED. 
*                A TEXT MESSAGE MAY BE SENT TO THE OPERATOR.
*                ONE OR MORE MSG/NP SUPERVISORY MESSAGES MAY BE SENT. 
* 
# 
  
# 
****  PROC CSSAMS XREF LIST 
# 
      XREF
        BEGIN 
        PROC MOVE;                       # MACREL MOVE ROUTINE #
        PROC MOVEI;                      # MACREL MOVE INDIRECT # 
        PROC SSTAQE;                     # SS ACCEPT QUEUE ENTRY #
        PROC SSBEBF;                     # SS EXTRACT BIT FIELD # 
        PROC SSBSBF;                     # SS STORE BIT FIELD # 
        PROC SSBSBW;                     # SS SET BIT IN WORD # 
        FUNC SSDCDA;                     # SS CONVERT DIS TO ASCII #
        END 
  
# 
****
# 
  
      DEF N1SENDL$     # 4 #; 
      DEF N2SENDL$     # 5 #; 
      DEF US$          # X"1F" #; 
  
# 
*     ITEM LIST 
# 
  
      ITEM ORD               I;          # OCB ORDINAL #
      ITEM NORD              I;          # NPU ORDINAL #
      ITEM AORD              I;          # CHAR CONV VAR #
      ITEM ABIT              I; 
      ITEM DBIT              I; 
      ITEM DORD              I; 
      ITEM I                 I;          # LOOP VAR # 
      ITEM SCHAR             U;          # CHARACTER TEMP CELL #
      ITEM BSYIX             I;          # BEGINNING SYN INDEX VAR #
      ITEM Y                 I;          # LOCAL WORKING VAR #
  
  
# 
*     FLG$WORD - A BASED ARRAY THAT POINTS TO THE PENDING SEND BIT
*     MAPS IN THE NPUCB-S.
# 
      BASED ARRAY FLG$WORD [00:00] S(NPCBSZ$);
        BEGIN 
        ITEM FW$WORD    I(00,00,60);
        END 
  
  
# 
*     FROMNOP - HEADER TEXT PREFIX FOR HOST BROADCAST MSG.
# 
  
      ARRAY FROMNOP [00:00] S(1); 
        BEGIN 
        ITEM FRO$TXT            C(00,00,10) = ["FROM NOP.."]; 
        END 
  
# 
*     THIS MESSAGE IS SENT WHEN NO SEND WAS ACTIONED BECAUSE THERE
*     ARE NO NPUS CURRENTLY BEING SUPERVISED. 
# 
  
      DEF LNONPUS # 04 #;    # NUMBER OF WORD IN MESSAGE               #
      ARRAY NONPUS [00:00] S(LNONPUS);
        BEGIN 
        ITEM NNP$MSG1    C(00,00,20) = ["NO NPUS ARE BEING SU"];
        ITEM NNP$MSG2    C(02,00,10) = ["PERVISED"];
        ITEM NNP$ZFIL    I(03,00,60) = [0]; 
        END 
  
  
  
# 
*     MAIN PROCEDURE STARTS HERE. 
# 
  
      ORD = HDR$OPORD[0];                 # SET OCB ORDINAL # 
  
      ABHWORD[1] = 0;                     # CLEAR ABH AND WC WORDS #
      WCB$WORD[1] = 0;
      PFCSFC[1] = MSGNP;                 # SET UP OUTGOING SM AREA #
      ABHABT[1] = APPSUP; 
      ABHBT[1] = APPSUP;
# 
*     SET UP THE ABH WORD FOR OUTGOING SM (MSG/NP). 
# 
  
      PFCSFC[1] = MSGNP;
      ABHABT[1] = APPSUP; 
      ABHBT[1] = APPSUP;
      ABHACT[1] = ACTCSNP$; 
      ABHTLC[1] = 2;
  
# 
*     SET THE OUTGOING SM IDENTIFIER. 
# 
  
      WCB$SMID[1] = SMID"MSGNP";
  
# 
*     SET UP THE ASCII PORTION OF THE OUTGOING SM BY CONVERTING 
*     THE HEADER TEXT AND MESSAGE TEXT TO ASCII INTO THE SM.
# 
  
      AORD = 0; 
      ABIT = 16;
      DORD = 0; 
      DBIT = 0; 
  
      FOR I = 1 STEP 1 UNTIL 10 
      DO
        BEGIN 
        SSBEBF(FRO$TXT[0],DORD,DBIT,6,SCHAR); 
        SCHAR = SSDCDA(SCHAR);
        SSBSBF(CSSM[1],AORD,ABIT,8,SCHAR);
        END 
  
# 
*     DETERMINE POSITION OF MSG TEXT IN COMMAND BLOCK.
# 
  
      BSYIX = HDR$TXWCNT[0] + 1;
      FOR I = BSYIX STEP 1 WHILE PAR$PCODE[I] NQ "MS0"
      DO
        BEGIN 
        END 
  
      DORD = I + 1; 
  
# 
*     MOVE MSG TEXT INTO SM BODY AFTER ASCII CONVERSION.
# 
  
      FOR Y = 1 STEP 1 UNTIL PAR$MSGCL[I] 
      DO
        BEGIN 
        SSBEBF(PARMS[0],DORD,DBIT,6,SCHAR); 
        SCHAR = SSDCDA(SCHAR);
        SSBSBF(CSSM[1],AORD,ABIT,8,SCHAR);
        END 
  
      SCHAR = US$;
      SSBSBF(CSSM[1],AORD,ABIT,8,SCHAR);
  
# 
*     SET THE TEXT LENGTH OF SM IN CHARACTERS.
# 
  
      ABHTLC[1] = ABHTLC[1] + PAR$MSGCL[I] + 11;
      WCB$WC[1] = ((ABHTLC[1] * 8)/60) + 3; 
  
# 
*     SAVE THE SM IN THE OPERATOR CONTROL BLOCK.
# 
      OC$WC[ORD] = WCB$WC[1] - 2; 
      OC$TLC[ORD] = ABHTLC[1];
  
      MOVEI(OC$WC[ORD],LOC(CSSM[1]),LOC(OC$SM[ORD])); 
  
# 
*     SEARCH THE NPUCB ARRAY FOR EACH NPUCB THAT IS SUPERVISED AND
*     NOT BUSY WITH ANOTHER BROADCAST COMMAND.
# 
  
      FOR NORD = 0 STEP 1 UNTIL CSNPCNT - 1 
      DO
        BEGIN 
        IF NPU$STAT[NORD] EQ SUPSTAT"SUP" AND 
           (ORD EQ HOPORD$  OR  ORD EQ NPU$CNOP[NORD])
        THEN
          BEGIN 
          P<FLG$WORD> = LOC(NPU$SDFLGS[NORD]);
          SSBSBW(FLG$WORD,ORD); 
  
# 
*     INCREMENT THE NUMBER OF SEND NPUS AFFECTED BY THIS COMMAND. 
# 
  
          OC$NCNT[ORD] = OC$NCNT[ORD] + 1;
  
  
# 
*     IF THE NPU IS NOT BUSY WITH ANOTHER SEND COMMAND,  THEN SEND
*     THEN MESSAGE. 
# 
  
          IF NPU$OPSD[NORD] EQ 0
          THEN
            BEGIN 
  
  
# 
*     SET THE SEND OPERATOR IN THE NPUCB. 
# 
  
            NPU$OPSD[NORD] = ORD; 
  
  
# 
*     SEND THE MSG/NP SM
# 
  
            ABHDN[1] = NPU$NID[NORD]; 
            ABHSN[1] = NPU$HID[NORD]; 
            SSTAQE(P<OTQ>,WCBUF[1],ABH[1],CSSM[1]); 
            END 
          END 
  
        END 
  
# 
*     IF THE AFFECTED NPU COUNT IS ZERO THEN THERE ARE NO NPUS BEING
*     SUPERVISED.  SEND A MESSAGE INDICATING SO AND CAUSE A *READY* 
*     TO GO TO OPERATOR.                                                      # 
# 
  
      IF OC$NCNT[ORD] EQ 0
      THEN
        BEGIN 
        WCB$WORD[1] = LNONPUS + 2;
        WCB$SMID[1] = SMID"TTEXT";
        WCB$IAF[1] = TRUE;
        ABHWORD[1] = 0; 
        ABHADR[1] = HOPORD$;
  
        SSTAQE(P<CNQ>,WCBUF[1],ABH[1],NONPUS);
        END 
  
  
      WCB$WORD[1] = 0;
      ABHWORD[1] = 0; 
  
# 
*     SEND THE COMMAND TEXT TO THE NETWORK LOG FILE VIA AN EVENT. 
# 
  
      P<MSCMD> = LOC(CMD$TEXT[0]);
      CMD$TNAM[0] = OC$TNAM[ORD]; 
      MOVE(HDR$TXWCNT[0],PARMS[0],MSCMD[0]);
      WCB$SMID[1] = SMID"CMDTXT"; 
      WCB$WC[1] = HDR$TXWCNT[0] + 4;
      SSTAQE(P<EVQ>,WCBUF[1],ABH[1],CMDLINE[0]);
  
      END #CSSAMS#
 TERM 
