*DECK GETNDT
USETEXT COMCBEG 
USETEXT COMMCOM 
USETEXT COMMGET 
USETEXT COMRNAM 
USETEXT COMRNET 
USETEXT COMRRHH 
USETEXT COMRRTN 
    PROC GETNDT;
# TITLE  GETNDT - GET NETWORK DESCRIPTION TABLE FROM RHF #
  
      BEGIN  # GETNDT # 
  
# 
**    GETNDT - GET NETWORK DESCRIPTION TABLE FROM RHF 
* 
*     GETNDT GETS THE NETWORK DESCRIPTION TABLE FROM RHF, USING THE 
*     CNTRL/INFO COMMAND. 
* 
*     PROC GETNDT.
* 
*     ENTRY   NDTBUF = CURRENT FWA OF NDT BUFFER. 
*             NDTLEN = CURRENT SIZE OF NDT BUFFER.
* 
*     EXIT    ERROR = FALSE, IF NDT OBTAINED. 
*             NDTBUF = FWA OF NDT.
*             NDTLEN = LENGTH OF NDT. 
*             <NDT$HEADER> = NDTBUF 
*             NDTBIAS = NDTBUF + 1 - NDT$FWA
*             NDTLNT = FWA OF LOCAL NAD TABLES. 
*             HOSTPID = PID OF HOST.
* 
*             ERROR = TRUE, IF NDT NOT OBTAINED.
*             NDTBUF = NDTLEN = 0.
* 
*     PROCESS    IF HOST PID BLANK (1ST CALL):  
*                  CALL RHH TO GET HOST PID 
*                  SET NDTLEN TO INITIAL SIZE (2 PRU-S).
*                ELSE:  
*                  SAVE OLD NDT POINTER 
*                CALL CMM TO GET MEMORY (NDTLEN)
*                CALL RHFPUT TO GET NDT FROM RHF
*                IF NOT 1ST CALL: 
*                  IF NDT LENGTH CHANGED: 
*                    SEND MESSAGE 
*                    ERROR = TRUE 
*                  ELSE:  
*                    RESET OLD NDT POINTER
*                    UPDATE PATH AND NAD ENTRIES IN OLD NDT BUFFER. 
*                    RELEASE NEW NDT BUFFER 
*                    RETURN.
* 
*                IF NDT OBTAINED (1ST CALL):  
*                  IF NDT .GT. NDTLEN:  
*                    CALL CMM TO OBTAIN ADDITIONAL MEMORY 
*                    CALL RHFPUT (NETPUT) TO GET NDT FROM RHF 
*                IF NDT OBTAINED
*                  SET ERROR = FALSE
*                  SET NDTFWA = FWA OF NDT
*                  SET NDTLEN = LENGTH OF NDT.
*                ELSE 
*                  CALL CMM TO RELEASE MEMORY 
*                  SET ERROR = TRUE.
*                  SET NDTBUF = NDTLEN = 0. 
# 
  
# 
****  PROC GETNDT - XREF LIST BEGIN 
# 
      XREF
        BEGIN 
        PROC CALLSYS;              # CALL SYSTEM VIA RA+1 # 
        PROC DBGNAME;              # DEBUG CODE # 
        FUNC MEMCMM     U;         # GET/RELEASE CMM BUFFER # 
        PROC NSTORE;               # SET UP NETORK MESS. #
        PROC RHFPUT;               # SEND MESSAGE TO RHF #
        PROC SETNDT;               # SET WORD IN NDT #
        END 
  
# 
****  PROC GETNDT - XREF LIST END 
# 
  
  
      ARRAY [0:1] S(4); 
        BEGIN 
        ITEM GNDTERRMSG C(00,00,48) = 
             [" MHF, NDT NOT AVAILABLE FROM RHF.     ", 
              " MHF, NDT LENGTH CHANGED.             "];
        ITEM GNDTERREND U(03,48,12) = [2(0)]; 
        END 
  
      ITEM DONE       B;           # LOOP VARIABLE #
      ITEM I          I;           # LOOP VARIABLE #
      ITEM NEWBUF     I;           # NEW NDT BUFFER ADDR #
      ITEM BUFBIAS    I;           # OLD/NDT BUFFER BIAS #
      ITEM WORD       U;           # SETNDT PARAMETER # 
      ITEM REJ        B;           # SETNDT PARAMETER # 
  
