Contributor: LEOPOLDO SALDANHA
{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 000ドルffff6}
 Selector := AllocSelector(DSeg); {Copies DSeg Selector properties }
 base := SetSelectorBase(Selector, LinearBase);
 SetSelectorLimit(Selector, Size);
 if (Selector  0) and (base0) 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.


AltStyle によって変換されたページ (->オリジナル) /