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.