64 lines
1.9 KiB
Rust
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(())
|
|
}
|