From 3818ecf193c6950ae0034e89baca7fd2726aa42a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Mon, 4 Dec 2017 14:39:41 -0500 Subject: [PATCH] GBHawk: Implement obscure audio effects --- .../Consoles/Nintendo/GBHawk/Audio.cs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Audio.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Audio.cs index 28b9c2edf2..6af2ade6ce 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Audio.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBHawk/Audio.cs @@ -188,11 +188,20 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk SQ1_len_cntr = SQ1_length; break; case 0xFF12: // NR12 (envelope) - Audio_Regs[NR12] = value; SQ1_st_vol = (byte)((value & 0xF0) >> 4); SQ1_env_add = (value & 8) > 0; SQ1_per = (byte)(value & 7); + + // several glitchy effects happen when writing to NRx2 during audio playing + if (((Audio_Regs[NR12] & 7) == 0) && !SQ1_vol_done) { SQ1_vol_state++; } + else if ((Audio_Regs[NR12] & 8) == 0) { SQ1_vol_state += 2; } + + if (((Audio_Regs[NR12] ^ value) & 8) > 0) { SQ1_vol_state = (byte)(0x10 - SQ1_vol_state); } + + SQ1_vol_state &= 0xF; + if ((value & 0xF8) == 0) { SQ1_enable = SQ1_swp_enable = false; SQ1_output = 0; } + Audio_Regs[NR12] = value; break; case 0xFF13: // NR13 (freq low) Audio_Regs[NR13] = value; @@ -269,11 +278,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk SQ2_len_cntr = SQ2_length; break; case 0xFF17: // NR22 (envelope) - Audio_Regs[NR22] = value; SQ2_st_vol = (byte)((value & 0xF0) >> 4); SQ2_env_add = (value & 8) > 0; SQ2_per = (byte)(value & 7); + + // several glitchy effects happen when writing to NRx2 during audio playing + if (((Audio_Regs[NR22] & 7) == 0) && !SQ2_vol_done) { SQ2_vol_state++; } + else if ((Audio_Regs[NR22] & 8) == 0) { SQ2_vol_state += 2; } + + if (((Audio_Regs[NR22] ^ value) & 8) > 0) { SQ2_vol_state = (byte)(0x10 - SQ2_vol_state); } + + SQ2_vol_state &= 0xF; if ((value & 0xF8) == 0) { SQ2_enable = false; SQ2_output = 0; } + Audio_Regs[NR22] = value; break; case 0xFF18: // NR23 (freq low) Audio_Regs[NR23] = value;