Minor tweaks to assist in comparing new and old DMAC behaviors:

* VIF now sends a 128 bit tag instead of a 64 bit tag (lower 64 bits masked to 0 -- this should mimic real hardware behavior more closely)
 * Added more GIFtag logging info

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@3916 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
Jake.Stine 2010-10-12 12:15:57 +00:00
parent 2d9d3a6b5c
commit fc99f79aac
7 changed files with 72 additions and 19 deletions

View File

@ -277,6 +277,7 @@ enum EERegisterAddresses
SIF2_CHCR = 0x1000C800, SIF2_CHCR = 0x1000C800,
SIF2_MADR = 0x1000C810, SIF2_MADR = 0x1000C810,
SIF2_QWC = 0x1000C820, SIF2_QWC = 0x1000C820,
SIF2_TADR = 0x1000C830,
//fromSPR //fromSPR
D8_CHCR = 0x1000D000, D8_CHCR = 0x1000D000,
@ -286,6 +287,8 @@ enum EERegisterAddresses
fromSPR_CHCR = 0x1000D000, fromSPR_CHCR = 0x1000D000,
fromSPR_MADR = 0x1000D010, fromSPR_MADR = 0x1000D010,
fromSPR_QWC = 0x1000D020, fromSPR_QWC = 0x1000D020,
fromSPR_TADR = 0x1000D030,
fromSPR_SADR = 0x1000D080,
//toSPR //toSPR
D9_CHCR = 0x1000D400, D9_CHCR = 0x1000D400,
@ -295,6 +298,8 @@ enum EERegisterAddresses
toSPR_CHCR = 0x1000D400, toSPR_CHCR = 0x1000D400,
toSPR_MADR = 0x1000D410, toSPR_MADR = 0x1000D410,
toSPR_QWC = 0x1000D420, toSPR_QWC = 0x1000D420,
toSPR_TADR = 0x1000D430,
toSPR_SADR = 0x1000D480,
DMAC_CTRL = 0x1000E000, DMAC_CTRL = 0x1000E000,
DMAC_STAT = 0x1000E010, DMAC_STAT = 0x1000E010,

View File

@ -224,7 +224,7 @@ static VIFregisters& vif1Regs = (VIFregisters&)eeHw[0x3C00];
extern void dmaVIF0(); extern void dmaVIF0();
extern void dmaVIF1(); extern void dmaVIF1();
extern void mfifoVIF1transfer(int qwc); extern void mfifoVIF1transfer(int qwc);
extern bool VIF0transfer(u32 *data, int size); extern bool VIF0transfer(u32 *data, int size, bool TTE=0);
extern bool VIF1transfer(u32 *data, int size); extern bool VIF1transfer(u32 *data, int size, bool TTE=0);
extern void vifMFIFOInterrupt(); extern void vifMFIFOInterrupt();
extern bool CheckPath2GIF(EE_EventType channel); extern bool CheckPath2GIF(EE_EventType channel);

View File

