#include #include #include #include #include static uint32_t framebuffer_address; static uint32_t framebuffer_width; static uint32_t framebuffer_height; static uint32_t framebuffer_total_pixels; static uint32_t framebuffer_pitch; static uint32_t framebuffer_bpp; enum vga_color { VGA_COLOR_BLACK = 0, VGA_COLOR_BLUE = 1, VGA_COLOR_GREEN = 2, VGA_COLOR_CYAN = 3, VGA_COLOR_RED = 4, VGA_COLOR_MAGENTA = 5, VGA_COLOR_BROWN = 6, VGA_COLOR_LIGHT_GREY = 7, VGA_COLOR_DARK_GREY = 8, VGA_COLOR_LIGHT_BLUE = 9, VGA_COLOR_LIGHT_GREEN = 10, VGA_COLOR_LIGHT_CYAN = 11, VGA_COLOR_LIGHT_RED = 12, VGA_COLOR_LIGHT_MAGENTA = 13, VGA_COLOR_LIGHT_BROWN = 14, VGA_COLOR_WHITE = 15, }; void vga_init( uint32_t fb_vaddr, uint32_t fb_width, uint32_t fb_height, uint32_t fb_pitch, uint8_t fb_bpp ) { framebuffer_address = fb_vaddr; framebuffer_width = fb_width; framebuffer_height = fb_height; framebuffer_pitch = fb_pitch; framebuffer_bpp = fb_bpp; framebuffer_total_pixels = framebuffer_width * framebuffer_height; vga_clear_scrn(0xFFFFFFFF); } void vga_clear_scrn(uint32_t color) { if (framebuffer_address == 0) return; // Completely ignore the framebuffer address for a split second. // Let's force raw ASCII text into the legacy VGA text console area. uint16_t* text_mode_buffer = (uint16_t*)0xB8000; // Fill the screen with 'A' characters on a red background for (int i = 0; i < 80 * 25; i++) { text_mode_buffer[i] = (0x4F << 8) | 'A'; } } void vga_putchar(char c) { if (c == '\n') { return; } if (c == '\t') { for (int i = 0; i < 4; i++) { vga_putchar(' '); } return; } } uint32_t vga_seek(vfs_node_t* node, uint32_t offset, int whence) { return 0; } uint32_t vga_write(vfs_node_t* node, uint32_t offset, uint32_t size, uint8_t* buf) { for (uint32_t i = 0; i < size; i++) { vga_putchar((char)buf[i]); } return size; }