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> { let args: Vec = env::args().collect(); if args.len() < 2 { eprintln!("Usage: {} ", 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 = 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(()) }