2022-09-28 02:40:05 +10:00
|
|
|
#![no_std]
|
|
|
|
#![no_main]
|
|
|
|
|
2022-10-07 10:14:34 +11:00
|
|
|
use core::{fmt::Write, mem::size_of_val};
|
2022-09-28 09:57:09 +10:00
|
|
|
use gba::{
|
|
|
|
mgba::{MgbaBufferedLogger, MgbaMessageLevel},
|
|
|
|
prelude::*,
|
|
|
|
};
|
2022-09-28 02:40:05 +10:00
|
|
|
|
|
|
|
#[panic_handler]
|
2022-09-28 09:57:09 +10:00
|
|
|
fn panic_handler(info: &core::panic::PanicInfo) -> ! {
|
|
|
|
if let Ok(mut logger) = MgbaBufferedLogger::try_new(MgbaMessageLevel::Fatal) {
|
|
|
|
write!(logger, "{info}").ok();
|
|
|
|
}
|
2022-09-28 02:40:05 +10:00
|
|
|
loop {}
|
|
|
|
}
|
|
|
|
|
2022-10-07 10:23:32 +11:00
|
|
|
// GbaCell is non-freeze, so `.data` section, so this will default to IWRAM.
|
2022-09-28 02:40:05 +10:00
|
|
|
static KEYS: GbaCell<KeyInput> = GbaCell::new(KeyInput::new());
|
|
|
|
|
2022-10-07 10:23:32 +11:00
|
|
|
// We can also put things into EWRAM if we want to.
|
2022-09-28 03:20:05 +10:00
|
|
|
#[link_section = ".ewram"]
|
|
|
|
static VALUE: GbaCell<u16> = GbaCell::new(0);
|
|
|
|
|
2022-10-07 10:23:32 +11:00
|
|
|
extern "C" fn irq_handler(_: IrqBits) {
|
2022-09-28 02:40:05 +10:00
|
|
|
// just as a demo, we'll read the keys during vblank.
|
|
|
|
KEYS.write(KEYINPUT.read());
|
|
|
|
}
|
|
|
|
|
|
|
|
#[no_mangle]
|
|
|
|
extern "C" fn main() -> ! {
|
|
|
|
RUST_IRQ_HANDLER.write(Some(irq_handler));
|
|
|
|
DISPSTAT.write(DisplayStatus::new().with_irq_vblank(true));
|
|
|
|
IE.write(IrqBits::VBLANK);
|
|
|
|
IME.write(true);
|
|
|
|
|
2022-09-28 09:57:09 +10:00
|
|
|
if let Ok(mut logger) = MgbaBufferedLogger::try_new(MgbaMessageLevel::Debug) {
|
|
|
|
writeln!(logger, "hello!").ok();
|
|
|
|
}
|
|
|
|
|
2022-10-07 10:14:34 +11:00
|
|
|
{
|
|
|
|
// get our tile data into memory.
|
|
|
|
//let src = ;
|
|
|
|
let dest = CHARBLOCK0_4BPP.index(0).as_usize() as *mut u32;
|
|
|
|
let info = BitUnpackInfo {
|
|
|
|
src_byte_len: size_of_val(&CGA_8X8_THICK) as u16,
|
|
|
|
src_elem_width: 1,
|
|
|
|
dest_elem_width: 4,
|
|
|
|
offset_and_touch_zero: 0,
|
|
|
|
};
|
|
|
|
unsafe { BitUnPack(CGA_8X8_THICK.as_ptr().cast::<u8>(), dest, &info) };
|
|
|
|
}
|
|
|
|
|
|
|
|
DISPCNT.write(DisplayControl::new().with_show_bg2(true));
|
2022-09-28 02:40:05 +10:00
|
|
|
|
|
|
|
loop {
|
|
|
|
VBlankIntrWait();
|
|
|
|
|
|
|
|
let k = KEYS.read();
|
2022-09-28 03:20:05 +10:00
|
|
|
VALUE.write((k.to_u16() + 3) / k.to_u16()); // force a runtime division
|
2022-09-28 02:40:05 +10:00
|
|
|
BACKDROP_COLOR.write(Color(k.to_u16()));
|
|
|
|
}
|
|
|
|
}
|