DVI-Grafikkarten, VGA-Modi und EDID-Tabellen

Auswahl, Einrichtung und Betrieb von Rechnern und Komponenten
Antworten
Benutzeravatar
ChrisR3tro
Administrator
Beiträge: 1981
Registriert: Mo 7. Mär 2005, 23:33
Wohnort: NRW
Kontaktdaten:

DVI-Grafikkarten, VGA-Modi und EDID-Tabellen

Beitrag von ChrisR3tro »

Warum oder mit welcher Logik die Grafikkarte unter DOS eine bestimmte Auflösung für den Monitor am DVI-Anschluss wählt habe ich nie ganz verstanden.

Unter Windows war mir relativ klar was passiert:
  • Windows liest über die Grafikkarte die sogenannte EDID-Tabelle des Monitors aus
  • Die Tabelle enthält gültige Auflösungen mit denen der Monitor betrieben werden kann.
  • Der Benutzer kann anschließend eine dieser Auflösung über irgendeinen Grafikeigenschaften-Dialog auswählen.
Unter DOS sieht das ganze etwas anders aus:

Hier wählt der Benutzer nichts. Vielmehr sind Auflösungen bzw. Timings u.a. durch die VGA-Spezifikation vorgegeben. Im Spiel ist zudem meist "hart verdrahtet", welcher "Legacy-Modus" gewählt wird. Dieser wird z.B. über BIOS-Interrupts) (typischerweise Int10h) initialisiert.

Aufhänger der ganzen Geschichte ist, dass ich mir einen neuen TFT-Monitor gekauft habe für Retro-Gaming. Dieser sollte das Seitenverhältnis 4:3 und eine möglichst hohe Auflösung haben, weil ich ihn evtl. auch für Win98-Spiele mal brauchen könnte. Der Samsung Syncmaster 204B war bei eBay für 10 EUR zu haben, also hab ich den genommen.

Das Ding ist nicht schlecht, es hat nur einen Nachteil: Die Daten in der EDID-Tabelle stimmen nicht. Die native Auflösung ist 1600x1200 aber die von Windows vorgeschlagene Auflösung ist 1024x768. Die höchste verfügbare Auflösung ist 1280x1024, eine 5:4-Auflösung, selten dämlich für einen 4:3-Monitor.

Woran liegt das? Das habe ich Google gefragt. Angeblich hat der Monitor einen Produktionsfehler und frühe Revisionen des Monitors haben die 1600er-Auflösung sogar noch über DVI angeboten. Allerdings kam der Monitor wohl mit der Bandbreite (Pixeltakt =~ 162 Mhz) über den DVI-Port nicht klar und hatte dann hin und wieder Bildaussetzer... aber das glaube ich natürlich erst wenn ich es selbst sehe. ;-)

Nebenbei konnte ich was darüber lernen, ob DVI für DOS-Gaming überhaupt sinnvoll ist. Meine bisherigen Erfahrungen zeigten mir, dass die meisten DVI-fähigen Grafikkarten einen 60Hz-Modus wählen. Unter DOS arbeiten viele (vor allem ältere) Spiele aber in einen 70Hz-Modus, undzwar genau 720x400@70Hz. Unter diesem Timing wird anscheinend alles Legacy-mäßige wie EGA, VGA, DOS-Text etc. betrieben. Wie genau, das weiß ich nicht. Vielleicht kann mir das jemand erklären, wie man von 320x200 auf 720x400 kommt...

Was passiert wenn man ein 70Hz-Spiel mit 60Hz betreibt? Ganz einfach, es führt in der Regel zu Framedrops, was sich als Ruckeln bemerkbar macht. Ein gutes Beispiel ist hier Doom, was bei 70hz butterweich läuft, bei 60Hz aber sichtbar ruckelt (für das geübte Auge).

Über VGA ging die 1600er-Auflösung übrigens ohne Probleme... :-) Ging das auch über DVI?
Meine Mission war also fortan: Die EDID-Tabelle korrigieren und neu flashen.

Noch was über EDID-Tabellen

Das Tool Phoenix EDID Designer war mir bei meinen Untersuchungen sehr hilfreich. Das ist ein Windows-Programm was den Inhalt der EDID-Tabelle verständlich darstellt und die Daten auch in eine Datei exportieren kann.

