void CSystemTimer::TimerDone() { UpdateTimers(); switch (m_Current) { case CSystemTimer::CompareTimer: m_Reg.FAKE_CAUSE_REGISTER |= CAUSE_IP7; m_Reg.CheckInterrupts(); UpdateCompareTimer(); break; case CSystemTimer::SoftResetTimer: g_SystemTimer->StopTimer(CSystemTimer::SoftResetTimer); g_System->ExternalEvent(SysEvent_ResetCPU_SoftDone); break; case CSystemTimer::SiTimer: g_SystemTimer->StopTimer(CSystemTimer::SiTimer); m_Reg.MI_INTR_REG |= MI_INTR_SI; m_Reg.SI_STATUS_REG |= SI_STATUS_INTERRUPT; m_Reg.CheckInterrupts(); break; case CSystemTimer::PiTimer: g_SystemTimer->StopTimer(CSystemTimer::PiTimer); m_Reg.PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; m_Reg.MI_INTR_REG |= MI_INTR_PI; m_Reg.CheckInterrupts(); break; case CSystemTimer::DDPiTimer: g_SystemTimer->StopTimer(CSystemTimer::DDPiTimer); m_Reg.PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; DiskBMUpdate(); m_Reg.MI_INTR_REG |= MI_INTR_PI; m_Reg.CheckInterrupts(); break; case CSystemTimer::ViTimer: try { g_System->RefreshScreen(); } catch (...) { WriteTrace(TraceN64System, TraceError, "Exception caught\nFile: %s\nLine: %d", __FILE__, __LINE__); } m_Reg.MI_INTR_REG |= MI_INTR_VI; m_Reg.CheckInterrupts(); break; case CSystemTimer::RspTimer: g_SystemTimer->StopTimer(CSystemTimer::RspTimer); try { g_System->RunRSP(); } catch (...) { g_Notify->BreakPoint(__FILE__, __LINE__); } break; case CSystemTimer::RSPTimerDlist: g_SystemTimer->StopTimer(CSystemTimer::RSPTimerDlist); m_Reg.m_GfxIntrReg |= MI_INTR_DP; m_Reg.CheckInterrupts(); break; case CSystemTimer::AiTimerInterrupt: g_SystemTimer->StopTimer(CSystemTimer::AiTimerInterrupt); g_Audio->InterruptTimerDone(); break; case CSystemTimer::AiTimerBusy: g_SystemTimer->StopTimer(CSystemTimer::AiTimerBusy); g_Audio->BusyTimerDone(); break; default: g_Notify->BreakPoint(__FILE__, __LINE__); } //CheckTimer(); /*if (Profiling) { StartTimer(LastTimer); }*/ }
void CSystemTimer::TimerDone() { UpdateTimers(); /* uint32_t LastTimer; if (Profiling) { LastTimer = StartTimer(Timer_Done); } if (LogOptions.GenerateLog && LogOptions.LogExceptions && !LogOptions.NoInterrupts) { LogMessage("%08X: Timer Done (Type: %d CurrentTimer: %d)", *_PROGRAM_COUNTER, m_Current, *_Timer ); } */ switch (m_Current) { case CSystemTimer::CompareTimer: g_Reg->FAKE_CAUSE_REGISTER |= CAUSE_IP7; g_Reg->CheckInterrupts(); UpdateCompareTimer(); break; case CSystemTimer::SoftResetTimer: g_SystemTimer->StopTimer(CSystemTimer::SoftResetTimer); g_System->ExternalEvent(SysEvent_ResetCPU_SoftDone); break; case CSystemTimer::SiTimer: g_SystemTimer->StopTimer(CSystemTimer::SiTimer); g_Reg->MI_INTR_REG |= MI_INTR_SI; g_Reg->SI_STATUS_REG |= SI_STATUS_INTERRUPT; g_Reg->CheckInterrupts(); break; case CSystemTimer::PiTimer: g_SystemTimer->StopTimer(CSystemTimer::PiTimer); g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY; g_Reg->MI_INTR_REG |= MI_INTR_PI; g_Reg->CheckInterrupts(); break; case CSystemTimer::ViTimer: try { g_System->RefreshScreen(); } catch (...) { WriteTrace(TraceN64System, TraceError, "Exception caught\nFile: %s\nLine: %d", __FILE__, __LINE__); } g_Reg->MI_INTR_REG |= MI_INTR_VI; g_Reg->CheckInterrupts(); break; case CSystemTimer::RspTimer: g_SystemTimer->StopTimer(CSystemTimer::RspTimer); try { g_System->RunRSP(); } catch (...) { g_Notify->BreakPoint(__FILE__, __LINE__); } break; case CSystemTimer::RSPTimerDlist: g_SystemTimer->StopTimer(CSystemTimer::RSPTimerDlist); g_Reg->m_GfxIntrReg |= MI_INTR_DP; g_Reg->CheckInterrupts(); break; case CSystemTimer::AiTimerInterrupt: g_SystemTimer->StopTimer(CSystemTimer::AiTimerInterrupt); g_Audio->InterruptTimerDone(); break; case CSystemTimer::AiTimerBusy: g_SystemTimer->StopTimer(CSystemTimer::AiTimerBusy); g_Audio->BusyTimerDone(); break; default: g_Notify->BreakPoint(__FILE__, __LINE__); } //CheckTimer(); /*if (Profiling) { StartTimer(LastTimer); }*/ }