mirror of https://github.com/PCSX2/pcsx2.git
MFIFO: Maintain VIF DMA status and Empty condition on VIF reset
Also don't decrement/change VIF1 QWC on VIF1 FIFO write
This commit is contained in:
parent
465aa00fc7
commit
32f14f48b0
|
@ -105,8 +105,6 @@ void __fastcall WriteFIFO_VIF1(const mem128_t *value)
|
||||||
DevCon.Warning("Offset on VIF1 FIFO start!");
|
DevCon.Warning("Offset on VIF1 FIFO start!");
|
||||||
}
|
}
|
||||||
|
|
||||||
vif1ch.qwc += 1;
|
|
||||||
|
|
||||||
bool ret = VIF1transfer((u32*)value, 4);
|
bool ret = VIF1transfer((u32*)value, 4);
|
||||||
|
|
||||||
if (vif1.cmd) {
|
if (vif1.cmd) {
|
||||||
|
|
|
@ -158,28 +158,21 @@ __fi void vif1FBRST(u32 value) {
|
||||||
SaveCol._u64[1] = vif1.MaskCol._u64[1];
|
SaveCol._u64[1] = vif1.MaskCol._u64[1];
|
||||||
SaveRow._u64[0] = vif1.MaskRow._u64[0];
|
SaveRow._u64[0] = vif1.MaskRow._u64[0];
|
||||||
SaveRow._u64[1] = vif1.MaskRow._u64[1];
|
SaveRow._u64[1] = vif1.MaskRow._u64[1];
|
||||||
|
u8 mfifo_empty = vif1.inprogress & 0x10;
|
||||||
memzero(vif1);
|
memzero(vif1);
|
||||||
vif1.MaskCol._u64[0] = SaveCol._u64[0];
|
vif1.MaskCol._u64[0] = SaveCol._u64[0];
|
||||||
vif1.MaskCol._u64[1] = SaveCol._u64[1];
|
vif1.MaskCol._u64[1] = SaveCol._u64[1];
|
||||||
vif1.MaskRow._u64[0] = SaveRow._u64[0];
|
vif1.MaskRow._u64[0] = SaveRow._u64[0];
|
||||||
vif1.MaskRow._u64[1] = SaveRow._u64[1];
|
vif1.MaskRow._u64[1] = SaveRow._u64[1];
|
||||||
cpuRegs.interrupt &= ~((1 << 1) | (1 << 10)); //Stop all vif1 DMA's
|
|
||||||
///vif1ch.qwc -= std::min((int)vif1ch.qwc, 16); //not sure if the dma should stop, FFWDing could be tricky
|
|
||||||
vif1ch.qwc = 0;
|
|
||||||
|
|
||||||
psHu64(VIF1_FIFO) = 0;
|
|
||||||
psHu64(VIF1_FIFO + 8) = 0;
|
|
||||||
vif1.done = true;
|
|
||||||
vif1ch.chcr.STR = false;
|
|
||||||
|
|
||||||
GUNIT_WARN(Color_Red, "VIF FBRST Reset MSK = %x", vif1Regs.mskpath3);
|
GUNIT_WARN(Color_Red, "VIF FBRST Reset MSK = %x", vif1Regs.mskpath3);
|
||||||
vif1Regs.mskpath3 = false;
|
vif1Regs.mskpath3 = false;
|
||||||
gifRegs.stat.M3P = 0;
|
gifRegs.stat.M3P = 0;
|
||||||
vif1Regs.err.reset();
|
vif1Regs.err.reset();
|
||||||
vif1.inprogress = 0;
|
vif1.inprogress = mfifo_empty;
|
||||||
vif1.cmd = 0;
|
vif1.cmd = 0;
|
||||||
vif1.vifstalled.enabled = false;
|
vif1.vifstalled.enabled = false;
|
||||||
vif1.irqoffset.enabled = false;
|
|
||||||
vif1Regs.stat._u32 = 0;
|
vif1Regs.stat._u32 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -436,6 +436,7 @@ void dmaVIF1()
|
||||||
vif1ch.tadr, vif1ch.asr0, vif1ch.asr1);
|
vif1ch.tadr, vif1ch.asr0, vif1ch.asr1);
|
||||||
|
|
||||||
g_vif1Cycles = 0;
|
g_vif1Cycles = 0;
|
||||||
|
vif1.inprogress = 0;
|
||||||
|
|
||||||
if (vif1ch.qwc > 0) // Normal Mode
|
if (vif1ch.qwc > 0) // Normal Mode
|
||||||
{
|
{
|
||||||
|
|
|
@ -90,6 +90,7 @@ _vifT static __fi bool vifTransfer(u32 *data, int size, bool TTE) {
|
||||||
if (!TTE) // *WARNING* - Tags CAN have interrupts! so lets just ignore the dma modifying stuffs (GT4)
|
if (!TTE) // *WARNING* - Tags CAN have interrupts! so lets just ignore the dma modifying stuffs (GT4)
|
||||||
{
|
{
|
||||||
transferred = transferred >> 2;
|
transferred = transferred >> 2;
|
||||||
|
transferred = std::min((int)vifXch.qwc, transferred);
|
||||||
vifXch.madr +=(transferred << 4);
|
vifXch.madr +=(transferred << 4);
|
||||||
vifXch.qwc -= transferred;
|
vifXch.qwc -= transferred;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue