| Zeile 12: | Zeile 12: | ||
void main() { | void main() { | ||
// Textausgabe | // Textausgabe | ||
| − | screen << color::blue << "Willkommen im C++-TestKernel!"; | + | screen << background(color::red) << color::blue << "Willkommen im C++-TestKernel!"; |
} | } | ||
</cpp> | </cpp> | ||
| Zeile 46: | Zeile 46: | ||
}; | }; | ||
} | } | ||
| + | |||
| + | struct background | ||
| + | { | ||
| + | inline background(color::type color) | ||
| + | : m_color(color){} | ||
| + | |||
| + | color::type m_color; | ||
| + | }; | ||
class Video | class Video | ||
| Zeile 62: | Zeile 70: | ||
Video& operator << (const char* s); | Video& operator << (const char* s); | ||
| − | // | + | // Vordergrundfarbe setzen |
Video& operator << (color::type color); | Video& operator << (color::type color); | ||
| + | |||
| + | // Hintergrundfarbe setzen | ||
| + | Video& operator << (const background& color); | ||
// Ausgabe eines einzelnen Zeichens | // Ausgabe eines einzelnen Zeichens | ||
| Zeile 70: | Zeile 81: | ||
private: | private: | ||
// Zeiger auf den Videospeicher | // Zeiger auf den Videospeicher | ||
| − | unsigned short* | + | unsigned short* m_videomem; |
// Y-Position der Textausgabe, je volle Zeile +80 | // Y-Position der Textausgabe, je volle Zeile +80 | ||
| − | unsigned int | + | unsigned int m_off; |
// X-Position der Textausgabe, ab Zeilenanfang | // X-Position der Textausgabe, ab Zeilenanfang | ||
| − | unsigned int | + | unsigned int m_pos; |
// FB/BG-Farbe | // FB/BG-Farbe | ||
| − | unsigned int | + | unsigned int m_color; |
}; | }; | ||
| Zeile 98: | Zeile 109: | ||
Video::Video() | Video::Video() | ||
| − | : | + | : m_videomem((unsigned short*) 0xb8000), m_off(0), m_pos(0), m_color(0x0700) |
{ | { | ||
//Bildschirm leeren | //Bildschirm leeren | ||
| Zeile 110: | Zeile 121: | ||
// Füllen des Bildschirms mit Leerzeichen | // Füllen des Bildschirms mit Leerzeichen | ||
for(int i = 0;i < (80*25);i++) | for(int i = 0;i < (80*25);i++) | ||
| − | + | m_videomem[i] = (unsigned char)' ' | m_color; | |
// Zurücksetzen der Textausgabe nach links oben | // Zurücksetzen der Textausgabe nach links oben | ||
| − | + | m_pos = 0; | |
| − | + | m_off = 0; | |
} | } | ||
| Zeile 126: | Zeile 137: | ||
Video& Video::operator << (color::type color){ | Video& Video::operator << (color::type color){ | ||
| − | + | m_color = (static_cast<unsigned int>(color) << 8) | (m_color & 0xF000); | |
| + | return *this; | ||
| + | } | ||
| + | |||
| + | Video& Video::operator << (const background& color){ | ||
| + | m_color = (static_cast<unsigned int>(color.m_color) << 12) | (m_color & 0x0F00); | ||
return *this; | return *this; | ||
} | } | ||
| Zeile 132: | Zeile 148: | ||
void Video::put(char c){ | void Video::put(char c){ | ||
// Wenn die Textausgabe den rechten... | // Wenn die Textausgabe den rechten... | ||
| − | if( | + | if(m_pos >= 80){ |
| − | + | m_pos = 0; | |
| − | + | m_off += 80; | |
} | } | ||
// ...oder den unteren Bildschirmrand erreicht, gibt es | // ...oder den unteren Bildschirmrand erreicht, gibt es | ||
// einen Umbruch bzw. es wird aufgeräumt. | // einen Umbruch bzw. es wird aufgeräumt. | ||
| − | if( | + | if(m_off >= (80*25)) |
clear(); | clear(); | ||
// Setzen des Zeichens und der Farbe in den Videospeicher | // Setzen des Zeichens und der Farbe in den Videospeicher | ||
| − | + | m_videomem[m_off + m_pos] = (unsigned char)c | m_color; | |
| − | + | m_pos++; | |
} | } | ||
</cpp> | </cpp> | ||