From 443ecb313d55c5ab9b256fa0176d560cc1b521ec Mon Sep 17 00:00:00 2001 From: Jaklyy <102590697+Jaklyy@users.noreply.github.com> Date: Sun, 15 Dec 2024 19:57:04 -0500 Subject: [PATCH] improve(?) irq handling ...i dont think this fixes anything --- src/ARM.cpp | 23 +++++++++++++---------- src/ARM.h | 2 ++ src/NDS.cpp | 16 ++++++++++------ 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/ARM.cpp b/src/ARM.cpp index d4e49723..5e6ce172 100644 --- a/src/ARM.cpp +++ b/src/ARM.cpp @@ -160,6 +160,7 @@ void ARM::Reset() Halted = 0; DataCycles = 0; + IRQTimestamp = -1; IRQ = 0; for (int i = 0; i < 16; i++) @@ -705,7 +706,7 @@ void ARMv5::StartExecTHUMB() else NullFetch = false; PC = R[15]; - if (IRQ && !(CPSR & 0x80)) TriggerIRQ(); + if (!(CPSR & 0x80) && (NDS.ARM9Timestamp > IRQTimestamp)) TriggerIRQ(); else if (CurInstr > 0xFFFFFFFF) [[unlikely]] // handle aborted instructions { PrefetchAbort(); @@ -728,7 +729,7 @@ void ARMv5::StartExecARM() NullFetch = false; PC = R[15]; - if (IRQ && !(CPSR & 0x80)) TriggerIRQ(); + if (!(CPSR & 0x80) && (NDS.ARM9Timestamp > IRQTimestamp)) TriggerIRQ(); else if (CurInstr & ((u64)1<<63)) [[unlikely]] // handle aborted instructions { PrefetchAbort(); @@ -771,14 +772,13 @@ void ARMv5::Execute() else if (NDS.HaltInterrupted(0)) { Halted = 0; + NDS.ARM9Timestamp = IRQTimestamp; +#ifdef JIT_ENABLED if (NDS.IME[0] & 0x1) { -#ifdef JIT_ENABLED if constexpr (mode == CPUExecuteMode::JIT) TriggerIRQ(); - else -#endif - IRQ = 1; } +#endif } else { @@ -921,7 +921,7 @@ void ARMv4::StartExecTHUMB() CodeRead16(R[15]); QueueFunction(&ARMv4::UpdateNextInstr1); - if (IRQ && !(CPSR & 0x80)) TriggerIRQ(); + if (!(CPSR & 0x80) && (NDS.ARM7Timestamp > IRQTimestamp)) TriggerIRQ(); else { // actually execute @@ -939,7 +939,7 @@ void ARMv4::StartExecARM() CodeRead32(R[15]); QueueFunction(&ARMv4::UpdateNextInstr1); - if (IRQ && !(CPSR & 0x80)) TriggerIRQ(); + if (!(CPSR & 0x80) && (NDS.ARM7Timestamp > IRQTimestamp)) TriggerIRQ(); else if (CheckCondition(CurInstr >> 28)) // actually execute { u32 icode = ((CurInstr >> 4) & 0xF) | ((CurInstr >> 16) & 0xFF0); @@ -964,13 +964,16 @@ void ARMv4::Execute() else if (NDS.HaltInterrupted(1)) { Halted = 0; + NDS.ARM7Timestamp = IRQTimestamp; if (NDS.IME[1] & 0x1) { #ifdef JIT_ENABLED if constexpr (mode == CPUExecuteMode::JIT) TriggerIRQ(); - else #endif - IRQ = 1; + } + else + { + IRQTimestamp = -1; } } else diff --git a/src/ARM.h b/src/ARM.h index 21c06813..eabae95b 100644 --- a/src/ARM.h +++ b/src/ARM.h @@ -213,6 +213,8 @@ public: u32 StopExecution; }; + u64 IRQTimestamp; + u32 CodeRegion; s32 CodeCycles; diff --git a/src/NDS.cpp b/src/NDS.cpp index 12a96cb3..c4fb3bbe 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -1834,7 +1834,7 @@ u32 NDS::RunFrame() if (!MainRAMHandle()) break; } } - + CurCPU = 2; RunSystem(target); if (CPUStop & CPUStop_Sleep) @@ -2156,16 +2156,20 @@ void NDS::SetGBASlotTimings() void NDS::UpdateIRQ(u32 cpu) { ARM& arm = cpu ? (ARM&)ARM7 : (ARM&)ARM9; + u64 curtime = ((CurCPU == 2) ? SysTimestamp : ((CurCPU == 1) ? ARM7Timestamp : ((ARM9Timestamp + ((1<> ARM9ClockShift))); + if (!cpu) curtime <<= ARM9ClockShift; - if (IME[cpu] & 0x1) + if (IME[cpu] & 0x1 || (arm.Halted == 1)) { - arm.IRQ = !!(IE[cpu] & IF[cpu]); - if ((ConsoleType == 1) && cpu) - arm.IRQ |= !!(IE2 & IF2); + //arm.IRQ = !!(IE[cpu] & IF[cpu]); + if (IE[cpu] & IF[cpu]) { if (curtime < arm.IRQTimestamp) arm.IRQTimestamp = curtime; } + else arm.IRQTimestamp = -1; + if ((ConsoleType == 1) && cpu && (IE2 & IF2) && (curtime < arm.IRQTimestamp)) + arm.IRQTimestamp = curtime; } else { - arm.IRQ = 0; + arm.IRQTimestamp = -1; } }