diff options
Diffstat (limited to 'kernel/arch/i386/tmtty.cpp')
| -rw-r--r-- | kernel/arch/i386/tmtty.cpp | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/kernel/arch/i386/tmtty.cpp b/kernel/arch/i386/tmtty.cpp index 06eb578..d4dc772 100644 --- a/kernel/arch/i386/tmtty.cpp +++ b/kernel/arch/i386/tmtty.cpp @@ -10,17 +10,16 @@ static const size_t VGA_WIDTH = 80;
static const size_t VGA_HEIGHT = 25;
+static uint16_t* const VGA_MEMORY = (uint16_t*) 0xB8000;
size_t terminal_row;
size_t terminal_column;
uint8_t terminal_color;
uint16_t* terminal_buffer;
-void terminal_initialize(void) {
+void terminal_clear(void) {
terminal_row = 0;
terminal_column = 0;
- terminal_color = vga_entry_color(VGA_COLOR_WHITE, VGA_COLOR_BLACK);
- terminal_buffer = (uint16_t*) 0xB8000;
for (size_t y = 0; y < VGA_HEIGHT; y++) {
for (size_t x = 0; x < VGA_WIDTH; x++) {
const size_t i = y * VGA_WIDTH + x;
@@ -29,15 +28,10 @@ void terminal_initialize(void) { }
}
-void terminal_clear(void) {
- terminal_row = 0;
- terminal_column = 0;
- for (size_t y = 0; y < VGA_HEIGHT; y++) {
- for (size_t x = 0; x < VGA_WIDTH; x++) {
- const size_t i = y * VGA_WIDTH + x;
- terminal_buffer[i] = vga_entry(' ', terminal_color);
- }
- }
+void terminal_initialize(void) {
+ terminal_color = vga_entry_color(VGA_COLOR_WHITE, VGA_COLOR_BLACK);
+ terminal_buffer = VGA_MEMORY;
+ terminal_clear();
}
void terminal_setcolor(uint8_t color) {
@@ -49,18 +43,26 @@ void terminal_putentryat(char c, uint8_t color, size_t x, size_t y) { terminal_buffer[i] = vga_entry(c, color);
}
+void terminal_scroll() {
+ memmove(VGA_MEMORY, (VGA_MEMORY + VGA_WIDTH), (VGA_HEIGHT * VGA_WIDTH) - VGA_WIDTH);
+ memset(VGA_MEMORY + (VGA_WIDTH * VGA_HEIGHT) - VGA_WIDTH, 0x0, VGA_WIDTH * 2);
+ --terminal_row;
+}
+
void terminal_putchar(char c) {
- if (c == '\n') {
+ unsigned char uc = c;
+ if (uc == '\n') {
terminal_column = 0;
- ++terminal_row;
+ if (terminal_row++ == VGA_HEIGHT)
+ terminal_scroll();
return;
}
- terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
+ terminal_putentryat(uc, terminal_color, terminal_column, terminal_row);
if (++terminal_column == VGA_WIDTH) {
terminal_column = 0;
if (++terminal_row == VGA_HEIGHT) {
- terminal_row = 0;
+ terminal_scroll();
}
}
}
|
