From 4047bc3936b91d0af0bae6685686b70087a02ff7 Mon Sep 17 00:00:00 2001 From: Gregory Bowne Date: Wed, 26 Nov 2025 16:02:07 -0800 Subject: [PATCH] Update display.c Added the 95% completely wired up display driver implementation file --- kernel/display.c | 77 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/kernel/display.c b/kernel/display.c index 3f8d14c..a22dc24 100644 --- a/kernel/display.c +++ b/kernel/display.c @@ -1,36 +1,79 @@ #include "display.h" -#include "io.h" // Include your I/O header for port access +#include "io.h" #include "vga.h" // Initialize the display void init_display(void) { - // Initialize VGA settings, if necessary - // This could involve setting up the VGA mode, etc. - set_display_mode(0x13); // Example: Set to 320x200 256-color mode + // Initialize the VGA driver. This typically sets up the 80x25 text mode, + // clears the screen, and sets the cursor. + vga_init(); } // Enumerate connected displays void enumerate_displays(void) { - // This is a simplified example. Actual enumeration may require - // reading from specific VGA registers or using BIOS interrupts. + // This function is often a complex operation in a real driver. + // In this simplified kernel/VGA text mode environment, we use printf + // to output a message and rely on the fact that VGA is present. - // For demonstration, we will just print a message - // In a real driver, you would check the VGA registers - // to determine connected displays. - clear_display(); - // Here you would typically read from VGA registers to find connected displays - // For example, using inb() to read from VGA ports + // Clear the display before printing a message + vga_clear(vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK)); + + // Output a simplified enumeration message + vga_printf("Display: Standard VGA Text Mode (80x25) Detected.\n"); + + // In a real driver, you would use inb() and outb() with specific VGA ports + // to read information (e.g., from the CRTC registers 0x3D4/0x3D5) + // to check for display presence or configuration. } // Set the display mode +// NOTE: Setting arbitrary VGA modes (like 0x13 for 320x200) is very complex +// and requires writing hundreds of register values, often done via BIOS in +// real mode. Since we are in protected mode and have a simple text driver, +// this function is kept simple or treated as a placeholder for full mode changes. void set_display_mode(uint8_t mode) { - // Set the VGA mode by writing to the appropriate registers - outb(VGA_PORT, mode); // Example function to write to a port + // Check if the requested mode is a known mode (e.g., VGA Text Mode 3) + // For this example, we simply acknowledge the call. + // A true mode set would involve complex register sequencing. + + // The provided vga.c is a Text Mode driver, so a graphical mode set + // like 0x13 (320x200 256-color) would break the existing vga_printf functionality. + + // A simplified text-mode-specific response: + if (mode == 0x03) { // Mode 3 is standard 80x25 text mode + vga_printf("Display mode set to 80x25 Text Mode (Mode 0x03).\n"); + vga_init(); // Re-initialize the text mode + } else { + // Simple I/O example based on the original structure (Caution: Incomplete for full mode set) + outb(VGA_PORT, mode); // Example function to write to a port + vga_printf("Attempting to set display mode to 0x%x. (Warning: May break current display)\n", mode); + } } // Clear the display void clear_display(void) { - // Clear the display by filling it with a color - // This is a placeholder for actual clearing logic - // You would typically write to video memory here + // Use the VGA driver's clear function, typically clearing to black on light grey + // or black on black. We'll use the black on light grey from vga_init for consistency. + vga_clear(vga_entry_color(VGA_COLOR_BLACK, VGA_COLOR_LIGHT_GREY)); + // Reset cursor to 0, 0 + vga_set_cursor_position(0, 0); +} + +// Helper function to write a string +void display_write_string(const char* str) { + // Use the VGA driver's string writing function + vga_write_string(str, my_strlen(str)); +} + +// Helper function to print a formatted string +void display_printf(const char* format, ...) { + // Use the VGA driver's printf function + va_list args; + va_start(args, format); + + // The vga_printf function already handles the va_list internally, + // so we can just call it directly. + vga_printf(format, args); + + va_end(args); }