*DECK SETCWIP 
USETEXT COMCBEG 
USETEXT COMMCOM 
    PROC SETCWIP (FWA,ERRFLG);
#TITLE  SETCWIP - SET CONTROLWARE INITIALIZATION PARAMETERS # 
      BEGIN  # SETCWIP #
  
# 
**    SETCWIP - SET CONTROLWARE INITIALIZATION PARAMETERS 
* 
*     THIS PROCEDURE SETS NAD CONTROLWARE INITIALIZATION PARAMETERS.
* 
*     ENTRY   - FWA = FWA OF CONTROLWARE-INITIALIZATION-PARAMETER BLOCK.
*             - BUFFER - BUFFER+7 = 0 (1ST CALL). 
*                                 = NAD DETAILED STATUS TABLE (2D CALL).
* 
*     EXIT    - ERRFLG = 0, CONTROLWARE-INITIALIZATION-PARAMETER BLOCK
*                           READY FOR LOADING.
*                      = 1, ERROR, CWIP MEMORY-SIZE PARAMETER VALUE 
*                           IS GREATER THAN ACTUAL NAD MEMORY SIZE, 
*                           OR CWIP SYSTEM BUFFER COUNT PARAMETER 
*                           TOO LARGE FOR ACTUAL NAD MEMORY SIZE. 
* 
*     PROCESS - SET ERRFLG = 0. 
*                 IF 1ST CALL (DST EMPTY):  
*                   SET CWIP MEMORY SIZE = DEFAULT. 
*                   IF SYSTEM BUFFER COUNT LE MAX PATHS:  
*                     SET CWIP SYSTEM BUFFER COUNT = MAX PATHS + 1. 
*                   IF CONTROL MESSAGE BUFFER COUNT LT DEFAULT: 
*                     SET CWIP CONTROL MESSAGE BUFFER COUNT = DEFAULT.
*                   IF TYPE 1 BUFFER COUNT LT DEFAULT:  
*                     SET CWIP TYPE 1 BUFFER COUNT = DEFAULT. 
*                 ELSE (2D CALL): 
*                   GET ACTUAL AND UNUSED NAD MEMORY FROM 
*                       DETAILED STATUS TABLE.
*                   IF ACTUAL MEMORY LT CWIP MEMORY:  
*                     SET ERRFLG = 1 (CWIP MEMORY TOO LARGE). 
*                   ELSE: 
*                     SET CWIP MEMORY = ACTUAL MEMORY.
*                     IF UNUSED MEMORY: 
*                       INCREASE TYPE 1 AND CONTROL MESSAGE BUFFER
*                           COUNTS TO FILL UNUSED MEMORY. 
*               RETURN. 
# 
  
      ITEM FWA        I;           # FWA OF CWIP BLOCK #
      ITEM ERRFLG     I;           # ERRFLG FLAG #
  
# 
****  PROC SETCWIP - XREF LIST BEGIN
# 
      XREF
        BEGIN 
        PROC DBGNAME;              # DEBUG - DAYFILE MESSAGE #
        PROC FSNADW;               # FETCH/SET C/W INIT. PARAMETER #
        END 
# 
****  PROC SETCWIP - XREF LIST END
# 
  
  
      ITEM I          I;
      ITEM J          I;
      ITEM OFFSET     I;
      ITEM VALUE      I;
  
      $BEGIN
      DBGNAME ("SETCWIP");         # DEBUG MESSAGE #
      $END
  
      ERRFLG = 0;                  # CLEAR ERROR FLAG # 
  
      IF (BUFWD[6] + BUFWD[7]) EQ 0  # IF 1ST CALL #
      THEN
        BEGIN 
        OFFSET = 0; 
        VALUE = -1; 
        FSNADW (FWA,OFFSET,VALUE);  # FETCH MEMORY SIZE # 
  
        IF VALUE NE 0              # IF MEMORY SIZE SPECIFIED # 
        THEN
          BEGIN 
          RETURN; 
          END 
  
        ELSE
          BEGIN                    # SET UNSPECIFIED PARAMETERS # 
          SLOWFOR I = 1 STEP 1 UNTIL CWIP$NDVAL 
          DO
            BEGIN 
            OFFSET = CWIP$W[I];    # POSITION OF VALUE #
            VALUE = -1; 
            FSNADW (FWA,OFFSET,VALUE);  # FETCH NEXT VALUE #
  
            IF VALUE EQ 0          # IF NO VALUE SPECIFIED #
              OR (((OFFSET EQ 8)    # OR CONTROL MESSAGE #
                 OR(OFFSET EQ 12))    # OR TYPE 1 BUFFER COUNT #
                AND (VALUE LT CWIP$V[I]))  # LESS THAN MINIMUM #
            THEN
              BEGIN 
              VALUE = CWIP$V[I];
              FSNADW (FWA,OFFSET,VALUE);  # SET DEFAULT VALUE # 
              END 
            END 
  
