Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 20. October 2005, 22:34

Titel: Modus mit Ports setzten
Beitrag von: bitmaster am 20. October 2005, 22:34
Hi
Wie kann man den Video-Modus mit Ports setzten. Also das was ich sonst immer mit dem ah = 00h , al = Modus und int 10h mache. Wie kann ich das mit Ports machen? Bei google habe ich nichts gefunden. Bitte um Hilfe. Das ist doch nicht schwerer als mit dem int 10h oder? Könnt Ihr mir einfach nur die Ports nennen? Und wie es gemacht wird?

Danke!!!
Titel: Modus mit Ports setzten
Beitrag von: n3Ro am 21. October 2005, 01:52
Natürlich ist es schwieriger als einen BIOS Interrupt aufzurufen. Einer Grafikkarte kann mann nicht einfach sagen "ich will die Auflösung mit der Farbtiefe". Schau dir am besten mal die Quellcodes des VGABIOS auf http://savannah.nongnu.org/download/vgabios/ an. Da steht alles drin, wie er es macht. Ansonsten schaust du dir mal die MODES.ASM auf http://www.programmersheaven.com/zone5/cat20/1866.htm, die schaltet den 320x200x256 Grafikmodus ohne BIOS an.
Titel: Modus mit Ports setzten
Beitrag von: Roshl am 21. October 2005, 10:03
Wenn uns die Grafikkartenhersteller verraten würden wie man ihre Grakas anspricht wäre das einfacher, aber das tun sie eben nicht, wegen dem knallharten Wettbewerb in dem Geschäft. Deshalb ist unter Linux relativ wenig mit Hardwarebeschleunigung möglich wenn die Hersteller selbst keine Treiber liefern. Gleiches gilt fürs eigene OS, selbst Hardwarebeschleunigung zu nutzen kannst du da fast vergessen.
Über ports kann man lediglich die Standard VGA Modi nutzen, da sind die Ports und alles für alle Karten identisch, aber einfacher ist es das übers BIOS zu machen, und wenn du im PM bist, wäre es auch einfacher einen V86-Modus zu erstellen und darüber zu arbeiten.
Titel: Modus mit Ports setzten
Beitrag von: WhiteDragon am 21. October 2005, 13:53
Also ich habe ja auch vor einigen Wochen das Problem gehabt, dass bei mir das Einstellen des 80*50-Text-Modus über's BIOS nicht funktioniert (zumindest auf einem von drei Rechnern nicht). Daher wäre dieses "manuelle Setzen" für mich auch von Interesse. Das Assemblerscript aus dem Link sieht vielversprechend aus - danke schön!
Titel: Modus mit Ports setzten
Beitrag von: bitmaster am 21. October 2005, 14:07
Danke für die Antworten. Aber die haben mir leider nicht geholfe. Die Datei mode.asm habe ich assembliert und gelinkt. Aber der schaltet nicht in den 13h Modus. Der schreibt nur "Text 80*25" (im Textmodus) mehr nicht. Warum?  Unter dem anderen Link finde ich nichts brauchbares. Habt Ihr eine Erklärung (Doku) zu dem Thema Modi mit Ports wechseln? Wäre sehr dankbar.
Titel: Modus mit Ports setzten
Beitrag von: WhiteDragon am 21. October 2005, 15:55
Also ich könnte dir das Buch "PC Underground" empfehlen (deutschsprachig, trotz des Titels). Zwar alt, aber die Ports dazu sind gut erläutert. Sind allerdings einige Seiten und ich habe mir noch nie die Zeit genommen, es wirklich durchzuarbeiten.
Titel: Modus mit Ports setzten
Beitrag von: Homix am 22. October 2005, 21:19
hi,
Es gibt afaik einige hardwarebeschleunigte Funktionen, u.a. auch Auflösung ändern ect... im Linux Kernel Code zu ATI,nVidia,... Grakas, aber ich weiss nicht, inwiefern das funktioniert...

der VESA Mode wird ja auch mittels INT 0x10 initialisiert. Kann man dann nicht einfach den Quellcode des INT 0x10 vom Bios auslesen und auf 32-Bit portieren ?

cu,
stefan2005
Titel: Modus mit Ports setzten
Beitrag von: SSJ7Gohan am 22. October 2005, 22:23
Das geht schon, aber ich denke mal, das der VESA Code je nach Mainboard unterschiedlich aussehen wird :(
Titel: Modus mit Ports setzten
Beitrag von: Homix am 22. October 2005, 22:27
hi,
ja der Code kann je nach Bios variieren, aber eigentlich sollte jeder VESA code auf jedem Mainboard lauffähig sein, weil VESA ja eigentlich die Grafikkarte hauptsächlich anspricht und auf jedem Mainboard jede Grafikkarte funzt  :)

