Newer
Older
ubixfs-2 / RAMDRIVE.PAS
@flameshadow flameshadow on 10 Jun 2005 3 KB UbixFS
unit ramdrive;

interface

uses device;

type
  PRamDrive = ^TRamDrive;
  TRamDrive = object(Tdevice)
   private
    ramData:pointer;
    ramDriveSize:dword;
   public
    constructor init(ramDriveSectors:dword);
    function read(ptr:pointer; offset:int64; length:dword):integer; virtual;
    function write(ptr:pointer; offset:int64; length:dword):integer; virtual;
    destructor done; virtual;
  end; // TRamDrive

(*
function dev_ramDrive:PDevice;
function dev_ramDestroy:integer;
*)
implementation

{const RAM_DRIVE_SIZE = 1024*1024*20;}

constructor TRamDrive.init;
begin
  inherited init;
  if (ramDriveSectors = 0) then runError; // I can't imagine why you'd want a 0 byte ramdrive
  ramDriveSize := ramDriveSectors * SECTOR_SIZE;
  ramData := NIL;
  GetMem(ramData, ramDriveSize);
  if (ramData = NIL) then runError;
  major := 1;
  sectors := ramDriveSectors;
end; // TRamDrive.init

function TRamDrive.read;
var data:pointer;
begin
  data := pointer(dword(ramData) + dword(offset)*SECTOR_SIZE);
  if (offset+length > sectors) then runError;
  move(data^, ptr^, length*SECTOR_SIZE);
  result := length
end; // TRamDrive.read

function TRamDrive.write;
var data:pointer;
begin
  data := pointer(dword(ramData) + dword(offset) * 512);
  if (offset+length > sectors) then halt;
  move(ptr^, data^, length*512);
  result := length;
end; // TRamDrive.write

destructor TRamDrive.done;
begin
  inherited done;
  if (ramData <> NIL) then FreeMem(ramData, ramDriveSize);
  ramData := NIL;
end; // TRamDrive.done
(*
var ram_data:pointer;
var ram_drive_size:dword;

function ramDrive_read(dev:PDevice; ptr:pointer; offset:int64; length:dword):integer;
var data:pointer;
begin
  data := pointer(dword(ram_data) + dword(offset)*512);
  if (offset+length > dev^.sectors) then halt;
  move(data^, ptr^, length*512);
  result := length;
end; {ramDrive_read}

function ramDrive_write(dev:PDevice; ptr:pointer; offset:int64; length:dword):integer;
var data:pointer;
begin
  data := pointer(dword(ram_data) + dword(offset) * 512);
  if (offset+length > dev^.sectors) then halt;
  move(ptr^, data^, length*512);
  result := length;
end; {ramDrive_write}

function dev_ramDrive:PDevice;
var
  ramDevice : PDevice;
  ramDisk : file;
  ramDriveSize : dword;
begin
  new(ramDevice);
  assign(ramDisk, 'ram.dsk');
  reset(ramDisk, 1);
  ram_drive_size := filesize(ramDisk);

  getmem(ram_data, ram_drive_size);
  fillchar(ram_data^, ram_drive_size, 0);
  blockread(ramDisk, ram_data^, ram_drive_size);
  close(ramDisk);

  with ramDevice^ do
    begin
      major := 1;
      sectors := ram_drive_size div 512;
      read := ramDrive_read;
      write := ramDrive_write;
    end;
  result := ramDevice;
end;

function dev_ramDestroy:integer;
var
  ramDisk : file;

begin
  assign(ramDisk, 'ram.dsk');
  reset(ramDisk, 1);
  blockwrite(ramDisk, ram_data^, ram_drive_size);
  close(ramDisk);
  freemem(ram_data, ram_drive_size);
end;

begin
  ram_data := NIL;
  ram_drive_size := 0; *)
end.