*DECK     NVFUFVO 
USETEXT  TXVCBNV
PROC NVFUFVO(VCBORD); 
# TITLE NVFUFVO - FREES UP AN VCB ORDINAL. #
  
      BEGIN    # NVFFVO # 
# 
**    NVFUFVO - FREES UP AN VCB ORDINAL.
* 
*     A. LIM    81/07/21
*     C. BRION  82/06/22
* 
*     THIS PROCEDURE FREES UP AN VCB ORDINAL. 
* 
*     PROC NVFUFVO(VCBORD)
* 
*     ENTRY    VCBORD = VCB ORDINAL TO BE FREED UP. 
* 
*     EXIT     VCB ORDINAL FREED
* 
*     NOTES    NONE 
* 
*     METHOD   1) VERIFY THAT VCB ORDINAL IS LEGAL
*              2) VERIFY THAT VCB ORDINAL IS NOT IN PRESENT STATE.
*              IF EITHER ONE OF THE ABOVE FAILS, THEN 
*              ISSUE DAYFILE MESSAGE, AND ABORT NVF.  ELSE, 
*              MARK IT FREE, AND DECREMENT THE ACTIVE-VCB-COUNT(AVCBCNT)
* 
# 
  
# 
****  PROC NVFUFVO XREF BEGIN.
# 
      XREF
        BEGIN 
        PROC ABORT;                    # MACREL - ABORT TASK           #
        PROC MESSAGE;                  # MACREL - ISSUE MESSAGE        #
        PROC SSBSBW;                   # SS - SET BIT IN WORD          #
        PROC SSBTBW;                   # SS - TEST BIT IN WORD         #
        FUNC XCDD C(10);               # MACREL-CNVRT INT TO DEC DSP CD#
        END 
# 
****
# 
  
      # FORMAL PARAMETERS # 
  
      ITEM VCBORD    I;               # VCB ORDINAL                   # 
  
  
      # ACTUAL PARAMETERS # 
  
      ITEM WORD       I;
      ITEM BITN       I;
      ITEM STATS      B;
  
  
      # INDUCTION VARIABLES # 
  
      ITEM I          I;               # DUMMY                         #
  
  
      # ITEMS # 
  
      ITEM TEMP       C(10);
  
  
  
  
  
      WORD = 0; 
      BITN = VCBORD;
  
      FOR I = 0 WHILE (BITN-48) GR 0 DO # CONVERT ORDNL TO WORD/BIT    #
        BEGIN 
        BITN = BITN-48; 
        WORD = WORD+1;
        END 
  
  
# 
*     1) VERIFY THAT VCB ORDINAL IS LEGAL, AND
*     2) CHECK PRESENT ORDINAL STATUS.
# 
  
  
      $BEGIN
      SSBTBW(VOT[WORD],BITN,STATS); 
      IF    WORD GR VTSIZE$ 
         OR (BITN - BITN/MAXENSEC$ * MAXENSEC$) EQ 0
         OR (BITN - BITN/MAXENSEC$ * MAXENSEC$) GR ACTENSEC$
         OR STATS 
      THEN
        BEGIN 
        TEMP = XCDD(VCBORD);
        V$MSG[0] = "ILLEGAL VCB ORDINAL = ";
        V$ORD[0] = C<7,3>TEMP;
        V$PID[0] = "NVFUFVO"; 
        MESSAGE(VCBMSG[0],DFILE$);
        ABORT;
        END 
      $END
  
      SSBSBW(VOT[WORD],BITN);          # MARK ORDINAL AS FREE          #
      AVCBCNT = AVCBCNT-1;             # DECR ACTIVE VCB COUNT         #
  
      RETURN; 
      END  # NVFUFVO #
  
      TERM