wenn ich mal zeit hab kann ich es ja mal ausprobieren  :D

cu,
stefan2005
Titel: Modus mit Ports setzten
Beitrag von: Jidder am 23. October 2005, 00:35
Zitat von: stefan2005
ja der Code kann je nach Bios variieren, aber eigentlich sollte jeder VESA code auf jedem Mainboard lauffähig sein, weil VESA ja eigentlich die Grafikkarte hauptsächlich anspricht und auf jedem Mainboard jede Grafikkarte funzt  :)

die schnittstelle zu den programmen ist überall gleich (int 10h), aber die schnittstelle zur grafikkarte kann je nach modell der grafikkarte stark varieren. vesa ist erst das, was die unterschiedlichen ansprechmöglichkeiten der grafikkarten vereinheitlichen soll. auf das was darunter liegt (=das was du beim disassemblieren von int 10h finden wirst), kann man sich nicht verlassen.
Titel: Modus mit Ports setzten
Beitrag von: SSJ7Gohan am 23. October 2005, 12:25
Ich denke mal, die VESA Spezifischen Sachen des INT 0x10 werden vom VGA BIOS und nicht vom BIOS verarbeitet.
Titel: Modus mit Ports setzten
Beitrag von: bitmaster am 23. October 2005, 14:29
Ich möchte im 286er Protected-Mode den Modus 13h setzten. Der Code soll auf alle PCs lauffähig sein mit denen auch der Modus 13h mittels int 10h gesetzt werden kann. Ist das möglich? Und wenn ja ist das auch machbar?

Danke!!!
Titel: Modus mit Ports setzten
Beitrag von: Jidder am 23. October 2005, 17:11
ja es ist möglich. ja es ist machbar.

