Setting some colors
This commit is contained in:
parent
df0660f5ed
commit
823d9ecf4e
|
@ -10,7 +10,49 @@ const VBE_DISPI_INDEX_YRES: u16 = 0x02;
|
||||||
const VBE_DISPI_INDEX_BPP: u16 = 0x03;
|
const VBE_DISPI_INDEX_BPP: u16 = 0x03;
|
||||||
const VBE_DISPI_INDEX_ENABLE: u16 = 0x04;
|
const VBE_DISPI_INDEX_ENABLE: u16 = 0x04;
|
||||||
|
|
||||||
|
const VBE_DISPI_DISABLED: u16 = 0x00;
|
||||||
|
const VBE_DISPI_ENABLED: u16 = 0x01;
|
||||||
const VBE_DISPI_GETCAPS: u16 = 0x02;
|
const VBE_DISPI_GETCAPS: u16 = 0x02;
|
||||||
|
const VBE_DISPI_LFB_ENABLED: u16 = 0x40;
|
||||||
|
const VBE_DISPI_NOCLEARMEM: u16 = 0x80;
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
#[repr(u8)]
|
||||||
|
pub enum BitsPerPixel {
|
||||||
|
Bpp4 = 0x04,
|
||||||
|
Bpp8 = 0x08,
|
||||||
|
Bpp15 = 0x0F,
|
||||||
|
Bpp16 = 0x10,
|
||||||
|
Bpp24 = 0x18,
|
||||||
|
Bpp32 = 0x20,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u16> for BitsPerPixel {
|
||||||
|
fn from(value: u16) -> BitsPerPixel {
|
||||||
|
match value {
|
||||||
|
0x04 => BitsPerPixel::Bpp4,
|
||||||
|
0x08 => BitsPerPixel::Bpp8,
|
||||||
|
0x0F => BitsPerPixel::Bpp15,
|
||||||
|
0x10 => BitsPerPixel::Bpp16,
|
||||||
|
0x18 => BitsPerPixel::Bpp24,
|
||||||
|
0x20 => BitsPerPixel::Bpp32,
|
||||||
|
_ => panic!("invalid bits per pixel value: {}", value),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct Mode {
|
||||||
|
width: u16,
|
||||||
|
height: u16,
|
||||||
|
bpp: BitsPerPixel,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Mode {
|
||||||
|
pub const fn new(width: u16, height: u16, bpp: BitsPerPixel) -> Mode {
|
||||||
|
Mode { width, height, bpp }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub struct Capabilities {
|
pub struct Capabilities {
|
||||||
|
@ -73,4 +115,76 @@ impl BochsDevice {
|
||||||
Capabilities { width, height, bpp }
|
Capabilities { width, height, bpp }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn disable_display(&mut self) {
|
||||||
|
unsafe {
|
||||||
|
self.index_port.write(VBE_DISPI_INDEX_ENABLE);
|
||||||
|
self.data_port.write(VBE_DISPI_DISABLED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn enable_display(&mut self) {
|
||||||
|
unsafe {
|
||||||
|
self.index_port.write(VBE_DISPI_INDEX_ENABLE);
|
||||||
|
self.data_port
|
||||||
|
.write(VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED | VBE_DISPI_NOCLEARMEM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_mode(&mut self) -> Mode {
|
||||||
|
let width = self.get_width();
|
||||||
|
let height = self.get_height();
|
||||||
|
let bpp = self.get_bpp();
|
||||||
|
Mode { width, height, bpp }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_mode(&mut self, mode: Mode) {
|
||||||
|
self.disable_display();
|
||||||
|
self.set_width(mode.width);
|
||||||
|
self.set_height(mode.height);
|
||||||
|
self.set_bpp(mode.bpp);
|
||||||
|
self.enable_display();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_width(&mut self) -> u16 {
|
||||||
|
unsafe {
|
||||||
|
self.index_port.write(VBE_DISPI_INDEX_XRES);
|
||||||
|
self.data_port.read()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_height(&mut self) -> u16 {
|
||||||
|
unsafe {
|
||||||
|
self.index_port.write(VBE_DISPI_INDEX_YRES);
|
||||||
|
self.data_port.read()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_bpp(&mut self) -> BitsPerPixel {
|
||||||
|
unsafe {
|
||||||
|
self.index_port.write(VBE_DISPI_INDEX_BPP);
|
||||||
|
BitsPerPixel::from(self.data_port.read())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_width(&mut self, width: u16) {
|
||||||
|
unsafe {
|
||||||
|
self.index_port.write(VBE_DISPI_INDEX_XRES);
|
||||||
|
self.data_port.write(width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_height(&mut self, height: u16) {
|
||||||
|
unsafe {
|
||||||
|
self.index_port.write(VBE_DISPI_INDEX_YRES);
|
||||||
|
self.data_port.write(height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_bpp(&mut self, bpp: BitsPerPixel) {
|
||||||
|
unsafe {
|
||||||
|
self.index_port.write(VBE_DISPI_INDEX_BPP);
|
||||||
|
self.data_port.write(bpp as u16);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
pub mod bochs;
|
pub mod bochs;
|
||||||
mod pci;
|
mod pci;
|
||||||
|
|
||||||
pub use bochs::BochsDevice;
|
pub use bochs::{BitsPerPixel, BochsDevice, Mode};
|
||||||
|
|
Loading…
Reference in a new issue