*DECK NADREQ
USETEXT COMCBEG 
USETEXT COMRAPL 
USETEXT COMRNET 
USETEXT COMRNDR 
USETEXT COMRQUE 
PROC NADREQ(LOCALNAD);
# TITLE NADREQ - INITIATE NAD REQUEST.  # 
  
      BEGIN  # NADREQ # 
  
# 
**    NADREQ  - INITIATE NAD REQUEST. 
* 
*     INITIATE NAD REQUEST. 
* 
*     PROC NADREQ(LOCALNAD).
* 
*     ENTRY   - QU$ADDRESS IS BASED ARRAY CONTAINING NAD REQUEST. 
* 
*     EXIT    - QU$ADDRESS IS INVALID.
* 
* 
*     PROCESS - QUEUE REQUEST TO LOCAL NAD QUEUE. 
*               SAVE NDR$COMMUN POINTER.
*               IF MORE NDRS CAN BE ASSIGNED TO THIS NAD
*               THEN: 
*                 SET REQUEST AND DROP INTERLOCK FLAG.
*                 LOCATE AN IDLE NDR (PREFERRABLY LONG ILDE). 
*                 IF AN IDLE NDR IS FOUND 
*                 THEN: 
*                   ASSIGN REQUEST TO NDR.
*                 ELSE: 
*                   IF MORE NDRS CAN BE STARTED 
*                     AND ( QUEUE COUNT IS LARGER THAN ONE
*                           OR NAD STATUS NOT QUEUED )
*                   THEN
*                     START UP ANOTHER NDR. 
*               INVALIDATE QU$ADDRESS POINTER.
*               RESTORE NDR$COMMUN POINTER. 
*               RETURN. 
* 
*     NOTE    - WHEN RHF IS CHANGING THE NDR FUNCTION CODE FROM IDLE
*               TO ANOTHER FUNCTION IT IS POSSIBLE THAT NDR HAS NOT 
*               YET READ UP THE IDLE FUNCTION.  A FLAG, NDR$RQCHG,
*               HAS BEEN ADDED TO THE NDR/RHF REQUEST AREA TO TELL
*               NDR THAT RHF IS GOING TO BE CHANGING THE REQUEST AREA 
*               AND THAT NDR SHOULD WAIT UNTIL THE FLAG IS CLEARED
*               BEFORE ATTEMPTING TO EXECUTE THE FUNCTION IN THE
*               REQUEST AREA. 
# 
  
      ITEM LOCALNAD   I;             # LOCAL NAD ORDINAL #
  
# 
****  PROC NADREQ - XREF LIST BEGIN.
# 
      XREF
        BEGIN 
        PROC QUEUE;                  # QUEUE #
        PROC ASGNDR;                 # ASSIGN REQUEST TO NDR #
        PROC STRTNDR;                # START UP ANOTHER NDR # 
        ITEM MAXNDRS I;              # MAXIMUM NDRS # 
        ITEM NADTBL  I;              # NAD TABLE ADDRESS #
        ITEM NDRCOM  I;              # NDR COMMUNICATION AREA ADDRESS # 
        END 
  
# 
****  PROC NADREQ - XREF LIST END.
# 
  
  
      ITEM IDLEFOUND B;              # IDLE FOUND # 
      ITEM I I;                      # LOOP CONTROL VARIABLE #
      ITEM NDRCOMM I;                # SAVE NDR$COMMUN POINTER #
      ITEM STATUSACT B;              # STATUS ACTIVE #
      ITEM STATUSNDR I;              # STATUS NDR ADDRESS # 
      ITEM REQASSIGNED B;            # REQUEST ASSIGNED FLAG #
      ITEM NOSTATUS B = TRUE;        # NO STATUS REQUIRED # 
  
CONTROL EJECT;
  
      P<NAD$ENTRY> = LOCALNAD * NAD$LENGTH + NADTBL;
      NDRCOMM = P<NDR$COMMUN>;
      QUEUE(LOC(NAD$Q));
      NAD$QCOUNT = NAD$QCOUNT + 1;
      REQ$DROPIL = TRUE;
      IF NAD$NDRASG LS NAD$MAXNDR 
      THEN
        BEGIN  # LOCATE IDLE NDR #
        IDLEFOUND = FALSE;
        STATUSACT = FALSE;
        FASTFOR I=0 STEP NDR$LENGTH 
          WHILE I LS MAXNDRS*NDR$LENGTH AND NOT IDLEFOUND 
        DO
          BEGIN  # EXAMINE NEXT NDR FOR IDLE #
          P<NDR$COMMUN> = NDRCOM + I; 
          IF NDR$FUNC EQ NF$IDLE
          THEN
            BEGIN  # IDLE NDR FOUND # 
            IF NDR$IDLTIM LS LONGIDLE 
            THEN
              BEGIN  # STATUS NDR FOUND # 
              STATUSACT = TRUE; 
              STATUSNDR = P<NDR$COMMUN>;
              END 
  
            ELSE
              BEGIN  # USE THIS NDR # 
              IDLEFOUND = TRUE; 
              END 
  
            END 
  
          END 
  
        IF NOT IDLEFOUND AND STATUSACT
        THEN
          BEGIN  # USE STATUS NDR # 
          IDLEFOUND = TRUE; 
          P<NDR$COMMUN> = STATUSNDR;
          END 
  
        IF IDLEFOUND
        THEN
          BEGIN  # ASSIGN REQUEST TO NDR #
          NDR$RQCHG = TRUE; 
          ASGNDR(REQASSIGNED,NOSTATUS); 
          NDR$RQCHG = FALSE;
          END 
  
        ELSE
          BEGIN  # ATTEMPT TO START NEW NDR # 
          IF ACTIVENDRS LS MAXNDRS
            AND ( NAD$QCOUNT GR 1 
            OR NOT NAD$STATQ )
          THEN
            BEGIN  # START NEW NDR #
            STRTNDR;
            END 
  
          END 
  
        END 
  
      P<NDR$COMMUN> = NDRCOMM;
      P<QU$ADDRESS> = O"400000";
      RETURN; 
      END  # NADREQ # 
  
      TERM