ich mach es so:
mov dx, 0x3c2
mov al, 0x63
out dx, al ; outportb(0x3c2, 0x63)
mov dx, 0x3c4
mov al, 0x00
out dx, al ; outportb(0x3c4, 0x00)
mov dx, 0x3c5
mov al, 0x03
out dx, al ; outportb(0x3c5, 0x03)
mov dx, 0x3c4
mov al, 0x01
out dx, al ; outportb(0x3c4, 0x01)
mov dx, 0x3c5
mov al, 0x01
out dx, al ; outportb(0x3c5, 0x01)
mov dx, 0x3c4
mov al, 0x02
out dx, al ; outportb(0x3c4, 0x02)
mov dx, 0x3c5
mov al, 0x0f
out dx, al ; outportb(0x3c5, 0x0f)
mov dx, 0x3c4
mov al, 0x03
out dx, al ; outportb(0x3c4, 0x03)
mov dx, 0x3c5
mov al, 0x00
out dx, al ; outportb(0x3c5, 0x00)
mov dx, 0x3c4
mov al, 0x04
out dx, al ; outportb(0x3c4, 0x04)
mov dx, 0x3c5
mov al, 0x0e
out dx, al ; outportb(0x3c5, 0x0e)
mov dx, 0x3d4
mov al, 0x03
out dx, al ; outportb(0x3d4, 0x03)
mov dx, 0x3d5
in al, dx ; al = inportb(0x3d5)
out dx, al ; outportb(0x3d5, al)
mov dx, 0x3d4
mov al, 0x11
out dx, al ; outportb(0x3d4, 0x11)
mov dx, 0x3d5
in al, dx ; al = inportb(0x3d5)
out dx, al ; outportb(0x3d5, al)
mov dx, 0x3d4
mov al, 0x00
out dx, al ; outportb(0x3d4, 0x00)
mov dx, 0x3d5
mov al, 0x5f
out dx, al ; outportb(0x3d5, 0x5f)
mov dx, 0x3d4
mov al, 0x01
out dx, al ; outportb(0x3d4, 0x01)
mov dx, 0x3d5
mov al, 0x4f
out dx, al ; outportb(0x3d5, 0x4f)
mov dx, 0x3d4
mov al, 0x02
out dx, al ; outportb(0x3d4, 0x02)
mov dx, 0x3d5
mov al, 0x50
out dx, al ; outportb(0x3d5, 0x50)
mov dx, 0x3d4
mov al, 0x03
out dx, al ; outportb(0x3d4, 0x03)
mov dx, 0x3d5
mov al, 0x82
out dx, al ; outportb(0x3d5, 0x82)
mov dx, 0x3d4
mov al, 0x04
out dx, al ; outportb(0x3d4, 0x04)
mov dx, 0x3d5
mov al, 0x54
out dx, al ; outportb(0x3d5, 0x54)
mov dx, 0x3d4
mov al, 0x05
out dx, al ; outportb(0x3d4, 0x05)
mov dx, 0x3d5
mov al, 0x80
out dx, al ; outportb(0x3d5, 0x80)
mov dx, 0x3d4
mov al, 0x06
out dx, al ; outportb(0x3d4, 0x06)
mov dx, 0x3d5
mov al, 0xbf
out dx, al ; outportb(0x3d5, 0xbf)
mov dx, 0x3d4
mov al, 0x07
out dx, al ; outportb(0x3d4, 0x07)
mov dx, 0x3d5
mov al, 0x1f
out dx, al ; outportb(0x3d5, 0x1f)
mov dx, 0x3d4
mov al, 0x08
out dx, al ; outportb(0x3d4, 0x08)
mov dx, 0x3d5
mov al, 0x00
out dx, al ; outportb(0x3d5, 0x00)
mov dx, 0x3d4
mov al, 0x09
out dx, al ; outportb(0x3d4, 0x09)
mov dx, 0x3d5
mov al, 0x41
out dx, al ; outportb(0x3d5, 0x41)
mov dx, 0x3d4
mov al, 0x0a
out dx, al ; outportb(0x3d4, 0x0a)
mov dx, 0x3d5
mov al, 0x00
out dx, al ; outportb(0x3d5, 0x00)
mov dx, 0x3d4
mov al, 0x0b
out dx, al ; outportb(0x3d4, 0x0b)
mov dx, 0x3d5
mov al, 0x00
out dx, al ; outportb(0x3d5, 0x00)
mov dx, 0x3d4
mov al, 0x0c
out dx, al ; outportb(0x3d4, 0x0c)
mov dx, 0x3d5
mov al, 0x00
out dx, al ; outportb(0x3d5, 0x00)
mov dx, 0x3d4
mov al, 0x0d
out dx, al ; outportb(0x3d4, 0x0d)
mov dx, 0x3d5
mov al, 0x00
out dx, al ; outportb(0x3d5, 0x00)
mov dx, 0x3d4
mov al, 0x0e
out dx, al ; outportb(0x3d4, 0x0e)
mov dx, 0x3d5
mov al, 0x00
out dx, al ; outportb(0x3d5, 0x00)
mov dx, 0x3d4
mov al, 0x0f
out dx, al ; outportb(0x3d4, 0x0f)
mov dx, 0x3d5
mov al, 0x00
out dx, al ; outportb(0x3d5, 0x00)
mov dx, 0x3d4
mov al, 0x10
out dx, al ; outportb(0x3d4, 0x10)
mov dx, 0x3d5
mov al, 0x9c
out dx, al ; outportb(0x3d5, 0x9c)
mov dx, 0x3d4
mov al, 0x11
out dx, al ; outportb(0x3d4, 0x11)
mov dx, 0x3d5
mov al, 0x0e
out dx, al ; outportb(0x3d5, 0x0e)
mov dx, 0x3d4
mov al, 0x12
out dx, al ; outportb(0x3d4, 0x12)
mov dx, 0x3d5
mov al, 0x8f
out dx, al ; outportb(0x3d5, 0x8f)
mov dx, 0x3d4
mov al, 0x13
out dx, al ; outportb(0x3d4, 0x13)
mov dx, 0x3d5
mov al, 0x28
out dx, al ; outportb(0x3d5, 0x28)
mov dx, 0x3d4
mov al, 0x14
out dx, al ; outportb(0x3d4, 0x14)
mov dx, 0x3d5
mov al, 0x40
out dx, al ; outportb(0x3d5, 0x40)
mov dx, 0x3d4
mov al, 0x15
out dx, al ; outportb(0x3d4, 0x15)
mov dx, 0x3d5
mov al, 0x96
out dx, al ; outportb(0x3d5, 0x96)
mov dx, 0x3d4
mov al, 0x16
out dx, al ; outportb(0x3d4, 0x16)
mov dx, 0x3d5
mov al, 0xb9
out dx, al ; outportb(0x3d5, 0xb9)
mov dx, 0x3d4
mov al, 0x17
out dx, al ; outportb(0x3d4, 0x17)
mov dx, 0x3d5
mov al, 0xa3
out dx, al ; outportb(0x3d5, 0xa3)
mov dx, 0x3d4
mov al, 0x18
out dx, al ; outportb(0x3d4, 0x18)
mov dx, 0x3d5
mov al, 0xff
out dx, al ; outportb(0x3d5, 0xff)
mov dx, 0x3ce
mov al, 0x00
out dx, al ; outportb(0x3ce, 0x00)
mov dx, 0x3cf
mov al, 0x00
out dx, al ; outportb(0x3cf, 0x00)
mov dx, 0x3ce
mov al, 0x01
out dx, al ; outportb(0x3ce, 0x01)
mov dx, 0x3cf
mov al, 0x00
out dx, al ; outportb(0x3cf, 0x00)
mov dx, 0x3ce
mov al, 0x02
out dx, al ; outportb(0x3ce, 0x02)
mov dx, 0x3cf
mov al, 0x00
out dx, al ; outportb(0x3cf, 0x00)
mov dx, 0x3ce
mov al, 0x03
out dx, al ; outportb(0x3ce, 0x03)
mov dx, 0x3cf
mov al, 0x00
out dx, al ; outportb(0x3cf, 0x00)
mov dx, 0x3ce
mov al, 0x04
out dx, al ; outportb(0x3ce, 0x04)
mov dx, 0x3cf
mov al, 0x00
out dx, al ; outportb(0x3cf, 0x00)
mov dx, 0x3ce
mov al, 0x05
out dx, al ; outportb(0x3ce, 0x05)
mov dx, 0x3cf
mov al, 0x40
out dx, al ; outportb(0x3cf, 0x40)
mov dx, 0x3ce
mov al, 0x06
out dx, al ; outportb(0x3ce, 0x06)
mov dx, 0x3cf
mov al, 0x05
out dx, al ; outportb(0x3cf, 0x05)
mov dx, 0x3ce
mov al, 0x07
out dx, al ; outportb(0x3ce, 0x07)
mov dx, 0x3cf
mov al, 0x0f
out dx, al ; outportb(0x3cf, 0x0f)
mov dx, 0x3ce
mov al, 0x08
out dx, al ; outportb(0x3ce, 0x08)
mov dx, 0x3cf
mov al, 0xff
out dx, al ; outportb(0x3cf, 0xff)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x00
out dx, al ; outportb(0x3c0, 0x00)
mov al, 0x00
out dx, al ; outportb(0x3c0, 0x00)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x01
out dx, al ; outportb(0x3c0, 0x01)
mov al, 0x01
out dx, al ; outportb(0x3c0, 0x01)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x02
out dx, al ; outportb(0x3c0, 0x02)
mov al, 0x02
out dx, al ; outportb(0x3c0, 0x02)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x03
out dx, al ; outportb(0x3c0, 0x03)
mov al, 0x03
out dx, al ; outportb(0x3c0, 0x03)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x04
out dx, al ; outportb(0x3c0, 0x04)
mov al, 0x04
out dx, al ; outportb(0x3c0, 0x04)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x05
out dx, al ; outportb(0x3c0, 0x05)
mov al, 0x05
out dx, al ; outportb(0x3c0, 0x05)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x06
out dx, al ; outportb(0x3c0, 0x06)
mov al, 0x06
out dx, al ; outportb(0x3c0, 0x06)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x07
out dx, al ; outportb(0x3c0, 0x07)
mov al, 0x07
out dx, al ; outportb(0x3c0, 0x07)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x08
out dx, al ; outportb(0x3c0, 0x08)
mov al, 0x08
out dx, al ; outportb(0x3c0, 0x08)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x09
out dx, al ; outportb(0x3c0, 0x09)
mov al, 0x09
out dx, al ; outportb(0x3c0, 0x09)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x0a
out dx, al ; outportb(0x3c0, 0x0a)
mov al, 0x0a
out dx, al ; outportb(0x3c0, 0x0a)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x0b
out dx, al ; outportb(0x3c0, 0x0b)
mov al, 0x0b
out dx, al ; outportb(0x3c0, 0x0b)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x0c
out dx, al ; outportb(0x3c0, 0x0c)
mov al, 0x0c
out dx, al ; outportb(0x3c0, 0x0c)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x0d
out dx, al ; outportb(0x3c0, 0x0d)
mov al, 0x0d
out dx, al ; outportb(0x3c0, 0x0d)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x0e
out dx, al ; outportb(0x3c0, 0x0e)
mov al, 0x0e
out dx, al ; outportb(0x3c0, 0x0e)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x0f
out dx, al ; outportb(0x3c0, 0x0f)
mov al, 0x0f
out dx, al ; outportb(0x3c0, 0x0f)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x10
out dx, al ; outportb(0x3c0, 0x10)
mov al, 0x41
out dx, al ; outportb(0x3c0, 0x41)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x11
out dx, al ; outportb(0x3c0, 0x11)
mov al, 0x00
out dx, al ; outportb(0x3c0, 0x00)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x12
out dx, al ; outportb(0x3c0, 0x12)
mov al, 0x0f
out dx, al ; outportb(0x3c0, 0x0f)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x13
out dx, al ; outportb(0x3c0, 0x13)
mov al, 0x00
out dx, al ; outportb(0x3c0, 0x00)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x14
out dx, al ; outportb(0x3c0, 0x14)
mov al, 0x00
out dx, al ; outportb(0x3c0, 0x00)
mov dx, 0x3da
in al, dx ; al = inportb(0x3da)
mov dx, 0x3c0
mov al, 0x20
out dx, al ; outportb(0x3c0, 0x20)
Titel: Modus mit Ports setzten
Beitrag von: bitmaster am 23. October 2005, 17:39
:shock: muss ich testen
Titel: Modus mit Ports setzten
Beitrag von: bitmaster am 23. October 2005, 17:55
:shock:  :shock:  :shock:  :shock:  :shock:  Der zeichnet mir Fujitsu Siemens Computers (der Hersteller meines PC) zweimal nebeneinander in schlechter Grafik auf. Wie ist das möglich? So etwas habe ich ja noch nie gesehen. Jetzt musst du mir den Code aber erklären.

