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.