Change the return values on some Vif functions.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2261 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
arcum42 2009-11-27 13:49:37 +00:00
parent 82a506cd04
commit f11a138ce9
7 changed files with 171 additions and 173 deletions

View File

@ -144,21 +144,29 @@ void iDumpVU0Registers()
// fixme: This code is outdated, broken, and lacks printed labels.
// Needs heavy mods to be useful.
#ifdef TEST_BROKEN_DUMP_ROUTINES
int i;
for(i = 1; i < 32; ++i) {
for(int i = 1; i < 32; ++i) {
__Log("v%d: %x %x %x %x, vi: ", i, VF_VAL(VU0.VF[i].UL[3]), VF_VAL(VU0.VF[i].UL[2]),
VF_VAL(VU0.VF[i].UL[1]), VF_VAL(VU0.VF[i].UL[0]));
if( i == REG_Q || i == REG_P )
switch (i)
{
case REG_Q:
case REG_P:
__Log("%f\n", VU0.VI[i].F);
else if( i == REG_MAC_FLAG )
break;
case REG_MAC_FLAG:
__Log("%x\n", 0);//VU0.VI[i].UL&0xff);
else if( i == REG_STATUS_FLAG )
break;
case REG_STATUS_FLAG:
__Log("%x\n", 0);//VU0.VI[i].UL&0x03);
else if( i == REG_CLIP_FLAG )
break;
case REG_CLIP_FLAG:
__Log("0\n");
else
break;
default:
__Log("%x\n", VU0.VI[i].UL);
break;
}
}
__Log("vfACC: %f %f %f %f\n", VU0.ACC.F[3], VU0.ACC.F[2], VU0.ACC.F[1], VU0.ACC.F[0]);
#endif

View File

@ -114,8 +114,8 @@ void __fastcall WriteFIFO_page_4(u32 mem, const mem128_t *value)
psHu64(VIF0_FIFO + 8) = value[1];
vif0ch->qwc += 1;
int ret = VIF0transfer((u32*)value, 4, 0);
pxAssertDev( ret == 0, "vif stall code not implemented" );
bool ret = VIF0transfer((u32*)value, 4, true);
pxAssertDev( ret, "vif stall code not implemented" );
}
void __fastcall WriteFIFO_page_5(u32 mem, const mem128_t *value)
@ -133,8 +133,8 @@ void __fastcall WriteFIFO_page_5(u32 mem, const mem128_t *value)
DevCon.Warning("writing to vif1 fifo when stalled");
vif1ch->qwc += 1;
int ret = VIF1transfer((u32*)value, 4, 0);
pxAssertDev( ret == 0, "vif stall code not implemented" );
bool ret = VIF1transfer((u32*)value, 4, false);
pxAssertDev( ret, "vif stall code not implemented" );
}
// Dummy GIF-TAG Packet to Guarantee Count = 1

View File

