diff --git a/src/core/spu.cpp b/src/core/spu.cpp index c15567d86..131e38040 100644 --- a/src/core/spu.cpp +++ b/src/core/spu.cpp @@ -9,6 +9,12 @@ #include Log_SetChannel(SPU); +// TODO: +// - Reverb +// - Noise +// - Volume Sweep +// - Pulse Modulation + SPU::SPU() = default; SPU::~SPU() = default; @@ -35,6 +41,7 @@ void SPU::Reset() m_key_off_register = 0; m_endx_register = 0; m_reverb_on_register = 0; + m_noise_mode_register = 0; m_ticks_carry = 0; for (u32 i = 0; i < NUM_VOICES; i++) @@ -71,6 +78,7 @@ bool SPU::DoState(StateWrapper& sw) sw.Do(&m_key_off_register); sw.Do(&m_endx_register); sw.Do(&m_reverb_on_register); + sw.Do(&m_noise_mode_register); sw.Do(&m_ticks_carry); for (u32 i = 0; i < NUM_VOICES; i++) { @@ -123,6 +131,12 @@ u16 SPU::ReadRegister(u32 offset) case 0x1F801D8E - SPU_BASE: return Truncate16(m_key_off_register >> 16); + case 0x1F801D94 - SPU_BASE: + return Truncate16(m_noise_mode_register); + + case 0x1F801D96 - SPU_BASE: + return Truncate16(m_noise_mode_register >> 16); + case 0x1F801D98 - SPU_BASE: return Truncate16(m_reverb_on_register); @@ -277,6 +291,22 @@ void SPU::WriteRegister(u32 offset, u16 value) } break; + case 0x1F801D94 - SPU_BASE: + { + Log_DebugPrintf("SPU noise mode register <- 0x%04X", ZeroExtend32(value)); + m_system->Synchronize(); + m_noise_mode_register = (m_noise_mode_register & 0xFFFF0000) | ZeroExtend32(value); + } + break; + + case 0x1F801D96 - SPU_BASE: + { + Log_DebugPrintf("SPU noise mode register <- 0x%04X", ZeroExtend32(value)); + m_system->Synchronize(); + m_noise_mode_register = (m_noise_mode_register & 0x0000FFFF) | (ZeroExtend32(value) << 16); + } + break; + case 0x1F801D98 - SPU_BASE: { Log_DebugPrintf("SPU reverb on register <- 0x%04X", ZeroExtend32(value)); diff --git a/src/core/spu.h b/src/core/spu.h index fa29aefca..622ef3042 100644 --- a/src/core/spu.h +++ b/src/core/spu.h @@ -292,6 +292,7 @@ private: u32 m_key_off_register = 0; u32 m_endx_register = 0; u32 m_reverb_on_register = 0; + u32 m_noise_mode_register = 0; TickCount m_ticks_carry = 0;