Autor Thema: Modus mit Ports setzten  (Gelesen 11181 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« 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!!!
In the Future everyone will need OS-64!!!

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #1 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.
Agieren statt Konsumieren!

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #2 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.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #3 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!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 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.
In the Future everyone will need OS-64!!!

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #5 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.

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #6 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

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 22. October 2005, 22:23 »
Das geht schon, aber ich denke mal, das der VESA Code je nach Mainboard unterschiedlich aussehen wird :(

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #8 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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 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.
Dieser Text wird unter jedem Beitrag angezeigt.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #10 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.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #11 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!!!
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #12 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)
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #13 am: 23. October 2005, 17:39 »
:shock: muss ich testen
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #14 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!!!
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #15 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 ...
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #16 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!!!
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #17 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.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #18 am: 23. October 2005, 21:12 »
OK, du hast recht. Dann werde ich das mal tuen. Danke für deine (eure) Hilfe.
In the Future everyone will need OS-64!!!

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #19 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:

 

Einloggen