diff --git a/examples/benchmark/Cargo.toml b/examples/benchmark/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..81438038316f1b576b71c6f15038f4afcd7b637a --- /dev/null +++ b/examples/benchmark/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "chip-ahoyto-benchmark" +version = "0.1.0" +authors = ["João Magalhães <joamag@gmail.com>"] +description = "CHIP-8 Benchmark application" +license = "Apache-2.0" +keywords = ["chip-8", "emulator", "rust", "benchmark"] +edition = "2018" + +[dependencies.chip-ahoyto] +path = "../.." + +[profile.release] +debug = false +lto = true +opt-level = 3 diff --git a/examples/benchmark/resources/pong.ch8 b/examples/benchmark/resources/pong.ch8 new file mode 100644 index 0000000000000000000000000000000000000000..295ce91c67214cf73298959781e6c1c089b55d2a Binary files /dev/null and b/examples/benchmark/resources/pong.ch8 differ diff --git a/examples/benchmark/src/main.rs b/examples/benchmark/src/main.rs new file mode 100644 index 0000000000000000000000000000000000000000..5ef3f0face4af6e7a2ef616ba6db3725790f11a1 --- /dev/null +++ b/examples/benchmark/src/main.rs @@ -0,0 +1,25 @@ +use chip_ahoyto::chip8::Chip8; +use std::{fs::File, io::Read}; + +const CYCLE_COUNT: u32 = 1_000_000_000; + +fn main() { + let rom = read_file("./resources/pong.ch8"); + + let mut chip8 = Chip8::new(); + chip8.reset_hard(); + chip8.load_rom(&rom); + + println!("Running {} cycles", CYCLE_COUNT); + + for _ in 0..CYCLE_COUNT { + chip8.tick(); + } +} + +fn read_file(path: &str) -> Vec<u8> { + let mut file = File::open(path).unwrap(); + let mut data = Vec::new(); + file.read_to_end(&mut data).unwrap(); + data +} diff --git a/examples/sdl/src/main.rs b/examples/sdl/src/main.rs index 518ec6edaa9d3930feff8974b22113a98693ebfe..13d4c1ea69c2d211e241abe8fcabd00a7be5005a 100644 --- a/examples/sdl/src/main.rs +++ b/examples/sdl/src/main.rs @@ -272,9 +272,7 @@ fn main() { for _ in 0..logic_visual_ratio { // runs the tick operation in the CHIP-8 system, // effectively changing the logic state of the machine - state.system.clock(); - state.system.clock_dt(); - state.system.clock_st(); + state.system.tick(); beep |= state.system.beep(); } @@ -348,7 +346,7 @@ fn key_to_btn(keycode: Keycode) -> Option<u8> { fn read_file(path: &str) -> Vec<u8> { let mut file = File::open(path).unwrap(); - let mut rom = Vec::new(); - file.read_to_end(&mut rom).unwrap(); - rom + let mut data = Vec::new(); + file.read_to_end(&mut data).unwrap(); + data } diff --git a/src/chip8.rs b/src/chip8.rs index f8135ca093807ee3c5d72edf74714b832edf5cac..614f27eea057b517c80583f08719133dc0d6ab95 100644 --- a/src/chip8.rs +++ b/src/chip8.rs @@ -120,6 +120,12 @@ impl Chip8 { self.ram[ROM_START..ROM_START + rom.len()].clone_from_slice(rom); } + pub fn tick(&mut self) { + self.clock(); + self.clock_dt(); + self.clock_st(); + } + pub fn clock(&mut self) { let opcode = self.fetch_opcode(); self.process_opcode(opcode);