From f5835bab5702e83c04cd8a18c6da36703a255897 Mon Sep 17 00:00:00 2001 From: Able Date: Mon, 5 Dec 2022 06:04:35 -0600 Subject: [PATCH] more layout work for the VGA Driver --- drivers/graphics/vgable/src/main.rs | 57 ++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/drivers/graphics/vgable/src/main.rs b/drivers/graphics/vgable/src/main.rs index 943b8e8..efd0daf 100644 --- a/drivers/graphics/vgable/src/main.rs +++ b/drivers/graphics/vgable/src/main.rs @@ -3,6 +3,8 @@ use able_graphics_library::display::parse_display_string; +const VGA_ADDRESS: *mut u8 = 0xB8000 as *mut u8; + #[no_mangle] fn start() { // TODO: Initialize the VGA hardware and configure it to the desired video mode @@ -14,6 +16,7 @@ fn start() { Ok(display) => { let (width, height, bpp, fps) = display; let vga_mode = VGAMode::get_vga_mode(width, height, bpp).unwrap_or(VGAMode::Mode0); + let mut vga_state = VGAState::new(vga_mode); } Err(err) => match err { @@ -26,20 +29,20 @@ fn start() { } } -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] enum VGAMode { - Mode0, //: 640x480 pixels, 16 colors - Mode1, //: 640x480 pixels, 256 colors - Mode2, //: 640x480 pixels, 16-bit color - Mode3, //: 800x600 pixels, 16 colors - Mode4, //: 800x600 pixels, 256 colors - Mode5, //: 800x600 pixels, 16-bit color - Mode6, //: 1024x768 pixels, 16 colors - Mode7, //: 1024x768 pixels, 256 colors - Mode8, //: 1024x768 pixels, 16-bit color - Mode9, //: 1280x1024 pixels, 16 colors - Mode10, //: 1280x1024 pixels, 256 colors - Mode11, //1: 1280x1024 pixels, 16-bit color + Mode0 = 0, //: 640x480 pixels, 16 colors + Mode1 = 1, //: 640x480 pixels, 256 colors + Mode2 = 2, //: 640x480 pixels, 16-bit color + Mode3 = 3, //: 800x600 pixels, 16 colors + Mode4 = 4, //: 800x600 pixels, 256 colors + Mode5 = 5, //: 800x600 pixels, 16-bit color + Mode6 = 6, //: 1024x768 pixels, 16 colors + Mode7 = 7, //: 1024x768 pixels, 256 colors + Mode8 = 8, //: 1024x768 pixels, 16-bit color + Mode9 = 9, //: 1280x1024 pixels, 16 colors + Mode10 = 10, //: 1280x1024 pixels, 256 colors + Mode11 = 11, //: 1280x1024 pixels, 16-bit color } impl VGAMode { fn get_vga_mode(width: u32, height: u32, bpp: u32) -> Option { @@ -60,3 +63,31 @@ impl VGAMode { } } } +#[allow(dead_code)] +struct VGAState<'a> { + mode: VGAMode, + buffer: &'a mut u8, +} +#[allow(dead_code)] +impl<'a> VGAState<'a> { + fn new(mode: VGAMode) -> Self { + let mut state = Self { + mode, + buffer: unsafe { &mut *VGA_ADDRESS }, + }; + unsafe { + state.initialize_hardware(); + } + + state + } + unsafe fn set_vga_mode(&mut self, mode: VGAMode) { + self.mode = mode; + // Set registers here + } + unsafe fn initialize_hardware(&mut self) { + // set vga mode + self.set_vga_mode(self.mode) + // initalize the graphics lib to be usable + } +}