more layout work for the VGA Driver

This commit is contained in:
Able 2022-12-05 06:04:35 -06:00
parent 183136103f
commit f5835bab57

View file

@ -3,6 +3,8 @@
use able_graphics_library::display::parse_display_string; use able_graphics_library::display::parse_display_string;
const VGA_ADDRESS: *mut u8 = 0xB8000 as *mut u8;
#[no_mangle] #[no_mangle]
fn start() { fn start() {
// TODO: Initialize the VGA hardware and configure it to the desired video mode // TODO: Initialize the VGA hardware and configure it to the desired video mode
@ -14,6 +16,7 @@ fn start() {
Ok(display) => { Ok(display) => {
let (width, height, bpp, fps) = display; let (width, height, bpp, fps) = display;
let vga_mode = VGAMode::get_vga_mode(width, height, bpp).unwrap_or(VGAMode::Mode0); 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 { Err(err) => match err {
@ -26,20 +29,20 @@ fn start() {
} }
} }
#[derive(Debug)] #[derive(Debug, Clone, Copy)]
enum VGAMode { enum VGAMode {
Mode0, //: 640x480 pixels, 16 colors Mode0 = 0, //: 640x480 pixels, 16 colors
Mode1, //: 640x480 pixels, 256 colors Mode1 = 1, //: 640x480 pixels, 256 colors
Mode2, //: 640x480 pixels, 16-bit color Mode2 = 2, //: 640x480 pixels, 16-bit color
Mode3, //: 800x600 pixels, 16 colors Mode3 = 3, //: 800x600 pixels, 16 colors
Mode4, //: 800x600 pixels, 256 colors Mode4 = 4, //: 800x600 pixels, 256 colors
Mode5, //: 800x600 pixels, 16-bit color Mode5 = 5, //: 800x600 pixels, 16-bit color
Mode6, //: 1024x768 pixels, 16 colors Mode6 = 6, //: 1024x768 pixels, 16 colors
Mode7, //: 1024x768 pixels, 256 colors Mode7 = 7, //: 1024x768 pixels, 256 colors
Mode8, //: 1024x768 pixels, 16-bit color Mode8 = 8, //: 1024x768 pixels, 16-bit color
Mode9, //: 1280x1024 pixels, 16 colors Mode9 = 9, //: 1280x1024 pixels, 16 colors
Mode10, //: 1280x1024 pixels, 256 colors Mode10 = 10, //: 1280x1024 pixels, 256 colors
Mode11, //1: 1280x1024 pixels, 16-bit color Mode11 = 11, //: 1280x1024 pixels, 16-bit color
} }
impl VGAMode { impl VGAMode {
fn get_vga_mode(width: u32, height: u32, bpp: u32) -> Option<VGAMode> { fn get_vga_mode(width: u32, height: u32, bpp: u32) -> Option<VGAMode> {
@ -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
}
}