HhhOS/arch/x86_64/drivers/terminal/terminal.c
2021-08-17 12:45:35 +03:00

135 lines
3.1 KiB
C

#include <drivers/terminal/terminal.h>
#include <drivers/device/device.h>
usize terminal_row;
usize terminal_column;
u8 terminal_color;
framebuffer_t *terminal_framebuffer;
void terminal_clear() {
for (usize y = 0; y < terminal_height; y++) {
for (usize x = 0; x < terminal_width; x++) {
const usize index = y * terminal_width + x;
//terminal_buffer[index] = vga_entry(' ', terminal_color);
}
}
}
/*
static inline void terminal_writestring(const char* data) {
terminal_write(data, strlen(data));
}
static inline void terminal_writeline(const char* data) {
terminal_writestring(data);
terminal_putchar('\n');
}
*/
void* terminal_devread(void* data) {
return NULL;
}
void* terminal_devwrite(void* data) {
terminal_putchar(*((char*)data));
return NULL;
}
int terminal_initialize(framebuffer_t *terminal_fb) {
terminal_framebuffer = terminal_fb;
terminal_width = terminal_framebuffer->width / 8;
terminal_height = terminal_framebuffer->height / 16;
terminal_row = 0;
terminal_column = 0;
terminal_clear();
struct device terminal_device = {
write: &terminal_devwrite,
read: &terminal_devread
};
return push_device(terminal_device);
}
void terminal_setcolor(u8 color) {
terminal_color = color;
}
void terminal_clearline(usize line) {
for (usize x = 0; x < terminal_width; x++) {
const usize index = line * terminal_width + x;
//terminal_buffer[index] = vga_entry(' ', terminal_color);
}
}
void terminal_clearlines(usize from, usize to) {
for (usize y = from; y <= to; y++) {
for (usize x = 0; x < terminal_width; x++) {
const usize index = y * terminal_width + x;
//terminal_buffer[index] = vga_entry(' ', terminal_color);
}
}
}
void terminal_updatecursor() {
/*
usize temp = terminal_row * terminal_width + terminal_column;
outportb(0x3D4, 14);
outportb(0x3D5, temp >> 8);
outportb(0x3D4, 15);
outportb(0x3D5, temp);
*/
}
void terminal_checknewline() {
if (terminal_row >= terminal_height - 1) {
//terminal_scrollup();
}
}
void terminal_putentryat(char c, u8 color, usize x, usize y) {
//terminal_buffer[y * terminal_width + x] = vga_entry(c, color);
draw_psf_char(terminal_framebuffer, c, x, y, 0xFFFFFFFF, 0);
}
void terminal_putchar(char c) {
outportb(0x3F8, c); // log terminal to serial.log when running on qemu
switch (c) {
case '\b':
if (--terminal_column < 0) {
if (terminal_row-- > 0) {
terminal_column = terminal_width - 1;
terminal_putentryat(' ', terminal_color, terminal_column, terminal_row);
}
} else {
terminal_putentryat(' ', terminal_color, terminal_column, terminal_row);
}
terminal_updatecursor();
return;
case '\r':
terminal_column = 0;
break;
case '\n':
terminal_column = 0;
terminal_row++;
break;
default:
terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
terminal_column++;
}
if (terminal_column >= terminal_width) {
terminal_column = 0;
terminal_row++;
}
terminal_updatecursor();
terminal_checknewline();
}
void terminal_write(const char* data, usize size) {
for (usize i = 0; i < size; i++)
terminal_putchar(data[i]);
}