Textausgabe — Änderungen 8225 → 8491

Zeile 1: Zeile 1:
 
Die Textausgabe ist für so gut wie jedes Programm eine wichtige Möglichkeit, dem User oder Programmierer Informationen über sich mitzuteilen bzw. generell Output auszugeben. Auch und gerade für ein Betriebssystem ist es auch schon in einer sehr frühen Phase wichtig, dass es Informationen per Textausgabe ausgeben kann um z. B. anzuzeigen, ob diverse Aufgaben gelungen sind oder nicht.
 
Die Textausgabe ist für so gut wie jedes Programm eine wichtige Möglichkeit, dem User oder Programmierer Informationen über sich mitzuteilen bzw. generell Output auszugeben. Auch und gerade für ein Betriebssystem ist es auch schon in einer sehr frühen Phase wichtig, dass es Informationen per Textausgabe ausgeben kann um z. B. anzuzeigen, ob diverse Aufgaben gelungen sind oder nicht.
 +
== Realmode ==
 
{{Tutorial
 
{{Tutorial
 
|Titel=Textausgabe ohne BIOS
 
|Titel=Textausgabe ohne BIOS
 
|Schwierigkeit=1
 
|Schwierigkeit=1
−
|Sprache=C
+
|Sprache=[[ASM]]
 +
}}
 +
 
 +
 
 +
/// ToDo
 +
 
 +
 
 +
 
 +
== Protected Mode ==
 +
{{Tutorial
 +
|Titel=Textausgabe ohne BIOS
 +
|Schwierigkeit=1
 +
|Sprache=[[C]]
 
}}
 
}}
−
== Anwendung ==
 
−
=== Protected Mode ===
 
 
Zur Ausgabe von Text gibt es einen 4 kB großen Speicher an der Adresse 0xB8000. Dieser Speicher kann linear angesprochen werden und benutzt 2 Byte pro Zeichen auf dem Bildschirm. Es ergeben sich also 80 Spalten (Zeichen pro Zeile) und 25 Zeilen, insgesamt also 2000 gleichzeitig darstellbare Zeichen.
 
Zur Ausgabe von Text gibt es einen 4 kB großen Speicher an der Adresse 0xB8000. Dieser Speicher kann linear angesprochen werden und benutzt 2 Byte pro Zeichen auf dem Bildschirm. Es ergeben sich also 80 Spalten (Zeichen pro Zeile) und 25 Zeilen, insgesamt also 2000 gleichzeitig darstellbare Zeichen.
 +
 +
=== Zeichenausgabe ===
  
 
Um nun auf dem Bildschirm ein Zeichen auszugeben, muss erstmal das Offset ausgerechnet werden, an dem das Zeichen steht. Da der Speicher linear ist geht das auch mit einer linearen Gleichung: o = z*80+s, wobei
 
Um nun auf dem Bildschirm ein Zeichen auszugeben, muss erstmal das Offset ausgerechnet werden, an dem das Zeichen steht. Da der Speicher linear ist geht das auch mit einer linearen Gleichung: o = z*80+s, wobei
Zeile 14: Zeile 27:
 
In dem ersten Byte wird der Buchstabe selbst, in dem 2. Byte wird das Attribut, also die Vorder- und Hintergrundfarbe gespeichert. Als Code wird [[Codepage 437]] verwendet, welche eine Erweiterung von [[ASCII]] darstellt.
 
In dem ersten Byte wird der Buchstabe selbst, in dem 2. Byte wird das Attribut, also die Vorder- und Hintergrundfarbe gespeichert. Als Code wird [[Codepage 437]] verwendet, welche eine Erweiterung von [[ASCII]] darstellt.
  
−
==== Attribute-Byte ====
 
 
Das Attribute-Byte ist wie folgt aufgebaut:
 
Das Attribute-Byte ist wie folgt aufgebaut:
  
Zeile 43: Zeile 55:
 
Häufig benutzt wird 0x07, <b style="color:#a8a8a8; background-color:#000000; border: 10px solid black">Hellgrau auf Schwarz.</b>
 
Häufig benutzt wird 0x07, <b style="color:#a8a8a8; background-color:#000000; border: 10px solid black">Hellgrau auf Schwarz.</b>
  
−
===== Blinken =====
 
 
Man kann sich nicht darauf verlassen, dass das höchstwertige Bit des Attributbytes wirklich anzeigt, ob das Zeichen blinken soll oder nicht. Bei einigen Computern ist dieses Bit einfach das höherwertige Bit der Hintergrundfarbe, sodass man hier auch helle Farben als Hintergrund verwenden kann.
 
Man kann sich nicht darauf verlassen, dass das höchstwertige Bit des Attributbytes wirklich anzeigt, ob das Zeichen blinken soll oder nicht. Bei einigen Computern ist dieses Bit einfach das höherwertige Bit der Hintergrundfarbe, sodass man hier auch helle Farben als Hintergrund verwenden kann.
  
 
Wie man die Bedeutung dieses Bits manuell bestimmen kann, steht im Artikel [[Color_Graphics_Adapter#16_Hintergrundfarben|Color Graphics Adapter]].
 
Wie man die Bedeutung dieses Bits manuell bestimmen kann, steht im Artikel [[Color_Graphics_Adapter#16_Hintergrundfarben|Color Graphics Adapter]].
  
−
==== Beispiel ====
+
 
 
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]]).  
  
Zeile 61: Zeile 72:
 
}
 
}
 
</c>
 
</c>
−
 
−
===== Erläuterung =====
 
  
 
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 74: Zeile 83:
 
  <<8      "
 
  <<8      "
 
  0x0700 | 0x41 = 0x0741
 
  0x0700 | 0x41 = 0x0741
−
 
  
 
=== Bildschirm scrollen ===
 
=== Bildschirm scrollen ===
Zeile 81: Zeile 89:
 
Das BIOS stellt ein Cursor zur Verfügung, dessen Verschiebung relativ lange dauert.([http://www.osdev.org/wiki/Text_Mode_Cursor “Keep in mind that in/out to VGA Hardware is a slow operation”])
 
Das BIOS stellt ein Cursor zur Verfügung, dessen Verschiebung relativ lange dauert.([http://www.osdev.org/wiki/Text_Mode_Cursor “Keep in mind that in/out to VGA Hardware is a slow operation”])
  
−
==== Verschieben des Cursors ====
+
'''Cursor verschieben'''
 +
 
 
Diese Funktion verschiebt den Cursor.
 
Diese Funktion verschiebt den Cursor.
 
<c>
 
<c>
Zeile 94: Zeile 103:
 
}
 
}
 
</c>
 
</c>
−
==== Löschen des Cursors ====
+
'''Löschen des Cursors'''
 
Wenn man den Cursor vom Bildschirm weg haben möchte, muss man ihn z.&nbsp;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.&nbsp;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:
−
===== Beispiel =====
+
 
 
<c>
 
<c>
 
void removecursor()
 
void removecursor()
Zeile 114: Zeile 123:
 
* [http://osdever.net/bkerndev/Docs/printing.htm “Printing to the Screen” Bran's Kernel Development Tutorial]
 
* [http://osdever.net/bkerndev/Docs/printing.htm “Printing to the Screen” Bran's Kernel Development Tutorial]
 
* [http://de.wikipedia.org/wiki/ASCII-Tabelle ASCII-Tabelle]
 
* [http://de.wikipedia.org/wiki/ASCII-Tabelle ASCII-Tabelle]
−
 
−
[[Category:Tutorials]]