From 1dbec8faf93291d11e6b5e98a7b6fc2f67165bb9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Mon, 15 May 2023 18:36:21 +0100
Subject: [PATCH] chore: multiplier support in web version

---
 frontends/sdl/src/main.rs | 3 +--
 frontends/web/ts/gb.ts    | 6 +++++-
 src/gb.rs                 | 6 +++++-
 3 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/frontends/sdl/src/main.rs b/frontends/sdl/src/main.rs
index fb789d0a..c8227f12 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 c734938d..2e5af350 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 f0990106..8f38e481 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
     }
-- 
GitLab