Hi, ich sitze inzwischen seit über 1 woche daran, mit vesa was zu zeichnen.
Vesa initialisiere ich ohne probleme im kernel16.asm mit folgenden code:
SetVesaMode:
push ax
push bx
mov ax, 4f00h
mov bx, 0x7e0
mov es, bx
mov di, 0x0
int 0x10
cmp ax, 0x004f
jne .1
mov bx, 0x7e0
mov es, bx
mov di, 0x0
mov ax, [es:di+4]
mov ax, 0x4f01
mov di, 0x0
mov bx, 0x800 ; VbeInfoBlock nach 0x8000
mov es, bx
mov cx, 0x0115 ; Videomodus 800x600 mit lfb
int 0x10
mov ax, 0x4f02
mov bx, 0x4115
int 0x10
cmp ax, 0x004f
je .3
.1:
mov si, msg_VesaError
call PrintString
.2:
jmp .2
.3:
pop bx
pop ax
ret
danach wird in den PMode geschalten. der Vesamodeinfoblock müsste sich jetzt an 0x8000 befinden (im pmode).
hier ist meine vesa.c:
unsigned long *Video;
unsigned short sWidth, sHeight;
unsigned short VBEModeInfo = 0x8000;
void InitVideo()
{
unsigned long *pLong = (unsigned long *)(VBEModeInfo + 0x28);
unsigned short *pShort = (unsigned short*)(VBEModeInfo + 0x12);
Video = (unsigned long*)(pLong[0]);
sWidth = pShort[0];
sHeight = pShort[1];
}
void FillScreen(unsigned long color)
{
unsigned long End = sWidth * sHeight, i;
for (i=0;i<End;i++)
Video[i] = color;
}
void PutPixel(short x, short y, unsigned long color)
{
if (x>=0 && y>=0 && x<sWidth && y<sHeight)
Video[y*sWidth+x] = color;
}
...
Das Problem sieht folgend aus:
Er schaltet den Vesamodus, initialisiert den PMode, aber ich kann weder einen pixel zeichnen, noch den bildschirm füllen...
Danke schon mal