diff --git a/Source/Core/Core/Src/HW/DSP.cpp b/Source/Core/Core/Src/HW/DSP.cpp index 07dd335bf5..71b338a9a6 100644 --- a/Source/Core/Core/Src/HW/DSP.cpp +++ b/Source/Core/Core/Src/HW/DSP.cpp @@ -387,6 +387,13 @@ void Write16(const u16 _Value, const u32 _Address) tmpControl.Hex = (_Value & ~DSP_CONTROL_MASK) | (dsp_plugin->DSP_WriteControlRegister(_Value) & DSP_CONTROL_MASK); + // HACK for DSPReset: do it instantaneously + if (_Value & 1) + { + Shutdown(); + Init(); + } + // Update DSP related flags g_dspState.DSPControl.DSPReset = tmpControl.DSPReset; g_dspState.DSPControl.DSPAssertInt = tmpControl.DSPAssertInt; diff --git a/Source/Core/DSPCore/Src/DSPInterpreter.cpp b/Source/Core/DSPCore/Src/DSPInterpreter.cpp index 54c2f60322..96fac7d485 100644 --- a/Source/Core/DSPCore/Src/DSPInterpreter.cpp +++ b/Source/Core/DSPCore/Src/DSPInterpreter.cpp @@ -42,12 +42,20 @@ volatile u32 gdsp_running; void WriteCR(u16 val) { // reset - if (val & 0x0001) + if (val & 1) { DSPCore_Reset(); + val &= ~1; + } + // init - can reset and init be done at the same time? + else if (val == 4) + { + // this looks like a hack! OSInitAudioSystem ucode + // should send this mail - not dsp core itself + gdsp_mbox_write_h(GDSP_MBOX_DSP, 0x8054); + gdsp_mbox_write_l(GDSP_MBOX_DSP, 0x4348); + val |= 0x800; } - - val &= ~0x0001; // update cr g_dsp.cr = val;