*DECK LOADCW
USETEXT COMCBEG 
USETEXT COMMCOM 
USETEXT COMRNET 
    PROC LOADCW;
      BEGIN  # LOADCW  #
#  TITLE  LOADCW  - LOAD NAD CONTROLWARE #
  
# 
**    LOADCW  - LOAD NAD CONTROLWARE
* 
*     ENTRY    - DLRMTNAD  = TRUE, IF LOADING REMOTE NAD. 
*                           = FALSE, IF LOADING LOCAL NAD.
*                DLSTATE = 01 (LOAD IN-PROGRESS). 
*                CWFWA = FWA OF C/W.
*                CWLEN = LENGTH OF C/W (NOT INCLUDING I.P.).
*                CWNAM = NAME OF C/W. 
*                IPFWA = FWA OF INITIALIZATION PARAMETERS.
*                IPLEN = LENGTH OF I.P. 
* 
*     EXIT     - DLSTATE = 00 (NAD READY FOR USE) 
*                DLSTATE = 01 (LOAD IN-PROGRESS)
*                DLCVLR  = TRUE, IF NAD RESERVED BY CVL.
* 
*     PROCESS  - CALL CVL TO OBTAIN MAINTENANCE ACCESS. 
*                IF ACCESS OBTAINED:  
*                  ADD I.P. TO C/W. 
*                  IF DEFAULT TRACE OPTION GIVEN: 
*                    SET TRACE FLAGS IN I.P. WORD 23. 
*                  IF NOT REMOTE NAD: 
*                    SET CHAR-SET FLAG IN I.P. WORD 24. 
*                  IF I.P. MEMORY-SIZE .EQ. 0:  
*                    CALL SETCWIP TO SET DEFAULT I.P. 
*                    CALL NLD TO LOAD C/W 
*                    IF LOAD COMPLETED: 
*                      CALL NLD TO OBTAIN NAD STATUS. 
*                      IF STATUS OBTAINED:  
*                        CALL SETCWIP TO OPTIMIZE I.P.
*                      ELSE:  
*                        SET ERROR. 
*                    ELSE:  
*                      SET ERROR. 
*                  IF NO ERROR: 
*                    CALL NLD TO LOAD C/W 
*                    IF LOAD COMPLETED: 
*                      SET DLSTATE = 0
*                      IF LOADING LOCAL NAD:  
*                        CALL NLD TO TURN NAD EST ENTRY ON
# 
  
  
# 
****  PROC LOADCW  - XREF BEGINS. 
# 
      XREF
        BEGIN 
        PROC CALLCVL;              # CALL CVL FOR MAINTENANCE ACCESS #
        PROC CALLNLD;              # CALL NLD TO LOAD NAD # 
        PROC CALLSYS;              # CALL SYSTEM VIA RA+1 # 
        FUNC CSET64     B;         # CHECK 64-CHARACTER SET # 
        PROC DBGNAME;              # DEBUG - DAYFILE MESSAGE #
        PROC ERRNLD;               # PROCESS NLD ERROR #
        PROC FSNADW;               # FETCH/SET NAD WORD # 
        PROC SETCWIP;              # SET CW INIT PARAMETERS # 
        END 
# 
****  PROC LOADCW  - XREF ENDS. 
# 
  
  
      ARRAY [0:0] S(4); 
        BEGIN 
        ITEM LOADCWMSG  C(00,00,48) = 
             [" MHF,      INIT PARAMETER BAD IN RECORD XXXXXXX."];
        ITEM LOADCWMSGN C(04,00,07);  # I/P RECORD NAME # 
        ITEM LOADCWMSGT U(04,48,12) = [0];  # TERMINATOR #
        END 
  
      ITEM I          I;           # SCRATCH #
  
