Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: 475 am 02. July 2005, 20:11
-
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
-
so... hab es jetzt geschafft, das er pixel zeichnen kann.
Allerdings nicht so wie er soll.
Wenn ich ein Pixel zeichnen will, stimmen die koordinaten nicht und beim bildschirm füllen ist der ganze bildschirm "gestrichelt"
Der Code ist der gleiche geblieben (hab nur die header etwas abgeändert, wo auch der fehler war)
-
Hast du den VESA code mit Bochs getestet oder ??
Bei meinem Vesa code passiert das gleiche wenn ich ihn unter Bochs teste ...
aber unter M$ Virtual PC und auf dem PC funktionierts ohne Probleme ...
-
Du musst die Farbtiefe überprüfen wenn du Pixel zeichenen willst. AFAIK benutzt Bochs gerne einen 24Bit Mode, das solltest du also überprüfen.
-
danke.. hab es jetzt mal auf nem normalen pc getestet und da füllt er den halben bildschirm mit der farbe.
Jedoch macht er nicht den ganzen bildschirm...
Wie kann ich bochs mitteilen, dass er 32 bit verwenden soll? hab nix mit google gefunden.
<->
Hab jetzt mal Verschiedene Modis probiert...
er zeichnet bei 640x480 fast alles, bei 800x600 nur noch die hälfte und bei 1024x768 ca. 1/3.
Kann es sein, dass ich vesa mit lfb nicht richtig initialisiert hab?
-
hast du den a20 gate richti aktiviert?
das war bei mir auf jedenfall das problem...
-
das is zwar OT, aber was is mit deiner Page zack? Die funzt irgendwie nich
-
Danke. Es lag wirklich am A20 gate.
-
OT: gute Frage, frag ich mich auch schon eine Weile.
-
OT: me 2
-
jaja meine page geht net mehr... habe vergessen die domain zu bezahlen... :( solte bis nächsten monat wieder funktionieren... :oops: :oops: