Video-RAM
Jede PC-Grafikkarte verfügt über einen eigenen Speicherbereich, das Video-RAM, mit dessen Hilfe der Bildschirminhalt programmiert werden kann. Im Grafikmodus müssen dazu für jeden Bildpunkt je nach der Anzahl der möglichen Farben ein oder mehrere Bits im Video-RAM gesetzt bzw. gelöscht werden. Im Textmodus genügt es dagegen, den ASCII-Code des gewünschten Zeichens zusammen mit dessen Darstellungsattributen in das Video-RAM zu übertragen. Die Umsetzung des ASCII-Codes in eine Pixelmatrix wird dann von der Grafikkarte eigenständig vorgenommen.
In dem Rechnerübung zu Betriebssystembau sollen alle Ausgaben im CGA-Textmodus erfolgen. Dieser Modus wird von fast allen Grafikkarten unterstützt, ist einfach zu programmieren und für das Übungsbetriebssystem vollkommen ausreichend.
Im CGA-Textmodus belegt jede Bildschirmposition zwei Bytes im Video-RAM. Das erste der beiden Bytes (gerade Offsetadresse) nimmt den ASCII-Code des darzustellenden Zeichens auf, das zweite (ungerade Offsetadresse) die gewünschte Vorder- und Hintergrundfarbe. Die Abbildung der Bildschirmpositionen auf die Einträge im Video-RAM erfolgt nach Zeilen und Spalten geordnet. Bei einer Auflösung von 80 Zeichen pro Zeile und 25 Zeilen belegt das Zeichen in der linken oberen Ecke die Bytes 0 und 1, das Zeichen rechts daneben die Bytes 2 und 3 und das Zeichen am Ende der ersten Zeile die Bytes 158 und 159. Die Zählung wird dann mit dem ersten Zeichen der zweiten Zeile fortgesetzt.
Da das Video-RAM in den Hauptspeicher des PCs eingeblendet ist, kann es mit Hilfe normaler Speicherzugriffe beschrieben werden. Offset 0 im Video-RAM wird mit (hexadezimal) b8000 addressiert.
Darstellungsattribute
Zu jedem Zeichen können die Merkmale Vordergrundfarbe, Hintergrundfarbe und Blinken einzeln festgelegt werden. Für diese Attribute steht pro Zeichen ein Byte zur Verfügung, dessen Bits folgende Bedeutung haben:
Darstellungsattribute | |
---|---|
Bits 0-3 | Vordergrundfarbe |
Bits 4-6 | Hintergrundfarbe |
Bit 7 | Blinken |
Im CGA-Textmodus stehen die folgenden 16 Farben zur Verfügung:
Farbpalette | |||
---|---|---|---|
0 | Schwarz | 8 | Dunkelgrau |
1 | Blau | 9 | Hellblau |
2 | Grün | 10 | Hellgrün |
3 | Cyan | 11 | Hellcyan |
4 | Rot | 12 | Hellrot |
5 | Magenta | 13 | Hellmagenta |
6 | Braun | 14 | Gelb |
7 | Hellgrau | 15 | Weiß |
Da für die Hintergrundfarbe im Attributbyte nur drei Bits zur Verfügung stehen, können auch nur die ersten acht Farben zur Hintergrundfarbe gewählt werden.
Kontrolle des Cursors
Um die aktuelle Cursorposition abfragen oder setzen zu können, muss der Videocontroller der Grafikkarte programmiert werden. Der Videocontroller der CGA-Karte stellt insgesamt 18 Steuerregister (8-Bit Wortbreite) zur Verfügung. Für die Cursorsteuerung sind hier nur die Steuerregister 14 und 15 interessant:
Index | Register | Bedeutung |
---|---|---|
14 | Cursor (high) | Zeichenoffset der Cursorposition |
15 | Cursor (low) |
Die Steuerregister können jedoch nicht direkt angesprochen werden. Der Zugriff erfolgt vielmehr indirekt über ein Index- und ein Datenregister. Dazu wird in das Indexregister zunächst die Nummer des Steuerregisters geschrieben, das gelesen oder geschrieben werden soll. Der eigentliche Zugriff auf den Inhalt des Steuerregisters (lesen/schreiben) erfolgt dann über das Datenregister.
Daten- und Indexregister können direkt mit Hilfe derin
und out
Befehle angesprochen werden, da ihnen eigenständige Portadressen zugeordnet sind:
Port | Register | Zugriffsart |
---|---|---|
0x3d4 | Indexregister | nur schreiben |
0x3d5 | Datenregister | lesen und schreiben |
Weiterführende Informationen und Referenzen
Wer etwas mehr zum Thema VGA-Grafikkarten-Programmierung lesen möchte, sei auf dasFreeVGA-Projektverwiesen.