CONTROL EJECT;
  
      $BEGIN
      DBGNAME ("LOADCW");          # DEBUG MESSAGE #
      $END
  
      DLDELAY = LOADDELAY;         # SET LOAD RETRY DELAY # 
      ERROR = FALSE;               # CLEAR ERROR #
      PB$RC = 0;
  
      CALLCVL (I);                 # GET MAINTENANCE ACCESS # 
  
      IF DLCVLR                    # IF ACCESS OBTAINED # 
      THEN
        BEGIN 
        P<BUF1> = CWADR + CWLEN;   # END OF C/W DATA #
        P<BUF2> = IPADR;           # FWA OF I/P DATA #
  
        SLOWFOR I = 0 STEP 1 UNTIL IPLEN-1
        DO
          BEGIN 
          BUF1WORD[I] = BUF2WORD[I];  # ADD I/P DATA TO C/W # 
          END 
  
        IF DLTRACE NE 0            # IF NOT DEFAULT TRACE OPTION #
        THEN
          BEGIN 
          IF DLTRACE EQ 1 
          THEN
            BEGIN 
            I = 0;                 # DISABLE TRACE #
            END 
  
          ELSE
            BEGIN 
            IF DLTRACE EQ 2 
            THEN
              BEGIN 
              I = X"2954";         # STANDARD TRACE VALUES #
              END 
  
            ELSE
              BEGIN 
              I = X"529F";         # LARGE TRACE VALUES # 
              END 
  
            END 
  
          FSNADW (P<BUF1>,23,I);   # SET TRACE OPTION WORD #
          END 
  
        IF NOT DLRMTNAD            # IF LOCAL NAD # 
        THEN
          BEGIN 
          IF CSET64                # IF 64-CHAR SET # 
          THEN
            BEGIN 
            I = 0;                 # 64-CHAR SET VALUE #
            END 
  
          ELSE
            BEGIN 
            I = X"1000";           # 63-CHAR SET VALUE #
            END 
  
          FSNADW (P<BUF1>,24,I);   # SET CHAR-SET WORD #
          END 
  
        I = -1; 
        FSNADW (IPADR,0,I);        # GET NAD MEMORY SIZE FROM I.P. #
  
        IF I EQ 0                  # IF MEMORY SIZE NOT SPECIFIED # 
        THEN
          BEGIN 
          BUFWD[6] = 0;              # CLEAR NAD MEMORY SIZE #
          BUFWD[7] = 0;              # IN DETAILED STATUS BUFFER #
  
          SETCWIP (P<BUF1>,I);     # SET DEFAULTS # 
  
          IF I NE 0                # IF ERROR # 
          THEN
            BEGIN 
            ERROR = TRUE;          # SET ERROR #
            END 
  
          ELSE
            BEGIN 
            PB$FIRST = CWADR;      # SET NLD PARAMETER BLOCK #
            PB$IN = PB$FIRST + CWLEN + IPLEN; 
            PB$OUT = PB$FIRST;
            PB$LIMIT = PB$IN + 1; 
            NLD$FC = NLD$FCLOAD;   # NAD LOAD # 
  
            CALLNLD (DLRMTNAD);    # CALL NLD TO LOAD NAD # 
  
            IF PB$RC NE 0          # IF LOAD FAILED # 
            THEN
              BEGIN 
              ERRNLD;              # PROCESS NLD ERROR #
              END 
  
            ELSE
              BEGIN 
              PB$FIRST = LOC(BUFFER); 
              PB$IN = PB$FIRST; 
              PB$OUT = PB$FIRST;
              PB$LIMIT = PB$FIRST + ONEPRU; 
              NLD$FC = NLD$FCSTAT; # NAD STATUS # 
  
              CALLNLD (DLRMTNAD);  # CALL NLD TO GET STATUS # 
  
              IF PB$RC NE 0        # IF STATUS NOT OBTAINED # 
              THEN
                BEGIN 
                ERRNLD;            # PROCESS NLD ERROR #
                END 
  
              ELSE
                BEGIN 
                I = 0;
                SETCWIP (P<BUF1>,I);  # RESET I/P # 
  
                IF I NE 0          # IF ERROR # 
                THEN
                  BEGIN 
                  ERROR = TRUE;    # SET ERROR #
                  END 
                END 
              END 
            END 
          END 
  
        IF ERROR                   # IF ERROR # 
        THEN
          BEGIN 
          LOADCWMSGN = IPNAM;      # CWIP RECORD NAME # 
          MSG$BUFADR = LOC(LOADCWMSG);
          MSG$STATUS = 0; 
          CALLSYS (MSGCALL);       # SEND DAYFILE MESSAGE # 
          END 
  
        IF NOT ERROR               # IF NO I/P ERROR #
          AND PB$RC EQ 0           # OR NLD ERROR # 
        THEN
          BEGIN 
          PB$FIRST = CWADR;        # SET NLD PARAMETER BLOCK #
          PB$IN = PB$FIRST + CWLEN + IPLEN; 
          PB$OUT = PB$FIRST;
          PB$LIMIT = PB$IN + 1; 
          NLD$FC = NLD$FCLOAD;     # NAD LOAD # 
  
          CALLNLD (DLRMTNAD);      # CALL NLD TO LOAD NAD # 
  
          IF PB$RC EQ 0            # IF LOAD COMPLETED #
          THEN
            BEGIN 
  
            IF NOT DLRMTNAD        # IF LOCAL NAD LOADED #
            THEN
              BEGIN 
              NLD$FC = 4; 
              NLD$FC = NLD$FCESTE; # PLACE NAD IN SERVICE # 
              PB$SUBFCN = 0;
              CALLNLD (DLRMTNAD);  # CALL NLD TO GET STATUS # 
              END 
  
            IF PB$RC EQ 0        # IF NO ERROR #
            THEN
              BEGIN 
              DLSTATE = NS$AVAIL;  # SET STATE = LOAD COMPLETE #
              RECNADMSGD = "LOADED";
              MSG$BUFADR = LOC(RECNADMSG);
              MSG$STATUS = 0; 
              CALLSYS (MSGCALL);   # SEND DAYFILE MESSAGE # 
              END 
            END 
  
          IF PB$RC NE 0            # IF NLD ERROR # 
          THEN
            BEGIN 
            ERRNLD;                # PROCESS NLD ERROR #
            END 
          END 
  
        END 
  
      ELSE                         # MAINTENANCE ACCESS DENIED #
        BEGIN 
        IF I EQ 1                  # IF NAD IN USE #
          AND DLRETRY GE DLRTYLIM  # AND RETRY LIMIT #
        THEN
          BEGIN 
          DLRETRY = DLRTYLIM - 1;  # RESET RETRY LIMIT #
          DLDELAY = ELIDLEDLY;     # USE LONGER DELAY # 
          END 
  
        END 
  
      END  # LOADCW # 
  
    TERM
