diff --git a/Source/Core/VideoCommon/Src/CommandProcessor.cpp b/Source/Core/VideoCommon/Src/CommandProcessor.cpp index 49c6762f51..2e46d1219c 100644 --- a/Source/Core/VideoCommon/Src/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/Src/CommandProcessor.cpp @@ -402,6 +402,30 @@ void Write16(const u16 _Value, const u32 _Address) UCPCtrlReg tmpCtrl(_Value); m_CPCtrlReg.Hex = tmpCtrl.Hex; + //If there is a SetBreakPoint and the actual distance is enought to achieve the BP, + //we wait for the FIFO Loop in DC MODE + if (g_VideoInitialize.bOnThread && fifo.bFF_BPInt && tmpCtrl.BPInt && fifo.bFF_BPEnable && tmpCtrl.BPEnable) + { + bool wait = false; + if (fifo.CPReadPointer + fifo.CPReadWriteDistance + 32 > fifo.CPBreakpoint) + { + wait = true; + } //If the distance is >= CPEnd we need to calculate the distane related to CPBase + else if (fifo.CPReadPointer + fifo.CPReadWriteDistance >= fifo.CPEnd) + { + if (fifo.CPReadWriteDistance + fifo.CPReadPointer - fifo.CPEnd + 32 > fifo.CPBreakpoint) + wait = true; + } + + // We waiting for the fifo loop finish + while (wait && fifo.bFF_GPReadEnable && (fifo.CPReadWriteDistance || + (fifo.bFF_BPEnable && ((fifo.CPReadPointer <= fifo.CPBreakpoint) && + (fifo.CPReadPointer + 32 > fifo.CPBreakpoint))))) + { + Common::YieldCPU(); + } + } + Common::AtomicStore(fifo.bFF_Breakpoint, false); if (tmpCtrl.FifoUnderflowIntEnable)