Finally, after days of suffering, investigation and a LOT OF LUCK, i got it. and only cost myself the greatest conflict whith my gildfriend. She at least understood that i haven¬Ąt changed her for my computer.

well, its posible to acces memory almost directly runing under protected mode. The way (for those who want to investigate or think that directx or opengl its not the way):

1) I used FPC for GO32v2, a dos extender. It works perfect under windows XP and other OS with dos emulation, and uses the DPMI, a Protected mode interface. Its free download in the Free pascal main page.

2) To start 13h mode its like in real mode (i havent started to investigate vesa implementation, but for my purpose, 13h mode runs perfect), calling int 10h with 13h in ax.

3) you can access videomemory this way: In real mode you were used to access with the $a000 segment, and the offset (obtained this way offset = y*320+x). In protected mode you have no segment, but a selector and a offset. Using the apropiate selector you can access videoram directly. Using assembler: in the FS register you have all msdos memory directions, and videoram is at FS:[$A0000 + offset]. ($A0000 is $A000 selector).

4) to read or write directly in memory, you need the offset, and no need of the segment (in protected mode, segment dont have real meaning). All variables are loaded at the DS register. With the offset you can access a memory value at DS:[offset+pos], where pos is the position in the range of memory you want to access.

here is some code to create virtual memory pages and flip them to vga.
As you see, im from spain, so excuse my poor english. the code is in spanish.

[pascal]const
VGA = $A0000; {VGA selector}
MaxScreens = 100; {You can use much more virtual screens}

type
screen = array[1..64000] of byte;

var
Vir:array[1..MaxScreens] of longint;
Pan:array[1..Maxscreens] of ^screen;
Usada:array[1..MaxScreens] of boolean; {not important, only for my games}

Procedure ModoGrafico; {init graph mode}
begin
asm
mov ax,13h
int 10h
end;
end;

Procedure ModoTexto;assembler; {end graph mode}
asm
mov ax,3h
int 10h
end;

procedure VirtualUp (numero:byte); {load a virtual screen into memory}
var
temp:longint;
begin
getmem (pan[numero],sizeof(pan[numero]^));
vir[numero]:=ofs(pan[numero]^);
usada[numero]:=false;
end;

procedure VirtualDown (numero:byte); {dispose a virtual page}
begin
freemem (pan[numero]);
end;

Function ExtraerByte (offset_:longint):byte; {offset_ must be }
{vir[n] + (y*320+x) }
var
temp:byte;
begin
temp:=0;
asm
mov esi,offset_
mov al,ds:[esi]
mov temp,al
end;
ExtraerByte:=temp;
end;

Procedure PonerByte (offset_:longint;valor:byte); assembler; {same as above}
asm
mov esi,offset_
mov al,valor
mov ds:[esi],al
end;

Procedure Flip32 (p:longint); assembler; {reveal a virtual screen into vga}
asm {p must be vir[n]}
mov edi,vga
mov esi,p
mov cx,64000
@salto1:
mov eax,ds:[esi]
mov fs:[edi],eax
add edi,4
add esi,4
sub cx,4
cmp cx,0
jne @salto1
end;

Procedure EnviaPantalla32 (p0,pf:longint); assembler; {copy a virtual}
asm { page into other. }
mov edi,pf { p0 must be vir[n] source and }
mov esi,p0 { pf vir[m] destiny }
mov cx,64000
@salto1:
mov eax,ds:[esi]
mov ds:[edi],eax
add edi,4
add esi,4
sub cx,4
cmp cx,0
jne @salto1
end;

procedure FillVGA32 (b:byte); assembler; {simply fills vga with b color }
asm
mov edi,$A0000
mov al,b
mov cx,64000
@salto:
mov fs:[edi],al
inc edi
dec cx
cmp cx,0
jne @salto
end;

procedure Fill32 (b:byte;p:longint); assembler; {same as above but for }
asm { a virtual page p = vir[n] }
mov esi,p
mov al,b
mov cx,64000
@salto:
mov ds:[esi],al
inc esi
dec cx
cmp cx,0
jne @salto
end;[/pascal]