home *** CD-ROM | disk | FTP | other *** search
- 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.