EDID-Tabellen enthalten eine Reihe von typischen IBM- bzw. VESA-Timings, die der Monitor unterstützen kann (sog. Established Timings):
Hier finden sich einige "Legacy-Modi" (IBM, VESA...)
Hier finden sich einige "Legacy-Modi" (IBM, VESA...)
phoenix2-esttim.png (18.2 KiB) 3899 mal betrachtet
Des weiteren gibt es eine vordefinierte Anzahl von Standard Timings:
Hier ist von Samsung ein Timing von 1280x1024 im Verhältnis 5:4 voreingestellt... bei einem 4:3 Monitor. D'OOH!
Hier ist von Samsung ein Timing von 1280x1024 im Verhältnis 5:4 voreingestellt... bei einem 4:3 Monitor. D'OOH!
phoenix3-stdtim.png (16.15 KiB) 3899 mal betrachtet
Und zu guter Letzt eine handvoll Detailed Timings:
Hier wird's eigentlich erst interessant.
Hier wird's eigentlich erst interessant.
phoenix4-pref.png (21.23 KiB) 3899 mal betrachtet
Hierbei handelt es sich um Einträge mit sehr genauen Angaben zu einem Timing. Von den Parametern her gleicht das beispielsweise einer Linux-Modeline. Wenn man ein wenig versteht wie Display Timings funktionieren, kann man eine solche Modeline in diese Parameter überführen.

Diese Daten liegen in einem EEPROM was normalerweise in der Nähe des DVI-Ports platziert ist. Das EEPROM hängt an einem I²C-Bus, der wiederum über den DVI-Anschluss rausgeführt wird. So gelangt Windows auch an die EDID-Tabelle.

Noch was über solche EEPROMs in Monitoren

Die EEPROMs können über den I²C-Bus natürlich nicht nur ausgelesen sondern auch geschrieben werden. Hierzu kursiert im Internet das DOS-Programm "DDC Write" (?) (... ddcw.exe). Der Autor ist mir leider unbekannt und der genaue Name auch. Vielleicht hat jemand genauere Infos?

Noch ein Haken an der Sache: Grundsätzlich sind die EDID-EEPROMs in Monitoren erstmal vor dem Überschreiben geschützt. Nur ganz wenige Monitore erlauben das Flashen grundsätzlich (und das hat in der Vergangenheit auch mal zu Fehlern geführt im Zusammenhang mit Windows Vista, ihr könnt ja mal googeln :-) . Manche Monitore widerum erlauben das Überschreiben wenn man einen Schalter im Service-Menü umlegt (etwa EDID Write Enable). Manchmal reicht es auch, das Service-Menü einfach nur zu aktivieren. Ich hatte zwar bereits durch Googeln herausgefunden wie ich ins Service-Menü komme, aber weder war dort eine entsprechende Option vorhanden, noch hat es gereicht, das Menü zu aktivieren...

Ok, let's do it the hard way then...

