mirror of https://github.com/PCSX2/pcsx2.git
Adjust Ipu1Dma to use the helper functions in Dmac.h for tag transferring. A few minor changes.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2893 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
0fa4a5e433
commit
6cb4d35e50
|
@ -49,6 +49,7 @@
|
||||||
|
|
||||||
static tIPU_DMA g_nDMATransfer(0);
|
static tIPU_DMA g_nDMATransfer(0);
|
||||||
static tIPU_cmd ipu_cmd;
|
static tIPU_cmd ipu_cmd;
|
||||||
|
static IPUStatus IPU1Status;
|
||||||
|
|
||||||
// FIXME - g_nIPU0Data and Pointer are not saved in the savestate, which breaks savestates for some
|
// FIXME - g_nIPU0Data and Pointer are not saved in the savestate, which breaks savestates for some
|
||||||
// FMVs at random (if they get saved during the half frame of a 30fps rate). The fix is complicated
|
// FMVs at random (if they get saved during the half frame of a 30fps rate). The fix is complicated
|
||||||
|
@ -1258,17 +1259,17 @@ static __forceinline void ipuDmacSrcChain()
|
||||||
case TAG_CNT: // cnt
|
case TAG_CNT: // cnt
|
||||||
// Set the taddr to the next tag
|
// Set the taddr to the next tag
|
||||||
ipu1dma->tadr = ipu1dma->madr;
|
ipu1dma->tadr = ipu1dma->madr;
|
||||||
if(IPU1Status.DMAFinished == false) IPU1Status.DMAFinished = false;
|
//if(IPU1Status.DMAFinished == false) IPU1Status.DMAFinished = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TAG_NEXT: // next
|
case TAG_NEXT: // next
|
||||||
ipu1dma->tadr = IPU1Status.NextMem;
|
ipu1dma->tadr = IPU1Status.NextMem;
|
||||||
if(IPU1Status.DMAFinished == false) IPU1Status.DMAFinished = false;
|
//if(IPU1Status.DMAFinished == false) IPU1Status.DMAFinished = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TAG_REF: // ref
|
case TAG_REF: // ref
|
||||||
//if(IPU1Status.InProgress == false)ipu1dma->tadr += 16;
|
//if(IPU1Status.InProgress == false)ipu1dma->tadr += 16;
|
||||||
if(IPU1Status.DMAFinished == false) IPU1Status.DMAFinished = false;
|
//if(IPU1Status.DMAFinished == false) IPU1Status.DMAFinished = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TAG_END: // end
|
case TAG_END: // end
|
||||||
|
@ -1359,15 +1360,12 @@ static __forceinline int IPU1chain() {
|
||||||
|
|
||||||
int IPU1dma()
|
int IPU1dma()
|
||||||
{
|
{
|
||||||
bool done = FALSE;
|
|
||||||
int ipu1cycles = 0;
|
int ipu1cycles = 0;
|
||||||
int totalqwc = 0;
|
int totalqwc = 0;
|
||||||
|
|
||||||
//We need to make sure GIF has flushed before sending IPU data, it seems to REALLY screw FFX videos
|
//We need to make sure GIF has flushed before sending IPU data, it seems to REALLY screw FFX videos
|
||||||
//if(!WaitGSPaths()) return totalqwc;
|
//if(!WaitGSPaths()) return totalqwc;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
IPU_LOG("IPU1 DMA Called QWC %x Finished %d In Progress %d tadr %x", ipu1dma->qwc, IPU1Status.DMAFinished, IPU1Status.InProgress, ipu1dma->tadr);
|
IPU_LOG("IPU1 DMA Called QWC %x Finished %d In Progress %d tadr %x", ipu1dma->qwc, IPU1Status.DMAFinished, IPU1Status.InProgress, ipu1dma->tadr);
|
||||||
|
|
||||||
switch(IPU1Status.DMAMode)
|
switch(IPU1Status.DMAMode)
|
||||||
|
@ -1401,24 +1399,15 @@ int IPU1dma()
|
||||||
|
|
||||||
if(IPU1Status.InProgress == false && IPU1Status.DMAFinished == false) //No transfer is ready to go so we need to set one up
|
if(IPU1Status.InProgress == false && IPU1Status.DMAFinished == false) //No transfer is ready to go so we need to set one up
|
||||||
{
|
{
|
||||||
u32 *ptag;
|
tDMA_TAG* ptag = dmaGetAddr(ipu1dma->tadr, false); //Set memory pointer to TADR
|
||||||
|
|
||||||
|
if (!ipu1dma->transfer("IPU1", ptag))
|
||||||
ptag = (u32*)dmaGetAddr(ipu1dma->tadr, false); //Set memory pointer to TADR
|
|
||||||
if (ptag == NULL) //Is ptag empty?
|
|
||||||
{
|
{
|
||||||
Console.Error("IPU1 BUSERR");
|
|
||||||
ipu1dma->chcr._u32 = (ipu1dma->chcr._u32 & 0xFFFF) | ((*ptag) & 0xFFFF0000); //Transfer upper part of tag to CHCR bits 31-15
|
|
||||||
psHu32(DMAC_STAT) |= 1 << 15; //If yes, set BEIS (BUSERR) in DMAC_STAT register
|
|
||||||
return totalqwc;
|
return totalqwc;
|
||||||
}
|
}
|
||||||
|
|
||||||
ipu1cycles += 1; // Add 1 cycles from the QW read for the tag
|
ipu1cycles += 1; // Add 1 cycles from the QW read for the tag
|
||||||
|
IPU1Status.ChainMode = ptag->ID;
|
||||||
ipu1dma->chcr._u32 = (ipu1dma->chcr._u32 & 0xFFFF) | ((*ptag) & 0xFFFF0000); //Transfer upper part of tag to CHCR bits 31-15
|
|
||||||
ipu1dma->qwc = (u16)ptag[0]; //QWC set to lower 16bits of the tag
|
|
||||||
|
|
||||||
IPU1Status.ChainMode = (ptag[0] & 0x70000000) >> 28;
|
|
||||||
|
|
||||||
switch (IPU1Status.ChainMode)
|
switch (IPU1Status.ChainMode)
|
||||||
{
|
{
|
||||||
|
@ -1426,7 +1415,7 @@ int IPU1dma()
|
||||||
// do not change tadr
|
// do not change tadr
|
||||||
//ipu1dma->tadr += 16;
|
//ipu1dma->tadr += 16;
|
||||||
ipu1dma->tadr += 16;
|
ipu1dma->tadr += 16;
|
||||||
ipu1dma->madr = ptag[1];
|
ipu1dma->madr = ptag[1]._u32;
|
||||||
IPU_LOG("Tag should end on %x", ipu1dma->tadr);
|
IPU_LOG("Tag should end on %x", ipu1dma->tadr);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -1441,13 +1430,13 @@ int IPU1dma()
|
||||||
|
|
||||||
case TAG_NEXT: // next
|
case TAG_NEXT: // next
|
||||||
ipu1dma->madr = ipu1dma->tadr + 16;
|
ipu1dma->madr = ipu1dma->tadr + 16;
|
||||||
IPU1Status.NextMem = ptag[1];
|
IPU1Status.NextMem = ptag[1]._u32;
|
||||||
IPU_LOG("Tag should end on %x", IPU1Status.NextMem);
|
IPU_LOG("Tag should end on %x", IPU1Status.NextMem);
|
||||||
//IPU1Status.DMAFinished = false;
|
//IPU1Status.DMAFinished = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TAG_REF: // ref
|
case TAG_REF: // ref
|
||||||
ipu1dma->madr = ptag[1];
|
ipu1dma->madr = ptag[1]._u32;
|
||||||
ipu1dma->tadr += 16;
|
ipu1dma->tadr += 16;
|
||||||
IPU_LOG("Tag should end on %x", ipu1dma->tadr);
|
IPU_LOG("Tag should end on %x", ipu1dma->tadr);
|
||||||
//IPU1Status.DMAFinished = false;
|
//IPU1Status.DMAFinished = false;
|
||||||
|
@ -1469,9 +1458,9 @@ int IPU1dma()
|
||||||
//if(ipu1dma->qwc == 0) Console.Warning("Blank QWC!");
|
//if(ipu1dma->qwc == 0) Console.Warning("Blank QWC!");
|
||||||
if(ipu1dma->qwc > 0) IPU1Status.InProgress = true;
|
if(ipu1dma->qwc > 0) IPU1Status.InProgress = true;
|
||||||
IPU_LOG("dmaIPU1 dmaChain %8.8x_%8.8x size=%d, addr=%lx, fifosize=%x",
|
IPU_LOG("dmaIPU1 dmaChain %8.8x_%8.8x size=%d, addr=%lx, fifosize=%x",
|
||||||
ptag[1], ptag[0], ipu1dma->qwc, ipu1dma->madr, 8 - g_BP.IFC);
|
ptag[1]._u32, ptag[0]._u32, ipu1dma->qwc, ipu1dma->madr, 8 - g_BP.IFC);
|
||||||
|
|
||||||
if (ipu1dma->chcr.TIE && (ptag[0] & 0x80000000)) //Tag Interrupt is set, so schedule the end/interrupt
|
if (ipu1dma->chcr.TIE && ptag->IRQ) //Tag Interrupt is set, so schedule the end/interrupt
|
||||||
IPU1Status.DMAFinished = true;
|
IPU1Status.DMAFinished = true;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -55,8 +55,6 @@ struct IPUStatus {
|
||||||
u32 NextMem;
|
u32 NextMem;
|
||||||
};
|
};
|
||||||
|
|
||||||
static IPUStatus IPU1Status;
|
|
||||||
|
|
||||||
#define DMA_MODE_NORMAL 0
|
#define DMA_MODE_NORMAL 0
|
||||||
#define DMA_MODE_CHAIN 1
|
#define DMA_MODE_CHAIN 1
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ static NonblockingMutex state_buffer_lock;
|
||||||
|
|
||||||
// This boolean tracks if a savestate is actively saving. When a state is saving we
|
// This boolean tracks if a savestate is actively saving. When a state is saving we
|
||||||
// typically delay program termination to allow the state time to finish its work.
|
// typically delay program termination to allow the state time to finish its work.
|
||||||
static bool state_is_saving = false;
|
//static bool state_is_saving = false;
|
||||||
|
|
||||||
// This boolean is to keep the system from resuming emulation until the current state has completely
|
// This boolean is to keep the system from resuming emulation until the current state has completely
|
||||||
// uploaded or downloaded itself. It is only modified from the main thread, and should only be read
|
// uploaded or downloaded itself. It is only modified from the main thread, and should only be read
|
||||||
|
|
Loading…
Reference in New Issue