PS: Ich dachte schon das wäre der Code um nur in den Modus 13h zu springen. *erleichtert* Welchen Abschnitt davon benötige ich um nur in den Modus 13h zu springen aber nichts aus zu geben. Also das das passiert was ich im Real-Mode mit mov ax,0013h int 10h mache.

Danke!!!
Titel: Modus mit Ports setzten
Beitrag von: Jidder am 23. October 2005, 17:58
der code wechselt tatsächlich nur in den modus 13h. die grafik ist noch im ram drin gewesen.

edit: übrigens ist da ein kleiner fehler im code. aber vielleicht ist der nicht schlimm, weil das register, dass ich falsch beschreibe, noch mal überschreiben wird.
also der abschnitt um zeile 38 muss so lauten
in al, dx ; al = inportb(0x3d5)
or al, 0x80                                    ; + neu neu neu +
out dx, al ; outportb(0x3d5, al)
mov dx, 0x3d4
mov al, 0x11
out dx, al ; outportb(0x3d4, 0x11)
mov dx, 0x3d5
in al, dx ; al = inportb(0x3d5)
and al, 0x7f                                   ; + neu neu neu +

hab ich ganz vergessen, als ich den code entschlackt habe ...
Titel: Modus mit Ports setzten
Beitrag von: bitmaster am 23. October 2005, 19:11
So viel Code nur um den Modus 13h zu setzten. Na gut, dann bleibt dir wohl nichts anderes übrig als ihn mir zu erklären.

