unit diskDrv;
interface
uses device;
type
PDiskDrive = ^TDiskDrive;
TDiskDrive = object(TDevice)
private
diskDrive:file;
openFile:boolean;
public
constructor init(const filename:string);
function read(ptr:pointer; offset:int64; length:dword):integer; virtual;
function write(ptr:pointer; offset:int64; length:dword):integer; virtual;
destructor done; virtual;
end; // TdiskDrive
//function dev_diskDrive(const filename:string):PDevice;
//function dev_diskDestroy:integer;
implementation
uses dos;
constructor TDiskDrive.init;
begin
inherited init;
openFile := FALSE;
if (filename = '') then exit;
writeln('filename: ', filename);
if (fsearch(filename, '') = '') then exit;
// The file must exist!
assign(diskDrive, filename);
{$I-} reset(diskDrive, 512); {$I+}
if (IOResult() <> 0) then writeln('Could not open file'); //exit; // should yell louder
major := 1;
sectors := filesize(diskDrive); // returns the number of records
writeln('sectors: ', sectors);
openFile := TRUE;
end; // TDiskDrive.init
function TDiskDrive.read;
begin
if (offset+length > sectors) then
begin
writeln('offset + length > sectors');
writeln('offset: ', offset);
writeln('length: ', length);
writeln('sectors: ', sectors);
halt;
end;
seek(diskDrive, dword(offset));
blockread(diskDrive, ptr^, length);
result := length;
end; // TDiskDrive.read
function TDiskDrive.write;
begin
if (offset+length > sectors) then
begin
writeln('offset + length > sectors');
writeln('offset: ', offset);
writeln('length: ', length);
writeln('sectors: ', sectors);
halt;
end;
seek(diskDrive, dword(offset));
blockwrite(diskDrive, ptr^, length);
result := length;
end;
destructor TDiskDrive.done;
begin
inherited done;
if (openFile) then close(diskDrive);
end; // TDiskDrive.done
(*
function diskDrive_read(dev:PDevice; ptr:pointer; offset:int64; length:dword):integer;
begin
if (offset+length > dev^.sectors) then
begin
writeln('offset + length > dev^.sectors');
writeln('offset: ', offset);
writeln('length: ', length);
writeln('dev^.sectors: ', dev^.sectors);
halt;
end;
seek(diskDrive, dword(offset));
blockread(diskDrive, ptr^, length);
result := length;
end; {diskDrive_read}
function diskDrive_write(dev:PDevice; ptr:pointer; offset:int64; length:dword):integer;
begin
if (offset+length > dev^.sectors) then
begin
writeln('offset + length > dev^.sectors');
writeln('offset: ', offset);
writeln('length: ', length);
writeln('dev^.sectors: ', dev^.sectors);
halt;
end;
seek(diskDrive, dword(offset));
blockwrite(diskDrive, ptr^, length);
result := length;
end; {diskDrive_write}
function dev_diskDrive;
var diskDevice : PDevice;
begin
assign(diskDrive, filename);
reset(diskDrive, 512);
new(diskDevice);
with diskDevice^ do
begin
major := 1;
sectors := filesize(diskDrive);
read := diskDrive_read;
write := diskDrive_write;
end;
result := diskDevice;
end;
function dev_diskDestroy;
begin
close(diskDrive);
end;
*)
end.