screen: implement cursor positioning

This commit is contained in:
2025-11-20 20:13:45 +03:00
parent 0b0492e756
commit 1f90fb5825
2 changed files with 14 additions and 0 deletions
+1
View File
@@ -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_putchar(char c);
void terminal_write(const char* data, size_t size); void terminal_write(const char* data, size_t size);
void terminal_writestring(const char* data); void terminal_writestring(const char* data);
void update_cursor(int x, int y);
#endif #endif
+13
View File
@@ -1,6 +1,7 @@
// screen.c // screen.c
#include "../include/screen.h" #include "../include/screen.h"
#include "../include/string.h" #include "../include/string.h"
#include "../include/utils.h"
static size_t terminal_row; static size_t terminal_row;
static size_t terminal_column; static size_t terminal_column;
@@ -83,6 +84,7 @@ void terminal_putchar(char c)
if (c == 'H') { if (c == 'H') {
terminal_row = 0; terminal_row = 0;
terminal_column = 0; terminal_column = 0;
update_cursor(0, 0);
} }
terminal_state = STATE_NORMAL; terminal_state = STATE_NORMAL;
return; return;
@@ -109,6 +111,7 @@ void terminal_putchar(char c)
if (terminal_row >= VGA_HEIGHT) { if (terminal_row >= VGA_HEIGHT) {
terminal_scroll(); terminal_scroll();
} }
update_cursor(terminal_column, terminal_row);
} }
void terminal_write(const char* data, size_t size) void terminal_write(const char* data, size_t size)
@@ -121,3 +124,13 @@ void terminal_writestring(const char* data)
{ {
terminal_write(data, strlen(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));
}