[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]