Newer
Older
CubeCactusCpp / os / drivers / tty.c
@agalyaramadoss agalyaramadoss on 6 Dec 1 KB shell impelment
/* 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);
        }
    }
}