Textausgabe — Änderungen 7559 → 7564

Zeile 1: Zeile 1:
 
[[Category:Tutorials]]
 
[[Category:Tutorials]]
−
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.
  
 
Folgend wird nun beschrieben, wie man im Protected Mode Text auf dem Bildschirm ausgeben kann.
 
Folgend wird nun beschrieben, wie man im Protected Mode Text auf dem Bildschirm ausgeben kann.
Zeile 11: Zeile 11:
 
o steht für das Offset, z für die Zeile und s für die Spalte.
 
o steht für das Offset, z für die Zeile und s für die Spalte.
  
−
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]] darstelt.
+
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.
  
 
==Attribut-Byte==
 
==Attribut-Byte==
 
Das Attribute-Byte ist wie folgt aufgebaut:
 
Das Attribute-Byte ist wie folgt aufgebaut:
  
−
BXXXYYYYb, Hierbei ist X die Hintergrundfarbe, Y die Vordergrundfarbe und B das "Blinkbit". Ist es gesetzt, blinkt das entsprechende Zeichen. Hier ist eine Tabelle aller Farben:
+
BXXXYYYYb, Hierbei ist X die Hintergrundfarbe, Y die Vordergrundfarbe und B das „Blinkbit“. Ist es gesetzt, blinkt das entsprechende Zeichen. Hier ist eine Tabelle aller Farben:
  
 
{| {{Prettytable}}
 
{| {{Prettytable}}
Zeile 47: Zeile 47:
  
 
== Beispiel ==
 
== 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]]).  
  
 
<c>
 
<c>
Zeile 62: Zeile 62:
 
Erläuterung des Codes:
 
Erläuterung des Codes:
  
−
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.
+
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 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 logischem 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 77: Zeile 77:
  
 
== Cursor ==
 
== Cursor ==
−
Einigen wird schon aufgefallen sein, dass auf dem Bildschirm ein Unterstrich ist, wo keiner sein sollte. Also zumindest wo keiner im Textspeicher ist. Das ist der Bildschirmcursor, der vom BIOS zur Verfügung gestellt wird. Ich will nicht lange darauf eingehen, ich stelle nur eine Funktion zum Verschieben und zum "Löschen" des Cursors zur Verfügung. Ich selber benutze ihn nicht, da das Verschieben des Cursors wirklich lahm geht ([http://www.osdev.org/wiki/Text_Mode_Cursor "Keep in mind that in/out to VGA Hardware is a slow operation"]), es ist aber jedem selbst überlassen.
+
Einigen wird schon aufgefallen sein, dass auf dem Bildschirm ein Unterstrich ist, wo keiner sein sollte. Also zumindest wo keiner im Textspeicher ist. Das ist der Bildschirmcursor, der vom BIOS zur Verfügung gestellt wird. Ich will nicht lange darauf eingehen, ich stelle nur eine Funktion zum Verschieben und zum „Löschen“ des Cursors zur Verfügung. Ich selber benutze ihn nicht, da das Verschieben des Cursors wirklich lahm geht ([http://www.osdev.org/wiki/Text_Mode_Cursor “Keep in mind that in/out to VGA Hardware is a slow operation”]), es ist aber jedem selbst überlassen.
  
−
Hier eine Funktion zum Verschieben des Cursors (dies kann auch mit Int 0x10,0x02 gemacht werden). In dem Artikel [[I/O Ports]] wird genauer erklärt, was es mit den hier verwendeten I/O Ports auf sich hat.
+
Hier eine Funktion zum Verschieben des Cursors (dies kann im Real Mode auch mit Int 0x10,0x02 gemacht werden). In dem Artikel [[I/O Ports]] wird genauer erklärt, was es mit den hier verwendeten I/O Ports auf sich hat.
  
 
<c>
 
<c>
Zeile 93: Zeile 93:
 
</c>
 
</c>
  
−
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.&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:
  
 
<c>
 
<c>
Zeile 110: Zeile 110:
 
==Weblinks==
 
==Weblinks==
 
* [http://www.osdev.org/wiki/Text_UI Artikel aus der OSDevWiki]
 
* [http://www.osdev.org/wiki/Text_UI Artikel aus der OSDevWiki]
−
* [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]