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.