*DECK NDRCOMP 
USETEXT COMCBEG 
USETEXT COMRNET 
USETEXT COMRNDR 
USETEXT COMRQUE 
USETEXT COMRSTA 
PROC NDRCOMP; 
# TITLE NDRCOMP - PROCESS NDR COMPLETION.  #
  
      BEGIN  # NDRCOMP #
  
# 
**    NDRCOMP - PROCESS NDR COMPLETION. 
* 
*     PROCESS NDR COMPLETION. 
* 
*     PROC NDRCOMP. 
* 
*     ENTRY   - NDR$COMMUN IS BASED ARRAY CONTAINING COMPLETE REQUEST.
* 
*     EXIT    - COMPLETION PROPERLY HANDLED.
* 
*     PROCESS - POINT TO LOCAL NAD (POSSIBLY) ASSOCIATED WITH COMPLETE. 
*               POINT TO QUEUE ENTRY (POSSIBLY) ASSOCIATED. 
*               DEPENDING ON WHICH FUNCTION COMPLETE: 
*                 CASE (IDLE):  
*                   SET NDRASG TO FALSE.
*                   IF LAST FUNCTION NOT IDLE 
*                   THEN: 
*                     CLEAR FUNCTION COMPLETE.
*                     SET FINDREQ TO FALSE. 
*                 CASE (STATUS):  
*                   DECREMENT NDRS ASSIGNED TO NAD. 
*                   SET NDRASG TO FALSE.
*                   CALL STATUS COMPLETE. 
*                 CASE (DROP):  
*                   DECREMENT ACTIVE NDR COUNT. 
*                   CLEAR ACTIVE NDR FLAG.
*                   CLEAR REPLY FUNCTION TO RELEASE NDR.
*                   SET FINDREQ TO FALSE. 
*                   SET NDRASG TO FALSE.
*                   IF REQUEST/DROP INTERLOCK AND ZERO ACTIVE NDRS
*                   THEN: 
*                     START UP ANOTHER NDR. 
*                 CASE (REQUEST CONNECTION):  
*                   CALL COMPLETION STATUS. 
*                   MOVE PATH ID TO COMPLETION STATUS.
*                 CASE (OBTAIN CONNECT REQUEST):  
*                   CALL COMPLETION STATUS. 
*                   SET FINDREQ TO FALSE. 
*                   SET NDRASG TO FALSE.
*                 CASE (CONNECT REQUEST REPLY): 
*                   IF RETURN CODE IS NAD OFF 
*                   THEN: 
*                     CALL TO CREATE NAD OFF QUEUE ENTRY. 
*                 CASE (SEND CONTROL MESSAGE):  
*                   CALL SEND CONTROL MESSAGE COMPLETE. 
*                 CASE (READ PATH DATA):  
*                   CALL READ PATH DATA COMPLETE. 
*                 CASE (WRITE PATH DATA): 
*                   CALL WRITE PATH DATA COMPLETE.
*                 CASE (DISCONNECT PATH): 
*                   CALL COMPLETION STATUS. 
*                 CASE (FLUSH PATH):  
*                   CALL COMPLETION STATUS. 
*                 CASE (INITIALIZE NAD):  
*                   CALL COMPLETION STATUS. 
*                 CASE (FET I/O READ):  
*                   CALL FET I/O COMPLETE.
*                 CASE (FET I/O WRITE): 
*                   CALL FET I/O COMPLETE.
*                 CASE (FET I/O WRITER):  
*                   CALL FET I/O COMPLETE.
*                 CASE (FET I/O WRITEF):  
*                   CALL FET I/O COMPLETE.
*                 CASE (FET I/O CLOSE): 
*                   CALL FET I/O COMPLETE.
*                 CASE (FET I/O READC): 
*                   CALL FET I/O COMPLETE.
*                 CASE (FET I/O WRITEC):  
*                   CALL FET I/O COMPLETE.
*                 CASE  (SELECT CONVERT MODE):  
*                   CALL SELECT CONVERT MODE COMPLETE.
*                 CASE  (EXIT CONVERT MODE):  
*                   CALL EXIT CONVERT MODE COMPLETE.
*                 CASE  (READ CONVERT MODE):  
*                   CALL FET I/O COMPLETE.
*                 CASE  (WRITE CONVERT MODE): 
*                   CALL FET I/O COMPLETE.
*                 CASE (START NDR): 
*                   SET NDRASG TO FALSE.
*               IF NDRASG 
*               THEN: 
*                 DECREMENT NDRS ASSIGNED TO NAD. 
*               IF FINDREQ
*               THEN: 
*                 CALL LOCATE NAD REQUEST.
*               RETURN. 
* 
*     NOTES     ANOTHER NDR IS STARTED AFTER A DROP COMPLETE WHENEVER 
*               NADREQ IS CALLED WHILE THE ONLY AVAILABLE NDR IS
*               PROCESSING THE DROP REQUEST.
*               A NDR COMPLETING STATUS IS UNASSIGNED FROM A NAD TO 
*               ALLOW ANY IDLE NDR TO RECEIVE A NEW FUNCTION RESULTING
*               FROM A CHANGE IN STATUS.
# 
  