Viele der EEPROMs in Monitoren ähneln sich sehr. In den meisten Datenblättern wird ein Weg beschrieben, wie man durch Verbinden des sog. Write-Protect-Pins (WP#) mit Ground (alternativ mit Vcc) das Schreiben von außen erlauben oder sperren kann. Das Vorgehen ist hier schonmal unterschiedlich von EEPROM zu EEPROM. Bei meinem Monitor reicht es über einen Pulldown-Widerstand WP# mit Ground zu verbinden, was ich dann gemacht habe:
Rumgeprutscht?
Rumgeprutscht?
20170202_182528.jpg (235.77 KiB) 3898 mal betrachtet
Das ganze war mit reichlich Trial & Error verbunden.

1. wusste ich nicht welches der beiden EEPROMs in der nähe des DVI-Ports nun das richtige ist.
2. hatte ich ein Datenblatt nur zu einem der beiden gefunden.

Ich fing also mit dem EEPROM an, wozu ich ein Datenblatt hatte, aber es stellte sich heraus, dass das nichts gebracht hat. ddcw.exe quittierte meine Versuche mit "Update failed" - falsches EEPROM erwischt.

Für das zweite (rot einkreiste EEPROM) hatte ich kein Datenblatt, ich vermutete aber dass es baugleich mit dem AT24C02 von Atmel war. Nachdem ich den Mod hier über einen Widerstand (hier 2x2.2kOhm seriell) durchgeführt hatte, sagte ddcw.exe mir "Update successful". Bingo!

EDID-Tabelle reparieren

Bevor ich dazu kam, die Spieletauglichkeit unter DOS unter die Lupe zu nehmen, habe ich nun erstmal versucht, die kaputte EDID-Tabelle zu reparieren. Das bedeutet:
  • Nutzloses Standard-Timing mit 1280x1024 raus
  • Detailed Timing Block 1 (Preferred Timing) auf 1600x1200 setzen. Hierfür habe ich einfach ein Timing eines anderen vorhandenen 1600x1200 Monitors (Eizo S2100) kopiert.
  • Maximalen Pixeltakt erhöhen auf über 162 MHz.
Das alles ging über das Phoenix-Tool relativ einfach mit klickibunti. Es speichert die Tabelle in einer .dat-Datei, welche durch einen Texteditor mit ein paar simplen Anpassungen in das erwartete Format von ddcw.exe überführt werden konnte:

Code: Alles auswählen

EDID BYTES:
0x   00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    ------------------------------------------------
00 | 00 FF FF FF FF FF FF 00 4C 2D 61 01 00 00 00 00
10 | 14 0E 01 03 80 22 1B 78 2A EE 91 A3 54 4C 99 26
20 | 0F 50 54 BF EE 00 01 01 01 01 01 01 01 01 01 01
30 | 01 01 01 01 01 01 48 3F 40 30 62 B0 32 40 40 C0
40 | 13 00 52 0E 11 00 00 18 00 00 00 FC 00 43 72 61
50 | 70 6D 61 73 74 65 72 20 39 6B 00 00 00 FD 00 38
60 | 4B 1E 51 11 00 0A 20 20 20 20 20 20 00 00 00 10
70 | 00 53 79 6E 63 4D 61 73 74 65 72 0A 0A 0A 00 CB
Damit ddcw.exe das versteht, muss man eigentlich nur die Überschrift "EDID BYTES", sowie die Indexspalten und die Indexzeile entfernen. Am Ende bleiben nur die Hex-Bytes, getrennt durch Leerzeichen. Zeilenumbrüche bleiben auch.

Ergebnis der Aktion: Der Monitor macht nun ein gutes Bild unter Windows am DVI-Anschluss. Die von Windows vorgeschlagene Auflösung ist jetzt 1600x1200. Bisher keine Bildaussetzer. Das war also schonmal ein Erfolg!

Nun aber zurück zu DOS...

Noch was zu Auflösungen und Scaling

Meine Tests unter DOS zeigten, dass eigentlich folgendes passiert:
  • Die Grafikkarte liest beim Boot die EDID-Tabelle des Monitors aus
  • Es wird eine geeignete Auflösung (entweder ein Established Timing oder das Preferred Timing gewählt)
  • Die Logik nach der eine bestimmte Auflösung für DOS gewählt wird, ist abhängig von der Implementation im Grafikkarten-BIOS
  • Alle Legacy-Modi werden auf diese Auflösung skaliert und an den Monitor weitergegeben
  • Der Monitor skaliert die Auflösung auf Vollbild nach seiner einer eigenen Logik. Manche Monitore erlauben hier, das Scaling über das Menü abzuschalten, aber meistens wird's einfach auf Vollbild skaliert.
Was passiert nun konkret? Ein Beispiel...

Ein Monitor mit nativer Auflösung von 1600x1200 bei 60Hz hat das Preferred Timing 1024x768 (so wie es bei meinem Samsung der Fall war). Wählt nun ein Spiel (z.B. Doom) die Auflösung 320x200 mit 70Hz, wird diese zunächst von der Grafikkarte auf 1024x768 aufgeblasen. 10 Bilder pro Sekunde entfallen dabei, wegen 70Hz->60Hz. Zu guter Letzt skaliert der Monitor die 1024x768 nun auf seine native Auflösung von 1600x1200. Ich glaube wir sind uns einig: Doppeltes Scaling und Framedrops sind relativ suboptimal.

Für meine weiteren Tests habe ich drei Grafikkarten mit DVI-Anschluss im Programm:

* nVidia Quadro 4 (PCI)
* Number Nine SR9 (AGP, S3 Savage)
* Eine neuere GeForce FX Something (AGP)

Mit allen davon war es übrigens möglich, den Monitor zu flashen, selbst mit der Savage-Karte, welche eine der ersten Karten mit DVI war.

Damit DOS-Spiele richtig Spaß machen braucht man einfach die 70Hz. Und am besten skaliert die Grafikkarte direkt alles auf die native Auflösung. Die optimale Lösung wäre deswegen ein Preferred Timing von 1600x1200@70Hz. Das kann mein Monitor leider nicht leisten, der versagt ja angeblich schon bei seinem nativen Timing über DVI :-)

Komischerweise wählen die Grafikkarten nicht die neue 1600er-Auflösung aus meinem reparierten Detailed Timing, sondern immer eine geringere Auflösung von z.B. 1024x768, die dann vermutlich aus dem Bereich der Established Timings kommt, aber grundsätzlich am liebsten mit 60 Hz. Was ich also zunächst versucht habe war, alle 60Hz-Modi aus dem Bereich Established Timings herauszunehmen. Leider ohne Erfolg: Das Bild blieb nun sogar schwarz. :-(

Sobald ich aber ein Detailed-Timing kleiner als 1600x1200 spezifiziert habe, haben sich die Grafikkarten darauf eingeschossen. So war es mir nun auch möglich, sie dazu zu bringen, z.B. eine Auflösung von 1280x960@70Hz, 640x480@70Hz oder sogar 720x400@70Hz zu wählen. Dafür hab ich online ein paar Modelines gefunden, die ich dann zu einem EDID-tauglichen Timing umgewandelt habe. Dabei fiel auf, dass die Scaler-Einheit in der Savage-Karte ziemliche Skalierungsartefakte produzierte (vermutlich kann die nur ein krudes Nearest-Neighbour-Scaling und kein bilineares). Außerdem hatte sie das Bild oft nicht auf das von mir angegebene Timing skaliert, was sich dann in einem schwarzen Trauerrand oder Letterboxing (Balken oben/unten) manifestierte. Diese Karte kann ich wirklich nicht empfehlen. :-)

