| Zeile 4: | Zeile 4: | ||
Im Realmode macht das BIOS diese Arbeit. | Im Realmode macht das BIOS diese Arbeit. | ||
Um ein Zeichen zu schreiben reicht folgender ASM-Code (für NASM): | Um ein Zeichen zu schreiben reicht folgender ASM-Code (für NASM): | ||
| − | <asm> | + | <syntaxhighlight lang=asm> |
mov ah, 0x0E ;Wir wollen schreiben | mov ah, 0x0E ;Wir wollen schreiben | ||
mov bh, 0x00 ;Auf den Bildschirm | mov bh, 0x00 ;Auf den Bildschirm | ||
mov al, "T" ;Das zu schreibende Zeichen | mov al, "T" ;Das zu schreibende Zeichen | ||
int 0x10 ;Ausführen | int 0x10 ;Ausführen | ||
| − | </ | + | </syntaxhighlight> |
Um einen ganzen Text zu schreiben gibt es folgenden Trick: | Um einen ganzen Text zu schreiben gibt es folgenden Trick: | ||
| − | <asm> | + | <syntaxhighlight lang=asm> |
Schreibe: ;Hier fängt die Funktion Schreibe an | Schreibe: ;Hier fängt die Funktion Schreibe an | ||
lodsb ;Zeichen laden nach al | lodsb ;Zeichen laden nach al | ||
| Zeile 23: | Zeile 23: | ||
Schreibeende: ;Bei Stringende wird hierher gesprungen: | Schreibeende: ;Bei Stringende wird hierher gesprungen: | ||
ret ;Die Funktion beenden | ret ;Die Funktion beenden | ||
| − | </ | + | </syntaxhighlight> |
Dann kann man einfach einen Text schreiben: | Dann kann man einfach einen Text schreiben: | ||
| − | <asm> | + | <syntaxhighlight lang=asm> |
mov si, Text ;Den Text unten | mov si, Text ;Den Text unten | ||
call Schreibe ;schreiben | call Schreibe ;schreiben | ||
| Zeile 34: | Zeile 34: | ||
; ,13,10 macht eine Neue Zeile | ; ,13,10 macht eine Neue Zeile | ||
; ,0 sagt das es hier aufhört (sonst würde zuviel geschrieben werden) | ; ,0 sagt das es hier aufhört (sonst würde zuviel geschrieben werden) | ||
| − | </ | + | </syntaxhighlight> |
Die Funktion INT 10/AH=0Eh erlaubt es nicht im Textmodus eine Farbe anzugeben. | Die Funktion INT 10/AH=0Eh erlaubt es nicht im Textmodus eine Farbe anzugeben. | ||
| Zeile 84: | Zeile 84: | ||
Hier ein kleines Beispiel einer Funktion, die ein Zeichen (chr), in der Farbe color auf den Bildschirm, an die Position x,y schreiben soll. Hierbei werden Steuerzeichen nicht beachtet bzw. als normales Zeichen auch ausgegeben (siehe [[Codepage 437]]). | Hier ein kleines Beispiel einer Funktion, die ein Zeichen (chr), in der Farbe color auf den Bildschirm, an die Position x,y schreiben soll. Hierbei werden Steuerzeichen nicht beachtet bzw. als normales Zeichen auch ausgegeben (siehe [[Codepage 437]]). | ||
| − | <c> | + | <syntaxhighlight lang=c> |
void printchar(uint8_t chr, uint8_t color, uint8_t x, uint8_t y) | void printchar(uint8_t chr, uint8_t color, uint8_t x, uint8_t y) | ||
{ | { | ||
| Zeile 93: | Zeile 93: | ||
*off = (((uint16_t)color) << 8) | chr; | *off = (((uint16_t)color) << 8) | chr; | ||
} | } | ||
| − | </ | + | </syntaxhighlight> |
Mit der 1. Zeile wird ein Pointer auf den Textspeicher erzeugt. Der Dateityp ist uint16_t, also 2 Byte, damit wir das Zeichen und das Attributebyte gleichzeitig schreiben können (geht einfach schneller). Nun wird mit der obengenannten Formel die Adresse ausgerechnet. Würde man uint8_t benutzen, müsste man dann mit 2 multiplizieren, denn jedes Zeichen benutzt 2 Byte. Man setzt das Zeichen, indem man das Attribute-Byte auf 16 Bit erweitern, dann eine Linksverschiebung von 8 Bit vornimmt und per logischem Oder mit dem Zeichenbyte verknüpft. | Mit der 1. Zeile wird ein Pointer auf den Textspeicher erzeugt. Der Dateityp ist uint16_t, also 2 Byte, damit wir das Zeichen und das Attributebyte gleichzeitig schreiben können (geht einfach schneller). Nun wird mit der obengenannten Formel die Adresse ausgerechnet. Würde man uint8_t benutzen, müsste man dann mit 2 multiplizieren, denn jedes Zeichen benutzt 2 Byte. Man setzt das Zeichen, indem man das Attribute-Byte auf 16 Bit erweitern, dann eine Linksverschiebung von 8 Bit vornimmt und per logischem Oder mit dem Zeichenbyte verknüpft. | ||
| Zeile 114: | Zeile 114: | ||
Diese Funktion verschiebt den Cursor. | Diese Funktion verschiebt den Cursor. | ||
| − | <c> | + | <syntaxhighlight lang=c> |
void displaycursor(uint8_t col, uint8_t row) | void displaycursor(uint8_t col, uint8_t row) | ||
{ | { | ||
| Zeile 124: | Zeile 124: | ||
outb(0x3D5,tmp); | outb(0x3D5,tmp); | ||
} | } | ||
| − | </ | + | </syntaxhighlight> |
'''Löschen des Cursors''' | '''Löschen des Cursors''' | ||
Wenn man den Cursor vom Bildschirm weg haben möchte, muss man ihn z. B. einfach in die 26. Zeile setzen (diese gibt es nämlich nicht). Das geht natürlich genau so wie in der eben genannten Funktion, aber dies hier ist die direkte Variante: | Wenn man den Cursor vom Bildschirm weg haben möchte, muss man ihn z. B. einfach in die 26. Zeile setzen (diese gibt es nämlich nicht). Das geht natürlich genau so wie in der eben genannten Funktion, aber dies hier ist die direkte Variante: | ||
| − | <c> | + | <syntaxhighlight lang=c> |
void removecursor() | void removecursor() | ||
{ | { | ||
| Zeile 136: | Zeile 136: | ||
outb(0x3D5,0xD0); | outb(0x3D5,0xD0); | ||
} | } | ||
| − | </ | + | </syntaxhighlight> |
== Siehe auch == | == Siehe auch == | ||