home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frostbyte's 1980s DOS Shareware Collection
/
floppyshareware.zip
/
floppyshareware
/
USCX
/
TURBO-06.ZIP
/
2DIR.PAS
next >
Wrap
Pascal/Delphi Source File
|
1985-02-23
|
5KB
|
157 lines
Program test01;
{$C-,V-,K-} { to speed up turbo }
{ types and vars req'd for disk space and dir procedures }
type
regpack = record
ax,bx,cx,dx,bp,si,di,ds,es,flags: integer;
end;
mem_ptr = ^pointer_type;
pointer_type = array [1..2] of integer;
fname_type = record
name : string[8];
period : char;
ext : string[3];
end;
dir_type = array [1..122] of fname_type;
var
R : regpack;
w,e,x : integer;
pointer,dta : mem_ptr;
asciiz : string[32]; {string input for dir scan}
fname : fname_type;
bts : real;
directory : dir_type;
total_files : integer;
Procedure free_space(drive_letter : char);
var
dl : integer;
begin
drive_letter := upcase(drive_letter);
case drive_letter of
'A'..'E' : dl := ord(drive_letter)-ord('A')+1;
else
dl := 0;
end;
R.ax :=$36 shl 8; { disk free space }
R.dx := dl;
MsDos(R);
bts := r.bx; bts := bts * 1024;
write ('Diskdrive free space for ',drive_letter,':');
writeln (' ',r.bx,'k or ',bts:7:0,' bytes');
end;
Procedure show_directory(current_dir : dir_type; Number_of_entries : integer);
begin
writeln;
for x := 1 to 5 do write (' Name Ext ');
for x := 1 to 76 do write('-'); writeln;
for x := 1 to number_of_entries do
begin
with current_dir[x] do write (name:8,period,ext:3);
write (' ');
end;
writeln;
end;
Procedure sort_directory (var current_dir : dir_type; num_entries : integer);
var
nochange : boolean;
temp1 : fname_type;
begin {this is a cheap bubble sort... of sorts (bad pun!) }
write (' Sorting');
repeat
write ('.');
nochange := true;
for x := 1 to num_entries - 1 do
if current_dir[x].name > current_dir[x+1].name then
begin
temp1 := current_dir[x];
current_dir[x] := current_dir[x+1];
current_dir[x+1] := temp1;
nochange := false;
end
else
if current_dir[x].name = current_dir[x+1].name then
if current_dir[x].ext > current_dir[x+1].ext then
begin
temp1 := current_dir[x];
current_dir[x] := current_dir[x+1];
current_dir[x+1] := temp1;
nochange := false;
end;
num_entries := num_entries - 1;
until nochange;
writeln ('done ');
end;
BEGIN {2DIR}
textcolor(lightcyan);
free_space('a');
free_space('b');
r.ax := 0;
r.es := 0;
r.bx := 0;
R.ax := $2F shl 8; { Get DTA address in ES:BX }
MsDos(R);
dta := ptr(r.es,r.bx);
repeat
writeln;
total_files := 0;
write ('Enter DIR mask > ');
readln(asciiz);
if length(asciiz) = 0 then halt;
asciiz := asciiz + chr(00);
pointer := addr(asciiz[1]);
R.ds := seg(pointer^);
R.dx := ofs(pointer^);
R.cx := 0;
R.ax := $4E shl 8; { get first entry in dir }
msdos(R);
begin
while (r.ax <> 18) and (r.ax <> 2) do
begin
total_files := total_files + 1;
e := 30;
fname.name := '';
fname.ext := '';
fname.period := ' ';
while (chr(mem[seg(dta^):ofs(dta^)+e]) <> '.') and (chr(mem[seg(dta^):ofs(dta^)+e]) <> #0) do
begin
fname.name := fname.name + chr(mem[seg(dta^):ofs(dta^)+e]);
e := e + 1;
end;
while length(fname.name) < 8 do fname.name := fname.name + ' ';
if chr(mem[seg(dta^):ofs(dta^)+e]) = '.' then
begin
fname.period := '.';
e := e + 1;
while chr(mem[seg(dta^):ofs(dta^)+e]) <> #0 do
begin
fname.ext := fname.ext + chr(mem[seg(dta^):ofs(dta^)+e]);
e := e + 1;
end;
while length(fname.ext) < 3 do fname.ext := fname.ext + ' ';
end;
directory[total_files] := fname;
R.ds := seg(pointer^);
R.dx := ofs(pointer^);
R.cx := 0;
R.ax := $4f shl 8; { get first entry in dir }
msdos(R);
end;
end;
writeln;
sort_directory(directory,total_files);
show_directory(directory,total_files);
if total_files = 0 then
writeln ('Files not found.')
else
writeln ('Total files = ',total_files:3);
until asciiz = '';
end.