*DECK     CSSCSR
USETEXT TEXTSS; 
USETEXT TEXTCS; 
USETEXT TXTSMCS;
USETEXT TXTSUSS;
USETEXT TXTAPSS;
PROC CSSCSR;
# TITLE CSSCSR - COMPLETE STATUS REQUEST #
  
      BEGIN # CSSCSR #
  
# 
**    CSSCSR - COMPLETE STATUS REQUEST. 
* 
*     C. BRION          82/05/06. 
* 
*     PROC CSSCSR 
* 
*     ENTRY:  
* 
*       WCBUF = ONE WORD ENTRY DESCRIPTOR WORD OF QUEUE ENTRY THAT
*               CONTAINS THE STATUS RESPONSE SM.
* 
*       ABH = ONE WORD APPLICATION BLOCK HEADER OF THE SM.
* 
* 
*     EXIT: 
* 
*       THE NPUCB AND OCB ARE UPDATED.
* 
*       IF STATUS IS COMPLETE, AN EVENT TO CONCLUDE THE STATUS REQUEST
*       IS SENT TO THE EVENT PROCESSOR. 
# 
  
# 
****  PROC CSSCSR XREF LIST.
# 
  
      XREF
  
        BEGIN 
        PROC MOVEI;                      # MOVE CM WORD INDIRECT #
        PROC SSBCBW;                     # SS- CLEAR BIT IN WORD #
        PROC SSBTBW;                     # SS- TEST BIT IN WORD # 
        PROC SSTAQE;                     # SS-ACCEPT QUEUE ENTRY #
        END 
  
# 
****
# 
  
# 
*     PROC CSSCSR ITEM DEFINITIONS. 
# 
  
      ITEM NPUORD       U;               # NPU ORDINAL #
      ITEM I            U;               # LOOP VAR # 
      ITEM OCBORD       U;               # OCB ORDINAL #
      ITEM MATCH        B;               # MATCH INDICATOR# 
  
      $BEGIN
      ITEM DBVAR        U;
      $END
  
# 
*     FLG$WORD - THIS BASED ARRAY POINTS TO THE PENDING STATUS REQUEST
*     WORD IN THE NPUCB.
# 
      BASED ARRAY FLG$WORD [00:00] S(NPCBSZ$);
        BEGIN 
        ITEM FW$WORD    I(00,00,60);
        END 
  
  
  
  
  
# 
*     MAIN PROCEDURE START. 
# 
  
# 
*     LOCATE THE NPUCB THAT HAS THE NODE NUMBER EQUAL TO THE SOURCE 
*     NODE OF THE ABH AND THE HOST NODE NUMBER EQUAL TO THE DESTINA-
*     TION NODE OF THE ABH. THIS MATCH WILL ALWAYS OCCUR. 
# 
  
      MATCH = FALSE;
  
      FOR I = 0 STEP 1 WHILE NOT MATCH
      DO
        BEGIN 
  
        IF (ABHSN[0] EQ NPU$NID[I]
          AND ABHDN[0] EQ NPU$HID[I]) 
        THEN
          BEGIN 
          NPUORD = I; 
          MATCH = TRUE; 
          END 
  
        END 
  
# 
*     CHECK TO VERIFY THAT A CURRENT STATUS OPERATOR STILL EXISTS FOR 
*     THIS NPUCB. IF NOT, EXIT. 
# 
  
      IF NPU$OPST[NPUORD] EQ 0
      THEN
        GOTO ENDEXIT; 
  
# 
*     A CURRENT STATUS OPERATOR STILL ACTIVE ON THIS NPUCB. 
*     INSURE THAT THE OCB ORDINAL IS WITHIN RANGE. IF NOT,
*     PROBABLY MEANS THAT THE OPERATOR ENTERED A BREAK OR THE 
*     CONNECTION WAS TERMINATED.
# 
  
      OCBORD = NPU$OPST[NPUORD];
      IF OCBORD LQ MAXACN$
      THEN
        BEGIN 
        OC$CNPU[OCBORD] = 0;
        END 
  
      NPU$OPST[NPUORD] = 0; 
      IF (OCBORD GQ HOPORD$ AND OCBORD LQ MAXACN$)
      THEN
        BEGIN 
  
        OC$NCNT[OCBORD] = OC$NCNT[OCBORD] - 1;
  
        P<FLG$WORD> = LOC(NPU$STFLGS[NPUORD]);
        SSBCBW(FLG$WORD,OCBORD);
  
