nibble8 0.2.0

Yet another Rust implementation of a Chip-8 interpreter, using sdl2.
use display::sdl_display::SDLDisplay;
use machine::chip8::Chip8;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use std::env;

mod bit_utils;
mod display;
mod machine;

fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() != 2 {
        println!("Usage: ./{} <rom.ch8>", args[0]);
        return;
    }

    let sdl_context = sdl2::init().unwrap();
    let mut display = SDLDisplay::init(&sdl_context, 640, 320);
    let mut chip8 = Chip8::new(&mut display);

    chip8.load_rom(&args[1]);
    let mut event_pump = sdl_context.event_pump().unwrap();

    let mut iteration = 0;
    'running: loop {
        iteration += 1;
        for event in event_pump.poll_iter() {
            match event {
                Event::Quit { .. }
                | Event::KeyDown {
                    keycode: Some(Keycode::Escape),
                    ..
                } => break 'running,
                Event::KeyDown {
                    keycode: Some(Keycode::Num0),
                    ..
                } => chip8.register_key(0x00),
                Event::KeyDown {
                    keycode: Some(Keycode::Num1),
                    ..
                } => chip8.register_key(0x01),
                Event::KeyDown {
                    keycode: Some(Keycode::Num2),
                    ..
                } => chip8.register_key(0x02),
                Event::KeyDown {
                    keycode: Some(Keycode::Num3),
                    ..
                } => chip8.register_key(0x03),
                Event::KeyDown {
                    keycode: Some(Keycode::Num4),
                    ..
                } => chip8.register_key(0x04),
                Event::KeyDown {
                    keycode: Some(Keycode::Num5),
                    ..
                } => chip8.register_key(0x05),
                Event::KeyDown {
                    keycode: Some(Keycode::Num6),
                    ..
                } => chip8.register_key(0x06),
                Event::KeyDown {
                    keycode: Some(Keycode::Num7),
                    ..
                } => chip8.register_key(0x07),
                Event::KeyDown {
                    keycode: Some(Keycode::Num8),
                    ..
                } => chip8.register_key(0x08),
                Event::KeyDown {
                    keycode: Some(Keycode::Num9),
                    ..
                } => chip8.register_key(0x09),
                Event::KeyDown {
                    keycode: Some(Keycode::A),
                    ..
                } => chip8.register_key(0x0A),
                Event::KeyDown {
                    keycode: Some(Keycode::B),
                    ..
                } => chip8.register_key(0x0B),
                Event::KeyDown {
                    keycode: Some(Keycode::C),
                    ..
                } => chip8.register_key(0x0C),
                Event::KeyDown {
                    keycode: Some(Keycode::D),
                    ..
                } => chip8.register_key(0x0D),
                Event::KeyDown {
                    keycode: Some(Keycode::E),
                    ..
                } => chip8.register_key(0x0E),
                Event::KeyDown {
                    keycode: Some(Keycode::F),
                    ..
                } => chip8.register_key(0x0F),
                _ => {
                    if iteration > 70 {
                        chip8.clear_keys();
                        iteration = 0;
                    }
                }
            }
        }
        chip8.tick();
    }
}