home *** CD-ROM | disk | FTP | other *** search
-
- type
- Char80arr = array [ 1..80 ] of Char;
- String80 = string[ 80 ];
-
- (****************************************************************************)
- (* GET DEFAULT DRIVE LETTER *)
- (****************************************************************************)
- function
- default_drive : char;
- var
- regs : registerset;
- begin
- regs.AX := $1900;
- msdos( regs );
- default_drive := chr(ord('A')+lo(regs.AX));
- end;
-
- (****************************************************************************)
- (* CHANGE DEFAULT DRIVE *)
- (****************************************************************************)
- procedure
- change_drive(dr : char);
- var
- regs : registerset;
- begin
- regs.AX := $0E00;
- regs.DX := ord(upcase(dr)) - ord('A');
- msdos( regs );
- end;
-
- (****************************************************************************)
- (* DISK SPACE AVAILABLE *)
- (****************************************************************************)
- function
- diskspace(dr : char) : integer;
- var
- regs : registerset;
- r : real;
- begin
- regs.AX := $3600;
- regs.DX := 1 + ord(upcase(dr)) - ord('A');
- msdos( regs );
- r := ((regs.AX * regs.CX * 1.0) * regs.BX);
- diskspace := round( r / 1024.0);
- end;
-
- (****************************************************************************)
- (* DISK DIRECTORY LISTER *)
- (****************************************************************************)
- procedure
- dir_list;
-
- {$I-}
-
- var
- DTA : array [ 1..43 ] of Byte;
- DTAseg,
- DTAofs,
- SetDTAseg,
- SetDTAofs,
- Error,
- I, J,
- Option : Integer;
- Regs : registerset;
- Buffer,
- NamR : String80;
- curdir : string80;
- dn : integer;
- ch : char;
- Mask : Char80arr;
- horz_tab : byte;
-
- (****************************************************************************)
- (* SetDTA resets the current DTA to the new address specified in the *)
- (* parameters 'SEGMENT' and 'OFFSET'. *)
- (****************************************************************************)
- procedure
- SetDTA( Segment, Offset : Integer; var Error : Integer );
- begin
- Regs.AX := $1A00;
- Regs.DS := Segment;
- Regs.DX := Offset;
- MSDos( Regs );
- Error := Regs.AX and $FF;
- end;
-
- (****************************************************************************)
- (* GetCurrentDTA is used to get the current Disk Transfer Area ( DTA ) *)
- (* address. A function code of $2F is stored in the high Byte of the AX *)
- (* register and a call to the predefined procedure MSDos is made. This *)
- (* can also be accomplished by using the "Intr" procedure with the same *)
- (* register record and a $21 specification for the interrupt. *)
- (****************************************************************************)
- procedure
- GetCurrentDTA( var Segment, Offset : Integer;
- var Error : Integer );
- begin
- Regs.AX := $2F00;
- MSDos( Regs );
- Segment := Regs.ES;
- Offset := Regs.BX;
- Error := Regs.AX and $FF;
- end;
-
- (****************************************************************************)
- (* GetFirst gets the first directory entry of a particular file Mask. The *)
- (* Mask is passed as a parameter 'Mask'. *)
- (****************************************************************************)
- procedure
- GetFirst( Mask : Char80arr; var NamR : String80;
- Segment, Offset : Integer; Option : Integer;
- var Error : Integer );
- var
- I : Integer;
- begin
- Error := 0;
- Regs.AX := $4E00;
- Regs.DS := Seg( Mask );
- Regs.DX := Ofs( Mask );
- Regs.CX := Option;
- MSDos( Regs );
- Error := Regs.AX and $FF;
- I := 1;
- repeat
- NamR[ I ] := Chr( mem[ Segment : Offset + 29 + I ] );
- I := I + 1;
- until ( not ( NamR[ I - 1 ] in [ ' '..'~' ] ));
- NamR[ 0 ] := Chr( I - 1 );
- end;
-
- (****************************************************************************)
- (* GetNextEntry uses the first bytes of the DTA for the file Mask, and *)
- (* returns the next file entry on disk corresponding to the file Mask. *)
- (****************************************************************************)
- procedure
- GetNextEntry( var NamR : String80; Segment, Offset : Integer;
- Option : Integer; var Error : Integer );
- var
- I : Integer;
- begin
- Error := 0;
- Regs.AX := $4F00;
- Regs.CX := Option;
- MSDos( Regs );
- Error := Regs.AX and $FF;
- I := 1;
- repeat
- NamR[ I ] := Chr( mem[ Segment : Offset + 29 + I ] );
- I := I + 1;
- until ( not ( NamR[ I - 1 ] in [ ' '..'~' ] ));
- NamR[ 0 ] := Chr( I - 1 );
- end;
-
- (****************************************************************************)
- (* LIST DIRECTORY OF DISK *)
- (****************************************************************************)
- begin
- mkwin(1,1,80,24,'Disk Directory');
- horz_tab := 4;
- for I := 1 to 21 do DTA[ I ] := 0;
- for I := 1 to 80 do begin
- Mask[ I ] := Chr( 0 );
- NamR[ I ] := Chr( 0 );
- end;
- NamR[ 0 ] := Chr( 0 );
- GetCurrentDTA( DTAseg, DTAofs, Error );
- if ( Error <> 0 ) then begin
- WriteLn( 'Unable to get current DTA' );
- WriteLn( 'Program aborting.' );
- Halt;
- end;
- SetDTAseg := Seg( DTA );
- SetDTAofs := Ofs( DTA );
- SetDTA( SetDTAseg, SetDTAofs, Error );
- if ( Error <> 0 ) then begin
- WriteLn( 'Cannot reset DTA' );
- WriteLn( 'Program aborting.' );
- Halt;
- end;
- Error := 0;
- Buffer[ 0 ] := Chr( 0 );
- Option:=16;
- ch:=default_drive;
- dn:=ord(ch)-ord('A')+1;
- getdir(dn,curdir);
- writeln(' Current Drive\Directory: ',curdir);
- Write(' Dir Mask: ' );
- ReadLn( Buffer );
- WriteLn;
- if ( length( Buffer ) = 0 ) then
- Buffer := '*.*';
- for I := 1 to length( Buffer ) do
- Mask[ I ] := Buffer[ I ];
- GetFirst( Mask, NamR, SetDTAseg, SetDTAofs, Option, Error );
- if ( Error = 0 ) then begin
- gotoxy(horz_tab,wherey);
- Write( NamR );
- horz_tab := horz_tab + 15;
- end
- else
- WriteLn( ' File ''', Buffer, ''' not found.' );
- while ( Error = 0 ) do begin
- GetNextEntry( NamR, SetDTAseg, SetDTAofs, Option, Error );
- if ( Error = 0 ) then begin
- gotoxy(horz_tab,wherey);
- Write( NamR );
- horz_tab := horz_tab + 15;
- if horz_tab > 70 then begin
- horz_tab := 4;
- writeln;
- end;
- end;
- end;
- SetDTA( DTAseg, DTAofs, Error );
- if horz_tab > 4 then
- writeln;
- writeln;
- writeln(' Bytes Available: ',diskspace(ch),'k');
- write(' ');
- wait_for_key;
- rmwin;
- end;
-
- {$I+}