2022-09-28 02:40:05 +10:00
|
|
|
#![no_std]
|
|
|
|
#![no_main]
|
|
|
|
|
2022-10-10 05:21:23 +11:00
|
|
|
use core::fmt::Write;
|
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) {
|
2022-10-14 13:20:57 +11:00
|
|
|
writeln!(logger, "{info}").ok();
|
2022-09-28 09:57:09 +10:00
|
|
|
}
|
2022-09-28 02:40:05 +10:00
|
|
|
loop {}
|
|
|
|
}
|
|
|
|
|
2022-10-09 18:40:26 +11:00
|
|
|
#[link_section = ".ewram"]
|
2022-10-07 15:11:13 +11:00
|
|
|
static FRAME_KEYS: GbaCell<KeyInput> = GbaCell::new(KeyInput::new());
|
2022-09-28 03:20:05 +10:00
|
|
|
|
2022-10-09 18:40:26 +11:00
|
|
|
#[link_section = ".iwram"]
|
2022-10-07 10:23:32 +11:00
|
|
|
extern "C" fn irq_handler(_: IrqBits) {
|
2022-10-07 15:11:13 +11:00
|
|
|
// We'll read the keys during vblank and store it for later.
|
|
|
|
FRAME_KEYS.write(KEYINPUT.read());
|
2022-09-28 02:40:05 +10:00
|
|
|
}
|
|
|
|
|
2022-10-09 18:40:26 +11:00
|
|
|
const TILE_LAYOUT: [u32; 512] = {
|
|
|
|
// Rust's const eval is limited at the moment, but with a bit of careful math
|
|
|
|
// we can set up `u32` values that store the right data. Tile maps are 32x32
|
|
|
|
// `u16` values, so when packing it as `u32` instead we have to throw in some
|
|
|
|
// `/2` stuff in a few places. Seperately, the tiles that we're using come
|
|
|
|
// from an image that was drawn as a 16 by 16 tile sheet, so most of the
|
|
|
|
// layout's area will be left as zero. Thankfully, tile index 0 is a blank
|
|
|
|
// tile in this tileset, so it all works out.
|
|
|
|
let mut data = [0; 512];
|
|
|
|
let mut r = 0;
|
|
|
|
while r < 16 {
|
|
|
|
let mut c = 0;
|
|
|
|
while c < 16 {
|
|
|
|
let index = r * (32 / 2) + (c / 2);
|
|
|
|
let a = r * 16 + c;
|
|
|
|
let b = r * 16 + c + 1;
|
|
|
|
data[index] = (a as u32) | ((b as u32) << 16);
|
|
|
|
//
|
|
|
|
c += 2;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
r += 1;
|
|
|
|
}
|
|
|
|
data
|
|
|
|
};
|
|
|
|
|
2022-09-28 02:40:05 +10:00
|
|
|
#[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.
|
2022-10-14 13:36:56 +11:00
|
|
|
Cga8x8Thick.bitunpack_4bpp(CHARBLOCK0_4BPP.as_region(), 0);
|
2022-10-07 10:14:34 +11:00
|
|
|
}
|
|
|
|
|
2022-10-08 13:52:50 +11:00
|
|
|
{
|
2022-10-09 18:40:26 +11:00
|
|
|
// get the the tilemap copied into place
|
2022-10-14 12:41:29 +11:00
|
|
|
let tsb = TextScreenblockAddress::new(31);
|
2022-10-09 18:40:26 +11:00
|
|
|
tsb.write_words(&TILE_LAYOUT);
|
2022-10-07 15:11:13 +11:00
|
|
|
}
|
|
|
|
|
2022-10-08 13:52:50 +11:00
|
|
|
{
|
|
|
|
// Set BG0 to use the tilemap we just made, and set it to be shown.
|
|
|
|
BG0CNT.write(BackgroundControl::new().with_screenblock(31));
|
|
|
|
DISPCNT.write(DisplayControl::new().with_show_bg0(true));
|
|
|
|
}
|
2022-09-28 02:40:05 +10:00
|
|
|
|
2022-10-07 15:11:13 +11:00
|
|
|
let mut x_off = 0_u32;
|
|
|
|
let mut y_off = 0_u32;
|
|
|
|
let mut backdrop_color = Color(0);
|
2022-09-28 02:40:05 +10:00
|
|
|
loop {
|
|
|
|
VBlankIntrWait();
|
2022-10-07 15:11:13 +11:00
|
|
|
// show current frame
|
|
|
|
BACKDROP_COLOR.write(backdrop_color);
|
|
|
|
BG0HOFS.write(x_off as u16);
|
|
|
|
BG0VOFS.write(y_off as u16);
|
2022-09-28 02:40:05 +10:00
|
|
|
|
2022-10-07 15:11:13 +11:00
|
|
|
// prep next frame
|
|
|
|
let k = FRAME_KEYS.read();
|
|
|
|
backdrop_color = Color(k.to_u16());
|
|
|
|
if k.up() {
|
|
|
|
y_off = y_off.wrapping_add(1);
|
|
|
|
}
|
|
|
|
if k.down() {
|
|
|
|
y_off = y_off.wrapping_sub(1);
|
|
|
|
}
|
|
|
|
if k.left() {
|
|
|
|
x_off = x_off.wrapping_add(1);
|
|
|
|
}
|
|
|
|
if k.right() {
|
|
|
|
x_off = x_off.wrapping_sub(1);
|
|
|
|
}
|
2022-09-28 02:40:05 +10:00
|
|
|
}
|
|
|
|
}
|