/* TTY (Terminal) Driver
* Handles keyboard input and screen output
*/
#include "../kernel/kernel.h"
extern int printf(const char* format, ...);
extern void outb(uint16_t port, uint8_t value);
extern uint8_t inb(uint16_t port);
extern int receive(int source, message_t* msg);
#define TTY_NAME "TTY Driver"
#define KEYBOARD_PORT 0x60
#define VGA_WIDTH 80
#define VGA_HEIGHT 25
static uint16_t* vga_buffer = (uint16_t*)0xB8000;
static int cursor_x = 0;
static int cursor_y = 0;
void tty_init() {
printf("[%s] Initializing...\n", TTY_NAME);
/* Clear screen */
for (int i = 0; i < VGA_WIDTH * VGA_HEIGHT; i++) {
vga_buffer[i] = 0x0F00 | ' '; /* White on black */
}
cursor_x = 0;
cursor_y = 0;
printf("[%s] Ready\n", TTY_NAME);
}
void tty_putchar(char c) {
if (c == '\n') {
cursor_x = 0;
cursor_y++;
} else {
int index = cursor_y * VGA_WIDTH + cursor_x;
vga_buffer[index] = 0x0F00 | c;
cursor_x++;
if (cursor_x >= VGA_WIDTH) {
cursor_x = 0;
cursor_y++;
}
}
/* Scroll if necessary */
if (cursor_y >= VGA_HEIGHT) {
/* TODO: Implement scrolling */
cursor_y = 0;
}
}
char tty_getchar() {
/* TODO: Read from keyboard */
uint8_t scancode = inb(KEYBOARD_PORT);
return scancode;
}
void tty_main() {
message_t msg;
tty_init();
/* Main driver loop */
for(;;) {
receive(-1, &msg);
/* Handle TTY requests */
switch(msg.type) {
case SYS_READ:
/* Handle read request */
break;
case SYS_WRITE:
/* Handle write request */
break;
default:
printf("[%s] Unknown message type: %d\n", TTY_NAME, msg.type);
}
}
}