135 lines
3.1 KiB
C
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]);
|
|
}
|