*DECK     CSSDNR
USETEXT TEXTCS
USETEXT TXTAPSS 
USETEXT TEXTSS
USETEXT TXTSMCS 
USETEXT TXCMDCS 
PROC CSSDNR;
# TITLE CSSDNR - DETERMINE NPU REQUIREMENT #
  
      BEGIN # CSSDNR #
  
  
# 
**    CSSDNR - DETERMINE NPU REQUIREMENT. 
* 
*     C. BRION          82/06/15. 
* 
*     THIS PROCEDURE IS PART OF THE COMMAND RECOGNITION ELEMENT OF CS.
*     ITS PURPOSE IS TO DETERMINE WHETHER A COMMAND THAT HAS BEEN 
*     SYNTAXICALLY EXAMINED BY THE COMMAND RECOGNIZER IS A COMMAND THAT 
*     WILL NEED TO HAVE THE PHYSICAL ADDRESSES OF THE NAMED ELEMENTS
*     INCORPORATED INTO THE COMMAND, WHETHER THE COMMAND IS GOING TO
*     BE ROUTED TO THE COMMAND DISPATCHER FOR PROCESSING. 
* 
*     PROC CSSDNR 
* 
*     ENTRY      ONE OR MORE VALID COMMANDS RESIDE IN THE VALID COMMAND 
*                QUEUE. 
* 
*     EXIT       THE VALID COMMAND QUEUE ENTRIES ARE EITHER ROUTED TO 
*                THE COMMAND DISPATCHER FOR PROCESSING OR THEY ARE
*                PASSED TO THE APPROPRIATE SUBROUTINE FOR FURTHER 
*                COMMAND PARAMETERIZATION OF PHYSICAL ADDRESSES OF
*                NAMED ELEMENTS.
* 
# 
  
# 
****  PROC CSSDNR XREF LIST 
# 
  
      XREF
        BEGIN 
        PROC CSSRCA;                     # RESOLVE SINGLE NPU COMMAND # 
        PROC SSTAQE;                     # SS-ACCEPT QUEUE ENTRY #
        PROC SSTRQE;                     # SS-REMOVE QUEUE ENTRY #
        END 
# 
****
# 
  
# 
*     DEFS
# 
  
  
# 
*     ITEMS 
# 
  
      ITEM I,J;                          # LOOP VARIABLES # 
      ITEM MATCH        B;               # MATCH INDICATOR #
      ITEM OCBORD       U;               # LOCAL OCB ORDINAL #
      ITEM STRTINDX     U;               # START INDX FOR SYNT PARMS #
      ITEM MAXINDX      U;                # MAX INDEX OF PARMS #
  
  
      CONTROL EJECT;
  
# 
*     MAIN PROC START 
# 
  
# 
*     CLEAR OUT THE LOCAL COMMAND STORAGE AREAS.
# 
  
      HDR$WORD[0] = 0;
      ABHWORD[1] = 0; 
      FOR I = 0 STEP 1 UNTIL MCMDL$ 
      DO
        BEGIN 
        PAR$WORD[I] = 0;
        END 
  
# 
*     REMOVE THE FIRST ENTRY FROM THE VALID COMMAND QUEUE AND KEEP
*     PROCESSING THE ENTRIES UNTIL THE QUEUE IS EMPTY.
# 
  
      FOR I = 0 WHILE VCQL NQ 0 
      DO
        BEGIN 
        SSTRQE(P<VCQ>,WCBUF[0],HDRCMD[0],PARMS[0]); 
  
        OCBORD = HDR$OPORD[0];            # SET LOCAL OCB ORDINAL # 
        ABHADR[1] = OCBORD;               # SET ADDRESS IN ABH #
  
# 
*     VALID COMMAND ENTRY NOW LOCAL, CHECK TO VERIFY THAT THE OP- 
*     ERATOR IS STILL ACTIVELY CONNECTED TO CS. IF SO, CHECK TO 
*     VERIFY THAT A CONNECTION BROKEN ISN'T PENDING. IF SO, SEND
*     A NULL TERMINAL TEXT ENTRY TO THE C LAYER TO BE ABLE TO 
*     PROCEED WITH THE CONNECTION BROKEN. 
# 
  
        IF OC$STATE[OCBORD] 
        THEN
          BEGIN 
  
          IF OC$CBPD[OCBORD]
          THEN
            BEGIN 
            WCB$SMID[1] = SMID"TTEXT";
            WCB$WC[1] = 2;
            WCB$IAF[1] = TRUE;
            ABHTLC[1] = 0;
            SSTAQE(P<CNQ>,WCBUF[1],ABH[1],CSSM[1]); 
            END 
          ELSE
  
# 
*     THE OPERATOR IS ACTIVELY CONNECTED. 
*     SEARCH THE COMMAND PARAMETER LIST FOR THE KEYWORDS THAT WOULD 
*     QUALIFY THE COMMAND AS A SINGLE NPU COMMAND OR A DUAL NPU 
*     COMMAND OR A COMMAND THAT IS ALREADY TO BE ROUTED TO THE
*     COMMAND DISPATCHER VIA THE ROUTED COMMAND QUEUE.
# 
  
            BEGIN 
            MATCH = FALSE;
            STRTINDX = HDR$TXWCNT[0] + 1;           # SET START INDEX#
            MAXINDX = HDR$SPCNT[0] + HDR$TXWCNT[0];    # SET MAX INDEX #
  
            FOR J = STRTINDX  STEP 1
              WHILE J LS MAXINDX AND NOT MATCH
            DO
  
              BEGIN 
  
# 
*     CHECK THE COMMAND ELEMENT. IF A COMMAND ELEMENT THAT NEEDS
*     ELEMENT ADDRESSES RESOLVED, CALL PROC CSSRCA. OTHERWISE THE 
*     COMMAND ALREADY FOR COMMAND DISPATCHER. 
# 
  
              IF PAR$PCODE[J] EQ "NP0"
                 OR PAR$PCODE[J] EQ "CP0" 
                 OR PAR$PCODE[J] EQ "LI0" 
                 OR PAR$PCODE[J] EQ "TE0" 
                 OR PAR$PCODE[J] EQ "VC0" 
                 OR PAR$PCODE[J] EQ "TR0" 
                 OR PAR$PCODE[J] EQ "LL0" 
                 OR PAR$PCODE[J] EQ "NPS" 
                 OR PAR$PCODE[J] EQ "AU0" 
                 OR PAR$PCODE[J] EQ "HO0" 
              THEN
                BEGIN 
                MATCH = TRUE; 
                CSSRCA(J);
                END 
  
  
              END  # FOR J LOOP # 
  
# 
*     IF NONE OF THE PARAMETER LIST KEYWORDS FOR A SINGLE OR DUAL 
*     NPU TYPE COMMAND WERE FOUND, THEN THE COMMAND IS ALREADY
*     FOR THE COMMAND DISPATCHER. GENERATE A ROUTED COMMAND QUEUE 
*     ENTRY TO THE COMMAND DISPATCHER.
# 
  
            IF NOT MATCH
            THEN
              BEGIN 
              HDR$APCNT[0] = 0; 
              SSTAQE(P<RCQ>,WCBUF[1],HDRCMD[0],PARMS[0]); 
              END 
  
            END  # ELSE # 
          END # IF OC$STATE # 
  
  
        END  # FOR I LOOP # 
  
      END # CSSDNR #
  
 TERM 