Danke!!!
Titel: Modus mit Ports setzten
Beitrag von: Jidder am 23. October 2005, 20:02
Zitat von: bitmaster
So viel Code nur um den Modus 13h zu setzten. Na gut, dann bleibt dir wohl nichts anderes übrig als ihn mir zu erklären.
lol, ganz sicher nicht. was soll das denn bringen? du wirst es eh nicht verstehen, wenn du nicht vorher anfängst bücher oder spezifikationen zu vga zu lesen und dich damit beschäftigst.
Titel: Modus mit Ports setzten
Beitrag von: bitmaster am 23. October 2005, 21:12
OK, du hast recht. Dann werde ich das mal tuen. Danke für deine (eure) Hilfe.
Titel: Modus mit Ports setzten
Beitrag von: WhiteDragon am 24. October 2005, 12:46
Hallo zusammen,

ich habe mir den Code von PorkChicken (Danke dafür!) mal genommen, bei mir getestet, vereinfacht (von 784 auf 188 Byte gekürzt) und kurz (!) kommentiert.

Hoffe, das hilft euch weiter.

Gruß!

mode320x200x256:
        ; Bit 0=1: CRTC-Register sollen (wegen Farbe) bei 0x3d4, 0x3d5 liegen.
        ; Bit 1=1: Zugriff der CPU auf VGA-RAM ermöglichen.
        ; Bit 3-2=00: 640 Pixel je Zeile.
        ; Bit 7-6=01: 400 Scanzeilen.
        mov     dx, 0x3c2
        mov     al, 0x63
        out     dx, al

        ; Ab hier nun die TS-Register 0 bis 4 setzen. Bemerkungen siehe Daten-Bytes.
        mov     dx, 0x3c4
        xor     bx, bx
.set_ts_regs:
        mov     ax, bx          ; TS-Register mit angegebenem Index setzen.
        out     dx, al
        inc     dx              ; Datenbyte in dieses Register schreiben.
        mov     al, [.ts_values + bx]
        out     dx, al
        dec     dx
        inc     bx
        cmp     bx, .end_ts_values - .ts_values
        jne     .set_ts_regs

        ; Test-Bit setzen, damit Register 0x10, 0x11 normal reagieren.
        mov     dx, 0x3d4
        mov     al, 0x03        ; CRTC-Register 3:
        out     dx, al          ; "end horizontal blanking register"
        mov     dx, 0x3d5
        in      al, dx
        or      al, 0x80
        out     dx, al

        ; Protection-Bit löschen, damit man auf CRTC-Register 0-7 schreibend zugreifen kann (Ausnahme: Register 7, Bit 4).
        mov     dx, 0x3d4
        mov     al, 0x11        ; CRTC-Register 17:
        out     dx, al          ; "vertical retrace end register"
        mov     dx, 0x3d5
        in      al, dx
        and     al, 0x7f
        out     dx, al

        ; Ab hier nun die CTRC-Register 0 bis 24 setzen. Bemerkungen siehe Daten-Bytes.
        mov     dx, 0x3d4
        xor     bx, bx
