*DECK     CSSDRC
USETEXT TEXTCS; 
USETEXT TXTAPSS;
USETEXT TXTSUSS;
USETEXT TXTSMCS;
USETEXT TXCMDCS;
USETEXT TEXTSS; 
PROC CSSDRC;
# TITLE CSSDRC - DISPATCH ROUTED COMMANDS. #
  
      BEGIN #CSSDRC#
# 
**    CSSDRC - DISPATCH COMMANDS. 
* 
*     C. BRION          82/06/15. 
* 
*     THIS PROCEDURE WILL EXTRACT ROUTED COMMANDS FROM THE ROUTED 
*     COMMAND QUEUE AND THEN, BASED ON THE COMMAND VERB, EITHER 
*     CALL THE APPROPRIATE COMMAND PROCESSING PROCEDURE OR QUEUE
*     AN ENTRY TO THE APPROPRIATE PROCESSOR.
* 
*     PROC CSSDRC 
* 
*     ENTRY:  
*       AT LEAST ONE ROUTED COMMAND QUEUE ENTRY RESIDES IN THE
*       ROUTED COMMAND QUEUE. 
* 
*     EXIT: 
*       THE ROUTED COMMAND QUEUE WILL BE EXHAUSTED AND THE ENTRIES
*       WILL HAVE BEEN PROCESSED BY THE APPROPRIATE COMMAND PROCESSING
*       PROCEDURE.
# 
  
# 
****  PROC CSSDRC XREF LIST 
# 
  
      XREF
        BEGIN 
        PROC CSSACO;                     # ACTION CONTROL CMD # 
        PROC CSSAGO;                     # ACTION GO COMMAND #
        PROC CSSADI;                     # ACTION DISABLE CMD # 
        PROC CSSAEN;                     # ACTION ENABLE CMD #
        PROC CSSADL;                     # ACTION DUMP/LOAD CMD # 
        PROC CSSDTC;                     # ACTION OVERLAY CMD # 
        PROC CSSARE;                     # ACTION REPORT COMMAND #
        PROC CSSASD;                     # ACTION SEND CMD #
        PROC CSSAST;                     # ACTION STATUS CMD #
        PROC CSSAIN;                     # ACTION INFO CMD #
        PROC CSSAED;                     # ACTION END CMD # 
        PROC CSSAAC;                     # ACTION ALERT COMMAND        #
        PROC CSSASO;                     # ACTION SEND TO OPERATOR #
        PROC CSSTCM;                     # TERMINATE COMMAND #
        PROC SSTAQE;                     # SS-ACCEPT QUEUE ENTRY #
        PROC SSTRQE;                     # SS-REMOVE QUEUE ENTRY #
        PROC MESSAGE;                    # MACREL DAYFILE MSG # 
        PROC ABORT;                      # MACREL ABORT # 
        END 
# 
****
# 
  
# 
*     ITEMS 
# 
  
      ITEM I;                            # LOOP VARIABLE #
      ITEM J;                            # LOOP VARIABLE #
      ITEM OORD  I;                      # OCB ORDINAL #
  
# 
*     BADCMD - BAD COMMAND VERB MESSAGE.
# 
  
      ARRAY BADCMD [00:00] S(2);
        BEGIN 
        ITEM BAD$TXT1   C(00,00,18) = ["CSSDRC-BAD COMMAND"]; 
        ITEM BAD$ZERO   U(01,48,12) = [0];
        END 
  
  
  
  
# 
* MAIN PROC START 
# 
  
# 
*     THIS PROCEDURE WILL REMOVE A QUEUE ENTRY FROM THE ROUTED COMMAND
*     QUEUE UNTIL IT IS EMPTY.
# 
  
      FOR I = 0 WHILE RCQL NQ 0 
      DO
        BEGIN 
# 
*       CLEAR BUFFER. 
# 
        FOR J=0 STEP 1 UNTIL MCMDL$ 
        DO
          BEGIN 
          PAR$WORD[J] = 0;
          END 
  
        SSTRQE(P<RCQ>,WCBUF[0],HDRCMD[0],PARMS[0]); 
