Remove micromath dependency, improve primitive drawing speed by 300x,

add mouse support and interrupts on x86_64 using a ps2 mouse which
needed pic unmasking, add span filling to framebuffer, add back
without_interrupts to serial console and framebuffer, add a mouse
rectangle which tracks the mouse position and test the performance of
the drawing.
This commit is contained in:
csd4ni3l
2026-03-29 14:38:43 +02:00
parent aa5cd85b48
commit 3ef95940a7
13 changed files with 494 additions and 56 deletions

View File

@@ -0,0 +1,67 @@
use core::sync::atomic::{AtomicI16, AtomicU8, Ordering};
use spin::Mutex;
pub struct Mouse {
left_button_pressed: AtomicU8,
right_button_pressed: AtomicU8,
middle_button_pressed: AtomicU8,
x_delta: AtomicI16,
y_delta: AtomicI16,
status: AtomicU8,
}
impl Mouse {
const fn new() -> Mouse {
Mouse {
left_button_pressed: AtomicU8::new(0),
right_button_pressed: AtomicU8::new(0),
middle_button_pressed: AtomicU8::new(0),
x_delta: AtomicI16::new(0),
y_delta: AtomicI16::new(0),
status: AtomicU8::new(0),
}
}
pub fn interrupt(
&self,
left_button_pressed: u8,
right_button_pressed: u8,
middle_button_pressed: u8,
x_delta: i16,
y_delta: i16,
) {
self.left_button_pressed
.store(left_button_pressed, Ordering::Relaxed);
self.right_button_pressed
.store(right_button_pressed, Ordering::Relaxed);
self.middle_button_pressed
.store(middle_button_pressed, Ordering::Relaxed);
self.x_delta.fetch_add(x_delta, Ordering::Relaxed);
self.y_delta.fetch_add(y_delta, Ordering::Relaxed);
}
pub fn is_left_button_pressed(&self) -> u8 {
self.left_button_pressed.load(Ordering::Relaxed)
}
pub fn is_right_button_pressed(&self) -> u8 {
self.right_button_pressed.load(Ordering::Relaxed)
}
pub fn is_middle_button_pressed(&self) -> u8 {
self.middle_button_pressed.load(Ordering::Relaxed)
}
pub fn get_x_delta(&self) -> i16 {
self.x_delta.swap(0, Ordering::Relaxed)
}
pub fn get_y_delta(&self) -> i16 {
self.y_delta.swap(0, Ordering::Relaxed)
}
pub fn set_status(&self, status: u8) {
self.status.store(status, Ordering::Relaxed);
}
pub fn get_status(&self) -> u8 {
self.status.load(Ordering::Relaxed)
}
}
pub static MOUSE: Mouse = Mouse::new();