Esempio n. 1
0
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);
    }*/
}
Esempio n. 2
0
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);
    }*/
}