# [Assembler] Grafik im Protected Mode



## Jellysheep (19. November 2010)

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?


----------



## BassBox (22. November 2010)

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


----------



## BassBox (22. November 2010)

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


----------



## Jellysheep (23. November 2010)

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?


----------



## BassBox (24. November 2010)

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


----------



## BassBox (23. Dezember 2010)

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.


----------



## Skini (24. Dezember 2010)

Prinzipiell empfehle ich dir www.lowlevel.eu die deutsch sprachige OS-Dev Community. Die gibt es auch im IRC #lost auf euirc.net
Skini


----------



## stephsto (20. Januar 2011)

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.


----------



## Jellysheep (20. Januar 2011)

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:

```
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:

```
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?


----------



## BassBox (20. Januar 2011)

ich weiß es (glaube ich) du musst das ganze auf 32 bit register erweitern also mov es,eax


----------



## Jellysheep (20. Januar 2011)

Dann kommt leider der gleiche Fehler, er meldet wieder die (nicht vorhandene) Zeile "mov es, ax".


----------



## BassBox (21. Januar 2011)

komisch, probiers mal in virtual box. Vieleicht is ja ein fehler von bochs?


----------

