Contributor: KAI ROHRBACHER           

{
KAI ROHRBACHER

I'm looking For a way to tell BorlandPascal that an allocated _data_
block should now be treated as an executable routine (in Protected Mode).
Here is a little example to show the problem; it runs w/o problems in
Real Mode, but results in a GP-fault (despite the use of the alias-selector!):
}

Program SelfModify;

Const
  AnzNOPs = 10;

Type
  TTestProc = Procedure;

Var
  code : Pointer;
  Run  : TTestProc;
  pb   : ^Byte;
  pw   : ^Word Absolute pb;
  i    : LongInt;

begin
  GetMem(code, AnzNOPs + 7); {7 Bytes For proc header & end}
  pb := code; {pb = ^start of routine to build}

  pb^ := $55;
  INC(pb);   {push bp}
  pw^ := $E589;
  INC(pw); {mov bp,sp}
  For i := 1 to AnzNOPs DO
  begin
    pb^ := $90;
    INC(pb); {nop's}
  end;
  pb^ := $5D;
  INC(pb);   {pop bp}
  pb^ := $CA;
  INC(pb);
  pw^ := $0000;          {retf 0}

  {$IFDEF DPMI}
  WriteLN('Protected Mode');
  code:= Ptr(Seg(code) + SelectorInc, Ofs(code)); {alias-selector}
  {$else}
  WriteLN('Real Mode');
  {$endIF}

  Run := TTestProc(code); {that's a Type-cast!}
  Run; {call routine}

  FreeMem(code, AnzNOPs + 7);
  WriteLN('Alive and kicking!');
end.