<< Previous Message Main Index Next Message >>
<< Previous Message in Thread This Month Next Message in Thread >>
Date   : Tue, 23 Jul 1985 21:52:27 PDT
From   : crash!ihom@sdcsvax.ARPA
Subject: Turbo free space query

Does anyone know of a correct algorithm for finding the amount of free space
on a drive in Turbo Pascal?  My quick and dirty algorithm below outputs the
corect results on my 128k floppies and 96k RAM disk, but errors on a hard
drive.
 
When a drive is activated in CP/M, an allocation vector is set up to determine 
the amount of free space remaining on the drive.  This vector is composed of
bits with a 0 indicating a free block and a 1 indicating an allocated block.
Calling BDOSHL(alloc_vect) puts the address of the allocation vector (for
the current selected drive) in the HL register pair.  "temp" points to the
address in memory where the allocation vector is stored.  "quotient" incre-
ments to the next consecutive 8-bit byte in the vector.  "freek" tallies up
all the 0 bits and is the value for the space remaining.
 
Would someone compile and execute this, and mail me the results?  (Be sure to
change the constant "total_k" to match your drive size.)  Or better yet,
supply me with a correct algorithm...
 
 
--Irwin Hom     ...crash!ihom@ucsd
 
 
 
 
program free_space;
 
const
   alloc_vect = $1B;   { Allocation vector address                        }
   total_k    = 128;   { since the total kilobytes is easy to find in the }
                       { DPB, set to a constant here for this example     }
type
   alvec = byte;
 
var
   cnt,freek,i : integer;
   quotient    : byte;
   temp        : ^alvec;
begin
   writeln('Total k = ',total_k);
 
   { address of space allocation bit vector }
   temp := ptr(BDOSHL(alloc_vect));
   freek := 0;   { counter for free blocks }
 
   for i := 0 to (total_k div 8) - 1 do   { 8 bits per byte }
      begin
         cnt := 0;   { bit counter }
         quotient := mem[addr(temp^) + i];
         writeln(quotient);
         while quotient > 0 do   { kludge to convert from dec to bin }
                                 { 0 = free, 1 = allocated }
            begin   { start from LSB to MSB }
               if not odd(quotient) then   { even = free block }
                  freek := freek + 1;
               cnt := cnt + 1;
               quotient := quotient div 2
            end;
         freek := freek + (8 - cnt)   { add remaining (0 bits) free blocks }
      end;
 
   writeln('Free k = ',freek)
end.
 
<< Previous Message Main Index Next Message >>
<< Previous Message in Thread This Month Next Message in Thread >>