diff --git a/src/apu.rs b/src/apu.rs
index ff7674e58b520fa6acbf2af64ae1365597d3b9e0..711e8115e28c80dce8d5af0a479e240ae51372dd 100644
--- a/src/apu.rs
+++ b/src/apu.rs
@@ -656,6 +656,14 @@ impl Apu {
         }
     }
 
+    pub fn read_unsafe(&mut self, addr: u16) -> u8 {
+        self.read(addr)
+    }
+
+    pub fn write_unsafe(&mut self, addr: u16, value: u8) {
+        self.write(addr, value);
+    }
+
     #[inline(always)]
     pub fn output(&self) -> u8 {
         self.ch1_output() + self.ch2_output() + self.ch3_output() + self.ch4_output()
diff --git a/src/mmu.rs b/src/mmu.rs
index a11a5f1e6ceb1cef59b838d6dd46c6a21dc7a7e5..141917e0d7c1bdb09b69ee0d2f6cdbfe4ca96fb4 100644
--- a/src/mmu.rs
+++ b/src/mmu.rs
@@ -502,6 +502,7 @@ impl Mmu {
     /// Game Boy verifications, allowing deep read of values.
     pub fn read_unsafe(&mut self, addr: u16) -> u8 {
         match addr {
+            0xff10..=0xff3f => self.apu.read_unsafe(addr),
             _ => self.read(addr),
         }
     }
@@ -512,6 +513,7 @@ impl Mmu {
     /// inaccessible.
     pub fn write_unsafe(&mut self, addr: u16, value: u8) {
         match addr {
+            0xff10..=0xff3f => self.apu.write_unsafe(addr, value),
             _ => self.write(addr, value),
         }
     }