X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/0471b0eeea5ea30883c776dd53275ec6b8454ca7..2803826a2373620dbfce8a5bff1e6a01dd594953:/lunaix-os/kernel/tty/tty.c diff --git a/lunaix-os/kernel/tty/tty.c b/lunaix-os/kernel/tty/tty.c index 4a20a77..4164239 100644 --- a/lunaix-os/kernel/tty/tty.c +++ b/lunaix-os/kernel/tty/tty.c @@ -1,6 +1,7 @@ +#include #include -#include #include +#include #include #define TTY_WIDTH 80 @@ -11,14 +12,24 @@ static vga_attribute* tty_vga_buffer = (vga_attribute*)VGA_BUFFER_PADDR; static vga_attribute tty_theme_color = VGA_COLOR_BLACK; static uint32_t tty_x = 0; -static uint16_t tty_y = 0; +static uint32_t tty_y = 0; -void tty_init(void* vga_buf) { +void +tty_init(void* vga_buf) +{ tty_vga_buffer = (vga_attribute*)vga_buf; tty_clear(); + + io_outb(0x3D4, 0x0A); + io_outb(0x3D5, (io_inb(0x3D5) & 0xC0) | 13); + + io_outb(0x3D4, 0x0B); + io_outb(0x3D5, (io_inb(0x3D5) & 0xE0) | 15); } -void tty_set_buffer(void* vga_buf) { +void +tty_set_buffer(void* vga_buf) +{ tty_vga_buffer = (vga_attribute*)vga_buf; } @@ -43,10 +54,12 @@ tty_put_char(char chr) break; case '\x08': tty_x = tty_x ? tty_x - 1 : 0; - *(tty_vga_buffer + tty_x + tty_y * TTY_WIDTH) = (tty_theme_color | 0x20); + *(tty_vga_buffer + tty_x + tty_y * TTY_WIDTH) = + (tty_theme_color | 0x20); break; default: - *(tty_vga_buffer + tty_x + tty_y * TTY_WIDTH) = (tty_theme_color | chr); + *(tty_vga_buffer + tty_x + tty_y * TTY_WIDTH) = + (tty_theme_color | chr); tty_x++; break; } @@ -60,6 +73,25 @@ tty_put_char(char chr) } } +void +tty_sync_cursor() +{ + tty_set_cursor(tty_x, tty_y); +} + +void +tty_set_cursor(uint8_t x, uint8_t y) +{ + if (x >= TTY_WIDTH || y >= TTY_HEIGHT) { + x = y = 0; + } + uint32_t pos = y * TTY_WIDTH + x; + io_outb(0x3D4, 14); + io_outb(0x3D5, pos / 256); + io_outb(0x3D4, 15); + io_outb(0x3D5, pos % 256); +} + void tty_put_str(char* str) { @@ -67,6 +99,11 @@ tty_put_str(char* str) tty_put_char(*str); str++; } + // FIXME: This does not work in user mode. + // Work around: + // 1. (Easy) Define an IO Permission bitmap in TSS + // 2. (More effort) Mount onto file system. (/dev/tty) + // tty_sync_cursor(); } void @@ -91,26 +128,29 @@ tty_clear() } void -tty_clear_line(unsigned int y) { - for (size_t i = 0; i < TTY_WIDTH; i++) - { +tty_clear_line(unsigned int y) +{ + for (size_t i = 0; i < TTY_WIDTH; i++) { *(tty_vga_buffer + i + y * TTY_WIDTH) = tty_theme_color; } } void -tty_set_cpos(unsigned int x, unsigned int y) { +tty_set_cpos(unsigned int x, unsigned int y) +{ tty_x = x % TTY_WIDTH; tty_y = y % TTY_HEIGHT; } void -tty_get_cpos(unsigned int* x, unsigned int* y) { +tty_get_cpos(unsigned int* x, unsigned int* y) +{ *x = tty_x; *y = tty_y; } vga_attribute -tty_get_theme() { +tty_get_theme() +{ return tty_theme_color; } \ No newline at end of file