| Zeile 48: | Zeile 48: | ||
<c> | <c> | ||
| − | + | void printchar(uint8_t chr, uint8_t color, uint8_t x, uint8_t y) | |
| − | + | { | |
| − | + | uint16_t* off = (uint16_t*)0xB8000; | |
| − | + | // berechnen der Adresse | |
| − | + | off += y * 80 + x; // eine Multiplikation mit 2 darf hier nicht erfolgen, da off vom type uint16_t ist | |
| − | + | // setzen des zeichens + attributebyte | |
| − | + | *off = (((uint16_t)color) << 8) | chr; | |
| + | } | ||
</c> | </c> | ||
Nun folgt die Erklärung: | Nun folgt die Erklärung: | ||
| − | Mit der 1. Zeile wird ein Pointer auf den Textspeicher erzeugt. Der Dateityp ist | + | Mit der 1. Zeile wird ein Pointer auf den Textspeicher erzeugt. Der Dateityp ist uint16_t, also 2byte, damit wir das Zeichen und das Attributebyte gleichzeitig schreiben können (geht einfach schneller). Nun wird die Adresse ausgerechnet, mit der oben genannten Formel. Hätten wird vorhin uint8_t benutzt müssten wir jetzt noch mit 2 multiplizieren, da ja jedes Zeichen 2 Byte benutzt. Das Setzen des Zeichens machen wir, indem wir einfach das Attribute auf 16 Bit erweitern, dann eine Linksverschiebung von 8 Bit vornehmen und per logischen Oder mit dem Zeichenbyte verknüpfen. |
Achtung: Das Attributebyte kommt zwar immer nach dem Zeichenbyte, aber wir benutzen hier ein Word und arbeiten ja auf einem [http://de.wikipedia.org/wiki/Byte-Reihenfolge Little-Endian]-System. | Achtung: Das Attributebyte kommt zwar immer nach dem Zeichenbyte, aber wir benutzen hier ein Word und arbeiten ja auf einem [http://de.wikipedia.org/wiki/Byte-Reihenfolge Little-Endian]-System. | ||
| Zeile 78: | Zeile 79: | ||
<c> | <c> | ||
| − | + | void displaycursor(uint8_t col, uint8_t row) | |
| − | + | { | |
| − | + | uint16_t tmp; | |
| − | + | tmp = row * VIDEOTEXT_WIDTH + col; | |
| − | + | outb(0x3D4,14); | |
| − | + | outb(0x3D5,tmp >> 8); | |
| − | + | outb(0x3D4,15); | |
| − | + | outb(0x3D5,tmp); | |
| + | } | ||
</c> | </c> | ||
| Zeile 91: | Zeile 93: | ||
<c> | <c> | ||
| − | + | void removecursor() | |
| − | + | { | |
| − | + | outb(0x3D4,14); | |
| − | + | outb(0x3D5,0x07); | |
| − | + | outb(0x3D4,15); | |
| − | + | outb(0x3D5,0xD0); | |
| + | } | ||
</c> | </c> | ||