.set_crtc_regs:
        mov     ax, bx          ; CRTC-Register mit angegebenem Index setzen.
        out     dx, al
        inc     dx              ; Datenbyte in dieses Register schreiben.
        mov     al, [.crtc_values + bx]
        out     dx, al
        dec     dx
        inc     bx
        cmp     bx, .end_crtc_values - .crtc_values
        jne     .set_crtc_regs

        ; Ab hier nun die GDC-Register 0 bis 8 setzen. Bemerkungen siehe Daten-Bytes.
        mov     dx, 0x3ce
        xor     bx, bx
.set_gdc_regs:
        mov     ax, bx          ; GDC-Register mit angegebenem Index setzen.
        out     dx, al
        inc     dx              ; Datenbyte in dieses Register schreiben.
        mov     al, [.gdc_values + bx]
        out     dx, al
        dec     dx
        inc     bx
        cmp     bx, .end_gdc_values - .gdc_values
        jne     .set_gdc_regs

        ; ATC-Register Index 0 verwenden (Bit 0-4).
        ; Zugriff auf Paletten-RAM einschalten (Bit 5 auf 0), hierdurch wird Bild auf Rahmenfarbe geschaltet.
        ; -> Muss also später wieder auf 1 gesetzt werden!
        mov     dx, 0x3da       ; Lesezugriff auf "Input Status Register 1": Bewirkt, dass  der nächste Schreibzugriff auf 0x3c0
        in      al, dx          ; im Index-Modus stattfindet (wechselt beim Schreiben immer zwischen Index- und Daten-Modus).

        ; Jeweils in ATC-Register 0..15 die Farbwahl 0..15 eintragen.
        xor     ax, ax
        mov     dx, 0x3c0
        xor     ebx, ebx
