From dcd09adffaef3c37bf2fd147741965f4504e0913 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Wed, 14 Jun 2023 00:23:34 +0100
Subject: [PATCH] chore: initial support for registers testing

---
 frontends/sdl/src/main.rs |  2 +-
 src/apu.rs                | 36 +++++++++++++++++++++++-------------
 src/mmu.rs                |  4 ++--
 3 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/frontends/sdl/src/main.rs b/frontends/sdl/src/main.rs
index ae1cdc1c..017932bc 100644
--- a/frontends/sdl/src/main.rs
+++ b/frontends/sdl/src/main.rs
@@ -712,7 +712,7 @@ struct Args {
     )]
     cycles: u64,
 
-    #[arg(short, long, default_value_t = String::from("../../res/roms/demo/pocket.gb"), help = "Path to the ROM file to be loaded")]
+    #[arg(short, long, default_value_t = String::from("C:/Users/joamag/Desktop/gb-test-roms/dmg_sound/rom_singles/01-registers.gb"), help = "Path to the ROM file to be loaded")]
     rom_path: String,
 }
 
diff --git a/src/apu.rs b/src/apu.rs
index 1519d0e3..649aef41 100644
--- a/src/apu.rs
+++ b/src/apu.rs
@@ -329,26 +329,31 @@ impl Apu {
     }
 
     pub fn read(&mut self, addr: u16) -> u8 {
-        match addr {
+        let value = match addr {
             // 0xFF10 — NR10: Channel 1 sweep
             0xff10 => {
                 (self.ch1_sweep_slope & 0x07)
-                    | (if self.ch1_sweep_increase { 0x08 } else { 0x00 })
+                    | (if self.ch1_sweep_increase { 0x00 } else { 0x08 })
                     | ((self.ch1_sweep_pace & 0x07) << 4)
+                    | 0x80
             }
             // 0xFF11 — NR11: Channel 1 length timer & duty cycle
-            0xff11 => (self.ch1_wave_duty & 0x03) << 6,
+            0xff11 => ((self.ch1_wave_duty & 0x03) << 6) | 0x3f,
             // 0xFF12 — NR12: Channel 1 volume & envelope
             0xff12 => {
                 (self.ch1_pace & 0x07)
                     | ((self.ch1_direction & 0x01) << 3)
                     | ((self.ch1_volume & 0x0f) << 4)
             }
+            // 0xFF13 — NR13: Channel 1 wavelength low
+            0xff13 => 0xff,
+            // 0xFF14 — NR14: Channel 1 wavelength high & control
+            0xff14 => (if self.ch1_length_stop { 0x40 } else { 0x00 }) | 0xbf,
 
             // 0xFF15 — Not used
             0xff15 => 0xff,
             // 0xFF16 — NR21: Channel 2 length timer & duty cycle
-            0xff16 => (self.ch2_wave_duty & 0x03) << 6,
+            0xff16 => (self.ch2_wave_duty & 0x03) << 6 | 0x3f,
             // 0xFF17 — NR22: Channel 2 volume & envelope
             0xff17 => {
                 (self.ch2_pace & 0x07)
@@ -404,10 +409,15 @@ impl Apu {
                 warnln!("Reading from unknown APU location 0x{:04x}", addr);
                 0xff
             }
-        }
+        };
+
+        println!("APU read: {:04x} = {:02x}", addr, value);
+
+        value
     }
 
     pub fn write(&mut self, addr: u16, value: u8) {
+        println!("APU write: {:04x} = {:02x}", addr, value);
         match addr {
             // 0xFF10 — NR10: Channel 1 sweep
             0xff10 => {
@@ -444,8 +454,8 @@ impl Apu {
                 if trigger {
                     self.trigger_ch1();
                 }
-                if (length_trigger || trigger) && self.ch1_length_timer == 0 {
-                    self.ch1_length_timer = 0;
+                if length_trigger && self.ch1_length_timer == 0 {
+                    self.ch1_enabled = false;
                 }
             }
 
@@ -479,8 +489,8 @@ impl Apu {
                 if trigger {
                     self.trigger_ch2();
                 }
-                if (length_trigger || trigger) && self.ch2_length_timer == 0 {
-                    self.ch2_length_timer = 0;
+                if length_trigger && self.ch2_length_timer == 0 {
+                    self.ch2_enabled = false;
                 }
             }
 
@@ -511,8 +521,8 @@ impl Apu {
                 if trigger {
                     self.trigger_ch3();
                 }
-                if (length_trigger || trigger) && self.ch3_length_timer == 0 {
-                    self.ch3_length_timer = 0;
+                if length_trigger && self.ch3_length_timer == 0 {
+                    self.ch3_enabled = false;
                 }
             }
 
@@ -545,8 +555,8 @@ impl Apu {
                 if trigger {
                     self.trigger_ch4();
                 }
-                if (length_trigger || trigger) && self.ch4_length_timer == 0 {
-                    self.ch4_length_timer = 0;
+                if length_trigger && self.ch4_length_timer == 0 {
+                    self.ch4_enabled = false;
                 }
             }
 
diff --git a/src/mmu.rs b/src/mmu.rs
index a32bbe8b..c5bd6784 100644
--- a/src/mmu.rs
+++ b/src/mmu.rs
@@ -340,7 +340,7 @@ impl Mmu {
                                 0x00
                             }
                         },
-                        0x10..=0x26 | 0x30..=0x37 => self.apu.read(addr),
+                        0x10..=0x26 | 0x30..=0x3f => self.apu.read(addr),
                         0x40 | 0x60 | 0x70 => self.ppu.read(addr),
                         0x50 => match addr & 0x00ff {
                             0x51..=0x55 => self.dma.read(addr),
@@ -448,7 +448,7 @@ impl Mmu {
                                 0x04..=0x07 => self.timer.write(addr, value),
                                 _ => debugln!("Writing to unknown IO control 0x{:04x}", addr),
                             },
-                            0x10..=0x26 | 0x30..=0x37 => self.apu.write(addr, value),
+                            0x10..=0x26 | 0x30..=0x3f => self.apu.write(addr, value),
                             0x40 | 0x60 | 0x70 => {
                                 match addr & 0x00ff {
                                     // 0xFF46 — DMA: OAM DMA source address & start
-- 
GitLab