@ -414,12 +414,13 @@ void __fastcall UNPACK_V4_8u(u32 *dest, u32 *data, int size)
UNPACK_V4(dest, cdata, size);
}
static __forceinline int mfifoVIF1rbTransfer()
static __forceinline bool mfifoVIF1rbTransfer()
{
u32 maddr = dmacRegs->rbor.ADDR;
u32 ret, msize = dmacRegs->rbor.ADDR + dmacRegs->rbsr.RMSK + 16;
u32 msize = dmacRegs->rbor.ADDR + dmacRegs->rbsr.RMSK + 16;
u16 mfifoqwc = std::min(vif1ch->qwc, vifqwc);
u32 *src;
bool ret;
/* Check if the transfer should wrap around the ring buffer */
if ((vif1ch->madr + (mfifoqwc << 4)) > (msize))
@ -430,21 +431,22 @@ static __forceinline int mfifoVIF1rbTransfer()
/* it does, so first copy 's1' bytes from 'addr' to 'data' */
src = (u32*)PSM(vif1ch->madr);
if (src == NULL) return -1;
if (src == NULL) return false;
if (vif1.vifstalled)
ret = VIF1transfer(src + vif1.irqoffset, s1 - vif1.irqoffset, 0);
ret = VIF1transfer(src + vif1.irqoffset, s1 - vif1.irqoffset, false);
else
ret = VIF1transfer(src, s1, 0);
if (ret == -2) return ret;
ret = VIF1transfer(src, s1, false);
if (ret)
{
/* and second copy 's2' bytes from 'maddr' to '&data[s1]' */
vif1ch->madr = maddr;
src = (u32*)PSM(maddr);
if (src == NULL) return -1;
ret = VIF1transfer(src, ((mfifoqwc << 2) - s1), 0);
if (src == NULL) return false;
VIF1transfer(src, ((mfifoqwc << 2) - s1), false);
}
}
else
{
@ -452,28 +454,25 @@ static __forceinline int mfifoVIF1rbTransfer()
/* it doesn't, so just transfer 'qwc*4' words */
src = (u32*)PSM(vif1ch->madr);
if (src == NULL) return -1;
if (src == NULL) return false;
if (vif1.vifstalled)
ret = VIF1transfer(src + vif1.irqoffset, mfifoqwc * 4 - vif1.irqoffset, 0);
ret = VIF1transfer(src + vif1.irqoffset, mfifoqwc * 4 - vif1.irqoffset, false);
else
ret = VIF1transfer(src, mfifoqwc << 2, 0);
if (ret == -2) return ret;
ret = VIF1transfer(src, mfifoqwc << 2, false);
}
return ret;
}
static __forceinline int mfifo_VIF1chain()
static __forceinline bool mfifo_VIF1chain()
{
int ret;
bool ret;
/* Is QWC = 0? if so there is nothing to transfer */
if ((vif1ch->qwc == 0) && (!vif1.vifstalled))
{
vif1.inprogress &= ~1;
return 0;
return true;
}
if (vif1ch->madr >= dmacRegs->rbor.ADDR &&
@ -488,13 +487,13 @@ static __forceinline int mfifo_VIF1chain()
u32 *pMem = (u32*)dmaGetAddr(vif1ch->madr);
SPR_LOG("Non-MFIFO Location");
if (pMem == NULL) return -1;
if (vif1.vifstalled)
ret = VIF1transfer(pMem + vif1.irqoffset, vif1ch->qwc * 4 - vif1.irqoffset, 0);
else
ret = VIF1transfer(pMem, vif1ch->qwc << 2, 0);
}
if (pMem == NULL) return false;
if (vif1.vifstalled)
ret = VIF1transfer(pMem + vif1.irqoffset, vif1ch->qwc * 4 - vif1.irqoffset, false);
else
ret = VIF1transfer(pMem, vif1ch->qwc << 2, false);
}
return ret;
}
@ -507,7 +506,6 @@ void mfifoVIF1transfer(int qwc)
{
u32 *ptag;
int id;
int ret;
g_vifCycles = 0;
@ -535,12 +533,14 @@ void mfifoVIF1transfer(int qwc)
if (vif1ch->chcr.TTE)
{
if (vif1.stallontag)
ret = VIF1transfer(ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset, 1); //Transfer Tag on Stall
else
ret = VIF1transfer(ptag + 2, 2, 1); //Transfer Tag
bool ret;
if (ret == -2)
if (vif1.stallontag)
ret = VIF1transfer(ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset, true); //Transfer Tag on Stall
else
ret = VIF1transfer(ptag + 2, 2, true); //Transfer Tag
if (!(ret))
{
VIF_LOG("MFIFO Stall on tag");
vif1.stallontag = true;

View File

@ -221,8 +221,8 @@ extern "C"
extern void dmaVIF0();
extern void dmaVIF1();
extern void mfifoVIF1transfer(int qwc);
extern int VIF0transfer(u32 *data, int size, int istag);
extern int VIF1transfer(u32 *data, int size, int istag);
extern bool VIF0transfer(u32 *data, int size, bool istag);
extern bool VIF1transfer(u32 *data, int size, bool istag);
extern void vifMFIFOInterrupt();
// --------------------------------------------------------------------------------------

View File

@ -43,7 +43,6 @@ __forceinline void vif0FLUSH()
g_vifCycles += (VU0.cycle - _cycles) * BIAS;
}
void vif0Init()
{
for (u32 i = 0; i < 256; ++i)
@ -364,7 +363,7 @@ static void Vif0CMDNull() // invalid opcode
vif0.cmd &= ~0x7f;
}
int VIF0transfer(u32 *data, int size, int istag)
bool VIF0transfer(u32 *data, int size, bool istag)
{
int ret;
int transferred = vif0.vifstalled ? vif0.irqoffset : 0; // irqoffset necessary to add up the right qws, or else will spin (spiderman)
@ -438,7 +437,6 @@ int VIF0transfer(u32 *data, int size, int istag)
if (vif0.tag.size == 0) break;
}
}
} //End of Transfer loop
transferred += size - vif0.vifpacketsize;
@ -462,7 +460,7 @@ int VIF0transfer(u32 *data, int size, int istag)
vif0ch->qwc -= transferred;
}
//else Console.WriteLn("Stall on vif0, FromSPR = %x, Vif0MADR = %x Sif0MADR = %x STADR = %x", psHu32(0x1000d010), vif0ch->madr, psHu32(0x1000c010), psHu32(DMAC_STADR));
return -2;
return false;
}
vif0Regs->stat.VPS = VPS_IDLE; //Vif goes idle as the stall happened between commands;
@ -475,15 +473,14 @@ int VIF0transfer(u32 *data, int size, int istag)
vif0ch->qwc -= transferred;
}
return 0;
return true;
}
int _VIF0chain()
bool _VIF0chain()
{
u32 *pMem;
u32 ret;
if ((vif0ch->qwc == 0) && !vif0.vifstalled) return 0;
if ((vif0ch->qwc == 0) && !vif0.vifstalled) return true;
pMem = (u32*)dmaGetAddr(vif0ch->madr);
if (pMem == NULL)
@ -491,24 +488,22 @@ int _VIF0chain()
vif0.cmd = 0;
vif0.tag.size = 0;
vif0ch->qwc = 0;
return 0;
return true;
}
if (vif0.vifstalled)
ret = VIF0transfer(pMem + vif0.irqoffset, vif0ch->qwc * 4 - vif0.irqoffset, 0);
return VIF0transfer(pMem + vif0.irqoffset, vif0ch->qwc * 4 - vif0.irqoffset, false);
else
ret = VIF0transfer(pMem, vif0ch->qwc * 4, 0);
return ret;
return VIF0transfer(pMem, vif0ch->qwc * 4, false);
}
int _chainVIF0()
bool _chainVIF0()
{
int id, ret;
int id;
vif0ptag = (u32*)dmaGetAddr(vif0ch->tadr); //Set memory pointer to TADR
if (!(Tag::Transfer("Vif0 Tag", vif0ch, vif0ptag))) return -1;
if (!(Tag::Transfer("Vif0 Tag", vif0ch, vif0ptag))) return false;
vif0ch->madr = vif0ptag[1]; // MADR = ADDR field
id = Tag::Id(vif0ptag); // ID for DmaChain copied from bit 28 of the tag
@ -520,13 +515,14 @@ int _chainVIF0()
// Transfer dma tag if tte is set
if (vif0ch->chcr.TTE)
{
if (vif0.vifstalled)
ret = VIF0transfer(vif0ptag + (2 + vif0.irqoffset), 2 - vif0.irqoffset, 1); //Transfer Tag on stall
else
ret = VIF0transfer(vif0ptag + 2, 2, 1); //Transfer Tag
bool ret;
if (ret == -1) return -1; //There has been an error
if (ret == -2) return -2; //IRQ set by VIFTransfer
if (vif0.vifstalled)
ret = VIF0transfer(vif0ptag + (2 + vif0.irqoffset), 2 - vif0.irqoffset, true); //Transfer Tag on stall
else
ret = VIF0transfer(vif0ptag + 2, 2, true); //Transfer Tag
if (!(ret)) return false; //IRQ set by VIFTransfer
}
vif0.done |= hwDmacSrcChainWithStack(vif0ch, id);
@ -534,15 +530,15 @@ int _chainVIF0()
VIF_LOG("dmaChain %8.8x_%8.8x size=%d, id=%d, madr=%lx, tadr=%lx",
vif0ptag[1], vif0ptag[0], vif0ch->qwc, id, vif0ch->madr, vif0ch->tadr);
ret = _VIF0chain(); //Transfers the data set by the switch
_VIF0chain(); //Transfers the data set by the switch
if (vif0ch->chcr.TIE && Tag::IRQ(vif0ptag)) //Check TIE bit of CHCR and IRQ bit of tag
{
VIF_LOG("dmaIrq Set\n");
vif0.done = true; //End Transfer
}
return (vif0.done) ? 1: 0; //Return Done
return vif0.done;
}
void vif0Interrupt()

