Minor cleanup
This commit is contained in:
parent
10b0939930
commit
76e5f8f22d
@ -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")
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user