diff --git a/src/apu.rs b/src/apu.rs
index 3b2f08f839ab19f63e8279456f511da11716d9ee..dbbe28918765d4985a460b20437406fcf88e3902 100644
--- a/src/apu.rs
+++ b/src/apu.rs
@@ -264,7 +264,7 @@ impl Apu {
         self.clear_audio_buffer()
     }
 
-    pub fn clock(&mut self, cycles: u8) {
+    pub fn clock(&mut self, cycles: u16) {
         if !self.sound_enabled {
             return;
         }
@@ -802,7 +802,7 @@ impl Apu {
     }
 
     #[inline(always)]
-    fn tick_ch_all(&mut self, cycles: u8) {
+    fn tick_ch_all(&mut self, cycles: u16) {
         self.tick_ch1(cycles);
         self.tick_ch2(cycles);
         self.tick_ch3(cycles);
@@ -810,7 +810,7 @@ impl Apu {
     }
 
     #[inline(always)]
-    fn tick_ch1(&mut self, cycles: u8) {
+    fn tick_ch1(&mut self, cycles: u16) {
         self.ch1_timer = self.ch1_timer.saturating_sub(cycles as i16);
         if self.ch1_timer > 0 {
             return;
@@ -832,7 +832,7 @@ impl Apu {
     }
 
     #[inline(always)]
-    fn tick_ch2(&mut self, cycles: u8) {
+    fn tick_ch2(&mut self, cycles: u16) {
         self.ch2_timer = self.ch2_timer.saturating_sub(cycles as i16);
         if self.ch2_timer > 0 {
             return;
@@ -854,7 +854,7 @@ impl Apu {
     }
 
     #[inline(always)]
-    fn tick_ch3(&mut self, cycles: u8) {
+    fn tick_ch3(&mut self, cycles: u16) {
         self.ch3_timer = self.ch3_timer.saturating_sub(cycles as i16);
         if self.ch3_timer > 0 {
             return;
@@ -883,7 +883,7 @@ impl Apu {
     }
 
     #[inline(always)]
-    fn tick_ch4(&mut self, cycles: u8) {
+    fn tick_ch4(&mut self, cycles: u16) {
         self.ch4_timer = self.ch4_timer.saturating_sub(cycles as i32);
         if self.ch4_timer > 0 {
             return;
diff --git a/src/dma.rs b/src/dma.rs
index f477b8607e2d4d8b631138a8acf8670a810adafa..8414356def5c50757c17da80fcc7e7804f652fdb 100644
--- a/src/dma.rs
+++ b/src/dma.rs
@@ -33,7 +33,7 @@ impl Dma {
         self.active = false;
     }
 
-    pub fn clock(&mut self, _cycles: u8) {}
+    pub fn clock(&mut self, _cycles: u16) {}
 
     pub fn read(&mut self, addr: u16) -> u8 {
         match addr {
diff --git a/src/gb.rs b/src/gb.rs
index 66c37c44ab0f421a9c49c36675ce53cfee813ba7..a43b6b117c1de0b3a41e289b16b9fa3389f9a106 100644
--- a/src/gb.rs
+++ b/src/gb.rs
@@ -391,9 +391,33 @@ impl GameBoy {
         self.cpu.reset();
     }
 
-    pub fn clock(&mut self) -> u8 {
-        let cycles = self.cpu_clock();
-        let cycles_n = cycles / self.multiplier();
+    pub fn clock(&mut self) -> u16 {
+        let cycles = self.cpu_clock() as u16;
+        let cycles_n = cycles / self.multiplier() as u16;
+        if self.ppu_enabled {
+            self.ppu_clock(cycles_n);
+        }
+        if self.apu_enabled {
+            self.apu_clock(cycles_n);
+        }
+        if self.dma_enabled {
+            self.dma_clock(cycles);
+        }
+        if self.timer_enabled {
+            self.timer_clock(cycles);
+        }
+        if self.serial_enabled {
+            self.serial_clock(cycles);
+        }
+        cycles
+    }
+
+    pub fn clock_m(&mut self, count: usize) -> u16 {
+        let mut cycles = 0u16;
+        for _ in 0..count {
+            cycles += self.clock() as u16;
+        }
+        let cycles_n = cycles / self.multiplier() as u16;
         if self.ppu_enabled {
             self.ppu_clock(cycles_n);
         }
@@ -424,23 +448,23 @@ impl GameBoy {
         self.cpu.clock()
     }
 
-    pub fn ppu_clock(&mut self, cycles: u8) {
+    pub fn ppu_clock(&mut self, cycles: u16) {
         self.ppu().clock(cycles)
     }
 
-    pub fn apu_clock(&mut self, cycles: u8) {
+    pub fn apu_clock(&mut self, cycles: u16) {
         self.apu().clock(cycles)
     }
 
-    pub fn dma_clock(&mut self, cycles: u8) {
+    pub fn dma_clock(&mut self, cycles: u16) {
         self.mmu().clock_dma(cycles);
     }
 
-    pub fn timer_clock(&mut self, cycles: u8) {
+    pub fn timer_clock(&mut self, cycles: u16) {
         self.timer().clock(cycles)
     }
 
-    pub fn serial_clock(&mut self, cycles: u8) {
+    pub fn serial_clock(&mut self, cycles: u16) {
         self.serial().clock(cycles)
     }
 
diff --git a/src/mmu.rs b/src/mmu.rs
index 00eb63228bc1ebe9c73c6bb57ee0419787c393db..2a5924453b9a63950dad12bbe6624389fdabded1 100644
--- a/src/mmu.rs
+++ b/src/mmu.rs
@@ -236,7 +236,7 @@ impl Mmu {
         self.boot_active = value;
     }
 
-    pub fn clock_dma(&mut self, _cycles: u8) {
+    pub fn clock_dma(&mut self, _cycles: u16) {
         if !self.dma.active() {
             return;
         }
diff --git a/src/ppu.rs b/src/ppu.rs
index d8c64c84d57c2a52448b0e17a228fde5777a5bdb..946f6ac462165ae8f6d6c957930f56f08c1c1221 100644
--- a/src/ppu.rs
+++ b/src/ppu.rs
@@ -589,7 +589,7 @@ impl Ppu {
         self.dmg_compat = false;
     }
 
-    pub fn clock(&mut self, cycles: u8) {
+    pub fn clock(&mut self, cycles: u16) {
         // in case the LCD is currently off then we skip the current
         // clock operation the PPU should not work
         if !self.switch_lcd {
diff --git a/src/serial.rs b/src/serial.rs
index a9bd6205435c22187694d291eda6d56ffe1c9f8b..7d0d1d44adfa8569637ca3dc4845c24750a5c66c 100644
--- a/src/serial.rs
+++ b/src/serial.rs
@@ -68,7 +68,7 @@ impl Serial {
         self.int_serial = false;
     }
 
-    pub fn clock(&mut self, cycles: u8) {
+    pub fn clock(&mut self, cycles: u16) {
         if !self.transferring {
             return;
         }
diff --git a/src/timer.rs b/src/timer.rs
index 0150496fa58394d17d87f6ad2a46df4e040a4a4d..7adc5fd9d12ff1b40a241b9ad1c651283f329413 100644
--- a/src/timer.rs
+++ b/src/timer.rs
@@ -39,7 +39,7 @@ impl Timer {
         self.int_tima = false;
     }
 
-    pub fn clock(&mut self, cycles: u8) {
+    pub fn clock(&mut self, cycles: u16) {
         self.div_clock += cycles as u16;
         while self.div_clock >= 256 {
             self.div = self.div.wrapping_add(1);