Say hello, kernel!

This commit is contained in:
Eryn Wells 2016-02-27 13:50:51 -05:00
parent d8c96e8eed
commit f750094b13
4 changed files with 66 additions and 6 deletions

View file

@ -32,20 +32,64 @@ makeVGAEntry(char c,
Console::Console() Console::Console()
: mBase(reinterpret_cast<uint16_t *>(0xB8000)), : mBase(reinterpret_cast<uint16_t *>(0xB8000)),
mCursor{0, 0} mCursor{0, 0},
mColor(makeVGAColor(Console::Color::LightGray, Console::Color::Black))
{ } { }
void void
Console::clear(Console::Color color) Console::clear(Console::Color color)
{ {
const uint16_t vgaColor = makeVGAColor(Color::LightGray, color); setColor(Color::LightGray, color);
for (size_t y = 0; y < Console::Height; y++) { for (size_t y = 0; y < Console::Height; y++) {
for (size_t x = 0; x < Console::Width; x++) { for (size_t x = 0; x < Console::Width; x++) {
const size_t index = y * Console::Width + x; putEntryAt(x, y, ' ', mColor);
mBase[index] = makeVGAEntry(' ', vgaColor);
} }
} }
} }
void
Console::writeChar(char c)
{
putEntryAt(mCursor.col, mCursor.row, c, mColor);
if (++mCursor.col == Console::Width) {
mCursor.col = 0;
if (++mCursor.row == Console::Height) {
mCursor.row = 0;
}
}
}
void
Console::writeString(const char *str)
{
// XXX: THIS IS VERY UNSAFE. PUT DOWN THE POINTER ERYN. NO BAD ERYN DONT YOU DARE.
const char *cur = str;
while (*cur != '\0') {
writeChar(*cur++);
}
}
void
Console::setColor(Console::Color fg,
Console::Color bg)
{
mColor = makeVGAColor(fg, bg);
}
/*
* Private
*/
void
Console::putEntryAt(size_t x,
size_t y,
char c,
uint8_t color)
{
const size_t index = y * Console::Width + x;
mBase[index] = makeVGAEntry(c, color);
}
} /* namespace kernel */ } /* namespace kernel */

View file

@ -46,9 +46,20 @@ struct Console
/** Clear the console to the provided color. */ /** Clear the console to the provided color. */
void clear(Color color = Color::Black); void clear(Color color = Color::Black);
/** Write a character to the terminal at the current cursor position. */
void writeChar(char c);
/** Write a string to the terminal at the current cursor position. */
void writeString(const char *str);
void setColor(Color fg, Color bg);
private: private:
uint16_t *const mBase; uint16_t *const mBase;
Cursor mCursor; Cursor mCursor;
uint8_t mColor;
void putEntryAt(size_t x, size_t y, char c, uint8_t color);
}; };
} /* namespace kernel */ } /* namespace kernel */

View file

@ -1,5 +1,6 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include "Console.hh"
#if defined(__linux__) #if defined(__linux__)
#error "This file should be compiled with a cross-compiler, not the Linux system compiler!" #error "This file should be compiled with a cross-compiler, not the Linux system compiler!"
@ -13,7 +14,11 @@
extern "C" extern "C"
void void
kearly() kearly()
{ } {
kernel::Console console;
console.clear(kernel::Console::Color::Blue);
console.writeString("Hello world!");
}
/** The beginning of the world... */ /** The beginning of the world... */

View file

@ -9,7 +9,7 @@ files = [
'boot.s', 'boot.s',
'crti.s', 'crti.s',
'crtn.s', 'crtn.s',
'main.cc', 'Main.cc',
'Console.cc' 'Console.cc'
] ]