@ -204,14 +204,25 @@ __fi void vif1SetupTransfer()
bool ret; bool ret;
static __aligned16 u128 masked_tag;
masked_tag._u64[0] = 0;
masked_tag._u64[1] = *((u64*)ptag + 1);
VIF_LOG("\tVIF1 SrcChain TTE=1, data = 0x%08x.%08x", masked_tag._u32[3], masked_tag._u32[2]);
if (vif1.vifstalled) if (vif1.vifstalled)
{ {
ret = VIF1transfer((u32*)ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset); //Transfer Tag on stall ret = VIF1transfer((u32*)&masked_tag + vif1.irqoffset, 4 - vif1.irqoffset, true); //Transfer Tag on stall
//ret = VIF1transfer((u32*)ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset); //Transfer Tag on stall
} }
else else
ret = VIF1transfer((u32*)ptag + 2, 2); //Transfer Tag {
ret = VIF1transfer((u32*)&masked_tag, 4, true); //Transfer Tag
//ret = VIF1transfer((u32*)ptag + 2, 2); //Transfer Tag
}
if (!ret && vif1.irqoffset < 2) if (!ret && vif1.irqoffset)
{ {
vif1.inprogress &= ~1; //Better clear this so it has to do it again (Jak 1) vif1.inprogress &= ~1; //Better clear this so it has to do it again (Jak 1)
return; //IRQ set by VIFTransfer return; //IRQ set by VIFTransfer

View File

@ -155,12 +155,25 @@ void mfifoVIF1transfer(int qwc)
{ {
bool ret; bool ret;
if (vif1.vifstalled) static __aligned16 u128 masked_tag;
ret = VIF1transfer((u32*)ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset); //Transfer Tag on Stall
else
ret = VIF1transfer((u32*)ptag + 2, 2); //Transfer Tag
if ((ret == false) && vif1.irqoffset < 2) masked_tag._u64[0] = 0;
masked_tag._u64[1] = *((u64*)ptag + 1);
VIF_LOG("\tVIF1 SrcChain TTE=1, data = 0x%08x.%08x", masked_tag._u32[3], masked_tag._u32[2]);
if (vif1.vifstalled)
{
ret = VIF1transfer((u32*)&masked_tag + vif1.irqoffset, 4 - vif1.irqoffset, true); //Transfer Tag on stall
//ret = VIF1transfer((u32*)ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset); //Transfer Tag on stall
}
else
{
ret = VIF1transfer((u32*)&masked_tag, 4, true); //Transfer Tag
//ret = VIF1transfer((u32*)ptag + 2, 2); //Transfer Tag
}
if (!ret && vif1.irqoffset)
{ {
return; //IRQ set by VIFTransfer return; //IRQ set by VIFTransfer

View File

@ -108,7 +108,7 @@ _vifT void vifTransferLoop(u32* &data) {
if (pSize) vifX.vifstalled = true; if (pSize) vifX.vifstalled = true;
} }
_vifT static __fi bool vifTransfer(u32 *data, int size) { _vifT static __fi bool vifTransfer(u32 *data, int size, bool TTE) {
vifStruct& vifX = GetVifX; vifStruct& vifX = GetVifX;
// irqoffset necessary to add up the right qws, or else will spin (spiderman) // irqoffset necessary to add up the right qws, or else will spin (spiderman)
@ -139,6 +139,8 @@ _vifT static __fi bool vifTransfer(u32 *data, int size) {
vifX.irqoffset = transferred % 4; // cannot lose the offset vifX.irqoffset = transferred % 4; // cannot lose the offset
if (TTE) return !vifX.vifstalled;
transferred = transferred >> 2; transferred = transferred >> 2;
vifXch.madr +=(transferred << 4); vifXch.madr +=(transferred << 4);
@ -161,9 +163,10 @@ _vifT static __fi bool vifTransfer(u32 *data, int size) {
return !vifX.vifstalled; return !vifX.vifstalled;
} }
bool VIF0transfer(u32 *data, int size) { // When TTE is set to 1, MADR and QWC are not updated as part of the transfer.
return vifTransfer<0>(data, size); bool VIF0transfer(u32 *data, int size, bool TTE) {
return vifTransfer<0>(data, size, TTE);
} }
bool VIF1transfer(u32 *data, int size) { bool VIF1transfer(u32 *data, int size, bool TTE) {
return vifTransfer<1>(data, size); return vifTransfer<1>(data, size, TTE);
} }

View File

@ -76,6 +76,7 @@ struct GIFTAG
GIFTAG() {} GIFTAG() {}
wxString DumpRegsToString() const; wxString DumpRegsToString() const;
wxString ToString() const;
}; };
wxString GIFTAG::DumpRegsToString() const wxString GIFTAG::DumpRegsToString() const
@ -105,6 +106,21 @@ wxString GIFTAG::DumpRegsToString() const
return result; return result;
} }
wxString GIFTAG::ToString() const
{
static const char* GifTagModeLabel[] =
{
"Packed", "RegList", "Image", "Image2"
};
FastFormatUnicode result;
result.Write("NLOOP=0x%04X, EOP=%u, PRE=%u, PRIM=0x%03X, MODE=%s",
NLOOP, EOP, PRE, PRIM, GifTagModeLabel[FLG]);
return result;
}
// -------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------
// GIFPath -- PS2 GIFtag info (one for each path). // GIFPath -- PS2 GIFtag info (one for each path).
// -------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------
@ -623,6 +639,8 @@ __fi int GIFPath::CopyTag(const u128* pMem128, u32 size)
SetTag<Aligned>((u8*)pMem128); SetTag<Aligned>((u8*)pMem128);
copyTag(); copyTag();
GifTagLog("\tSetTag: %ls", tag.ToString().c_str());
if(nloop > 0) if(nloop > 0)
{ {
switch(pathidx) switch(pathidx)

View File

@ -21,15 +21,15 @@
static __ri bool _eelog_enabled( u32 addr ) static __ri bool _eelog_enabled( u32 addr )
{ {
// Selective enable/disable ability for specific register maps // Selective enable/disable ability for specific register maps
if (eeAddrInRange(RCNT0, addr)) return true; if (eeAddrInRange(RCNT0, addr)) return false;
if (eeAddrInRange(RCNT1, addr)) return true; if (eeAddrInRange(RCNT1, addr)) return true;
if (eeAddrInRange(RCNT2, addr)) return true; if (eeAddrInRange(RCNT2, addr)) return true;
if (eeAddrInRange(RCNT3, addr)) return true; if (eeAddrInRange(RCNT3, addr)) return true;
if (eeAddrInRange(SBUS, addr)) return true; if (eeAddrInRange(SBUS, addr)) return false;
// INTC! // INTC!
if (addr == INTC_STAT || addr == INTC_MASK) return true; if (addr == INTC_STAT || addr == INTC_MASK) return false;
return true; return true;
} }
@ -175,10 +175,13 @@ static __ri const char* _eelog_GetHwName( u32 addr, T val )
EasyCase(fromSPR_CHCR); EasyCase(fromSPR_CHCR);
EasyCase(fromSPR_MADR); EasyCase(fromSPR_MADR);
EasyCase(fromSPR_QWC); EasyCase(fromSPR_QWC);
EasyCase(fromSPR_SADR);
EasyCase(toSPR_CHCR); EasyCase(toSPR_CHCR);
EasyCase(toSPR_MADR); EasyCase(toSPR_MADR);
EasyCase(toSPR_QWC); EasyCase(toSPR_QWC);
EasyCase(toSPR_TADR);
EasyCase(toSPR_SADR);
// DMAC! // DMAC!
EasyCase(DMAC_CTRL); EasyCase(DMAC_CTRL);