summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/CommandProcessor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/Src/CommandProcessor.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/CommandProcessor.cpp24
1 files changed, 24 insertions, 0 deletions
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)