# 
*     ENSURE THAT THERE ARE ENOUGH SYSTEM BUFFERS FOR ALL PATHS.
# 
  
          OFFSET = 4;              # NUMBER OF PATHS #
          VALUE = -1; 
          FSNADW(FWA,OFFSET,VALUE);  # FETCH NUMBER OF PATHS #
  
          OFFSET = 6;              # SYSTEM BUFFER COUNT #
          I = -1; 
          FSNADW(FWA,OFFSET,I);    # FETCH SYSTEM BUFFER COUNT #
  
          IF I LE VALUE            # IF TOO FEW SYSTEM BUFFERS #
          THEN
            BEGIN 
            VALUE = VALUE + 1;     # BUFFER COUNT = PATHS + 1 # 
            FSNADW(FWA,OFFSET,VALUE);  # RESET SYSTEM BUFFER COUNT #
            END 
          END 
        END 
  
      ELSE  # 2D CALL (NAD DEVICE STATUS TABLE IN BUFFER) # 
  
        BEGIN 
        OFFSET = 0;                # NAD MEMORY SIZE #
        VALUE = -1; 
        FSNADW (FWA,OFFSET,VALUE);  # FETCH INITIAL MEMORY SIZE # 
  
        I = (BUF$NADMSU[6] * X"100")
           + BUF$NADMSL[7];        # ACTUAL NAD MEMORY SIZE # 
  
        IF I LT VALUE              # IF ACTUAL LT INITIAL SIZE #
        THEN
          BEGIN 
          ERRFLG = 1;              # SET ERROR FLAG # 
          END 
  
        ELSE
          BEGIN 
          FSNADW(FWA,OFFSET,I);    # RESET CWIP TO ACTUAL MEMORY SIZE # 
          I = I + BUF$NADUM[4] - VALUE;  # ACTUAL + UNUSED - INITIAL #
# 
*     RESET TYPE 1 AND CONTROL MESSAGE BUFFER COUNTS TO FILL REMAINING
*     UNUSED MEMORY.
# 
  
            OFFSET = 11;           # TYPE 1 BUFFER SIZE # 
            VALUE = -1; 
            FSNADW(FWA,OFFSET,VALUE);  # FETCH TYPE 1 BUFFER SIZE # 
            VALUE = VALUE + CWIP$BHSZ;  # ADD HEADER SIZE # 
            J = I/VALUE;           # J = ADDITIONAL TYPE 1 BUFFERS #
  
            IF J GT 0              # IF ROOM FOR MORE BUFFERS # 
            THEN
              BEGIN 
              I = I - (J*VALUE);   # REMAINING UNUSED MEMORY #
  
              OFFSET = 12;         # TYPE 1 BUFFER COUNT #
              VALUE = -1; 
              FSNADW(FWA,OFFSET,VALUE);  # FETCH TYPE 1 BUFFER COUNT #
  
              VALUE = VALUE + J;
              FSNADW(FWA,OFFSET,VALUE);  # RESET TYPE 1 BUFFER COUNT #
              END 
  
            IF I GE (CWIP$CMBS + CWIP$BHSZ)  # IF ROOM FOR MORE # 
                                             # CTL MSG BUFFERS #
            THEN
              BEGIN 
              OFFSET = 8;          # CONTROL MSG BUFFER COUNT # 
              VALUE = -1; 
              FSNADW(FWA,OFFSET,VALUE);  # FETCH CTL MSG COUNT #
  
              VALUE = VALUE + (I/(CWIP$CMBS+CWIP$BHSZ));  # INCREASE #
              FSNADW(FWA,OFFSET,VALUE);  # RESET CTL MSG BUFF COUNT # 
              END 
          END 
        END 
      END 
  
    TERM
