diff --git a/frontends/sdl/src/main.rs b/frontends/sdl/src/main.rs index 5ab6c7fcecbeb4497522fc92449d2031783c8b20..b9ac2e86dc8420b6e7d2cb56d1fa145905dd17b8 100644 --- a/frontends/sdl/src/main.rs +++ b/frontends/sdl/src/main.rs @@ -39,17 +39,18 @@ const VOLUME: f32 = 64.0; pub struct Benchmark { count: usize, + chunk_size: Option<usize>, } impl Benchmark { - pub fn new(count: usize) -> Self { - Self { count } + pub fn new(count: usize, chunk_size: Option<usize>) -> Self { + Self { count, chunk_size } } } impl Default for Benchmark { fn default() -> Self { - Self::new(50000000) + Self::new(50000000, None) } } @@ -224,12 +225,19 @@ impl Emulator { println!("Going to run benchmark..."); let count = params.count; + let chunk_size = params.chunk_size.unwrap_or(1); let mut cycles = 0; let initial = SystemTime::now(); - for _ in 0..count { - cycles += self.system.clock() as u32; + if chunk_size > 1 { + for _ in 0..(count / chunk_size) { + cycles += self.system.clock_m(chunk_size) as u32; + } + } else { + for _ in 0..count { + cycles += self.system.clock() as u32; + } } let delta = initial.elapsed().unwrap().as_millis() as f32 / 1000.0; diff --git a/src/gb.rs b/src/gb.rs index a43b6b117c1de0b3a41e289b16b9fa3389f9a106..c6b0cd4314a14174c92811292ae04195e259fa2d 100644 --- a/src/gb.rs +++ b/src/gb.rs @@ -412,10 +412,16 @@ impl GameBoy { cycles } + /// Risky function that will clock the CPU multiple times + /// allowing an undefined number of cycles to be executed + /// in the other Game Boy components. + /// This can cause unwanted behaviour in components like + /// the PPU where only one mode switch operation is expected + /// per each clock call. pub fn clock_m(&mut self, count: usize) -> u16 { let mut cycles = 0u16; for _ in 0..count { - cycles += self.clock() as u16; + cycles += self.cpu_clock() as u16; } let cycles_n = cycles / self.multiplier() as u16; if self.ppu_enabled {