diff --git a/frontends/sdl/src/main.rs b/frontends/sdl/src/main.rs index fb789d0ab817bea820ef104e38ffa319918f3176..c8227f12f20924c219e6744a59d9e5b06f8727df 100644 --- a/frontends/sdl/src/main.rs +++ b/frontends/sdl/src/main.rs @@ -351,8 +351,7 @@ impl Emulator { // for the current "tick" operation this is basically the current // logic frequency divided by the visual one, this operation also // takes into account the current Game Boy speed multiplier (GBC) - let cycle_limit = (self.logic_frequency as f32 - * self.system.speed().multiplier() as f32 + let cycle_limit = (self.logic_frequency as f32 * self.system.multiplier() as f32 / self.visual_frequency) .round() as u32; diff --git a/frontends/web/ts/gb.ts b/frontends/web/ts/gb.ts index c734938d380a2f0c349bc5192da8d72e32b3012e..2e5af350f548a56ede50af2d2e08761c0c718adb 100644 --- a/frontends/web/ts/gb.ts +++ b/frontends/web/ts/gb.ts @@ -192,7 +192,11 @@ export class GameboyEmulator extends EmulatorBase implements Emulator { pending = this.tick( currentTime, pending, - Math.round(this.logicFrequency / this.visualFrequency) + Math.round( + (this.logicFrequency * + (this.gameBoy?.multiplier() ?? 1)) / + this.visualFrequency + ) ); } catch (err) { // sets the default error message to be displayed diff --git a/src/gb.rs b/src/gb.rs index f0990106a17a0713d20a029598b316efc34f1299..8f38e481eb1d0cbb1c75d5751cc26057f613b840 100644 --- a/src/gb.rs +++ b/src/gb.rs @@ -392,7 +392,7 @@ impl GameBoy { pub fn clock(&mut self) -> u8 { let cycles = self.cpu_clock(); - let cycles_n = cycles / self.mmu().speed.multiplier(); + let cycles_n = cycles / self.multiplier(); if self.ppu_enabled { self.ppu_clock(cycles_n); } @@ -640,6 +640,10 @@ impl GameBoy { self.mmu_i().speed } + pub fn multiplier(&self) -> u8 { + self.mmu_i().speed.multiplier() + } + pub fn mode(&self) -> GameBoyMode { self.mode }