# 
*     IF ALL AFFECTED NPUS HAVE RESPONDED, ISSUE STATUS DONE EVENT TO 
*     CAUSE THE READY.. MESSAGE TO THE OPERATOR VIA THE EVENT QUEUE TO
*     THE EVENT PROCESSOR.
*     ALSO, CLEAR THE CURRENT VERB FOR THE OCB. 
# 
  
        IF OC$NCNT[OCBORD] EQ 0 
        THEN
  
          BEGIN 
          WCB$WC[1] = 2;                 # SET EVENT ENTRY SIZE # 
          WCB$SMID[1] = SMID"STUFIN";    # SET EVENT CODE # 
          ABHADR[1] = OCBORD;            # SET ACN ADDR IN ABH #
          SSTAQE(P<EVQ>,WCBUF[1],ABH[1],CSSM[1]); 
          OC$VERB[OCBORD] = "   ";
          END 
  
# 
*     IF THERE ARE STILL OUTSTANDING STATUS REQUEST TO BE MADE, THEN
*     IF THERE IS ANOTHER STATUS REQUEST PENDING FOR AN NPU THAT IS NOT 
*     BUSY, THEN SAVE THE OCB ORDINAL IN THE NPUCB, SET THE CURRENT 
*     AFFECTED NPUCB ORDINAL IN THE OCB, AND SEND THE STATUS REQUEST
*     TO THE NPU. 
# 
        ELSE
          BEGIN 
          MATCH = FALSE;
          P<FLG$WORD> = LOC(NPU$STFLGS[0]); 
          FOR I=0 STEP 1 WHILE NOT MATCH AND
                               I LS CSNPCNT 
          DO
            BEGIN 
            SSBTBW(FLG$WORD[I],OCBORD,MATCH); 
            IF MATCH
            THEN
              BEGIN 
              IF NPU$OPST[I] NQ 0 
              THEN
                BEGIN 
                MATCH = FALSE;
                END 
              END 
            END 
  
          IF MATCH
          THEN
            BEGIN 
            I = I - 1;
            OC$CNPU[OCBORD] = I;
            NPU$OPST[I] = OCBORD; 
  
            WCB$WORD[1] = OC$WC[OCBORD] + 2;
            ABHWORD[1] = OC$TLC[OCBORD];
            ABHBT[1] = APPSUP;
            ABHABT[1] = APPSUP; 
            ABHDN[1] = NPU$NID[I];
            ABHSN[1] = NPU$HID[I];
            ABHACT[1] = ACTCSNP$; 
  
            MOVEI(OC$WC[OCBORD],LOC(OC$SM[OCBORD]),LOC(CSSM[1])); 
            SSTAQE(P<OTQ>,WCBUF[1],ABH[1],CSSM[1]); 
            END 
          END 
  
        END 
  
  
# 
*     CHECK IF THERE IS ANOTHER PENDING STATUS REQUEST FOR THE NPU
*     THAT JUST COMPLETED.  IF SO, THEN SET THE CURRENT AFFECTED
*     NPUCB ORDINAL IN THE OCB, SET THE CURRENT STATUS OCB ORDINAL
*     IN THE NPUCB, AND SEND THE STATUS REQUEST TO THE NPU. 
# 
      IF NPU$STFLGS[NPUORD] NQ 0
      THEN
        BEGIN 
        MATCH = FALSE;
        P<FLG$WORD> = LOC(NPU$STFLGS[NPUORD]);
        FOR I=HOPORD$ STEP 1 WHILE NOT MATCH AND
                                   I LQ MAXACN$ 
        DO
          BEGIN 
          SSBTBW(FLG$WORD,I,MATCH); 
  
          IF MATCH
          THEN
            BEGIN 
            IF OC$CNPU[I] NQ 0
            THEN
              BEGIN 
              MATCH = FALSE;
              END 
            END 
          END 
  
        IF MATCH
        THEN
          BEGIN 
          I = I - 1;
          OC$CNPU[I] = NPUORD;
          NPU$OPST[NPUORD] = I; 
  
          WCB$WORD[1] = OC$WC[I] + 2; 
          ABHWORD[1] = OC$TLC[I]; 
          ABHBT[1] = APPSUP;
          ABHABT[1] = APPSUP; 
          ABHDN[1] = NPU$NID[NPUORD]; 
          ABHSN[1] = NPU$HID[NPUORD]; 
          ABHACT[1] = ACTCSNP$; 
  
          MOVEI(OC$WC[I],LOC(OC$SM[I]),LOC(CSSM[1])); 
          SSTAQE(P<OTQ>,WCBUF[1],ABH[1],CSSM[1]); 
          END 
        END 
  
  
ENDEXIT:  
  
      $BEGIN
  
      DBVAR = 1;
  
      $END
  
      END #CSSCSR#
  
 TERM 