# 
****  PROC NDRCOMP - XREF LIST BEGIN. 
# 
      XREF
        BEGIN 
        PROC STATCMP;                # STATUS COMPLETE #
        PROC CMPSTAT;                # COMPLETION STATUS #
        PROC QUEOFF;                 # QUEUE NAD OFF #
        PROC DEQUEUE;                # DEQUEUE #
        PROC SENDCMP;                # SEND CONTROL MESSAGE COMPLETE #
        PROC READCMP;                # READ COMPLETE #
        PROC STRTNDR; 
        PROC WRITCMP;                # WRITE COMPLETE # 
        PROC FETCMP;                 # FET I/O COMPLETE # 
        PROC SCMCMP;                 # SELECT CONVERT MODE COMP. #
        PROC ECMCMP;                 # EXIT CONVERT MODE COMPLETE # 
        PROC NXTNADR;                # LOCATE NEXT NAD REQUEST #
        PROC NDRRSTR;                # NDR RESTART #
        ITEM NADTBL  I;              # NAD TABLE ADDRESS #
        END 
  
  
      ITEM FINDREQ B;                 # FIND REQUEST #
      ITEM NDRASG B;                  # NDR ASSIGNED TO NAD # 
  
      SWITCH FUNCTION 
             IDLE,                   # IDLE # 
             STATUSF,                # STATUS # 
             DROP,                   # DROP # 
             REQCON,                 # REQUEST CONNECTION # 
             OBTCONR,                # OBTAIN CONNECT REQUEST # 
             CONRRPY,                # CONNECT REQUEST REPLY #
             SNDCTL,                 # SEND CONTROL MESSAGE # 
             READ,                   # READ PATH DATA # 
             WRITE,                  # WRITE PATH DATA #
             DISCON,                 # DISCONNECT PATH #
             FLUSH,                  # FLUSH PATH # 
             INITNAD,                # INITIALIZE NAD # 
             FREAD,                  # FET I/O READ # 
             FWRITE,                 # FET I/O WRITE #
             FWRITER,                # FET I/O WRITER # 
             FWRITEF,                # FET I/O WRITEF # 
             FCLOSE,                 # FET I/O CLOSE #
             FREADC,                 # FET I/O READC #
             FWRITEC,                # FET I/O WRITEC # 
             SELCM,                  # SELECT CONVERT MODE #
             EXITCM,                 # EXIT COVERT MODE # 
             READCM,                 # READ CONVERT MODE #
             WRITECM,                # WRITE CONVERT MODE # 
             START,                  # START NDR #
             ;
  
CONTROL EJECT;
  
      P<NAD$ENTRY> = NDR$NADORD * NAD$LENGTH + NADTBL;
      P<QU$ADDRESS> = NDR$QADDR;
      FINDREQ = TRUE; 
  
      NDRASG = TRUE;