.set_atc_regs:
        mov     ax, bx
        out     dx, al                          ; <- Index-Modus.
        mov     al, [.atc_values + bx]
        out     dx, al                          ; <- Daten-Modus.
        inc     bx
        cmp     bx, .end_atc_values - .atc_values
        jne     .set_atc_regs

        ; ATC-Register Index 32 verwenden (tja, wofür?!).
        mov     dx, 0x3c0
        mov     al, 0x20
        out     dx, al

        ; Weitere Registers:
        ; DAC - 0x3c6: Maske für Farben (sollte normalerweise auf 0xff stehen).
        ;       0x3c7: Zu lesende Farbe (Index).
        ;       0x3c8: Zu schreibende (verändernde) Farbe (Index).
        ;       0x3c9: Daten zum Lesen schreiben (immer abwechselnd rot, grün, blau, danach

        ret

.ts_values:
     db 0x03    ; Register  0: Keinen synchronen/asynchronen Reset ausführen.
     db 0x01    ; Register  1: Bildschirm ein, Latches normal laden, Zeichenbreite 8 Pixel. 640 Pixel horizontale Auflösung.
     db 0x0f    ; Register  2: Schreibzugriff auf alle 4 Planen aktivieren.
     db 0x00    ; Register  3: Font A und B liegen ab Offset 0.
     db 0x0e    ; Register  4: Chain4-Modus verwenden, Odd/Even-Modus deaktivieren, 256KByte Bildschirmspeicher.
.end_ts_values:

.crtc_values:
     db 0x5f    ; Register  0: 90 (0x5f - 5) Zeichen je Zeile setzen.
     db 0x4f    ; Register  1: 79 sichtbare Zeichen je Zeile.
     db 0x50    ; Register  2: Blanking-Periode (Abschaltung des Kathodenstrahls beim Zeilenaufbau) ab Position 80.
     db 0x82    ; Register  3: Test-Bit setzen, 0 Zeichen Vorausschau zur Darstellung, "horizontal blank end" Bit 0-4.
     db 0x54    ; Register  4: Horizontalen Retrace ab Zeichenposition 84 beginnen.
     db 0x80    ; Register  5: Bit 5 von "horizontal blank end" - ergibt gesamt 100010b (0x22 - 34).
     db 0xbf    ; Register  6: Gesamtzahl Rasterzeilen pro Bild Minus 2 (10-Bit-Register, hier Bits 0..7), 0x1bf -> 447.
     db 0x1f    ; Register  7: Overflow - Bits 8 und 9 verschiedener Vertikel-Register.
     db 0x00    ; Register  8: Rasterzeile, ab der die Darstellung begonnen wird.
     db 0x41    ; Register  9: Jede Zeile doppelt darstellen (also aus 400 nur noch 200 Zeilen machen).
     db 0x00    ; Register 10: Cursor aus, Cursor ab Rasterzeile 0 darstellen lassen.
     db 0x00    ; Register 11: Cursordarstellung endet bei Rasterzeile 0.
     db 0x00    ; Register 12: High-Startadresse der Bildschirmdarstellung im Bildschirmspeicher ist 0.
     db 0x00    ; Register 13: Low-Startadresse der Bildschirmdarstellung im Bildschirmspeicher ist 0.
     db 0x00    ; Register 14: High-Cursor-Offset ist 0.
     db 0x00    ; Register 15: Low-Cursor-Offset ist 0.
     db 0x9c    ; Register 16: Vertikaler Retrace beginnt bei Rasterzeile 412.
     db 0x0e    ; Register 17: Protection-Bit löschen, Ende des vertikalen Retrace setzen.
     db 0x8f    ; Register 18: Letzte Darzustellende Rasterzeile ist 399.
     db 0x28    ; Register 19: Abstand zweier Zeilen im Speicher: 40 (*8, wegen Doubleword-Modus).
     db 0x40    ; Register 20: Doubleword-Modus einschalten.
     db 0x96    ; Register 21: Kathodenstrahl ab vertikaler Position 406 abschalten.
     db 0xb9    ; Register 22: Vertikal-Blanking ab Rasterzeile 185 beenden.
     db 0xa3    ; Register 23: Takrate und Zeilenzähler normal.
     db 0xff    ; Register 24: Split-Screen ab Zeile 1023 (also gar nicht).
.end_crtc_values:

.gdc_values:
     db 0x00    ; Register  0: Set/Reset-Werte aller 4 Planen auf 0 schalten.
     db 0x00    ; Register  1: Set/Reset-Funktion für alle 4 Planen ausschalten.
     db 0x00    ; Register  2: Farbvergleichswerte für alle 4 Planen auf 0 setzen.
     db 0x00    ; Register  3: CPU-Bytes überschreiben Latches. Keine Rechtsrotation.
     db 0x00    ; Register  4: Bei Lesezugriff Plane 0 ansprechen.
     db 0x40    ; Register  5: 256-Farb-Modus, Lese- und Schreibmodus 0 aktivieren.
     db 0x05    ; Register  6: Bildschirmbereich startet mit 0xa0000 bis 0xaffff. Grafikmodus einschalten.
     db 0xff    ; Register  7: Alle 4 Planen für Farbvergleich in Lesemodus 1 setzen.
     db 0xff    ; Register  8: Maske für CPU-Bits.
.end_gdc_values:

.atc_values:
     db 0x00, 0x01, 0x02, 0x03  ; Register 0..15: Farbindizes 0 bis 15 festlegen.
     db 0x04, 0x05, 0x06, 0x07
     db 0x08, 0x09, 0x0a, 0x0b
     db 0x0c, 0x0d, 0x0e, 0x0f
     db 0x41                    ; Register 16: Halbierung des Sendens der Pixeldaten an DAC (Halbierung horizontale Auflösung), Grafikmodus des ATC verwenden.
     db 0x00                    ; Register 17: DAC-Farbe für Bildschirmrahmen setzen.
     db 0x0f                    ; Register 18: Alle 4 Planen einschalten.
     db 0x00                    ; Register 19: Keine Verschiebung des Gesamtbildes nach links.
     db 0x00                    ; Register 20: [Nur für Modi mit weniger als 256 Farben interessant.]
.end_atc_values:
Titel: Modus mit Ports setzten
Beitrag von: bitmaster am 24. October 2005, 14:15
Vielen dank für deine Mühe. Wenn ich in den Modus 13h mit dem 10h schalte dann ist automatisch der komplette Bildschirm schwarz. Also müsste ich zu deinem Code einfach folgendes hinzufügen damit er das gleiche wie der int 10h tut oder?:

push 0A000h
pop es
mov dx,03C8h ;Farbnummer
xor al,al ;Null
out dx,al
inc dx
out dx,al ;schwarz
out dx,al
out dx,al
xor di,di
mov cx,320*200/2
xor ax,ax
rep stosw ;zeichne Bildschirm schwarz

danke
Titel: Modus mit Ports setzten
Beitrag von: Jidder am 24. October 2005, 20:08
@WhiteDragon: Nicht schlecht. Respekt! Hast du echt meinen Code dafür genommen? Ich steig durch mein Teil nämlich selbst nicht durch (denn das Ding ist automatisch generiert), sondern würde mir das komplett neuerarbeiten, wenn ich es ändern müsste. ;)

