| Zeile 129: | Zeile 129: | ||
Beispiel, das analog zum BIOS den Speicher in 8 Seiten unterteilt: | Beispiel, das analog zum BIOS den Speicher in 8 Seiten unterteilt: | ||
| − | < | + | <cpp>/* Unsere Auflösung */ |
#define ROWS 25 | #define ROWS 25 | ||
#define COLS 80 | #define COLS 80 | ||
| Zeile 161: | Zeile 161: | ||
* Das Setzen des Cursors wird im nächsten Abschnitt erläutert. | * Das Setzen des Cursors wird im nächsten Abschnitt erläutert. | ||
*/ | */ | ||
| − | }</ | + | }</cpp> |
==== Cursor Address ==== | ==== Cursor Address ==== | ||
| Zeile 169: | Zeile 169: | ||
Beispiel: | Beispiel: | ||
| − | < | + | <cpp>/* Unsere Auflösung */ |
#define ROWS 25 | #define ROWS 25 | ||
#define COLS 80 | #define COLS 80 | ||
| Zeile 188: | Zeile 188: | ||
outb(0x3D4, 14); | outb(0x3D4, 14); | ||
outb(0x3D5, (cursor_address >> 8) & 0xff); | outb(0x3D5, (cursor_address >> 8) & 0xff); | ||
| − | }</ | + | }</cpp> |
=== 16 Hintergrundfarben === | === 16 Hintergrundfarben === | ||
| Zeile 194: | Zeile 194: | ||
=== Vertical Sync === | === Vertical Sync === | ||
Bit 3 des Status Registers (Port 0x3DA) wird von der Grafikkarte genau dann gesetzt, wenn der Monitor sich im Vertical Retrace Mode befindet. Das heißt dann ist der Elektronenstrahl gerade deaktiviert und wird wieder von unten nach oben bewegt, um ein weiteres Bild darzustellen. Dieses Bit ist besonders bei der Darstellung von Grafikmodi z.B. in Spielen oder graphischen Oberflächen interessant. Wenn man darauf wartet, dass dieses Bit gesetzt ist, bevor man beginnt in den Grafikspeicher zu schreiben, verhindert man, dass der Monitor mitten in der Darstellung eines Bildes andere Daten vorgesetzt bekommt. Dadurch lässt sich verhindern, dass das Bild bei horizontalen Bewegungen zerissen erscheint. Der Code dafür könnte z.B. so aussehen: | Bit 3 des Status Registers (Port 0x3DA) wird von der Grafikkarte genau dann gesetzt, wenn der Monitor sich im Vertical Retrace Mode befindet. Das heißt dann ist der Elektronenstrahl gerade deaktiviert und wird wieder von unten nach oben bewegt, um ein weiteres Bild darzustellen. Dieses Bit ist besonders bei der Darstellung von Grafikmodi z.B. in Spielen oder graphischen Oberflächen interessant. Wenn man darauf wartet, dass dieses Bit gesetzt ist, bevor man beginnt in den Grafikspeicher zu schreiben, verhindert man, dass der Monitor mitten in der Darstellung eines Bildes andere Daten vorgesetzt bekommt. Dadurch lässt sich verhindern, dass das Bild bei horizontalen Bewegungen zerissen erscheint. Der Code dafür könnte z.B. so aussehen: | ||
| − | < | + | <cpp>// Direkt vor dem Zeichnen aufrufen |
// (besser: direkt vor dem Kopieren des Double Buffers) | // (besser: direkt vor dem Kopieren des Double Buffers) | ||
void vsync() | void vsync() | ||
| Zeile 200: | Zeile 200: | ||
do {} while (inb(0x3DA) & 8) != 0); // warten, wenn der vsync bereits läuft | do {} while (inb(0x3DA) & 8) != 0); // warten, wenn der vsync bereits läuft | ||
do {} while (inb(0x3DA) & 8) == 0); // warten während der Monitor darstellt | do {} while (inb(0x3DA) & 8) == 0); // warten während der Monitor darstellt | ||
| − | }</ | + | }</cpp> |
== Textausgabe == | == Textausgabe == | ||