# 
*     ENTRY REMOVED INTO COMMON MEMORY AS FOLLOWS:  
* 
*     WCBUF = ONE WORD FOR ENTRY WORD COUNT.
*     HDRCMD = ONE WORD FOR COMMAND HEADER. 
*     PARMS = THE COMMAND BODY WITH THE SYNTAX AND ADDRESS PARAMETER
*             LISTS PRECEEDED BY THE RAW COMMAND TEXT STRING. 
# 
  
# 
*     IF THE OCB IS CURRENTLY ACTIVE AND THE CB PENDING FLAG
*     IS NOT SET TRUE, THEN CONTINUE WITH PROCESSING. OTHER-
*     WISE, SEND NULL TERMINAL TEXT TO CONNECTION LAYER SO
*     AS TO UNLEASH THE CON/CB FOR THE OPERATOR.
# 
  
        OORD = HDR$OPORD[0];             # SET THE OCB ORDINAL #
  
        IF OC$STATE[OORD] 
        THEN
          BEGIN 
          IF NOT OC$CBPD[OORD]
          THEN
            BEGIN 
  
# 
*     BASED ON THE COMMAND VERB VALUE OF THE COMMAND HEADER WORD, 
*     THE DISPATCH TO THE APPROPRIATE COMMAND PROCESSOR IS DONE.
# 
  
        IF HDR$VERB[0] EQ "CO0"          # CONTROL CMD #
        THEN
          CSSACO; 
  
        ELSE IF HDR$VERB[0] EQ "GO0"     # GO CMD # 
        THEN
          CSSAGO; 
  
        ELSE IF HDR$VERB[0] EQ "DI0"     # DISABLE CMD #
        THEN
          CSSADI; 
  
        ELSE IF HDR$VERB[0] EQ "EN0"     # ENABLE CMD # 
        THEN
          CSSAEN; 
  
        ELSE IF HDR$VERB[0] EQ "DU0"     # DUMP OR LOAD CMD # 
              OR HDR$VERB[0] EQ "LO0" 
        THEN
          CSSADL; 
  
        ELSE IF HDR$VERB[0] EQ "TS0"     # OVERLAY CMD #
        THEN
          CSSDTC; 
  
        ELSE IF HDR$VERB[0] EQ "SE0"     # SEND CMD # 
        THEN
          CSSASD; 
  
        ELSE IF HDR$VERB[0] EQ "SE1"     # SEND CMD # 
        THEN
          CSSASO; 
  
        ELSE IF HDR$VERB[0] EQ "ST0"     # STATUS CMD # 
        THEN
          CSSAST; 
  
        ELSE IF HDR$VERB[0] EQ "IN0"     # INFO CMD # 
        THEN
          CSSAIN; 
  
        ELSE IF HDR$VERB[0] EQ "RE0"     # REPORT CMD # 
        THEN
          CSSARE; 
  
        ELSE IF HDR$VERB[0] EQ "END"     # END CMD #
               OR HDR$VERB[0] EQ "BYE"
               OR HDR$VERB[0] EQ "HEL"
        THEN
          CSSAED; 
  
        ELSE IF HDR$VERB[0] EQ "BRK"     # BREAK CMD #
        THEN
          CSSTCM; 
  
        ELSE IF HDR$VERB[0] EQ "HI0"     # HISTORY CMD #
        THEN
          BEGIN 
          WCB$SMID[0] = SMID"HIST";      # SET INTERNAL ID #
          SSTAQE(P<HRQ>,WCBUF[0],HDRCMD[0],PARMS[0]); # QUEUE OPERATOR #
                                                     # OUPUT Q ENTRY  # 
                                                     # FOR HISTORY    # 
          END 
  
        ELSE IF HDR$VERB[0] EQ "AL0"           # ACTION ALERT COMMAND # 
        THEN
          CSSAAC; 
  
        ELSE
          BEGIN 
          $BEGIN
          MESSAGE(BADCMD,0);
          ABORT;
          $END
          END 
        END 
          ELSE  # CB PENDING FLAG ON #
            BEGIN 
            WCB$WORD[1] = 0;
            ABHWORD[1] = 0; 
            WCB$WC[1] = 2;
            WCB$SMID[1] = SMID"TTEXT";
            WCB$IAF[1] = TRUE;
            ABHADR[1] = OORD; 
            SSTAQE(P<CNQ>,WCBUF[1],ABH[1],CSSM[1]); 
            END 
          END 
  
  
        END # FOR LOOP #
  
      END #CSSDRC#
 TERM 
  
  
  
  
