diff --git a/src/Console.cc b/src/Console.cc new file mode 100644 index 0000000..ee0c197 --- /dev/null +++ b/src/Console.cc @@ -0,0 +1,49 @@ +/* Console.cc + * vim: set tw=80: + * Eryn Wells + */ +/** + * Implementation of the Console class. + */ + +#include "Console.hh" + +/** Create a VGA color pair. */ +static inline uint8_t +makeVGAColor(Console::Color fg, + Console::Color bg) +{ + return fg | bg << 4; +} + +/** Create a VGA character entry. */ +static inline uint16_t +makeVGAEntry(char c, + uint8_t color) +{ + uint16_t c16 = c; + uint16_t color16 = color; + return c16 | color16 << 8; +} + + +namespace kernel { + +Console::Console() + : mBase(0xB8000), + mCursor({0, 0}) +{ } + + +Console::clear(Console::Color color) +{ + const uint16_t color = makeVGAColor(Color::LightGray, Color::Blue); + for (size_t y = 0; y < Console::Height; y++) { + for (size_t x = 0; x < Console::Width; x++) { + const size_t index = y * Console::Width + x; + mBase[index] = makeVGAEntry(' ', color); + } + } +} + +} /* namespace kernel */ diff --git a/src/Console.hh b/src/Console.hh new file mode 100644 index 0000000..7579cc0 --- /dev/null +++ b/src/Console.hh @@ -0,0 +1,50 @@ +/* Console.hh + * vim: set tw=80: + * Eryn Wells + */ +/** + * Declaration of the Console class. Presents an API for a VGA console. + */ + +namespace kernel { + +struct Console +{ + enum class Color { + Black = 0, + Blue = 1, + Green = 2, + Cyan = 3, + Red = 4, + Magenta = 5, + Brown = 6, + LightGray = 7, + DarkGray = 8, + LightBlue = 9, + LightGreen = 10, + LightCyan = 11, + LightRed = 12, + LightMagenta = 13, + LightBrown = 14, + White = 15 + }; + + struct Cursor + { + size_t row, col; + }; + + static const size_t Width = 80; + static const size_t Height = 25; + + Console(); + + /** Clear the console to the provided color. */ + clear(Color color = Color::Black); + +private: + uint16_t *const mBase; + Cursor mCursor; +}; + +} /* namespace kernel */