@bitmaster: ja, aber ich glaube int 13h verändert nicht die palette, sondern akzeptiert es einfach, wenn der paletteneintrag 0 eine andere farbe darstellt. hab ich aber nicht getestet.
Titel: Modus mit Ports setzten
Beitrag von: bitmaster am 24. October 2005, 21:09
Zitat von: PorkChicken
@bitmaster: ja, aber ich glaube int 13h verändert nicht die palette, sondern akzeptiert es einfach, wenn der paletteneintrag 0 eine andere farbe darstellt. hab ich aber nicht getestet.
Na ist ja auch wurscht. Ich muss ja nicht ganz genau das machen wie der int 10h haubsache er schaltet in den 13h Modus im PM und fertig.
Titel: Modus mit Ports setzten
Beitrag von: WhiteDragon am 25. October 2005, 06:08
Meines Wissens stehen die ersten 16 Index-Farben (EGA-Farben) fest. Du brauchst schwarz also nicht mehr extra bestimmen.

@PorkChicken: Du sagtest "automatisch generiert": Womit bitte? Fände ich schon interessant!
Titel: Modus mit Ports setzten
Beitrag von: drccpp am 25. October 2005, 19:33
Zitat von: PorkChicken
Ich steig durch mein Teil nämlich selbst nicht durch (denn das Ding ist automatisch generiert), sondern würde mir das komplett neuerarbeiten, wenn ich es ändern müsste. ;)

Hey ProkChicken: Lass mich raten:
Du hast mit Bochs die Ausführung des BIOS-Interupts verfolgt und hast alle Instruktionen mit in und out rausgefiltert und hast es noch assemblierbar gemacht (vielleicht per Perl-Skript?). Ziemlich genial. Die Idee hatte ich auch mal. Hatte aber nichts weiter als die Idee. :lol:
hast sicher auch bemerkt das etliche Aufrufe für die Paletten-Konfiguration draufgehen. Ja so kommt man auch zum Ziel.
Und danach systematisiert das einer (WhiteDragon). Das nenne ich Hacker-evolution, und kooperative zusammenarbeit!!!
Titel: Modus mit Ports setzten
Beitrag von: Jidder am 25. October 2005, 19:53
das aus den BIOS ausrufen rauszufummeln wär mir ein wenig zu aufwändig. vor allem auf das herauszuoperieren aus dem "rauschen" (z.B. das laden der palette) hätte ich keine lust gehabt. ich habs mir ein bisschen einfacher gemacht.

ich hab diesen code hier genommen: http://my.execpc.com/~geezer/osd/graphics/modes.c

und die funktionen inportb und outportb durch meine eigenen ersetzt, die in etwa so aussahen:

int dx = 0xFFFF;

void outportb(int port, int value)
{
if(dx != port) {
dx = port;
printf("mov dx, 0x%x\n", port);
}
if(value < 256)
printf("mov al, 0x%02x\nout dx, al\t\t; outportb(0x%x, 0x%02x)\n", value, port, value);
else
printf("out dx, al\t\t; outportb(0x%x, al)\n", port);
}

int inportb(int port)
{
if(dx != port) {
dx = port;
printf("mov dx, 0x%x\n", port);
}
printf("in al, dx\t\t; al = inportb(0x%x)\n", port);
return 0x1337;
}

int main()
{
write_regs(g_320x200x256);
}


im grunde genommen also nur der aufruf von printf, der die assembler-befehle ausgibt. die globale variable dx sorgt dafür, dass das register dx nicht unnötig oft mit dem selben wert geladen wird und das restliche drumherum ("return 0x1337;" und "if(value > 256)...") ist dazu da um den sonderfall mit outportb(..., inportb(...)); zu behandeln. also nichts wirklich spektakuläres.

hier sieht man auch, warum ich das or al, 0x80 und and al, 0x7f vergessen habe: weil es nämlich nicht automatisch generiert wird. deswegen musste ich es von hand einfügen und ich hab es halt vergessen.
Titel: Modus mit Ports setzten
Beitrag von: WhiteDragon am 26. October 2005, 06:17
:shock:  :D  :P

Das ist echt zum Schießen: Du hast aus den Tabellen einzelne ASM-Befehle gemacht und ich pack das wieder in Tabellen rein...

Aber okay: Dann hab ich es ja offensichtlich korrekt gemacht.

Danke für den Code - dann kann ich mir die anderen Modi dort ja auch raus holen.

 :wink:
Titel: Modus mit Ports setzten
Beitrag von: Roshl am 26. October 2005, 17:21
setzte lieber dx immer neu, das ist billiger (bezogen auf die takte) als diese vielen compares.
Aber den Rückgabewert 1337(Leet) bei inportb finde ich lustig^^
Titel: Modus mit Ports setzten
Beitrag von: SSJ7Gohan am 26. October 2005, 17:52
Der Code der oben steht generiert den Code, den den Modus setzt. In dem generierten Code gibt es keine Compares.