

                       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.

