[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
{Here is the code I promised to sent you. It works nice. You can read
any part of the real-mode low memory with it.}
function allocRealModePointer(var P: pointer; Size: longInt): boolean;
var
Selector,
base : word;
LinearBase : longint;
begin
result := false;
LinearBase := MakeLong(0,hiword(longint(p)) shr 12) +
hiword(longint(P)) shl 4 + loword(longint(P));
{converts 20-bit address into a 32-bit one}
{i.e. $ffff:0006 into $000ffff6}
Selector := AllocSelector(DSeg); {Copies DSeg Selector properties }
base := SetSelectorBase(Selector, LinearBase);
SetSelectorLimit(Selector, Size);
if (Selector <> 0) and (base<>0) then begin
P := Ptr(Selector, 0);
result := true;
end;
end;
function freeRealModePointer(var p: pointer): boolean;
var
fr : Word;
begin
fr := FreeSelector(hiword(longint(p)));
{seletor is at hiword(p)}
if (fr=0) then begin {ok}
p := nil;
result := true;
end else begin {fail}
result := false;
end;
end;
{ code Test: The Rom-Bios' date is allways at $ffff:0005 (real-mode)}
var
P: pChar;
begin
P := Ptr($FFFF, $0005); {FFFF5 -> data da Rom-Bios}
if AllocRealModePointer(Pointer(p), 8) then {8 chars to RomBios' date}
begin
{ Use p to read ROM Bios' date here}
FreeRealModePointer(Pointer(p)); {dispose p}
end;
end.
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]