This commit is contained in:
nub31
2025-08-24 00:29:04 +02:00
parent 3cc9ab2174
commit 336b4e1152
8 changed files with 178 additions and 147 deletions

111
src/vga.c Normal file
View File

@@ -0,0 +1,111 @@
#include "vga.h"
#define ROWS 25
#define COLUMNS 80
typedef struct
{
uint8_t character;
uint8_t color;
} vga_char;
vga_char* vga_buffer = (vga_char*)0xb8000;
uint8_t cursor_row = 0;
uint8_t cursor_col = 0;
void vga_set_char(uint8_t row, uint8_t col, vga_char character)
{
vga_buffer[COLUMNS * row + col] = character;
}
vga_char vga_char_at(uint8_t row, uint8_t col)
{
return vga_buffer[COLUMNS * row + col];
}
void vga_reset(void)
{
for (uint8_t row = 0; row < ROWS; row++)
{
for (uint8_t col = 0; col < COLUMNS; col++)
{
vga_char character = { .character = ' ', .color = vga_default_color() };
vga_set_char(row, col, character);
}
}
cursor_row = 0;
cursor_col = 0;
}
void vga_set_cursor_position(uint8_t row, uint8_t col)
{
if (row < ROWS && col < COLUMNS)
{
cursor_row = row;
cursor_col = col;
}
}
void vga_print_char(char character, vga_color_t color)
{
switch (character)
{
case '\n':
{
cursor_row += 1;
cursor_col = 0;
break;
}
case '\r':
{
cursor_col = 0;
break;
}
default:
{
vga_char c = { .character = character, .color = color };
vga_set_char(cursor_row, cursor_col, c);
cursor_col += 1;
break;
}
}
if (cursor_col >= COLUMNS)
{
cursor_col = 0;
cursor_row += 1;
}
if (cursor_row >= ROWS)
{
for (uint8_t row = 1; row < ROWS; row++)
{
for (uint8_t col = 0; col < COLUMNS; col++)
{
vga_set_char(row, col, vga_char_at(row - 1, col));
}
}
for (uint8_t col = 0; col < COLUMNS; col++)
{
vga_char character = { .character = ' ', .color = vga_default_color() };
vga_set_char(ROWS - 1, col, character);
};
cursor_row = ROWS - 1;
}
}
void vga_print_colored(const char* string, vga_color_t color)
{
for (uint8_t i = 0; string[i] != '\0'; i++)
{
vga_print_char(string[i], color);
}
}
void vga_print(const char* string)
{
vga_print_colored(string, vga_default_color());
}