Skip to content

Commit

Permalink
RSP: only look at SP_STATUS_HALT when seeing if the RSP should run
Browse files Browse the repository at this point in the history
  • Loading branch information
project64 committed Jul 6, 2023
1 parent 7dc30b1 commit 07cf94b
Showing 1 changed file with 70 additions and 73 deletions.
143 changes: 70 additions & 73 deletions Source/Project64-core/N64System/N64System.cpp
Expand Up @@ -2461,97 +2461,94 @@ void CN64System::RunRSP()

if ((m_Reg.SP_STATUS_REG & SP_STATUS_HALT) == 0)
{
if ((m_Reg.SP_STATUS_REG & SP_STATUS_BROKE) == 0)
{
HighResTimeStamp StartTime;
HighResTimeStamp StartTime;

uint32_t Task = 0;
if (m_RspBroke)
uint32_t Task = 0;
if (m_RspBroke)
{
g_MMU->MemoryValue32(0xA4000FC0, Task);
if (Task == 1 && UseHleGfx() && (m_Reg.DPC_STATUS_REG & DPC_STATUS_FREEZE) != 0)
{
g_MMU->MemoryValue32(0xA4000FC0, Task);
if (Task == 1 && UseHleGfx() && (m_Reg.DPC_STATUS_REG & DPC_STATUS_FREEZE) != 0)
{
WriteTrace(TraceRSP, TraceDebug, "Dlist that is frozen");
return;
}

if (g_Debugger != NULL && HaveDebugger())
{
g_Debugger->RSPReceivedTask();
}

switch (Task)
{
case 1:
WriteTrace(TraceRSP, TraceDebug, "*** Display list ***");
m_DlistCount += 1;
m_FPS.UpdateDlCounter();
break;
case 2:
WriteTrace(TraceRSP, TraceDebug, "*** Audio list ***");
m_AlistCount += 1;
break;
default:
WriteTrace(TraceRSP, TraceDebug, "*** Unknown list ***");
m_UnknownCount += 1;
break;
}

if (bShowDListAListCount())
{
DisplayRSPListCount();
}
if (bRecordExecutionTimes() || bShowCPUPer())
{
StartTime.SetToNow();
}
WriteTrace(TraceRSP, TraceDebug, "Dlist that is frozen");
return;
}

__except_try()
if (g_Debugger != NULL && HaveDebugger())
{
WriteTrace(TraceRSP, TraceDebug, "Do cycles - starting");
m_Plugins->RSP()->DoRspCycles(100);
WriteTrace(TraceRSP, TraceDebug, "Do cycles - done");
g_Debugger->RSPReceivedTask();
}
__except_catch()

switch (Task)
{
WriteTrace(TraceRSP, TraceError, "Exception generated");
g_Notify->FatalError("CN64System::RunRSP()\nUnknown memory action\n\nEmulation stopping");
case 1:
WriteTrace(TraceRSP, TraceDebug, "*** Display list ***");
m_DlistCount += 1;
m_FPS.UpdateDlCounter();
break;
case 2:
WriteTrace(TraceRSP, TraceDebug, "*** Audio list ***");
m_AlistCount += 1;
break;
default:
WriteTrace(TraceRSP, TraceDebug, "*** Unknown list ***");
m_UnknownCount += 1;
break;
}

if (Task == 1 && bDelayDP() && ((m_Reg.m_GfxIntrReg & MI_INTR_DP) != 0))
if (bShowDListAListCount())
{
g_SystemTimer->SetTimer(CSystemTimer::RSPTimerDlist, 0x1000, false);
m_Reg.m_GfxIntrReg &= ~MI_INTR_DP;
DisplayRSPListCount();
}
if (bRecordExecutionTimes() || bShowCPUPer())
{
HighResTimeStamp EndTime;
EndTime.SetToNow();
uint32_t TimeTaken = (uint32_t)(EndTime.GetMicroSeconds() - StartTime.GetMicroSeconds());

switch (Task)
{
case 1: m_CPU_Usage.RecordTime(Timer_RSP_Dlist, TimeTaken); break;
case 2: m_CPU_Usage.RecordTime(Timer_RSP_Alist, TimeTaken); break;
default: m_CPU_Usage.RecordTime(Timer_RSP_Unknown, TimeTaken); break;
}
StartTime.SetToNow();
}
}

if ((m_Reg.SP_STATUS_REG & SP_STATUS_HALT) == 0 &&
(m_Reg.SP_STATUS_REG & SP_STATUS_BROKE) == 0 &&
m_Reg.m_RspIntrReg == 0)
{
g_SystemTimer->SetTimer(CSystemTimer::RspTimer, 0x200, false);
m_RspBroke = false;
}
else
__except_try()
{
WriteTrace(TraceRSP, TraceDebug, "Do cycles - starting");
m_Plugins->RSP()->DoRspCycles(100);
WriteTrace(TraceRSP, TraceDebug, "Do cycles - done");
}
__except_catch()
{
WriteTrace(TraceRSP, TraceError, "Exception generated");
g_Notify->FatalError("CN64System::RunRSP()\nUnknown memory action\n\nEmulation stopping");
}

if (Task == 1 && bDelayDP() && ((m_Reg.m_GfxIntrReg & MI_INTR_DP) != 0))
{
g_SystemTimer->SetTimer(CSystemTimer::RSPTimerDlist, 0x1000, false);
m_Reg.m_GfxIntrReg &= ~MI_INTR_DP;
}
if (bRecordExecutionTimes() || bShowCPUPer())
{
HighResTimeStamp EndTime;
EndTime.SetToNow();
uint32_t TimeTaken = (uint32_t)(EndTime.GetMicroSeconds() - StartTime.GetMicroSeconds());

switch (Task)
{
m_RspBroke = true;
case 1: m_CPU_Usage.RecordTime(Timer_RSP_Dlist, TimeTaken); break;
case 2: m_CPU_Usage.RecordTime(Timer_RSP_Alist, TimeTaken); break;
default: m_CPU_Usage.RecordTime(Timer_RSP_Unknown, TimeTaken); break;
}
WriteTrace(TraceRSP, TraceDebug, "Check interrupts");
g_Reg->CheckInterrupts();
}

if ((m_Reg.SP_STATUS_REG & SP_STATUS_HALT) == 0 &&
(m_Reg.SP_STATUS_REG & SP_STATUS_BROKE) == 0 &&
m_Reg.m_RspIntrReg == 0)
{
g_SystemTimer->SetTimer(CSystemTimer::RspTimer, 0x200, false);
m_RspBroke = false;
}
else
{
m_RspBroke = true;
}
WriteTrace(TraceRSP, TraceDebug, "Check interrupts");
g_Reg->CheckInterrupts();
}
if (bShowCPUPer())
{
Expand Down

0 comments on commit 07cf94b

Please sign in to comment.