|
|
|
@ -13,22 +13,74 @@ fn panic_handler(_info: &PanicInfo) -> ! {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const OUTPUT: *mut u32 = 0x2000_0000 as *mut u32;
|
|
|
|
|
// const BTNS: *mut u8 = 0x2000_0008 as *mut u8;
|
|
|
|
|
|
|
|
|
|
const BTNS: *mut u8 = 0x2000_0008 as *mut u8;
|
|
|
|
|
const SCREEN: *mut u32 = 0x2000_0080 as *mut u32;
|
|
|
|
|
|
|
|
|
|
#[entry]
|
|
|
|
|
fn main() -> ! {
|
|
|
|
|
let mut value: u32 = 1;
|
|
|
|
|
let mut offset: isize = 0;
|
|
|
|
|
let mut playerA: u8 = 1;
|
|
|
|
|
let mut playerB: u8 = 1;
|
|
|
|
|
let mut ballX: i8 = 16;
|
|
|
|
|
let mut ballY: i8 = 16;
|
|
|
|
|
let mut ballXvel: i8 = 1;
|
|
|
|
|
|
|
|
|
|
let mut vram: [u32; 32] = [0; 32];
|
|
|
|
|
|
|
|
|
|
vram[playerA as usize] |= 1 << 31;
|
|
|
|
|
vram[playerB as usize] |= 1;
|
|
|
|
|
vram[ballY as usize] |= 1 << ballX;
|
|
|
|
|
|
|
|
|
|
loop {
|
|
|
|
|
let btns;
|
|
|
|
|
unsafe {
|
|
|
|
|
SCREEN.offset(offset).write_volatile(value);
|
|
|
|
|
btns = BTNS.read_volatile();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// left up
|
|
|
|
|
if btns & (1 << 7) > 0 {
|
|
|
|
|
vram[playerA as usize] &= !(1 << 31);
|
|
|
|
|
playerA -= 1;
|
|
|
|
|
vram[playerA as usize] |= 1 << 31;
|
|
|
|
|
}
|
|
|
|
|
// left down
|
|
|
|
|
if btns & (1 << 5) > 0 {
|
|
|
|
|
vram[playerA as usize] &= !(1 << 31);
|
|
|
|
|
playerA += 1;
|
|
|
|
|
vram[playerA as usize] |= 1 << 31;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// right up
|
|
|
|
|
if btns & (1 << 3) > 0 {
|
|
|
|
|
vram[playerB as usize] &= !1;
|
|
|
|
|
playerB -= 1;
|
|
|
|
|
vram[playerB as usize] |= 1;
|
|
|
|
|
}
|
|
|
|
|
value <<= 1;
|
|
|
|
|
offset += 1;
|
|
|
|
|
if value == 0 {
|
|
|
|
|
panic!();
|
|
|
|
|
// right down
|
|
|
|
|
if btns & (1 << 1) > 0 {
|
|
|
|
|
vram[playerB as usize] &= !1;
|
|
|
|
|
playerB += 1;
|
|
|
|
|
vram[playerB as usize] |= 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ballX >= 31 {
|
|
|
|
|
ballXvel = -1;
|
|
|
|
|
} else if ballX == 0 {
|
|
|
|
|
ballXvel = 1;
|
|
|
|
|
}
|
|
|
|
|
vram[ballY as usize] &= !(1 << ballX);
|
|
|
|
|
ballX += ballXvel;
|
|
|
|
|
vram[ballY as usize] |= 1 << ballX;
|
|
|
|
|
|
|
|
|
|
draw(&vram);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn draw(vram: &[u32; 32]) {
|
|
|
|
|
for row_index in 0..32 {
|
|
|
|
|
unsafe {
|
|
|
|
|
SCREEN
|
|
|
|
|
.offset(row_index)
|
|
|
|
|
.write_volatile(vram[row_index as usize]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|