[Assembler] Grafik im Protected Mode

Jellysheep

Erfahrenes Mitglied
Hi,
nach vielen erfolglosen Versuchen hab ich es geschafft, in einem eigenen OS in den Protected Mode zu wechseln.
Interrupts sind anscheinend nicht erlaubt (int 10h z.B. endet in einer 3rd exception).
Wie kann ich dann in den Grafikmodus schalten und Pixel setzen?
 
Hallo,
Bist wohl auch unter die OS entwickler gegangen? Ich schreibe schon set einiger zeit an meinem egenen.
Wenn du einen interrupt im Protected Mode ansprechen willst dann beachte das :http://www.fh-zwickau.de/doc/prmo/pmtutor/text/p_all8.htm

Da steht wie es geht. Aber es gibt auch noche eine funktion zur pixelausgabe ohne int:
PlotPixel: ;ax = farbe ;bx = y koordiante ;cx = x koordinate
pusha
push ax
mov ax,0xA000
mov es,ax
mov di,bx
shl di,6
shl bx,4
add di,bx
mov bx,cx
shr bx,3
add di,bx
and cx,7
mov ah,128
shr ah,cl
mov dx,03ceh
mov al,8
out dx,ax
mov dl,[es:di]
pop ax
mov [es:di],al
popa
ret

Diese funktion ist wie funktion 0ch im int 10h nur mit anderen parametern.
Du musst aber befor du in den Protected Mode wechselst musst du in den Grafik modus 12 wechseln und Hier der code zum wechseln im realmode:
set_mode12:
mov ax, 12h
int 10h
ret

LG
BassBox
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
Bist wohl auch unter die OS entwickler gegangen? Ich schreibe schon set einiger zeit an meinem egenen.
Wenn du einen interrupt im Protected Mode ansprechen willst dann beachte das :http://www.fh-zwickau.de/doc/prmo/pmtutor/text/p_all8.htm

Da steht wie es geht. Aber es gibt auch noche eine funktion zur pixelausgabe ohne int:

PlotPixel: ;ax = farbe ;bx = y koordiante ;cx = x koordinate
pusha
push ax
mov ax,0xA000
mov es,ax
mov di,bx
shl di,6
shl bx,4
add di,bx
mov bx,cx
shr bx,3
add di,bx
and cx,7
mov ah,128
shr ah,cl
mov dx,03ceh
mov al,8
out dx,ax
mov dl,[es:di]
pop ax
mov [es:di],al
popa
ret

Diese funktion ist wie funktion 0ch im int 10h nur mit anderen parametern.
Du musst aber befor du in den Protected Mode wechselst musst du in den Grafik modus 12 wechseln und Hier der code zum wechseln im realmode:
set_mode12:
mov ax, 12h
int 10h
ret
LG
BassBox
 
Vielen Dank!
Bist wohl auch unter die OS entwickler gegangen?
Ja! :-D Seit ein paar Monaten versuche ich mich da mal dran :) , auch wenn viele sagen, dass das OS-Entwickeln Zeitverschwendung ist. :(
Danke für die Funktion!
In den Grafikmodus kann ich im Realmode schon, kann ich auch im Protected-Mode in den Grafik-Modus wechseln?
 
Ja normalerweise schon. Aber dazu musst halt int 10h ansprechen und das funktioniert halt nur über den Umweg (siehe Link) oder (habs noch nicht ausprobiert) du setzt die parameter für den Int und dann machst du einfach call mit der Offset des Ints.
Gruß
BassBox
 
Sorry das mir die Idee erst jetzt kommt:
Dul lädst im Rmode die ivt an eine andere Stelle des Arbeitsspeichers:
mov ax,0
mov es,ax
mov word [offset_int_10h],[es:4*10h]
mov word [CS_int_10h],[es:4*10h+2]

So, jetzt stehen in den variablen das Code Segment vom int 10h und die offset.
im pmode kannst die dann aufrufen.
ZB(weis net ob des so klappt)
mov ax,[es:4*10h+2]
mov cs,ax
call far [es:4*10h]

Das Problem wir warscheinlich sein das ein int mit iret beendet wir, und wir deshalb noch ein paar kleinichkeiten auf den Stack schieben müssen. Ich weiß gerade nicht genau was auf den stack muss aber ich guck mal in meinem Assembler Buch nach.
 
Nun ihr könnt euch auch ein Protected Mode Interface der VESA Grafikerweiterung eures BIOS holen. Ihr müsst bedenken, dass sobald ihr in den PMode wechselt die IVT nicht mehr vorhanden ist. Deshalb gibt es keinen int10 mehr. Außerdem solltet ihr euch abgewöhnen von Funktionen zu sprechen. Der int 10h ist ein Software Interrupt. Ich habe das in einem System mal so gelöst, dass ich mir ein PMode Interface im Realmode vorbereitet und später im PMode geladen habe. Dann habe ich den int10 wieder mit den ursprünglichen Funktionen belegt. Ist aber eigentlich nicht notwendig.
 
Ah ok, interessante Vorschläge! ;)
@BassBox:
Deine Pixel-Setzen-Funktion funktioniert bei mir nicht. Wenn ich sie nach "[Bits 32]" stehen habe, stürtzt Bochs (o.ä.) ab und zeigt das an:
Code:
0x00000000000081b4>> mov es, ax : 8EC0
>>PANIC<< exception(): 3rd (13) exception with no resolution
Wenn ich die Zeile "mov es, ax" auskommentiere, kommt kein Fehler, aber auch kein Pixel.
Wenn ich die Funktion über das "[Bits 32]" schiebe, kommt dieser Fehler:
Code:
0x0000000007200002>> (invalid)  : FFFF
>>PANIC<< exception(): 3rd (13) exception with no resolution
Woran liegt das? :( Gibt es andere Funktionen, um Pixel auf dem Bildschirm zu zeichnen?
 
ich weiß es (glaube ich) du musst das ganze auf 32 bit register erweitern also mov es,eax
 

Neue Beiträge

Zurück