You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
1.9 KiB

#![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]);
}
}
}