...
This commit is contained in:
112
src/vga.c
112
src/vga.c
@@ -1,57 +1,20 @@
|
||||
#include "vga.h"
|
||||
#include "string.h"
|
||||
#include <stddef.h>
|
||||
|
||||
#define ROWS 25
|
||||
#define COLUMNS 80
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 character;
|
||||
u8 color;
|
||||
} vga_char;
|
||||
uint8_t character;
|
||||
uint8_t color;
|
||||
} vga_char_t;
|
||||
|
||||
vga_char* vga_buffer = (vga_char*)0xb8000;
|
||||
u8 cursor_row = 0;
|
||||
u8 cursor_col = 0;
|
||||
static vga_char_t* vga_buffer = (vga_char_t*)0xb8000;
|
||||
static uint8_t cursor_row = 0;
|
||||
static uint8_t cursor_col = 0;
|
||||
|
||||
void vga_set_char(u8 row, u8 col, vga_char character)
|
||||
{
|
||||
vga_buffer[COLUMNS * row + col] = character;
|
||||
}
|
||||
|
||||
vga_char vga_char_at(u8 row, u8 col)
|
||||
{
|
||||
return vga_buffer[COLUMNS * row + col];
|
||||
}
|
||||
|
||||
void vga_clear()
|
||||
{
|
||||
for (u8 row = 0; row < ROWS; row++)
|
||||
{
|
||||
for (u8 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(u8 row, u8 col)
|
||||
{
|
||||
if (row < ROWS && col < COLUMNS)
|
||||
{
|
||||
cursor_row = row;
|
||||
cursor_col = col;
|
||||
}
|
||||
}
|
||||
|
||||
void vga_print_char_colored(char character, vga_color_t color)
|
||||
void vga_put_char(char character, uint8_t color)
|
||||
{
|
||||
switch (character)
|
||||
{
|
||||
@@ -68,17 +31,16 @@ void vga_print_char_colored(char character, vga_color_t color)
|
||||
}
|
||||
case '\t':
|
||||
{
|
||||
u8 remainter = cursor_col % 4;
|
||||
uint8_t remainter = cursor_col % 4;
|
||||
cursor_col += remainter == 0 ? 4 : remainter;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
vga_char c = {
|
||||
vga_buffer[COLUMNS * cursor_row + cursor_col] = (vga_char_t){
|
||||
.character = character,
|
||||
.color = color,
|
||||
};
|
||||
vga_set_char(cursor_row, cursor_col, c);
|
||||
cursor_col += 1;
|
||||
break;
|
||||
}
|
||||
@@ -92,59 +54,39 @@ void vga_print_char_colored(char character, vga_color_t color)
|
||||
|
||||
if (cursor_row >= ROWS)
|
||||
{
|
||||
for (u8 row = 1; row < ROWS; row++)
|
||||
for (size_t row = 1; row < ROWS; row++)
|
||||
{
|
||||
for (u8 col = 0; col < COLUMNS; col++)
|
||||
for (size_t col = 0; col < COLUMNS; col++)
|
||||
{
|
||||
vga_set_char(row - 1, col, vga_char_at(row, col));
|
||||
vga_buffer[COLUMNS * row - 1 + col] = vga_buffer[COLUMNS * row + col];
|
||||
}
|
||||
}
|
||||
|
||||
for (u8 col = 0; col < COLUMNS; col++)
|
||||
for (size_t col = 0; col < COLUMNS; col++)
|
||||
{
|
||||
vga_char c = {
|
||||
vga_buffer[ROWS - 1 + col] = (vga_char_t){
|
||||
.character = ' ',
|
||||
.color = vga_default_color(),
|
||||
.color = VGA_LIGHT_GRAY | VGA_BLACK << 4,
|
||||
};
|
||||
vga_set_char(ROWS - 1, col, c);
|
||||
};
|
||||
|
||||
cursor_row = ROWS - 1;
|
||||
}
|
||||
}
|
||||
|
||||
void vga_print_colored(const char* string, vga_color_t color)
|
||||
void vga_clear()
|
||||
{
|
||||
for (u8 i = 0; string[i] != '\0'; i++)
|
||||
for (size_t row = 0; row < ROWS; row++)
|
||||
{
|
||||
vga_print_char_colored(string[i], color);
|
||||
for (size_t col = 0; col < COLUMNS; col++)
|
||||
{
|
||||
vga_buffer[COLUMNS * row - 1 + col] = (vga_char_t){
|
||||
.character = ' ',
|
||||
.color = VGA_LIGHT_GRAY | VGA_BLACK << 4,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void vga_print_success()
|
||||
{
|
||||
vga_print("[ ");
|
||||
vga_print_colored("success", VGA_GREEN);
|
||||
vga_print(" ]");
|
||||
}
|
||||
|
||||
void vga_print_error()
|
||||
{
|
||||
vga_print("[ ");
|
||||
vga_print_colored("error", VGA_RED);
|
||||
vga_print(" ]");
|
||||
}
|
||||
|
||||
void vga_print_uint(u32 value)
|
||||
{
|
||||
char buffer[11];
|
||||
uitoa(value, buffer);
|
||||
vga_print(buffer);
|
||||
}
|
||||
|
||||
void vga_print_int(i32 value)
|
||||
{
|
||||
char buffer[12];
|
||||
itoa(value, buffer);
|
||||
vga_print(buffer);
|
||||
cursor_row = 0;
|
||||
cursor_col = 0;
|
||||
}
|
||||
Reference in New Issue
Block a user