Der VESA-Standard Das es im SVGA-Bereich keinen Standard gab, sondern jeder Her- steller sein eigenes Sppchen kochte, war fr die selben zum einen zwar ein Vorteil, da sie jede Freiheit genieen konnten, die sie wollten - sie muten sich an niemandem orientieren, zum anderen war es aber fr die Softwarehersteller und im End- effekt dann fr uns ein wahnsinniges Problem, all diese ver- schiedenen 'Standards' unter ein Dach zu bringen. Jede Karte hatte verschiedene Register, die fr verschiedene Aufgaben mi- braucht wurden. Jede Karte brauchte ihre eigene Routine zum setzen und auslesen von Punkten. Das fhrte bei Windows z.B. dazu, da jeder Hersteller seine eigenen Treiber mitliefern mute, um die Karte unter Windows in SuperVGA-Modus zu be- nutzen. Was mir daran berhaupt nicht gefllt, ist, da man dann auf die Treiber von anderen angewiesen ist. Baut der Hersteller dieser Karte einen langsamen Treiber zusammen, knnen die eigenen Routinen noch so schnell sein. Auerdem waren diese Treiber auch nur auf Windows zugeschnitten. Unter DOS war man immer noch aufgeschmissen. Zum Glck kamen nach einiger Zeit einige der wichtigsten Her- steller auf die Idee, einen Standard zu schaffen: den VESA - Standard. VESA steht fr Video Electronic Standard Association und das passende Komitee wurde von Firmen wie ATI, Genoa, Orchid, Paradise, Video Seven und einigen anderen groen Firmen auf- gebaut. Was versprach dieser Standard nun? Es sollte ein Hardware- unabhngiger Zugriff auf SVGA-Karten verschiedenster Hersteller ermglicht werden, ohne auf Treibersoftware angewiesen zu sein. Dazu wurde ein BIOS-Aufsatz erarbeitet, der entweder direkt auf der Karte hardwaremig installiert war oder, um auch ltere Karten nicht auszuschlieen, mittels Software dazu geladen wer- den konnte. Der Treiber blieb dann als TSR-Programm im Speicher und der Anwender mute sich um nichts Weiteres kmmern. Neben dieser Grundlage wurden noch einige andere Standards fest- gelegt. Zum einen 9 Grafikmodi. Im Gegensatz zu den normalen, bisher bestehenden Modi, hatten die VESA-Modi eine Nummer, die grer war als 100h bzw. 255d. Wie man diese einstellt kommt spter, nun ersteinmal die Modiliste: Auflsung Farbanzahl Modinummer 640 * 480 256 100h 640 * 480 256 101h 800 * 600 16 102h 800 * 600 256 103h 1024* 768 16 104h 1024* 768 256 105h 1280*1024 16 106h 1280*1024 256 107h 800 * 600 16 6Ah Auffllig ist nur der letzte Modus: Er hat eine Nummer, die klei- ner als 100h ist. Das liegt daran, da sich schon im Vorfeld des VESA-Standards diese Nummer eingebrgert hatte. Neben den Modi wurden noch sechs Funktionen implementiert: Funktionsnummer Aufgabe 00h Abfragen der Fhigkeiten der Grafikkarte 01h Abfragen der Kenndaten eines Modus 02h Grafikmodus einstellen 03h Grafikmodus abfragen 04h Status der Karte sichern/wiederherstellen 05h Zugriffsfenster auf Videospeicher festlegen/ abfragen Allgemeines: Zugang zum VESA-Treiber bekommt man ber die Funktion 4Fh des Video-Interrupts 10h. Die oben genannten Funktionsnummern sind Unterfunktionen von der Funktion 4Fh. Um eine dieser Unter- funktionen aufzurufen, mu man 4Fh ins AH und die Unterfunk- tionsnummer ins AL Register laden. Ein Aufruf des Interrupts 10h lst dann die Funktion aus. Ist die Funktion erfolgreich ausgefhrt worden, so findet man im AL Register nun den Wert 4Fh und in AH 00h. Sollte AH einen anderen Wert enthalten (vornehmlich 01h) oder AL nicht 4Fh aufweisen, so gilt der Auf- ruf als gescheitert. 00h: Mit dieser Funktion kann man die Leistungsfhigkeit der ange- schlossenen VGA-Karte abfragen. Zustzlich zum Wert 4Fh im AH und 00h im AL Register mu im Registerpaar ES:DI ein 256 Byte groer Puffer bereitgestellt werden. Hier werden nach dem Aufruf des Interrupts 10h verschiedene Infos abgelegt: Offset Bedeutung 00h Kennzeichnung 'VESA' 04h bergeordnete VESA-Versionsnummer 05h Untergeordnete VESA-Versionsnummer 06h FAR-Zeiger auf den Namen des Karten-Herstellers. 00h terminiert 0Ah Leistungsfhigkeitsflag - bisher allerdings ungenutzt, daher : 0000h 0Eh FAR-Zeiger auf die Liste der Modinummern der unter- sttzten Grafikmodi. Die wichtigste Info bietet sich mit dem FAR-Zeiger, der auf die Videomodi gerichtet ist. Hier liegen in WORD-Form hintereinander die Nummern der Modi. Dabei stehen hier nicht nur die Modi des VESA-Standards, sondern es finden sich auch die herstellerspe- zifischen, eigenen Grafikmodi. Das Ende dieser Liste ist durch den Eintrag FFFFh gekennzeichnet. 01h: ber diesen Unterfunktionsaufruf knnen bestimmte Fhigkeiten bzw. Infos ber die Grafikmodi herausgefunden werden. Dazu mu 4Fh im AH, 01h im AL und der gewnschte Grafikmodus im CX Register stehen, wobei dieser Modus in der Liste stehen, die mit der Unterfunktion 00h abgefragt werden kann. Das Registerpaar ES:DI mu einen 29 Byte groen Puffer kenn- zeichnen. Offset Bedeutung 00h Modus-Flag (s.u.) 02h Flag fr das erste Videofenster (s.u.) 03h Flag fr das zweite Videofenster (s.u.) 04h Granularitt in KB, mit der beide Fenster verschoben werden knnen 06h Grer beider Videofenster in KB 08h Segmentadresse des ersten Videofensters 0Ah Segmentadresse des zweiten Videofensters 0Ch FAR-Zeiger auf Routine zur Einstellung des sichtbaren Bereichs der beiden Videofenster 10h Anzahl der Bytes, die jede Zeile im Video-RAM belegt (optionale Informationen, siehe Modus-Flag) 12h X-Auflsung in Pixel/Zeichen 14h Y-Auflsung in Pixel/Zeichen 16h Breite eines Zeichens 17h Hhe eines Zeichens 18h Anzahl der Bit-Planes 19h Anzahl der Bits pro Pixel 1Ah Anzahl der Speicherblcke 1Bh Speichermodell 1Ch Gre der Speicherblcke in KB Das Flag-Byte fr das erste und zweite Fenster mu ausgewertet werden, da bei einigen Karten (hier ist also kein 100% Standard) der Videospeicher nur ber ein Fenster, in das man sowohl schreiben als auch aus ihm lesen kann oder ber zwei Fenster, wobei in das eine geschrieben und aus dem anderen gelesen werden kann, verfgt. Auch andere Kombinationen sind mglich. Normaler- weise kann man aber zumindest ber das erste Fenster lesen und schreiben. 7 6 5 4 3 2 1 0 X X X X X ? ? ? Bit 0 gibt an, ob dieses Fenster berhaupt verfgbar ist, wenn nicht, steht hier eine 0 - sonst eine 1. ber Bit 1 bekommt man heraus, ob der Lesezugriff ber dieses Fenster mglich ist (0 = nein, 1 = ja). Bit 2 gibt die gleiche Info ber den Schreibzugriff. Der Rest der Bits ist unbenutzt. Das Modus-Flag ist ein WORD-Bitfeld, das weitere Informationen ber den angegebenen Modus bereitstellt: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 X X X X X ? ? ? ? ? Die Bits 10 - 15 stehen immer auf eins und haben genau wie die Bits 5 - 9 keine Bedeutung. Das Bit 0 gibt an, ob der befragte Modus berhaupt mit dem angeschlossenen Monitor eingestellt werden kann. Wenn es gesetzt ist (1), dann ja, sonst nein (0). Bit 1 gibt an, ob die optionalen Informationen beim Offset 10h zurckgeliefert wurden (1 = ja, 0 = nein), normaler- weise stehen diese aber zur Verfgung. Bit 2 bietet Info darber, ob in dem Modus die BIOS-Text- Funktionen untersttzt werden (1 = ja, 2 = nein). Bit 3 steht auf 0, wenn der Modus ein monochrom Modus ist, sonst 1 fr Farbe. Bit 4 ist auf 0 gesetzt, wenn der Modus ein Textmodus ist. Bei 1 ist es ein Grafikmodus. An der Offsetadresse 1Bh findet sich Byte, das Aufschlu ber das verwendete Speichermodell liefert. Wert Bedeutung 00h Textmodus 01h CGA-Format, d.h. 2 oder 4 Speicherblcke 02h Hercules-Format mit 4 Speicherblcken 03h normales EGA/VGA-Format fr 16-Farben-Grafikmodi 04h Zwei Pixel 4 Bit pro Byte 05h normales EGA/VGA-Format fr 256-Farben-Grafikmodi 06h-0Fh reserviert 10h-FFh Herstellerspezifische Codes, bisher aber ungenutzt Ich kenne zwar selber keinen Modus, wo diese Tabelle von Bedeu- tung wre, aber Ihr vielleicht... Ein Wort zur Granularitt: Was es genau damit auf sich hat, erklre ich in einem Zusatzartikel, wo es darum geht, Punkte zu setzen. Hier sei nur folgendes dazu gesagt: Das Videosegment, das bei der Adresse A000h beginnt, mu man sich als eine Art Fenster in den eigentlichen Videospeicher der Grafikkarte vor- stellen, bei denen heute ja schon 1 MB als Standard vorhanden ist. Normalerweise kann man durch dieses Fenster auf die ersten 64 KB des Videospeichers auf der Karte 'begutachten' und mani- pulieren. Will man nun aber auf die zweiten 64 KB zugreifen, um z.B. im Modus 101h (640x480x256) auch Pixel zu setzen, die nach dem 65536. Pixel kommen (soviele passen in ein Segment), mu man dieses Fenster verschieben. Dann kann man z.B. die Pixel Nummer 65536 (wenn der erster Pixel Nummer '0' ist) bis Pixel Nummer 131071 setzen und auslesen (ich hoffe, ich habe mich jetzt nicht verrechnet). Um nun auch tatschlich die zweiten 64 KB in den Hauptspeicher ab A000h einzublenden, mssen wir die Granularitt kennen. Denn das Fenster kann nicht beliebig verschoben werden, sondern nur in bestimmten Schritten, z.B. in ein Kilobyte Schritten oder vielleicht sogar in 64 KB Schritten. Diese 'Schrittweite' wird Granu- laritt genannt. Steht an dem Offset 04h/05h des Puffers z.B. 32, so wird das Fenster in 32'er Schritten verschoben usw... 02h: Mit dieser Unterfunktion lt sich ein Modus aus der mit der Unterfunktion 00h herausgefundenen Liste einstellen. Dazu mu wie immer AH = 4Fh und AL=02h sein. Im BX Register mu sich die Nummer des Videomodus befinden. Dabei kann man noch mit dem Bit 15 (also das hchste Bit) angeben, ob der bisherige Inhalt des Videorams erhalten bleiben soll oder nicht. Ist es auf 1 ge- setzt, wird dieser nicht gelscht. Wozu das allerdings gut sein soll, wei ich nicht. 03h: Diese Unterfunktion ist das Gegenstck zu 02h. Es liefert nach dem Aufruf im BX Register den aktuellen Videomodus zurck. 04h: Mittels dieser Unterfunktion, die 3 weitere Unter-Unterfunktio- nen hat, lt sich der Betriebszustand der Grafikkarte sichern und wieder herstellen. Das ist z.B. von Nten, wenn sich ein TSR-Programm einschalten will, und spter aber wieder alles so hinterlassen will, wie es vorher war. Die Unter-Unterfunktionsnummer wird dabei immer ins DL-Register geladen. Die Unter-Unterfunktionsnummer 00h liefert im BX Register die Anzahl der 64-Byte-Speicherblcke zurck, die bentigt werden, um den Betriebszustand zu sichern. Dabei stellt ein CX ein Bit- feld dar, dessen Bits angeben, was alles gesichert werden soll. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 X X X X X X X X X X X X ? ? ? ? Wenn die Bits 0-3 gesetzt sind, geben sie an: Bit 0 : Status der Videohardware soll gesichert werden Bit 1 : Verschiedene Variablen aus dem BIOS-Datenbereich sollen gesichert werden Bit 2 : Die Register des DACs sollen gesichert werden Bit 3 : Der SVGA-Status soll gesichert werden Dabei ist zu beachten, da diese Unter-Unterfunktion nur den be- ntigten Platz berechnet. Wie gesagt, steht in BX nach dem Auf- ruf die Anzahl der 64-Byte-Speicherblcke. Das heit, diese Zahl mu noch mit 64 multipliziert werden, um auf die Byteanzahl zu kommen, die der Puffer umfassen mu. Mittels der UU-Funktion 01h lt sich nun der Betriebszustand auch tatschlich sichern. Dabei mu natrlich AH wieder 4Fh, AL = 04H und DL = 01h sein. Weiterhin wird CX wieder als oben genanntes Bitfeld interpretiert. Das Registerpaar ES:BX kenn- zeichnet den Puffer. Der Betriebszustand kann wieder hergestellt werden, indem die UU-Funktion 02h benutzt wird. Es luft alles so ab, wie bei 01h. 05h: Mit dieser Unterfunktion knnen die Zugriffsfenster verschoben werden. Neben der 'normalen' Registerbelegung wird in BX der Wert 0 erwartet, wenn man das erste Fenster und der Wert 1, wenn man das zweite Fenster verschieben will. In DX wird dann noch der Faktor in bezug auf die Granularitt erwartet, mit dem das Fenster verschoben werden soll. Ist die Granularitt z.B. 16, und man will die zweiten 64 KB zugnglich machen, so mu hier der Wert 4 stehen (4*16 = 64). Mit der Unterfunktion 05h kann man aber auch die Lage des Fenster in bezug auf den Videoram ermitteln. Dazu mu das BL Register wie oben beschrieben benutzt werden (0 = erstes Fenster, 1 = zweites Fenster), zustzlich mu Bit 7 vom BH Register (bzw. Bit 15 vom BX Register) auf eins gesetzt wer- den. Nach dem Aufruf von Interrupt 10h steht im DX Register dann die Lage in bezug auf die Granularitt. Da besonders in hochauflsenden Grafikmodi auf diese Funktion hufig zugegriffen werden mu, ist es auch mglich, die dafr zustndige Routine mittels einem Direkt-Far-Call anzuspringen, und somit die langsame Interrupt Lsung zu umgehen. Dafr liefert die Funktion 01h beim Offset 0Ch des Puffers die n- tige Sprungadresse. Allerdings kann man als Sprungadresse auch 0000h:0000h vorfinden, was soviel heit wie 'geht nicht'. So, damit habe ich glaube ich alles gesagt, was ich ber diesen Standard wei. Wie man gesehen hat, ist noch nicht alles 'stan- dardisiert', aber - man arbeitet daran. Mein gesamtes Wissen habe ich brigens PC intern 4 entnommen. Daher stammen auch einige bereinstimmungen mit diesem Buch. Zum Schlu will ich noch sagen, da meine eigene Grafikkarte noch wesentlich mehr VESA-Modi hat, als ich oben genannt habe. Das mag daran liegen, da der Hersteller mal wieder selber VESA-Nummern zugewiesen hat. Es knnte aber auch sein, da diese mitlerweile mit in den Standard aufgenommen wurden. Daher kommt hier eine Liste meiner Modi. Ihr knnt mal nachschauen, ob sie bei Euch ebenso funktionieren und wenn ja oder nein, mir diese mitteilen. Ich werde dann in der nchsten Ausgabe von MicroCode das Ergeb- nis dieser 'Umfrage' bekannt geben. Auflsung Farbanzahl Modinummer Art 132x 43 16 10Ah TEXT 132x 25 16 109h TEXT 800x 600 16 102h GRAFIK 800x 600 256 103h GRAFIK 1024x 768 16 104h GRAFIK 640x 480 256 101h GRAFIK 1024x 768 256 105h GRAFIK 640x 480 64K 111h GRAFIK 800x 600 64K 114h GRAFIK 640x 480 32K 110h GRAFIK 800x 600 32K 113h GRAFIK 1280x1024 16 106h GRAFIK 1280x1024 256 107h GRAFIK 320x 200 64K 10Eh GRAFIK 320x 200 16M 10Fh GRAFIK 640x 480 16M 112h GRAFIK 1024x 768 64K 117h GRAFIK So, jetzt reicht's aber wirklich. Wenn Ihr noch ein wenig mehr wissen wollt, dann schaut Euch den anderen Artikel an, in dem es ums Setzen und Auslesen von Punkten in diesen Modi geht. Kemil PS: Ich habe gerade eine Praxisstunde hinter mir und habe dabei festgestellt, da der 29 Byte groe Puffer, auf den ES:DI bei der Unterfunktion 01h zeigen mu, nicht ausreicht. Zumindest hngt sich mein Rechner jedesmal auf, wenn dieser nur 29 Byte gro ist. Ich benutze nun einen Puffer, der 256 Byte gro ist. Bisher hatte ich keine Probleme.