View File

@ -250,7 +250,6 @@ static int __fastcall Vif1TransDirectHL(u32 *data)
gifRegs->stat.APATH |= GIF_APATH2;
gifRegs->stat.OPH = true;
if (splitptr > 0) //Leftover data from the last packet, filling the rest and sending to the GS
{
if ((splitptr < 4) && (vif1.vifpacketsize >= (4 - splitptr)))
@ -574,7 +573,7 @@ void (*Vif1CMDTLB[82])() =
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int VIF1transfer(u32 *data, int size, int istag)
bool VIF1transfer(u32 *data, int size, bool istag)
{
int ret;
int transferred = vif1.vifstalled ? vif1.irqoffset : 0; // irqoffset necessary to add up the right qws, or else will spin (spiderman)
@ -669,7 +668,7 @@ int VIF1transfer(u32 *data, int size, int istag)
if (vif1ch->qwc == 0 && (vif1.irqoffset == 0 || istag == 1)) vif1.inprogress &= ~0x1;
// spiderman doesn't break on qw boundaries
if (istag) return -2;
if (istag) return false;
transferred = transferred >> 2;
vif1ch->madr += (transferred << 4);
@ -677,7 +676,7 @@ int VIF1transfer(u32 *data, int size, int istag)
if ((vif1ch->qwc == 0) && (vif1.irqoffset == 0)) vif1.inprogress = 0;
//Console.WriteLn("Stall on vif1, FromSPR = %x, Vif1MADR = %x Sif0MADR = %x STADR = %x", psHu32(0x1000d010), vif1ch->madr, psHu32(0x1000c010), psHu32(DMAC_STADR));
return -2;
return false;
}
vif1Regs->stat.VPS = VPS_IDLE; //Vif goes idle as the stall happened between commands;
@ -690,14 +689,11 @@ int VIF1transfer(u32 *data, int size, int istag)
vif1ch->qwc -= transferred;
}
if (vif1Regs->stat.VGW)
{
vif1.vifstalled = true;
}
if (vif1Regs->stat.VGW) vif1.vifstalled = true;
if (vif1ch->qwc == 0 && (vif1.irqoffset == 0 || istag == 1)) vif1.inprogress &= ~0x1;
return vif1.vifstalled ? -2 : 0;
return (!(vif1.vifstalled));
}
void vif1TransferFromMemory()
@ -731,7 +727,7 @@ void vif1TransferFromMemory()
if (size > 1)
{
GetMTGS().WaitGS();
GSreadFIFO((u64*)&PS2MEM_HW[0x5000]);
GSreadFIFO(&psHu64(VIF1_FIFO));
}
pMem[0] = psHu64(VIF1_FIFO);
pMem[1] = psHu64(VIF1_FIFO + 8);
@ -755,22 +751,21 @@ void vif1TransferFromMemory()
vif1ch->qwc = 0;
}
int _VIF1chain()
bool _VIF1chain()
{
u32 *pMem;
u32 ret;
if (vif1ch->qwc == 0)
{
vif1.inprogress = 0;
return 0;
return true;
}
if (vif1.dmamode == VIF_NORMAL_FROM_MEM_MODE)
{
vif1TransferFromMemory();
vif1.inprogress = 0;
return 0;
return true;
}
pMem = (u32*)dmaGetAddr(vif1ch->madr);
@ -779,18 +774,16 @@ int _VIF1chain()
vif1.cmd = 0;
vif1.tag.size = 0;
vif1ch->qwc = 0;
return 0;
return true;
}
VIF_LOG("VIF1chain size=%d, madr=%lx, tadr=%lx",
vif1ch->qwc, vif1ch->madr, vif1ch->tadr);
if (vif1.vifstalled)
ret = VIF1transfer(pMem + vif1.irqoffset, vif1ch->qwc * 4 - vif1.irqoffset, 0);
return VIF1transfer(pMem + vif1.irqoffset, vif1ch->qwc * 4 - vif1.irqoffset, false);
else
ret = VIF1transfer(pMem, vif1ch->qwc * 4, 0);
return ret;
return VIF1transfer(pMem, vif1ch->qwc * 4, false);
}
bool _chainVIF1()
@ -811,7 +804,6 @@ __forceinline void vif1SetupTransfer()
case VIF_CHAIN_MODE:
int id;
int ret;
vif1ptag = (u32*)dmaGetAddr(vif1ch->tadr); //Set memory pointer to TADR
@ -841,13 +833,14 @@ __forceinline void vif1SetupTransfer()
if (vif1ch->chcr.TTE)
{
bool ret;
if (vif1.vifstalled)
ret = VIF1transfer(vif1ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset, 1); //Transfer Tag on stall
ret = VIF1transfer(vif1ptag + (2 + vif1.irqoffset), 2 - vif1.irqoffset, true); //Transfer Tag on stall
else
ret = VIF1transfer(vif1ptag + 2, 2, 1); //Transfer Tag
ret = VIF1transfer(vif1ptag + 2, 2, true); //Transfer Tag
if (ret < 0 && vif1.irqoffset < 2)
if ((ret == false) && vif1.irqoffset < 2)
{
vif1.inprogress = 0; //Better clear this so it has to do it again (Jak 1)
return; //There has been an error or an interrupt
@ -1133,7 +1126,8 @@ void vif1Write32(u32 mem, u32 value)
//vif1Regs->stat._u32 = (vif1Regs->stat._u32 & ~VIF1_STAT_FDR) | (value & VIF1_STAT_FDR);
if (vif1Regs->stat.FDR)
{
vif1Regs->stat.FQC = 1; // Hack but it checks this is true before transfer? (fatal frame)
// Hack but it checks this is true before transfer? (fatal frame)
vif1Regs->stat.FQC = 0x1;
}
else
{