Forced an exception check after an interrupt is generated by the DSP. Changed the timing back to 3ms/5ms periods, fixing the slowdown and garbled AX audio.
Fixed Accurate VBeam emulation when DSP HLE audio is being used.
This commit is contained in:
parent
53368823cb
commit
52053f5d95
|
@ -647,6 +647,7 @@ void GenerateDSPInterruptFromDSPEmu(DSPInterruptType type, bool _bSet)
|
||||||
{
|
{
|
||||||
CoreTiming::ScheduleEvent_Threadsafe(
|
CoreTiming::ScheduleEvent_Threadsafe(
|
||||||
0, et_GenerateDSPInterrupt, type | (_bSet<<16));
|
0, et_GenerateDSPInterrupt, type | (_bSet<<16));
|
||||||
|
CoreTiming::ForceExceptionCheck(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// called whenever SystemTimers thinks the dsp deserves a few more cycles
|
// called whenever SystemTimers thinks the dsp deserves a few more cycles
|
||||||
|
|
|
@ -112,12 +112,6 @@ u8 *CUCode_Zelda::GetARAMPointer(u32 address)
|
||||||
|
|
||||||
void CUCode_Zelda::Update(int cycles)
|
void CUCode_Zelda::Update(int cycles)
|
||||||
{
|
{
|
||||||
m_cycles += cycles;
|
|
||||||
|
|
||||||
if (m_cycles >= 243000)
|
|
||||||
{
|
|
||||||
m_cycles = 0;
|
|
||||||
|
|
||||||
if (!IsLightVersion())
|
if (!IsLightVersion())
|
||||||
{
|
{
|
||||||
if (m_rMailHandler.GetNextMail() == DSP_FRAME_END)
|
if (m_rMailHandler.GetNextMail() == DSP_FRAME_END)
|
||||||
|
@ -130,7 +124,6 @@ void CUCode_Zelda::Update(int cycles)
|
||||||
DSP::GenerateDSPInterruptFromDSPEmu(DSP::INT_DSP);
|
DSP::GenerateDSPInterruptFromDSPEmu(DSP::INT_DSP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void CUCode_Zelda::HandleMail(u32 _uMail)
|
void CUCode_Zelda::HandleMail(u32 _uMail)
|
||||||
{
|
{
|
||||||
|
|
|
@ -275,8 +275,6 @@ private:
|
||||||
u32 m_PBAddress; // The main param block array
|
u32 m_PBAddress; // The main param block array
|
||||||
u32 m_PBAddress2; // 4 smaller param blocks
|
u32 m_PBAddress2; // 4 smaller param blocks
|
||||||
|
|
||||||
u32 m_cycles;
|
|
||||||
|
|
||||||
void ExecuteList();
|
void ExecuteList();
|
||||||
|
|
||||||
u8 *GetARAMPointer(u32 address);
|
u8 *GetARAMPointer(u32 address);
|
||||||
|
|
|
@ -243,6 +243,8 @@ void PreInit()
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
|
const int fields = SConfig::GetInstance().m_LocalCoreStartupParameter.bVBeam ? 2 : 1;
|
||||||
|
|
||||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
|
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
|
||||||
{
|
{
|
||||||
// AyuanX: TO BE TWEAKED
|
// AyuanX: TO BE TWEAKED
|
||||||
|
@ -251,12 +253,19 @@ void Init()
|
||||||
|
|
||||||
// FYI, WII_IPC_HLE_Interface::Update is also called in WII_IPCInterface::Write32
|
// FYI, WII_IPC_HLE_Interface::Update is also called in WII_IPCInterface::Write32
|
||||||
const int freq = 1500;
|
const int freq = 1500;
|
||||||
const int fields = SConfig::GetInstance().m_LocalCoreStartupParameter.
|
|
||||||
bVBeam ? 2 : 1;
|
|
||||||
IPC_HLE_PERIOD = GetTicksPerSecond() / (freq * fields);
|
IPC_HLE_PERIOD = GetTicksPerSecond() / (freq * fields);
|
||||||
}
|
}
|
||||||
|
|
||||||
DSP_PERIOD = 12500; // TO BE TWEAKED (> 15000 breaks Lost Kingdom II)
|
if (DSP::GetDSPEmulator()->IsLLE())
|
||||||
|
{
|
||||||
|
DSP_PERIOD = 12000; // TO BE TWEAKED
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// AX HLE uses 3ms (Wii) or 5ms (GC) timing period
|
||||||
|
int ms_to_process = SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 3 : 5;
|
||||||
|
DSP_PERIOD = (int)(GetTicksPerSecond() / 1000) * ms_to_process / fields;
|
||||||
|
}
|
||||||
|
|
||||||
// System internal sample rate is fixed at 32KHz * 4 (16bit Stereo) / 32 bytes DMA
|
// System internal sample rate is fixed at 32KHz * 4 (16bit Stereo) / 32 bytes DMA
|
||||||
AUDIO_DMA_PERIOD = CPU_CORE_CLOCK / (AudioInterface::GetAIDSampleRate() * 4 / 32);
|
AUDIO_DMA_PERIOD = CPU_CORE_CLOCK / (AudioInterface::GetAIDSampleRate() * 4 / 32);
|
||||||
|
|
Loading…
Reference in New Issue