buttery8/src/main.rs
2026-04-08 09:17:52 -04:00

64 lines
1.9 KiB
Rust

mod cpu;
use cpu::Cpu;
use minifb::{Key, Scale, Window, WindowOptions};
use std::{env, fs};
const WIDTH: usize = 64;
const HEIGHT: usize = 32;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
eprintln!("Usage: {} <rom.ch8>", args[0]);
std::process::exit(1);
}
let rom = fs::read(&args[1])?;
let mut chip8 = Cpu::new(&rom);
let mut window = Window::new(
"Buttery Chip8",
WIDTH,
HEIGHT,
WindowOptions {
scale: Scale::X8,
..WindowOptions::default()
},
)
.unwrap();
let mut buffer: Vec<u32> = vec![0; WIDTH * HEIGHT];
while window.is_open() {
let keys = [
window.is_key_down(Key::X), // 0
window.is_key_down(Key::Key1), // 1
window.is_key_down(Key::Key2), // 2
window.is_key_down(Key::Key3), // 3
window.is_key_down(Key::Q), // 4
window.is_key_down(Key::W), // 5
window.is_key_down(Key::E), // 6
window.is_key_down(Key::A), // 7
window.is_key_down(Key::S), // 8
window.is_key_down(Key::D), // 9
window.is_key_down(Key::Z), // A
window.is_key_down(Key::C), // B
window.is_key_down(Key::Key4), // C
window.is_key_down(Key::R), // D
window.is_key_down(Key::F), // E
window.is_key_down(Key::V), // F
];
chip8.prev_keys = chip8.keys;
chip8.keys = keys;
for _ in 0..10 {
// 10 ticks * 60fps = ~600 cycles/sec
chip8.tick();
}
for (i, pixel) in chip8.display.iter().enumerate() {
buffer[i] = if *pixel { 0xFFFFFFFF } else { 0x00000000 };
}
window.update_with_buffer(&buffer, WIDTH, HEIGHT).unwrap();
}
Ok(())
}