CONTROL EJECT;
  
      $BEGIN
      DBGNAME ("GETNDT");          # DEBUG CODE # 
      $END
  
      ERROR = FALSE;
      IF HOSTPID EQ "   " 
      THEN
        BEGIN 
        RHHPARMAD = LOC(RHH$PARAM); 
        RHHFUNCTN = RH$PID;        # GET HOST PID # 
        RHHRCL    = TRUE; 
        RHH$COMPLT = FALSE; 
        CALLSYS (RHHCALL);
        RHHRCL    = FALSE;
        HOSTPID   = RHH$PID;       # HOST PID # 
        NDTLEN = ONEPRU * 2;       # SET INITIAL LENGTH # 
        NEWBUF = 0; 
        END 
  
      ELSE
        BEGIN 
        NEWBUF = NDTBUF;           # SAVE CURRENT NDT POINTER # 
        NDTBUF = 0; 
        END 
  
      NDTBUF = MEMCMM (NDTBUF,NDTLEN);  # GET NDT BUFFER #
  
      NSTORE(HEADER,$ABHABT,$SUPERABT); 
      NSTORE(HEADER,$ABHACT,SUPCHRTYPE);
      NSTORE(HEADER,$ABHTLC,SUPTXTLGTH);
      NSTORE(HEADER,$ABHADR,SUPCONNUMB);
      NSTORE(HEADER,$ABHABN,SUPBLKNUMB);
  
      NSTORE(CTRLINFOR,$PFCSFC,$CTRINF);
      NSTORE(CTRLINFOR,$CTFNDTL,NDTLEN);
      NSTORE(CTRLINFOR,$CTFNDTA,NDTBUF);
      NSTORE(CTRLINFOR,$CTFC,CTR$GETNDT); 
  
      P<NDT$HEADER> = NDTBUF; 
      NDT$WD1 = 0;
  
      RHFPUT (HEADER,CTRLINFOR);
  
      IF NEWBUF NE 0               # IF NOT FIRST CALL #
      THEN
        BEGIN 
        IF NDTLEN NE NDT$LENGTH + 1 
        THEN
          BEGIN 
          MSG$BUFADR = LOC(GNDTERRMSG[1]);
          MSG$STATUS = 0; 
          CALLSYS (MSGCALL);       # SEND DAYFILE MESSAGE # 
          ERROR = TRUE; 
          END 
  
        ELSE
          BEGIN 
          NDTBUF == NEWBUF;        # RESET NDT BUFFER ADDR #
          P<NDT$HEADER> = NDTBUF;  # RESET NDT HEADER # 
          BUFBIAS = NEWBUF - NDTBUF;
          P<NAD$ENTRY> = NDTLNT - NAD$LENGTH; 
          SLOWFOR I = 1 STEP 1 UNTIL NDT$NUMLN
          DO
            BEGIN  # UPDATE LOCAL NAD ENTRY # 
            P<NAD$ENTRY> = P<NAD$ENTRY> + NAD$LENGTH; 
            P<BUF1> = P<NAD$ENTRY> + BUFBIAS; 
            NAD$WORD0 = BUF1WORD[0];
            NAD$WORD1 = BUF1WORD[1];
            END 
  
          P<NET$HEADER> = NDT$FWA + NDTBIAS;
          DONE = FALSE; 
          ASLONGAS NOT DONE 
          DO
            BEGIN 
            IF NET$PID NE HOSTPID 
            THEN
              BEGIN  # UPDATE PATH ENTRY #
              P<PTH$ENTRY> = NET$PATHAD + NDTBIAS;
              P<BUF1> = P<PTH$ENTRY> + BUFBIAS; 
              PTH$WORD0 = BUF1WORD[0];  # UPDATE PATH WORD 0 #
              PTH$WORD1 = BUF1WORD[1];  # UPDATE PATH WORD 1 #
              P<BUF1> = PTH$RMTNAD + NDTBIAS; 
              IF BUF1WORD[BUFBIAS] NE 0  # IF NOT YET UPDATED # 
              THEN
                BEGIN  # UPDATE REMOTE NAD ENTRY #
                P<RMT$ENTRY> = P<BUF1>; 
                RMT$WORD0 = BUF1WORD[BUFBIAS];
                BUF1WORD[BUFBIAS] = 0;  # CLEAR (ENTRY UPDATED) # 
                P<BUF1> = LOC(RMT$NSTWD0);
                WORD = BUF1WORD[BUFBIAS]; 
                SETNDT (WORD,REJ);  # UPDATE REMOTE NAD STATE # 
                END 
              END 
  
            IF NET$NXTPID NE 0
            THEN
              BEGIN 
              P<NET$HEADER> = NET$NXTPID + NDTBIAS; 
              END 
  
            ELSE
              BEGIN 
              DONE = TRUE;
              END 
            END 
          END 
  
        NEWBUF = MEMCMM (NEWBUF,0);  # RELEASE NEW NDT BUFFER # 
        RETURN; 
        END 
  
      IF NDT$LENGTH NE 0           # IF NO ERROR #
      THEN
        BEGIN 
  
        IF (NDT$LENGTH+1) NE NDTLEN 
        THEN
          BEGIN 
          NDTLEN = NDT$LENGTH + 1;    # RESET # 
          NDTBUF = MEMCMM (NDTBUF,NDTLEN);  # GET NDT BUFFER #
          NSTORE(CTRLINFOR,$CTFNDTL,NDTLEN);
          NDT$WD1 = 0;
          RHFPUT (HEADER,CTRLINFOR);
          END 
        END 
  
      IF NDT$LENGTH NE 0           # IF NO ERROR #
      THEN
        BEGIN 
        NDTBIAS = NDTBUF + 1 - NDT$FWA; # OFFSET OF NDT ADDRESSES # 
        NDTLNT = NDT$FWALNT + NDTBIAS;  # FWA LOCAL NADS #
        END 
  
      ELSE
        BEGIN 
        NDTLEN = 0; 
        NDTBUF = MEMCMM (NDTBUF,NDTLEN);  # RELEASE BUFFER #
        MSG$BUFADR = LOC(GNDTERRMSG[0]);
        MSG$STATUS = 0; 
        CALLSYS (MSGCALL);         # SEND DAYFILE MESSAGE # 
  
        ERROR = TRUE; 
        END 
  
      END  # GETNDT # 
  
    TERM
