os3/stage1/screen.c
John Stefanelli 7a1f072e4a
[Stage1] Add RSDP and basic ACPI parsing
[Stage1] Add HEX display to screen.h
[Stage1] Handle IRQ1 semi-gracefully
[Stage1] Try (unsuccessfully) to "wait" for IRQ 1 (os_interrupt_wait())
2023-06-05 13:13:37 +02:00

143 lines
No EOL
2.3 KiB
C

#include "../os3_common/datatypes.h"
#include "../os3_common/packing.h"
#include "include/screen.h"
int x = 0;
int y = 0;
void write_character(char c, os_u8 color) {
os_u16* vram = (os_u16*) 0xB8000;
os_u16* cursor_pos = vram + ((y * 80) + x);
*cursor_pos = c | (color << 8);
}
void screen_write(const char* str, int max_len, os_u8 color) {
int i = 0;
do {
char c = *str;
if (c == 0) {
return;
}
if (c == '\n') {
if (y == 24) {
screen_clear();
}
y = (y + 1) % 25;
x = 0;
str++;
continue;
}
write_character(c, color);
x++;
if (x >= 80) {
if (y == 24) {
screen_clear();
}
y = (y + 1) % 25;
x = 0;
}
str++;
i++;
} while(i < max_len || max_len == 0);
}
void screen_write_string(const char* str, int length) {
screen_write(str, length, 0x0A);
}
void screen_write_error(const char* str, int length) {
screen_write(str, length, 0x0C);
}
void screen_clear() {
os_u16* ptr = (os_u16*) 0xB8000;
for (int y = 0; y < 25; y++) {
for (int x = 0; x < 80; x++) {
*ptr = 0;
ptr++;
}
}
x = 0;
y = 0;
}
void screen_write_number_impl(os_u32 number, os_u8 color) {
char buffer[32];
char buffer_2[32];
os_s32 i = 1;
while(i < 32) {
if (i > 1 && number == 0) {
break;
}
buffer[i] = ((char)(number % 10)) + '0';
i++;
number /= 10;
}
i--;
buffer[0] = '\0';
char* buffer_2_ptr = buffer_2;
while(i >= 0) {
*buffer_2_ptr = buffer[i];
buffer_2_ptr++;
i--;
}
screen_write(buffer_2, 0, color);
}
void screen_write_number_hex_impl(os_u32 number, os_u8 color) {
char buffer[32];
char buffer_2[32];
os_s32 i = 0;
while(i < 32) {
if (i > 0 && number == 0) {
break;
}
buffer[i] = ((char)(number % 16));
i++;
number /= 16;
}
i--;
char* buffer_2_ptr = buffer_2;
while(i >= 0) {
char val = (char)(buffer[i] >= 10 ? (buffer[i] - 10) + 'A' : buffer[i] + '0');
*buffer_2_ptr = val;
buffer_2_ptr++;
i--;
}
*buffer_2_ptr = 0;
screen_write(buffer_2, 0, color);
}
void screen_write_number(os_u32 number) {
screen_write_number_impl(number, 0x0A);
}
void screen_write_number_error(os_u32 number) {
screen_write_number_impl(number, 0x0C);
}
void screen_write_number_hex(os_u32 number) {
screen_write_number_hex_impl(number, 0x0A);
}
void screen_set_pos(int nx, int ny) {
x = nx;
y = ny;
}
int screen_get_pos_x() {
return x;
}
int screen_get_pos_y() {
return y;
}