screen: implement cursor positioning
This commit is contained in:
@@ -39,5 +39,6 @@ void terminal_putentryat(char c, uint8_t color, size_t x, size_t y);
|
||||
void terminal_putchar(char c);
|
||||
void terminal_write(const char* data, size_t size);
|
||||
void terminal_writestring(const char* data);
|
||||
void update_cursor(int x, int y);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// screen.c
|
||||
#include "../include/screen.h"
|
||||
#include "../include/string.h"
|
||||
#include "../include/utils.h"
|
||||
|
||||
static size_t terminal_row;
|
||||
static size_t terminal_column;
|
||||
@@ -83,6 +84,7 @@ void terminal_putchar(char c)
|
||||
if (c == 'H') {
|
||||
terminal_row = 0;
|
||||
terminal_column = 0;
|
||||
update_cursor(0, 0);
|
||||
}
|
||||
terminal_state = STATE_NORMAL;
|
||||
return;
|
||||
@@ -109,6 +111,7 @@ void terminal_putchar(char c)
|
||||
if (terminal_row >= VGA_HEIGHT) {
|
||||
terminal_scroll();
|
||||
}
|
||||
update_cursor(terminal_column, terminal_row);
|
||||
}
|
||||
|
||||
void terminal_write(const char* data, size_t size)
|
||||
@@ -121,3 +124,13 @@ void terminal_writestring(const char* data)
|
||||
{
|
||||
terminal_write(data, strlen(data));
|
||||
}
|
||||
|
||||
void update_cursor(int x, int y)
|
||||
{
|
||||
uint16_t pos = y * VGA_WIDTH + x;
|
||||
|
||||
outb(0x3D4, 0x0F);
|
||||
outb(0x3D5, (uint8_t) (pos & 0xFF));
|
||||
outb(0x3D4, 0x0E);
|
||||
outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF));
|
||||
}
|
||||
Reference in New Issue
Block a user