1
0

Minor cleanup
Some checks failed
CI / Typos (push) Successful in 7s
CI / Build (push) Successful in 40s
CI / Clippy (push) Failing after 52s

This commit is contained in:
Mark 2025-03-01 09:41:36 -08:00
parent 10b0939930
commit 76e5f8f22d
Signed by: Mark
GPG Key ID: C6D63995FE72FD80

View File

@ -4,6 +4,7 @@
#![feature(abi_x86_interrupt)]
#![allow(internal_features)]
use core::arch::asm;
use lazy_static::lazy_static;
use rand::{rngs::SmallRng, SeedableRng};
use spin::Mutex;
@ -25,6 +26,7 @@ pub(crate) static PIC: Mutex<PICDriver> = Mutex::new(PICDriver::new(32, 32 + 8))
pub(crate) static TICK_COUNTER: Mutex<u32> = Mutex::new(0);
pub(crate) static BOARD: Mutex<TetrisBoard> = Mutex::new(TetrisBoard::new());
pub(crate) static FALLING: Mutex<Option<FallingTetromino>> = Mutex::new(None);
pub(crate) static RUN_TICKS: Mutex<bool> = Mutex::new(false);
lazy_static! {
static ref RNG: Mutex<SmallRng> = Mutex::new(SmallRng::seed_from_u64(1337));
@ -44,30 +46,23 @@ extern "x86-interrupt" fn divide_handler(stack_frame: InterruptStackFrame) {
}
extern "x86-interrupt" fn timer_handler(_stack_frame: InterruptStackFrame) {
let mut t = TICK_COUNTER.lock();
*t = (*t).wrapping_add(1);
drop(t);
if !*RUN_TICKS.lock() {
PIC.lock().send_eoi(32);
return;
}
tick();
// Step tick counter
let t = {
let mut t = TICK_COUNTER.lock();
*t = (*t).wrapping_add(1);
*t
};
PIC.lock().send_eoi(32);
}
extern "x86-interrupt" fn double_fault_handler(
stack_frame: InterruptStackFrame,
error_code: u32,
) -> ! {
panic!("DOUBLE FAULT (err = 0x{error_code:x}\n{:#?}", stack_frame);
}
fn tick() {
let mut v = VGA.lock();
let t = *TICK_COUNTER.lock();
let mut board = BOARD.lock();
let mut fall = FALLING.lock();
v.swap();
board.draw(&mut v, fall.as_ref());
if let Some(fall_inner) = fall.as_mut() {
@ -84,6 +79,15 @@ fn tick() {
} else {
*fall = Some(FallingTetromino::random(5, 1))
}
PIC.lock().send_eoi(32);
}
extern "x86-interrupt" fn double_fault_handler(
stack_frame: InterruptStackFrame,
error_code: u32,
) -> ! {
panic!("DOUBLE FAULT (err = 0x{error_code:x}\n{:#?}", stack_frame);
}
#[no_mangle]
@ -118,16 +122,11 @@ pub unsafe extern "C" fn start(
pic.init();
}
// Clear screen
let mut v = VGA.lock();
let board = BOARD.lock();
*RUN_TICKS.lock() = true;
board.draw(&mut v, None);
v.swap();
// Important to drop these, or tick() will deadlock
drop(v);
drop(board);
loop {}
// Do-nothing loop,
// frames are driven by interrupts
loop {
asm!("hlt")
}
}