C++-Kernel mit GRUB — Änderungen 6433 → 6435

Zeile 7: Zeile 7:
 
Da wir ja schon mit C++ arbeiten, wäre auch etwas OOP angebracht. Deshalb erstellen wir ein Klasse namens Video, die wir in einen Header stecken. Dadurch ist unsere kernel.cpp sehr übersichtlich:
 
Da wir ja schon mit C++ arbeiten, wäre auch etwas OOP angebracht. Deshalb erstellen wir ein Klasse namens Video, die wir in einen Header stecken. Dadurch ist unsere kernel.cpp sehr übersichtlich:
 
<cpp>
 
<cpp>
−
#include "Video.h" // Einbinden unseres Header
+
// Einbinden unseres Header
 +
#include "Video.h"
  
 
void main() {
 
void main() {
−
screen.color(0x7000); // Vordergrund schwarz, Hintergrund hellgrau
+
  // Vordergrund schwarz, Hintergrund hellgrau
−
screen.clear(); // Bildschirm leeren
+
  screen.color(0x7000);
−
screen << "Willkommen im C++-TestKernel!"; // Textausgabe
+
 
 +
  // Bildschirm leeren
 +
  screen.clear();
 +
 
 +
  // Textausgabe
 +
  screen << "Willkommen im C++-TestKernel!";
 
}
 
}
 
</cpp>
 
</cpp>
Zeile 26: Zeile 32:
 
class Video
 
class Video
 
{
 
{
−
public:
+
  public:
−
Video(); // Konstruktor
+
    // Konstruktor
−
~Video(); // Destruktor
+
    Video();
−
void clear(); // Leeren des Bildschirms, die Größe beträgt 80x25 Zeichen
+
 
−
Video& operator << (const char* s); // Textausgabe
+
    // Destruktor
−
void put(char c); // Ausgabe eines einzelnen Zeichens
+
    ~Video();
−
void color(int color); // Setzen der FG/BG-Farben
+
 
−
private:
+
    // Leeren des Bildschirms, die Größe beträgt 80x25 Zeichen
−
unsigned short* videomem; // Zeiger auf den Videospeicher
+
    void clear();
−
unsigned int off; // Y-Position der Textausgabe, je volle Zeile +80
+
 
−
unsigned int pos; // X-Position der Textausgabe, ab Zeilenanfang
+
    // Textausgabe
−
unsigned int screen_color; // FB/BG-Farbe
+
    Video& operator << (const char* s);
 +
 
 +
    // Ausgabe eines einzelnen Zeichens
 +
    void put(char c);
 +
 
 +
    // Setzen der FG/BG-Farben
 +
    void color(int color);
 +
 
 +
  private:
 +
    // Zeiger auf den Videospeicher
 +
    unsigned short* videomem;
 +
 
 +
    // Y-Position der Textausgabe, je volle Zeile +80
 +
    unsigned int off;
 +
 
 +
    // X-Position der Textausgabe, ab Zeilenanfang
 +
    unsigned int pos;
 +
 
 +
    // FB/BG-Farbe
 +
    unsigned int screen_color;
 
};
 
};
  
−
extern Video screen; // Globale Instanz der Video-Klasse, Definition in Video.cpp
+
// Globale Instanz der Video-Klasse, Definition in Video.cpp
 +
extern Video screen;
  
 
#endif
 
#endif
Zeile 55: Zeile 81:
  
 
Video::Video(){
 
Video::Video(){
−
screen_color = 0x0700; // Setzen der Farbe auf Hellgrau auf Schwarz
+
  // Setzen der Farbe auf Hellgrau auf Schwarz
−
pos = 0; // Setzen der Textausgabe auf
+
  screen_color = 0x0700;
−
off = 0; // links oben.
+
 
−
videomem = (unsigned short*) 0xb8000; // Startadresse des Videospeichers
+
  // Setzen der Textausgabe auf links oben.
 +
  pos = 0;
 +
  off = 0;
 +
 
 +
  // Startadresse des Videospeichers
 +
  videomem = (unsigned short*) 0xb8000;
 
}
 
}
  
Zeile 65: Zeile 96:
  
 
void Video::clear(){
 
void Video::clear(){
−
for(int i = 0;i < (80*25);i++)
+
  // Füllen des Bildschirms mit Leerzeichen
−
{
+
  for(int i = 0;i < (80*25);i++)
−
videomem[i] = (unsigned char)' ' | screen_color; // Füllen des Bildschirms mit Leerzeichen
+
    videomem[i] = (unsigned char)' ' | screen_color;
−
}
+
 
−
pos = 0; // Zurücksetzen der Textausgabe nach links oben
+
  // Zurücksetzen der Textausgabe nach links oben
−
off = 0;
+
  pos = 0;
 +
  off = 0;
 
}
 
}
  
 
Video& Video::operator << (const char* s){
 
Video& Video::operator << (const char* s){
−
while (*s != '\0'){
+
  // Für jedes einzelne Zeichen wird put() aufgerufen
−
put(*s++); // Für jedes einzelne Zeichen wird put() aufgerufen
+
  while (*s != '\0')
−
}
+
    put(*s++);
−
return *this;
+
 
 +
  return *this;
 
}
 
}
  
 
void Video::put(char c){
 
void Video::put(char c){
−
if(pos >= 80){ // Wenn die Textausgabe den rechten...
+
  // Wenn die Textausgabe den rechten...
−
pos = 0;
+
  if(pos >= 80){
−
off += 80;
+
    pos = 0;
−
}
+
    off += 80;
−
if(off >= (80*25)){ // ...oder den unteren Bildschirmrand erreicht, gibt es einen
+
  }
−
clear(); // Umbruch bzw. es wird aufgeräumt.
+
 
−
}
+
  // ...oder den unteren Bildschirmrand erreicht, gibt es
−
videomem[off + pos] = (unsigned char)c | screen_color; // Setzen des Zeichens und der Farbe in den Videospeicher
+
  // einen Umbruch bzw. es wird aufgeräumt.
−
pos++;
+
  if(off >= (80*25))
 +
    clear();
 +
 
 +
  // Setzen des Zeichens und der Farbe in den Videospeicher
 +
  videomem[off + pos] = (unsigned char)c | screen_color;
 +
  pos++;
 
}
 
}
  
 
void Video::color(int color){
 
void Video::color(int color){
−
screen_color = color;
+
  screen_color = color;
 
}
 
}
 
</cpp>
 
</cpp>