Anderer Ansatz: Grafikkarten-Skaling unterbinden, d.h. Preferred Timing auf 720x400@70Hz setzen.

Hier stehen noch einige Tests aus, aber anscheinend führt das dazu, dass z.B. Auflösungen wie 800x600 teilweise nicht mehr korrekt funktionieren. Außerdem ist es schwierig, hierzu Modelines zu finden.

Mein Fazit:

Wer DOS-Spiele über DVI spielt, muss mit Nachteilen rechnen. Grundsätzlich wählen Grafikkarten hier ein 60Hz-Timing was für die meisten älteren DOS-Games sehr schlecht ist. Deshalb empfehle ich jedem, der sich keinen CRT-Monitor hinstellen möchte, lieber den VGA-Anschluss zu nehmen. Hier entfallen einfach die ganzen Probleme welche ich oben besprochen habe. Der TFT-Monitor muss allerdings grundsätzlich 70Hz beherrschen. Das können anscheinend nicht alle, darauf müsst ihr also achten.

Viele Grüße
locutus
Benutzeravatar
wretch
DOS-Guru
Beiträge: 608
Registriert: So 5. Jul 2009, 13:09
Wohnort: Sachsen

Re: DVI-Grafikkarten, VGA-Modi und EDID-Tabellen

Beitrag von wretch »

Wow, sehr interessant und ausführlich. Danke für den Bericht.
Bis jetzt verwende ich noch einen meiner 21" CRTs für DOS und zum schnellen Testen einen TFT via VGA.
DVI gehört eben wirklich zur "Nach-DOS"-Zeit, da hat sich wohl niemand mehr wirklich einen Kopf darüber gemacht. Gerade sowas wie Framedrops - und damit ein vorgegaukeltes Ruckeln - würden mich auch stören.
Für die mobile DOS-Session zwischendurch behalte ich deshalb auch meinen alten Laptop mit 640x480 Pixel Display, da stimmen die Pixel dann meist genau im Verhältnis 1:2. Normale Desktop-TFTs mit dieser Auflösung gabs wohl keine ...
Immer noch auf der Suche nach einem Roland MPU-401/AT
und Spiele: STUNTS / 4D SPORTS DRIVING, HERETIC
Sheltem
Solitärspieler
Beiträge: 24
Registriert: Mo 23. Jan 2017, 03:49
Kontaktdaten:

Re: DVI-Grafikkarten, VGA-Modi und EDID-Tabellen

Beitrag von Sheltem »

Sorry aber das einzig wahre ist ein CRT. Dies musste ich auch leider lernen.
Hab einen 24" SONY GDM FW 900 und da geht eben nichts drüber. In Windows ME fährt der 1920x1200 mit 85Hz, bzw. 1600x1024 mit 100Hz. DOSBOX oder auch WINUAE (Amiga) kann man mit 1024x768 und 144HZ zocken und damit erledigt sich eigentlich auch Legacy DOS für alles was mit DOSBOX läuft , sieht einfach zu gut aus.

Bessere Farben als alle TFTs, die ich bisher gesehen habe (ich hab jetzt ganz neu noch Samsung C34F791 mit quantum dot und ich finde die Farben auf dem Sony immer noch besser ... Aber der Samsung ist näher rangekommen!) dann natürlich noch 0ms reaktionszeit und auch von Input Lag keine Spur :)
Ahja was fehlt noch, Schwarz ist Schwarz und Backlightbleeding gibts auch keins.

Natürlich kann der auch ganz normales DOS mit seinen 70Hz auf einem altern PC, sieht auch gut aus, aber dafür reicht dann echt ein 21" CRT.
Meine Empfehlung, Sony GDM 520 oder ein anderes Trinitron Gerät. Die gibts für unter 50€ bei Kleinanzeigen oder Auktionen. TFT sollte wirklich nicht sein

Lg,
Mein Hardwaremuseum zum anfassen und zocken besteht aus über 30 Rechnern und fast so vielen CRT Monitoren.

https://www.youtube.com/@TheRetroCave
Antworten