From cec4c2c88014739443c4f3ce8d35880e83c16549 Mon Sep 17 00:00:00 2001 From: Jaklyy <102590697+Jaklyy@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:06:34 -0500 Subject: [PATCH] fix handling of halts --- src/ARM.cpp | 32 +++++++++++++++++++++++++------- src/NDS.cpp | 2 +- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/ARM.cpp b/src/ARM.cpp index b7acf3da..06cf57a1 100644 --- a/src/ARM.cpp +++ b/src/ARM.cpp @@ -823,7 +823,7 @@ void ARMv5::Execute() if constexpr (mode == CPUExecuteMode::InterpreterGDB) GdbCheckB(); - if (Halted) + if (Halted && !FuncQueueActive) { if (Halted == 2) { @@ -831,6 +831,7 @@ void ARMv5::Execute() } else if (NDS.HaltInterrupted(0)) { + NDS.ARM9Timestamp = IRQTimestamp; Halted = 0; if (NDS.IME[0] & 0x1) { @@ -910,6 +911,14 @@ void ARMv5::Execute() FuncQueueEnd = 0; FuncQueueActive = false; FuncQueue[0] = StartExec; + if (Halted) + { + if (Halted == 1 && NDS.ARM9Timestamp < NDS.ARM9Target) + { + NDS.ARM9Timestamp = NDS.ARM9Target; + } + goto exit; + } } } else @@ -942,7 +951,7 @@ void ARMv5::Execute() if (MRTrack.Type != MainRAMType::Null) return; // check if we need to resolve main ram // TODO optimize this shit!!! - if (Halted) + if (Halted && !FuncQueueActive) { if (Halted == 1 && NDS.ARM9Timestamp < NDS.ARM9Target) { @@ -965,7 +974,7 @@ void ARMv5::Execute() exit: - if (Halted == 2) + if (Halted == 2 && !FuncQueueActive) Halted = 0; } template void ARMv5::Execute(); @@ -1017,7 +1026,7 @@ void ARMv4::Execute() if constexpr (mode == CPUExecuteMode::InterpreterGDB) GdbCheckB(); - if (Halted) + if (Halted && !FuncQueueActive) { if (Halted == 2) { @@ -1025,6 +1034,7 @@ void ARMv4::Execute() } else if (NDS.HaltInterrupted(1)) { + NDS.ARM7Timestamp = IRQTimestamp; Halted = 0; if (NDS.IME[1] & 0x1) { @@ -1103,6 +1113,14 @@ void ARMv4::Execute() FuncQueueEnd = 0; FuncQueueActive = false; FuncQueue[0] = StartExec; + if (Halted) + { + if (Halted == 1 && NDS.ARM7Timestamp < NDS.ARM7Target) + { + NDS.ARM7Timestamp = NDS.ARM7Target; + } + goto exit; + } } } else @@ -1134,7 +1152,7 @@ void ARMv4::Execute() if (MRTrack.Type != MainRAMType::Null) return; // check if we need to resolve main ram // TODO optimize this shit!!! - if (Halted) + if (Halted && !FuncQueueActive) { if (Halted == 1 && NDS.ARM7Timestamp < NDS.ARM7Target) { @@ -1149,10 +1167,10 @@ void ARMv4::Execute() exit: - if (Halted == 2) + if (Halted == 2 && !FuncQueueActive) Halted = 0; - if (Halted == 4) + if (Halted == 4 && !FuncQueueActive) { assert(NDS.ConsoleType == 1); auto& dsi = dynamic_cast(NDS); diff --git a/src/NDS.cpp b/src/NDS.cpp index dc180e96..462f4ee4 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -1874,7 +1874,7 @@ u32 NDS::RunFrame() SPU.TransferOutput(); break; } - //printf("MAIN LOOP: 9 %lli %lli %08X %08llX %i %i %i 7 %lli %lli %08X %08llX %i %i %i\n", ARM9Timestamp, ARM9Target, ARM9.PC, ARM9.CurInstr, (u8)ARM9.MRTrack.Type, ARM9.Halted, ARM9.FuncQueueActive, ARM7Timestamp, ARM7Target, ARM7.R[15], ARM7.CurInstr, (u8)ARM7.MRTrack.Type, ARM7.Halted, ARM7.FuncQueueActive); + //printf("MAIN LOOP: 9 %lli %lli %08X %08llX %i %i %i 7 %lli %lli %08X %08llX %i %i %i\n", ARM9Timestamp, ARM9Target, ARM9.R[15], ARM9.CurInstr, (u8)ARM9.MRTrack.Type, ARM9.Halted, ARM9.FuncQueueActive, ARM7Timestamp, ARM7Target, ARM7.R[15], ARM7.CurInstr, (u8)ARM7.MRTrack.Type, ARM7.Halted, ARM7.FuncQueueActive); // In the context of TASes, frame count is traditionally the primary measure of emulated time, // so it needs to be tracked even if NDS is powered off.