#![no_std] #![no_main] use core::panic::PanicInfo; use riscv_rt::entry; #[panic_handler] fn panic_handler(_info: &PanicInfo) -> ! { unsafe { OUTPUT.write_volatile(0xDEADC0DE); } loop {} } const OUTPUT: *mut u32 = 0x2000_0000 as *mut u32; const BTNS: *mut u8 = 0x2000_0008 as *mut u8; const SCREEN: *mut u32 = 0x2000_0080 as *mut u32; #[entry] fn main() -> ! { 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 { 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; } // 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]); } } }