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;
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<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
}
}