# 
*     PROCESS COMPLETED FUNCTION THRU SIMULATED CASE STATEMENT. 
# 
  
      GOTO FUNCTION[NDR$FUNCOM-1];
  
IDLE:                                # IDLE # 
      NDRASG = FALSE; 
      IF NDR$FUNC NQ NF$IDLE
      THEN
        BEGIN  # FUNCTION ALREADY ASSIGNED #
        NDRRSTR;
        FINDREQ = FALSE;
        END 
  
      GOTO ENDCASE; 
  
STATUSF:                             # STATUS # 
      NAD$NDRASG = NAD$NDRASG - 1;
      NDRASG = FALSE; 
      STATCMP;
      GOTO ENDCASE; 
  
DROP:                                # DROP # 
      NDRASG = FALSE; 
      ACTIVENDRS = ACTIVENDRS - 1;
      NDR$ACTIVE = FALSE; 
      NDRRSTR;
      FINDREQ = FALSE;
      IF REQ$DROPIL 
      THEN
        BEGIN  # START UP ANOTHER NDR # 
        STRTNDR;
        END 
  
      GOTO ENDCASE; 
  
REQCON:                              # REQUEST CONNECTION # 
      CMPSTAT;
      CST$PATHID = NDR$RTNPTH;
      GOTO ENDCASE; 
  
OBTCONR:                             # OBTAIN CONNECT REQUEST # 
      CMPSTAT;
  
      IF NDR$RTNCOD EQ 0
        OR NDR$RTNCOD EQ RC$NOMATCH 
      THEN
        BEGIN  # ALLOW OVERLAY REQUESTOR TO REPLY # 
        FINDREQ = FALSE;
        NDRASG = FALSE; 
        END 
  
      GOTO ENDCASE; 
  
CONRRPY:                             # CONNECT REQUEST REPLY #
      IF NDR$RTNCOD EQ RTN$OFF
      THEN
        BEGIN  # NAD OFF #
        QUEOFF; 
        END 
  
      GOTO ENDCASE; 
  
SNDCTL:                              # SEND CONTROL MESSAGE # 
      SENDCMP;
      GOTO ENDCASE; 
  
READ:                                # READ PATH DATA # 
      READCMP;
      GOTO ENDCASE; 
  
WRITE:                               # WRITE PATH DATA #
      WRITCMP;
      GOTO ENDCASE; 
  
DISCON:                              # DISCONNECT PATH #
FLUSH:                               # FLUSH PATH # 
INITNAD:                             # INITIALIZE NAD # 
      CMPSTAT;
      GOTO ENDCASE; 
  
FREAD:                               # FET I/O READ # 
FWRITE:                              # FET I/O WRITE #
FWRITER:                             # FET I/O WRITER # 
FWRITEF:                             # FET I/O WRITEF # 
FCLOSE:                              # FET I/O CLOSE #
FREADC:                              # FET I/O READC #
FWRITEC:                             # FET I/O WRITEC # 
      FETCMP; 
      GOTO ENDCASE; 
  
SELCM:  
      SCMCMP; 
      GOTO ENDCASE; 
  
EXITCM: 
      ECMCMP; 
      GOTO ENDCASE; 
  
READCM: 
WRITECM:  
      FETCMP; 
      GOTO ENDCASE; 
  
START:                               # START NDR #
      NDRASG = FALSE; 
      GOTO ENDCASE; 
  
# 
*     END OF SIMULATED CASE STATEMENT.
# 
ENDCASE:  
      IF NDRASG 
      THEN
        BEGIN  # DECREMENT NDR ASSIGNED COUNT # 
        NAD$NDRASG = NAD$NDRASG - 1;
        END 
  
      IF FINDREQ
      THEN
        BEGIN  # LOCATE NEXT NAD REQUEST #
        NXTNADR;
        END 
  
      RETURN; 
      END  # NDRCOMP #
  
      TERM
