| Zeile 1: | Zeile 1: | ||
| − | Die VESA BIOS Extensions (kurz: VBE) sind ein Standard der [[VESA]]. Er vereinheitlicht den Zugriff auf eine Grafikkarte | + | Die VESA BIOS Extensions (kurz: VBE) sind ein Standard der [[VESA]]. Er vereinheitlicht den Zugriff auf eine Grafikkarte und bietet dabei deutlich mehr Möglichkeiten als [[VGA]]. Der Standard wird von nahezu allen Grafikkarten in Version 2.0 oder der letzten Version, 3.0, unterstützt. '''Daher bezieht sich dieser Artikel, wenn nicht anders vermerkt, auf Version 2.0.''' |
== VBE Funktionen == | == VBE Funktionen == | ||
=== Allgemein === | === Allgemein === | ||
| − | Alle Funktionen der VBE sind im Grunde nur im [[Real Mode]] verfügbar. Die Funktionsnummer wird in AX übergeben, weitere Informationen in den anderen 16 Bit Registern. Jede VBE Funktion liefert einen Wert in AX zurück, der Fehlerinformationen darstellt: | + | Alle Funktionen der VBE sind im Grunde nur im [[Real Mode]] verfügbar (es gibt ein Protected-Mode-Interface, welches allerdings nur sehr spärlich unterstützt wird). Die Funktionsnummer wird in AX übergeben, weitere Informationen in den anderen 16-Bit-Registern. Jede VBE Funktion liefert einen Wert in AX zurück, der Fehlerinformationen darstellt: |
* 004Fh: Aufruf erfolgreich | * 004Fh: Aufruf erfolgreich | ||
* 014Fh: Fehler bei der Ausführung | * 014Fh: Fehler bei der Ausführung | ||
| Zeile 9: | Zeile 9: | ||
* 034Fh: Funktion im aktuellen Grafikmodus nicht unterstützt | * 034Fh: Funktion im aktuellen Grafikmodus nicht unterstützt | ||
Der Funktionaufruf erfolgt über den Interrupt 0x10. | Der Funktionaufruf erfolgt über den Interrupt 0x10. | ||
| − | Wenn durch irgendwelche Funktionen | + | Wenn durch irgendwelche Funktionen „FARPTR“ zurückgegeben werden, sind dies für den Real Mode immer DWORDs, im Segment:Offset-Format, im Protected Mode (nur bei der Verwendung des Protected-Mode-Interface) DWORDs im Selektor:Offset-Format (wobei ein 16-Bit-Selektor verwendet wird). |
=== Linear Frame Buffer === | === Linear Frame Buffer === | ||
Grundsätzlich stellt VBE zwei Speichermodelle zur Verfügung, um auf den Grafikkartenspeicher zuzugreifen: | Grundsätzlich stellt VBE zwei Speichermodelle zur Verfügung, um auf den Grafikkartenspeicher zuzugreifen: | ||
| − | * '''paged''': Der Speicher wird in mehrere sogenannte | + | * '''paged''': Der Speicher wird in mehrere sogenannte Fenster unterteilt, von denen immer nur eines in den Adressraum der CPU einblendet wird. Um den gesamten Grafikkartenspeicher zu adressieren, muss man zwischen den einzelnen Windows wechseln. Dieser Vorgang wird „Bank Switching“ genannt. |
| − | * '''flat''': Der gesamte Grafikkartenspeicher wird als sogenannter | + | * '''flat''': Der gesamte Grafikkartenspeicher wird als sogenannter „Linear Frame Buffer“ in den Adressraum der CPU eingeblendet. |
| − | Der LFB ist wohl eine der wichtigsten Neuerungen mit VBE 2.0. Mithilfe dieser Funktionalität kann man direkt auf den Grafikspeicher der Grafikkarte zugreifen und so viel schneller und einfacher Pixel zeichnen. Außerdem entfällt das lästige | + | Der LFB ist wohl eine der wichtigsten Neuerungen mit VBE 2.0. Mithilfe dieser Funktionalität kann man direkt auf den Grafikspeicher der Grafikkarte zugreifen und so viel schneller und einfacher Pixel zeichnen. Außerdem entfällt das lästige „Bank Switching“. Daher sollte man (und wird auch) einen Grafikmodus wählen, der den LFB unterstützt. |
=== Auf VBE-Unterstützung testen: 4F00h === | === Auf VBE-Unterstützung testen: 4F00h === | ||
| Zeile 26: | Zeile 26: | ||
!Offset | !Offset | ||
!Eintrag | !Eintrag | ||
| − | !Größe | + | !Größe in Byte |
!Beschreibung | !Beschreibung | ||
|- | |- | ||
|0 | |0 | ||
|Signatur | |Signatur | ||
| − | | | + | |4 |
|Hier sollte "VESA" stehen (=0x56455341) | |Hier sollte "VESA" stehen (=0x56455341) | ||
|- | |- | ||
|4 | |4 | ||
|Version | |Version | ||
| − | | | + | |2 |
| − | |0x0200 für | + | |BCD-kodiert: 0x0100 für 1.0, 0x0200 für 2.0, 0x0300 für 3.0 |
|- | |- | ||
|6 | |6 | ||
|Zeiger auf OEMString | |Zeiger auf OEMString | ||
| − | | | + | |4 (FARPTR) |
| | | | ||
|- | |- | ||
|10 | |10 | ||
| − | | | + | |Eigenschaften des Grafikcontrollers |
| − | | | + | |4 |
| | | | ||
| − | * Bit 2: RAMDAC | + | * Bit 2: RAMDAC-Operation: 0=Normal; 1=Leeres Bit benutzen bei großen Blöcken |
| − | * Bit 1: 0=Controller ist VGA kompatibel | + | * Bit 1: 0=Controller ist VGA-kompatibel |
| − | * Bit 0: DAC Breite: 0=6 Bits; 1=6 oder 8 Bits | + | * Bit 0: DAC-Breite: 0=6 Bits; 1=6 oder 8 Bits |
|- | |- | ||
|14 | |14 | ||
|Zeiger auf eine Liste mit unterstützten Grafikmodi | |Zeiger auf eine Liste mit unterstützten Grafikmodi | ||
| − | | | + | |4 (FARPTR) |
| − | |Diese Liste ist ein Array aus 16 Bit großen Einträgen, die | + | |Diese Liste ist ein Array aus 16 Bit großen Einträgen, die jeweils die Nummer eines unterstützten Modus sind. Der letzte Eintrag ist 0xFFFF. |
|- | |- | ||
|18 | |18 | ||
|Größe des Grafikspeichers | |Größe des Grafikspeichers | ||
| − | | | + | |2 |
| − | |Die Größe des Grafikspeichers in | + | |Die Größe des Grafikspeichers in 64-kB-Blöcken |
|- | |- | ||
|20 | |20 | ||
|OEMSoftwareRevision | |OEMSoftwareRevision | ||
| − | | | + | |2 |
| | | | ||
|- | |- | ||
|22 | |22 | ||
|Zeiger auf OEMVendorNameString | |Zeiger auf OEMVendorNameString | ||
| − | | | + | |4 (FARPTR) |
| | | | ||
|- | |- | ||
|26 | |26 | ||
|Zeiger auf OEMProductNameString | |Zeiger auf OEMProductNameString | ||
| − | | | + | |4 (FARPTR) |
| | | | ||
|- | |- | ||
|30 | |30 | ||
|Zeiger auf OEMProductRevision | |Zeiger auf OEMProductRevision | ||
| − | | | + | |4 (FARPTR) |
| | | | ||
|- | |- | ||
|34 | |34 | ||
|''reserviert'' | |''reserviert'' | ||
| − | |222 | + | |222 |
| | | | ||
|- | |- | ||
|256 | |256 | ||
|Datenbereich für OEMStrings | |Datenbereich für OEMStrings | ||
| − | |256 | + | |256 |
| | | | ||
|} | |} | ||
| − | Vor dem Aufruf sollte das Feld | + | Vor dem Aufruf sollte das Feld „Signatur“ mit dem Wert „VBE2“ gefüllt werden. |
=== Unterstützte Grafikmodi suchen === | === Unterstützte Grafikmodi suchen === | ||
| Zeile 102: | Zeile 102: | ||
| | | | ||
{| {{prettytable}} | {| {{prettytable}} | ||
| − | !Modus !! Auflösung ( | + | !Modus !! Auflösung (Breite×Höhe) !! Farbtiefe (Bit) |
|- | |- | ||
|0x100 || 640×400 || 8 | |0x100 || 640×400 || 8 | ||
| Zeile 138: | Zeile 138: | ||
| | | | ||
{| {{prettytable}} | {| {{prettytable}} | ||
| − | !Modus !! Auflösung ( | + | !Modus !! Auflösung (Breite×Höhe) !! Farbtiefe (Bit) |
|- | |- | ||
|0x110 || 640×480 || 15 | |0x110 || 640×480 || 15 | ||
| Zeile 174: | Zeile 174: | ||
|} | |} | ||
Mit VBE 2.0 hat man sich allerdings dafür entschieden, dass die Grafikkartenherrsteller einfach nur eine Funktion bereitstellen, die alle von der Grafikkarte unterstützten Modi auflistet. | Mit VBE 2.0 hat man sich allerdings dafür entschieden, dass die Grafikkartenherrsteller einfach nur eine Funktion bereitstellen, die alle von der Grafikkarte unterstützten Modi auflistet. | ||
| − | Den Zeiger auf diese Liste erhält man mit dem VBE Info Block (4F00h). Diese Liste ist eigentlich nur ein WORD-Array, also eine Hintereinaderreihung von | + | Den Zeiger auf diese Liste erhält man mit dem VBE Info Block (4F00h). Diese Liste ist eigentlich nur ein WORD-Array, also eine Hintereinaderreihung von 16-Bit-Nummern. Diese repräsentieren die von der Grafikkarte unterstützten Grafikmodi. Die Liste wird terminiert durch den Eintrag 0xFFFF. |
| − | Es wird empfohlen, sich nicht auf die o.g. Standardmodi zu verlassen, sondern durch Abfragen des Modeinfoblocks die Auflösung und anderen Eigenschaften der Modi aus der Modeliste herauszufinden. | + | Es wird empfohlen, sich nicht auf die o. g. Standardmodi zu verlassen, sondern durch Abfragen des Modeinfoblocks die Auflösung und anderen Eigenschaften der Modi aus der Modeliste herauszufinden. |
| − | === | + | === Informationen zu einem Grafikmodus: 4F01h === |
| − | Man durchläuft also die obige Liste der unterstützten | + | Man durchläuft also die obige Liste der unterstützten Modi und prüft dann mit folgender Funktion, welche Eigenschaften der entsprechende Grafikmodus besitzt: |
* AX = 4F01h | * AX = 4F01h | ||
* CX = Nummer des Grafikmodus | * CX = Nummer des Grafikmodus | ||
| Zeile 187: | Zeile 187: | ||
!Offset | !Offset | ||
!Eintrag | !Eintrag | ||
| − | !Größe | + | !Größe in Byte |
!Beschreibung | !Beschreibung | ||
|- bgcolor=chartreuse | |- bgcolor=chartreuse | ||
|0 | |0 | ||
|ModeAttributes | |ModeAttributes | ||
| − | | | + | |2 |
| | | | ||
*Bit 7: 0=kein LFB, 1=LFB verfügbar | *Bit 7: 0=kein LFB, 1=LFB verfügbar | ||
| Zeile 205: | Zeile 205: | ||
|2 | |2 | ||
|WinAAttributes | |WinAAttributes | ||
| − | | | + | |1 |
| | | | ||
| − | *Bit 2: 0= | + | *Bit 2: 0=Fenster nicht beschreibbar, 1=Fenster beschreibbar |
| − | *Bit 1: 0= | + | *Bit 1: 0=Fenster lesbar, 1=nicht lesbar |
| − | *Bit 0: 0=Reallozierung der | + | *Bit 0: 0=Reallozierung der Fenster nicht möglich, 1=ist möglich |
|- | |- | ||
|3 | |3 | ||
|WinBAttributes | |WinBAttributes | ||
| − | | | + | |1 |
|''siehe WinAAttributes'' | |''siehe WinAAttributes'' | ||
|- | |- | ||
|4 | |4 | ||
|WinGranularity | |WinGranularity | ||
| − | | | + | |2 |
| − | |in | + | |in kB |
|- | |- | ||
|6 | |6 | ||
|WinSize | |WinSize | ||
| − | | | + | |2 |
| − | | | + | |Fenstergröße in kB |
|- | |- | ||
|8 | |8 | ||
|WinASegment | |WinASegment | ||
| − | | | + | |2 |
| − | | | + | |Startsegment des A-Fensters (Real-Mode-Segment) |
|- | |- | ||
|10 | |10 | ||
|WinBSegment | |WinBSegment | ||
| − | | | + | |2 |
| − | | | + | |Startsegment des B-Fensters (Real-Mode-Segment) |
|- | |- | ||
|12 | |12 | ||
|WinFuncPtr | |WinFuncPtr | ||
| − | | | + | |4 (FARPTR) |
| − | |Zeiger auf die | + | |Zeiger auf die „Window Function“ |
|- bgcolor=crimson | |- bgcolor=crimson | ||
|16 | |16 | ||
|BytesPerScanLine | |BytesPerScanLine | ||
| − | | | + | |2 |
| − | | | + | |Anzahl der Bytes pro Zeile |
|- bgcolor=crimson | |- bgcolor=crimson | ||
|18 | |18 | ||
|XResolution | |XResolution | ||
| − | | | + | |2 |
|Horizontale Auflösung | |Horizontale Auflösung | ||
|- bgcolor=crimson | |- bgcolor=crimson | ||
|20 | |20 | ||
|YResolution | |YResolution | ||
| − | | | + | |2 |
|Vertikale Auflösung | |Vertikale Auflösung | ||
|- | |- | ||
|22 | |22 | ||
|XCharSize | |XCharSize | ||
| − | | | + | |1 |
|Breite eines Buchstabens (Textmodus) | |Breite eines Buchstabens (Textmodus) | ||
|- | |- | ||
|23 | |23 | ||
|YCharSize | |YCharSize | ||
| − | | | + | |1 |
|Höhe eines Buchstabens (Textmodues) | |Höhe eines Buchstabens (Textmodues) | ||
|- | |- | ||
|24 | |24 | ||
|NumberOfPlanes | |NumberOfPlanes | ||
| − | | | + | |1 |
| | | | ||
|- bgcolor=crimson | |- bgcolor=crimson | ||
|25 | |25 | ||
|BitsPerPixel | |BitsPerPixel | ||
| − | | | + | |1 |
|Bits pro Pixel (=Farbtiefe) | |Bits pro Pixel (=Farbtiefe) | ||
|- | |- | ||
|26 | |26 | ||
|NumberOfBanks | |NumberOfBanks | ||
| − | | | + | |1 |
| | | | ||
|- bgcolor=crimson | |- bgcolor=crimson | ||
|27 | |27 | ||
|Speichermodell | |Speichermodell | ||
| − | | | + | |1 |
| | | | ||
*00h = Text mode | *00h = Text mode | ||
| Zeile 296: | Zeile 296: | ||
|28 | |28 | ||
|BankSize | |BankSize | ||
| − | | | + | |1 |
| − | |in | + | |in kB |
|- | |- | ||
|29 | |29 | ||
|NumberOfImagePages | |NumberOfImagePages | ||
| − | | | + | |1 |
| − | |Anzahl der Images | + | |Anzahl der Images - 1 |
|- | |- | ||
|30 | |30 | ||
|Reserviert | |Reserviert | ||
| − | | | + | |1 |
|=1 | |=1 | ||
|- bgcolor=lightskyblue | |- bgcolor=lightskyblue | ||
|31 | |31 | ||
|RedMaskSize | |RedMaskSize | ||
| − | | | + | |1 |
|Anzahl der Bits, die den roten Farbanteil angeben (Speichermodell: direct color) | |Anzahl der Bits, die den roten Farbanteil angeben (Speichermodell: direct color) | ||
|- bgcolor=lightskyblue | |- bgcolor=lightskyblue | ||
|32 | |32 | ||
|RedFieldPosition | |RedFieldPosition | ||
| − | | | + | |1 |
|Position des ersten Bits ([[LSB]]), das den roten Farbanteil angibt | |Position des ersten Bits ([[LSB]]), das den roten Farbanteil angibt | ||
|- bgcolor=lightskyblue | |- bgcolor=lightskyblue | ||
|33 | |33 | ||
|GreenMaskSize | |GreenMaskSize | ||
| − | | | + | |1 |
| | | | ||
|- bgcolor=lightskyblue | |- bgcolor=lightskyblue | ||
|34 | |34 | ||
|GreenFieldPosition | |GreenFieldPosition | ||
| − | | | + | |1 |
| | | | ||
|- bgcolor=lightskyblue | |- bgcolor=lightskyblue | ||
|35 | |35 | ||
|BlueMaskSize | |BlueMaskSize | ||
| − | | | + | |1 |
| | | | ||
|- bgcolor=lightskyblue | |- bgcolor=lightskyblue | ||
|36 | |36 | ||
|BlueFieldPosition | |BlueFieldPosition | ||
| − | | | + | |1 |
| | | | ||
|- bgcolor=lightskyblue | |- bgcolor=lightskyblue | ||
|37 | |37 | ||
|RsvdMaskSize | |RsvdMaskSize | ||
| − | | | + | |1 |
| + | | | ||
| + | |- bgcolor=lightskyblue | ||
| + | |38 | ||
| + | |RsvdFieldPosition | ||
| + | |1 | ||
| | | | ||
|- | |- | ||
| − | | | + | |39 |
|DirectColorModeInfo | |DirectColorModeInfo | ||
| − | | | + | |1 |
| | | | ||
| − | *Bit 1: 0=Alle reservierten Bits in der Farbmaske dürfen | + | *Bit 1: 0=Alle reservierten Bits in der Farbmaske dürfen <i>nicht</i> benutzt werden, 1=dürfen benutzt werden |
| − | *Bit 0: 0=Color | + | *Bit 0: 0=Color-Ramp des DAC ist fest, 1=einstellbar |
|- bgcolor=chartreuse | |- bgcolor=chartreuse | ||
| − | | | + | |40 |
|PhysBasePtr | |PhysBasePtr | ||
| − | | | + | |4 |
| − | | | + | |Physische Adresse des LFB |
|- | |- | ||
| − | | | + | |44 |
|OffScreenMemOffset | |OffScreenMemOffset | ||
| − | | | + | |4 |
|Zeiger auf den Anfang des Teil des Grafikspeichers, der nicht auf dem Bildschirm zu sehen ist | |Zeiger auf den Anfang des Teil des Grafikspeichers, der nicht auf dem Bildschirm zu sehen ist | ||
|- | |- | ||
| − | | | + | |48 |
|OffScreenMemSize | |OffScreenMemSize | ||
| − | | | + | |2 |
| − | |in | + | |in kB |
|- | |- | ||
| − | | | + | |50 |
|Reserviert | |Reserviert | ||
|206 Bytes | |206 Bytes | ||
| Zeile 380: | Zeile 385: | ||
Nachdem man nun die gewünschte Grafikmodusnummer hat, muss man nur noch in diesen umschalten: | Nachdem man nun die gewünschte Grafikmodusnummer hat, muss man nur noch in diesen umschalten: | ||
* AX = 4F02h | * AX = 4F02h | ||
| − | * BX = | + | * BX = VBE-Grafikmodus: |
| + | ** Bits 0 – 8: Modusnummer | ||
| + | ** Bits 9 – 13: reserviert, Null setzen | ||
| + | ** Bit 14: Speichermodell: 0=Windowed (paged); 1=Linear (flat) | ||
** Bit 15: Löscht den Grafikspeicher, wenn gelöscht (VBE 3.0 garantiert nicht, das die Grafikkarte dies unterstützt) | ** Bit 15: Löscht den Grafikspeicher, wenn gelöscht (VBE 3.0 garantiert nicht, das die Grafikkarte dies unterstützt) | ||
| − | |||
| − | |||
== VBE im Protected Mode == | == VBE im Protected Mode == | ||
| − | + | {{TODO}} | |
| − | Mit VBE 2.0 wurde das sogenannte | + | Mit VBE 2.0 wurde das sogenannte „Protected-Mode-Interface“ eingeführt. Das sind Funktionen, die die Grafikkarte zur Verfügung stellt und die im Gegensatz zu den anderen Funktionen in 16/32-Bit-Protected-Mode-Code vorliegen. Die Adresse dieser Funktionen erhält man mit folgendem Aufruf, der allerdings immer noch im Real Mode stattfinden muss: |
*AX = 4F0Ah | *AX = 4F0Ah | ||
*BL = 00h | *BL = 00h | ||
| Zeile 400: | Zeile 406: | ||
|- | |- | ||
|0 | |0 | ||
| − | |Offset der | + | |Offset der „SetWindow“-Funktion |
|- | |- | ||
|2 | |2 | ||
| − | |Offset der | + | |Offset der „SetDisplayStart“-Funktion |
|- | |- | ||
|4 | |4 | ||
| − | |Offset der | + | |Offset der „SetPaletteData“-Funktion |
|- | |- | ||
|6 | |6 | ||
| − | |Offset auf eine Liste aller Ports und | + | |Offset auf eine Liste aller Ports und Adressen, auf die der Code zugreift |
|- | |- | ||
|8 | |8 | ||
| Zeile 420: | Zeile 426: | ||
Wenn man also mithilfe des LFB Zugriff auf den Grafikspeicher hat, dann zeichnet man ein Pixel folgendermaßen: | Wenn man also mithilfe des LFB Zugriff auf den Grafikspeicher hat, dann zeichnet man ein Pixel folgendermaßen: | ||
<c> | <c> | ||
| − | + | uint8_t* lfb = (uint8_t*) (uintptr_t) vbe_mode_info.phys_base_ptr; | |
void draw_pixel(unsigned int x, unsigned int y, unsigned int color) | void draw_pixel(unsigned int x, unsigned int y, unsigned int color) | ||
{ | { | ||
| − | lfb | + | *(uint32_t *)(lfb + y * vbe_mode_info.bytes_per_scan_line + x * 4) = color; |
} | } | ||
</c> | </c> | ||
| − | Wenn man allerdings das | + | (Funktioniert nur, wenn die Farbtiefe 32 Bits pro Pixel beträgt, bei VBE 3.0 lin_bytes_per_scan_line gleich bytes_per_scan_line ist und der LFB virtuell an der gleichen Stelle wie physisch liegt) |
| + | |||
| + | Wenn man allerdings das Paged-Modell verwendet, muss man erst den entsprechenden Teil des Grafikspeichers in den Adressraum blenden mithilfe des „Bank Switch“. | ||
=== im Real Mode === | === im Real Mode === | ||
| − | Im Real Mode kann man die obige Variante theoretisch auch verwenden, wenn der Grafikspeicher sich nicht oberhalb der | + | Im Real Mode kann man die obige Variante theoretisch auch verwenden, wenn der Grafikspeicher sich nicht oberhalb der 1-MB-Marke im Adressraum befindet (sonst wird mindestens der Unreal Mode benötigt). |
== VBE 3.0 == | == VBE 3.0 == | ||
| Zeile 461: | Zeile 469: | ||
== Weblinks == | == Weblinks == | ||
| − | * http://www.phatcode.net/res/221/files/vbe20.pdf | + | * http://www.phatcode.net/res/221/files/vbe20.pdf – VBE Spezifikation 2.0 |
| − | * http://www.petesqbsite.com/sections/tutorials/tuts/vbe3.pdf | + | * http://www.petesqbsite.com/sections/tutorials/tuts/vbe3.pdf – VBE Spezifikation Version 3.0 |
[[Kategorie:Glossar]] | [[Kategorie:Glossar]] | ||