mirror of https://github.com/PCSX2/pcsx2.git
Changed SIF and IPU macros for hw register mappings into references. (-> into .)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@3727 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
935159ed8e
commit
02b390b0e1
|
@ -218,8 +218,6 @@ void __fastcall hwWrite32( u32 mem, u32 value )
|
|||
template< uint page >
|
||||
void __fastcall _hwWrite8(u32 mem, u8 value)
|
||||
{
|
||||
pxAssert( (mem & 0x03) == 0 );
|
||||
|
||||
iswitch (mem)
|
||||
icase(SIO_TXFIFO)
|
||||
{
|
||||
|
@ -247,7 +245,7 @@ void __fastcall _hwWrite8(u32 mem, u8 value)
|
|||
return;
|
||||
}
|
||||
|
||||
u32 merged = _hwRead32<page,false>(mem);
|
||||
u32 merged = _hwRead32<page,false>(mem & ~0x03);
|
||||
((u8*)&merged)[mem & 0x3] = value;
|
||||
|
||||
_hwWrite32<page>(mem & ~0x03, merged);
|
||||
|
@ -265,7 +263,7 @@ void __fastcall _hwWrite16(u32 mem, u16 value)
|
|||
{
|
||||
pxAssume( (mem & 0x01) == 0 );
|
||||
|
||||
u32 merged = _hwRead32<page,false>(mem);
|
||||
u32 merged = _hwRead32<page,false>(mem & ~0x03);
|
||||
((u16*)&merged)[(mem>>1) & 0x1] = value;
|
||||
|
||||
hwWrite32<page>(mem & ~0x03, merged);
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "Common.h"
|
||||
|
||||
#include "IPU.h"
|
||||
#include "IPUdma.h"
|
||||
#include "yuv2rgb.h"
|
||||
#include "mpeg2lib/Mpeg.h"
|
||||
|
||||
|
@ -27,8 +28,7 @@
|
|||
|
||||
static __fi void IPU_INT0_FROM()
|
||||
{
|
||||
extern void ipu0Interrupt(); // defined in IPUdma.cpp
|
||||
if (ipu0dma->qwc > 0 && ipu0dma->chcr.STR) ipu0Interrupt();
|
||||
if (ipu0dma.qwc > 0 && ipu0dma.chcr.STR) ipu0Interrupt();
|
||||
}
|
||||
|
||||
tIPU_cmd ipu_cmd;
|
||||
|
@ -60,14 +60,14 @@ u8* readbits = _readbits; // always can decrement by one 1qw
|
|||
|
||||
__fi void IPUProcessInterrupt()
|
||||
{
|
||||
if (ipuRegs->ctrl.BUSY && g_BP.IFC) IPUWorker();
|
||||
if (ipuRegs.ctrl.BUSY && g_BP.IFC) IPUWorker();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
// Register accesses (run on EE thread)
|
||||
int ipuInit()
|
||||
{
|
||||
memzero(*ipuRegs);
|
||||
memzero(ipuRegs);
|
||||
memzero(g_BP);
|
||||
memzero(decoder);
|
||||
|
||||
|
@ -213,27 +213,27 @@ __fi u32 ipuRead32(u32 mem)
|
|||
switch (mem)
|
||||
{
|
||||
ipucase(IPU_CTRL): // IPU_CTRL
|
||||
ipuRegs->ctrl.IFC = g_BP.IFC;
|
||||
ipuRegs->ctrl.CBP = coded_block_pattern;
|
||||
ipuRegs.ctrl.IFC = g_BP.IFC;
|
||||
ipuRegs.ctrl.CBP = coded_block_pattern;
|
||||
|
||||
if (!ipuRegs->ctrl.BUSY)
|
||||
IPU_LOG("read32: IPU_CTRL=0x%08X %x", ipuRegs->ctrl._u32, cpuRegs.pc);
|
||||
if (!ipuRegs.ctrl.BUSY)
|
||||
IPU_LOG("read32: IPU_CTRL=0x%08X", ipuRegs.ctrl._u32);
|
||||
|
||||
return ipuRegs->ctrl._u32;
|
||||
return ipuRegs.ctrl._u32;
|
||||
|
||||
ipucase(IPU_BP): // IPU_BP
|
||||
ipuRegs->ipubp = g_BP.BP & 0x7f;
|
||||
ipuRegs->ipubp |= g_BP.IFC << 8;
|
||||
ipuRegs->ipubp |= (g_BP.FP /*+ g_BP.bufferhasnew*/) << 16;
|
||||
ipuRegs.ipubp = g_BP.BP & 0x7f;
|
||||
ipuRegs.ipubp |= g_BP.IFC << 8;
|
||||
ipuRegs.ipubp |= (g_BP.FP /*+ g_BP.bufferhasnew*/) << 16;
|
||||
|
||||
IPU_LOG("read32: IPU_BP=0x%08X", ipuRegs->ipubp);
|
||||
return ipuRegs->ipubp;
|
||||
IPU_LOG("read32: IPU_BP=0x%08X", ipuRegs.ipubp);
|
||||
return ipuRegs.ipubp;
|
||||
|
||||
default:
|
||||
IPU_LOG("read32: Addr=0x%x Value = 0x%08X", mem, *(u32*)(((u8*)ipuRegs) + mem));
|
||||
IPU_LOG("read32: Addr=0x%08X Value = 0x%08X", mem, psHu32(IPU_CMD + mem));
|
||||
}
|
||||
|
||||
return *(u32*)(((u8*)ipuRegs) + mem);
|
||||
return psHu32(IPU_CMD + mem);
|
||||
}
|
||||
|
||||
__fi u64 ipuRead64(u32 mem)
|
||||
|
@ -249,8 +249,8 @@ __fi u64 ipuRead64(u32 mem)
|
|||
switch (mem)
|
||||
{
|
||||
ipucase(IPU_CMD): // IPU_CMD
|
||||
if (ipuRegs->cmd.DATA & 0xffffff)
|
||||
IPU_LOG("read64: IPU_CMD=BUSY=%x, DATA=%08X", ipuRegs->cmd.BUSY ? 1 : 0, ipuRegs->cmd.DATA);
|
||||
if (ipuRegs.cmd.DATA & 0xffffff)
|
||||
IPU_LOG("read64: IPU_CMD=BUSY=%x, DATA=%08X", ipuRegs.cmd.BUSY ? 1 : 0, ipuRegs.cmd.DATA);
|
||||
break;
|
||||
|
||||
ipucase(IPU_CTRL):
|
||||
|
@ -262,14 +262,14 @@ __fi u64 ipuRead64(u32 mem)
|
|||
break;
|
||||
|
||||
ipucase(IPU_TOP): // IPU_TOP
|
||||
IPU_LOG("read64: IPU_TOP=%x, bp = %d", ipuRegs->top, g_BP.BP);
|
||||
IPU_LOG("read64: IPU_TOP=%x, bp = %d", ipuRegs.top, g_BP.BP);
|
||||
break;
|
||||
|
||||
default:
|
||||
IPU_LOG("read64: Unknown=%x", mem);
|
||||
break;
|
||||
}
|
||||
return *(u64*)(((u8*)ipuRegs) + mem);
|
||||
return psHu64(IPU_CMD + mem);
|
||||
}
|
||||
|
||||
void ipuSoftReset()
|
||||
|
@ -278,10 +278,10 @@ void ipuSoftReset()
|
|||
|
||||
coded_block_pattern = 0;
|
||||
|
||||
ipuRegs->ctrl.reset();
|
||||
ipuRegs->top = 0;
|
||||
ipuRegs.ctrl.reset();
|
||||
ipuRegs.top = 0;
|
||||
ipu_cmd.clear();
|
||||
ipuRegs->cmd.BUSY = 0;
|
||||
ipuRegs.cmd.BUSY = 0;
|
||||
|
||||
g_BP.BP = 0;
|
||||
g_BP.FP = 0;
|
||||
|
@ -308,14 +308,14 @@ __fi bool ipuWrite32(u32 mem, u32 value)
|
|||
ipucase(IPU_CTRL): // IPU_CTRL
|
||||
// CTRL = the first 16 bits of ctrl [0x8000ffff], + value for the next 16 bits,
|
||||
// minus the reserved bits. (18-19; 27-29) [0x47f30000]
|
||||
ipuRegs->ctrl.write(value);
|
||||
if (ipuRegs->ctrl.IDP == 3)
|
||||
ipuRegs.ctrl.write(value);
|
||||
if (ipuRegs.ctrl.IDP == 3)
|
||||
{
|
||||
Console.WriteLn("IPU Invalid Intra DC Precision, switching to 9 bits");
|
||||
ipuRegs->ctrl.IDP = 1;
|
||||
ipuRegs.ctrl.IDP = 1;
|
||||
}
|
||||
|
||||
if (ipuRegs->ctrl.RST) ipuSoftReset(); // RESET
|
||||
if (ipuRegs.ctrl.RST) ipuSoftReset(); // RESET
|
||||
|
||||
IPU_LOG("write32: IPU_CTRL=0x%08X", value);
|
||||
return false;
|
||||
|
@ -357,8 +357,8 @@ static void ipuBCLR(u32 val)
|
|||
g_BP.BP = val & 0x7F;
|
||||
g_BP.FP = 0;
|
||||
//g_BP.bufferhasnew = 0;
|
||||
ipuRegs->ctrl.BUSY = 0;
|
||||
ipuRegs->cmd.BUSY = 0;
|
||||
ipuRegs.ctrl.BUSY = 0;
|
||||
ipuRegs.cmd.BUSY = 0;
|
||||
memzero(_readbits);
|
||||
IPU_LOG("Clear IPU input FIFO. Set Bit offset=0x%X", g_BP.BP);
|
||||
}
|
||||
|
@ -373,14 +373,14 @@ static bool ipuIDEC(u32 val, bool resume)
|
|||
g_BP.BP += idec.FB;//skip FB bits
|
||||
|
||||
//from IPU_CTRL
|
||||
ipuRegs->ctrl.PCT = I_TYPE; //Intra DECoding;)
|
||||
ipuRegs.ctrl.PCT = I_TYPE; //Intra DECoding;)
|
||||
|
||||
decoder.coding_type = ipuRegs->ctrl.PCT;
|
||||
decoder.mpeg1 = ipuRegs->ctrl.MP1;
|
||||
decoder.q_scale_type = ipuRegs->ctrl.QST;
|
||||
decoder.intra_vlc_format = ipuRegs->ctrl.IVF;
|
||||
decoder.scantype = ipuRegs->ctrl.AS;
|
||||
decoder.intra_dc_precision = ipuRegs->ctrl.IDP;
|
||||
decoder.coding_type = ipuRegs.ctrl.PCT;
|
||||
decoder.mpeg1 = ipuRegs.ctrl.MP1;
|
||||
decoder.q_scale_type = ipuRegs.ctrl.QST;
|
||||
decoder.intra_vlc_format = ipuRegs.ctrl.IVF;
|
||||
decoder.scantype = ipuRegs.ctrl.AS;
|
||||
decoder.intra_dc_precision = ipuRegs.ctrl.IDP;
|
||||
|
||||
//from IDEC value
|
||||
decoder.quantizer_scale = idec.QSC;
|
||||
|
@ -409,11 +409,11 @@ static __fi bool ipuBDEC(u32 val, bool resume)
|
|||
|
||||
g_BP.BP += bdec.FB;//skip FB bits
|
||||
decoder.coding_type = I_TYPE;
|
||||
decoder.mpeg1 = ipuRegs->ctrl.MP1;
|
||||
decoder.q_scale_type = ipuRegs->ctrl.QST;
|
||||
decoder.intra_vlc_format = ipuRegs->ctrl.IVF;
|
||||
decoder.scantype = ipuRegs->ctrl.AS;
|
||||
decoder.intra_dc_precision = ipuRegs->ctrl.IDP;
|
||||
decoder.mpeg1 = ipuRegs.ctrl.MP1;
|
||||
decoder.q_scale_type = ipuRegs.ctrl.QST;
|
||||
decoder.intra_vlc_format = ipuRegs.ctrl.IVF;
|
||||
decoder.scantype = ipuRegs.ctrl.AS;
|
||||
decoder.intra_dc_precision = ipuRegs.ctrl.IDP;
|
||||
|
||||
//from BDEC value
|
||||
decoder.quantizer_scale = decoder.q_scale_type ? non_linear_quantizer_scale [bdec.QSC] : bdec.QSC << 1;
|
||||
|
@ -433,7 +433,7 @@ static bool __fastcall ipuVDEC(u32 val)
|
|||
switch (ipu_cmd.pos[0])
|
||||
{
|
||||
case 0:
|
||||
ipuRegs->cmd.DATA = 0;
|
||||
ipuRegs.cmd.DATA = 0;
|
||||
if (!getBits32((u8*)&decoder.bitstream_buf, 0)) return false;
|
||||
|
||||
decoder.bitstream_bits = -16;
|
||||
|
@ -442,22 +442,22 @@ static bool __fastcall ipuVDEC(u32 val)
|
|||
switch ((val >> 26) & 3)
|
||||
{
|
||||
case 0://Macroblock Address Increment
|
||||
decoder.mpeg1 = ipuRegs->ctrl.MP1;
|
||||
ipuRegs->cmd.DATA = get_macroblock_address_increment();
|
||||
decoder.mpeg1 = ipuRegs.ctrl.MP1;
|
||||
ipuRegs.cmd.DATA = get_macroblock_address_increment();
|
||||
break;
|
||||
|
||||
case 1://Macroblock Type
|
||||
decoder.frame_pred_frame_dct = 1;
|
||||
decoder.coding_type = ipuRegs->ctrl.PCT;
|
||||
ipuRegs->cmd.DATA = get_macroblock_modes();
|
||||
decoder.coding_type = ipuRegs.ctrl.PCT;
|
||||
ipuRegs.cmd.DATA = get_macroblock_modes();
|
||||
break;
|
||||
|
||||
case 2://Motion Code
|
||||
ipuRegs->cmd.DATA = get_motion_delta(0);
|
||||
ipuRegs.cmd.DATA = get_motion_delta(0);
|
||||
break;
|
||||
|
||||
case 3://DMVector
|
||||
ipuRegs->cmd.DATA = get_dmv();
|
||||
ipuRegs.cmd.DATA = get_dmv();
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -469,21 +469,21 @@ static bool __fastcall ipuVDEC(u32 val)
|
|||
ReorderBitstream();
|
||||
}
|
||||
|
||||
ipuRegs->cmd.DATA = (ipuRegs->cmd.DATA & 0xFFFF) | ((decoder.bitstream_bits + 16) << 16);
|
||||
ipuRegs->ctrl.ECD = (ipuRegs->cmd.DATA == 0);
|
||||
ipuRegs.cmd.DATA = (ipuRegs.cmd.DATA & 0xFFFF) | ((decoder.bitstream_bits + 16) << 16);
|
||||
ipuRegs.ctrl.ECD = (ipuRegs.cmd.DATA == 0);
|
||||
|
||||
case 1:
|
||||
if (!getBits32((u8*)&ipuRegs->top, 0))
|
||||
if (!getBits32((u8*)&ipuRegs.top, 0))
|
||||
{
|
||||
ipu_cmd.pos[0] = 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
BigEndian(ipuRegs->top, ipuRegs->top);
|
||||
BigEndian(ipuRegs.top, ipuRegs.top);
|
||||
|
||||
IPU_LOG("VDEC command data 0x%x(0x%x). Skip 0x%X bits/Table=%d (%s), pct %d",
|
||||
ipuRegs->cmd.DATA, ipuRegs->cmd.DATA >> 16, val & 0x3f, (val >> 26) & 3, (val >> 26) & 1 ?
|
||||
((val >> 26) & 2 ? "DMV" : "MBT") : (((val >> 26) & 2 ? "MC" : "MBAI")), ipuRegs->ctrl.PCT);
|
||||
ipuRegs.cmd.DATA, ipuRegs.cmd.DATA >> 16, val & 0x3f, (val >> 26) & 3, (val >> 26) & 1 ?
|
||||
((val >> 26) & 2 ? "DMV" : "MBT") : (((val >> 26) & 2 ? "MC" : "MBAI")), ipuRegs.ctrl.PCT);
|
||||
return true;
|
||||
|
||||
jNO_DEFAULT
|
||||
|
@ -494,12 +494,12 @@ static bool __fastcall ipuVDEC(u32 val)
|
|||
|
||||
static __fi bool ipuFDEC(u32 val)
|
||||
{
|
||||
if (!getBits32((u8*)&ipuRegs->cmd.DATA, 0)) return false;
|
||||
if (!getBits32((u8*)&ipuRegs.cmd.DATA, 0)) return false;
|
||||
|
||||
BigEndian(ipuRegs->cmd.DATA, ipuRegs->cmd.DATA);
|
||||
ipuRegs->top = ipuRegs->cmd.DATA;
|
||||
BigEndian(ipuRegs.cmd.DATA, ipuRegs.cmd.DATA);
|
||||
ipuRegs.top = ipuRegs.cmd.DATA;
|
||||
|
||||
IPU_LOG("FDEC read: 0x%08x", ipuRegs->top);
|
||||
IPU_LOG("FDEC read: 0x%08x", ipuRegs.top);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -967,10 +967,10 @@ u8 __fastcall getBits8(u8 *address, u32 advance)
|
|||
void IPUCMD_WRITE(u32 val)
|
||||
{
|
||||
// don't process anything if currently busy
|
||||
if (ipuRegs->ctrl.BUSY) Console.WriteLn("IPU BUSY!"); // wait for thread
|
||||
if (ipuRegs.ctrl.BUSY) Console.WriteLn("IPU BUSY!"); // wait for thread
|
||||
|
||||
ipuRegs->ctrl.ECD = 0;
|
||||
ipuRegs->ctrl.SCD = 0; //clear ECD/SCD
|
||||
ipuRegs.ctrl.ECD = 0;
|
||||
ipuRegs.ctrl.SCD = 0; //clear ECD/SCD
|
||||
ipu_cmd.clear();
|
||||
ipu_cmd.current = val;
|
||||
|
||||
|
@ -988,17 +988,17 @@ void IPUCMD_WRITE(u32 val)
|
|||
// check if enough data in queue
|
||||
if (ipuVDEC(val)) return;
|
||||
|
||||
ipuRegs->cmd.BUSY = 0x80000000;
|
||||
ipuRegs->topbusy = 0x80000000;
|
||||
ipuRegs.cmd.BUSY = 0x80000000;
|
||||
ipuRegs.topbusy = 0x80000000;
|
||||
break;
|
||||
|
||||
case SCE_IPU_FDEC:
|
||||
IPU_LOG("FDEC command. Skip 0x%X bits, FIFO 0x%X qwords, BP 0x%X, FP %d, CHCR 0x%x, %x",
|
||||
val & 0x3f, g_BP.IFC, (int)g_BP.BP, g_BP.FP, ipu1dma->chcr._u32, cpuRegs.pc);
|
||||
IPU_LOG("FDEC command. Skip 0x%X bits, FIFO 0x%X qwords, BP 0x%X, FP %d, CHCR 0x%x",
|
||||
val & 0x3f, g_BP.IFC, (int)g_BP.BP, g_BP.FP, ipu1dma.chcr._u32);
|
||||
g_BP.BP += val & 0x3F;
|
||||
if (ipuFDEC(val)) return;
|
||||
ipuRegs->cmd.BUSY = 0x80000000;
|
||||
ipuRegs->topbusy = 0x80000000;
|
||||
ipuRegs.cmd.BUSY = 0x80000000;
|
||||
ipuRegs.topbusy = 0x80000000;
|
||||
break;
|
||||
|
||||
case SCE_IPU_SETTH:
|
||||
|
@ -1042,58 +1042,58 @@ void IPUCMD_WRITE(u32 val)
|
|||
return;
|
||||
}
|
||||
|
||||
ipuRegs->topbusy = 0x80000000;
|
||||
ipuRegs.topbusy = 0x80000000;
|
||||
break;
|
||||
|
||||
case SCE_IPU_BDEC:
|
||||
if (ipuBDEC(val, false))
|
||||
{
|
||||
IPU_INT0_FROM();
|
||||
if (ipuRegs->ctrl.SCD || ipuRegs->ctrl.ECD) hwIntcIrq(INTC_IPU);
|
||||
if (ipuRegs.ctrl.SCD || ipuRegs.ctrl.ECD) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
ipuRegs->topbusy = 0x80000000;
|
||||
ipuRegs.topbusy = 0x80000000;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// have to resort to the thread
|
||||
ipuRegs->ctrl.BUSY = 1;
|
||||
if(ipu1dma->chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
ipuRegs.ctrl.BUSY = 1;
|
||||
if(ipu1dma.chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
}
|
||||
|
||||
void IPUWorker()
|
||||
{
|
||||
pxAssert(ipuRegs->ctrl.BUSY);
|
||||
pxAssert(ipuRegs.ctrl.BUSY);
|
||||
|
||||
switch (ipu_cmd.CMD)
|
||||
{
|
||||
case SCE_IPU_VDEC:
|
||||
if (!ipuVDEC(ipu_cmd.current))
|
||||
{
|
||||
if(ipu1dma->chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
if(ipu1dma.chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
}
|
||||
ipuRegs->cmd.BUSY = 0;
|
||||
ipuRegs->topbusy = 0;
|
||||
ipuRegs.cmd.BUSY = 0;
|
||||
ipuRegs.topbusy = 0;
|
||||
break;
|
||||
|
||||
case SCE_IPU_FDEC:
|
||||
if (!ipuFDEC(ipu_cmd.current))
|
||||
{
|
||||
if(ipu1dma->chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
if(ipu1dma.chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
}
|
||||
ipuRegs->cmd.BUSY = 0;
|
||||
ipuRegs->topbusy = 0;
|
||||
ipuRegs.cmd.BUSY = 0;
|
||||
ipuRegs.topbusy = 0;
|
||||
break;
|
||||
|
||||
case SCE_IPU_SETIQ:
|
||||
if (!ipuSETIQ(ipu_cmd.current))
|
||||
{
|
||||
if(ipu1dma->chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
if(ipu1dma.chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -1101,7 +1101,7 @@ void IPUWorker()
|
|||
case SCE_IPU_SETVQ:
|
||||
if (!ipuSETVQ(ipu_cmd.current))
|
||||
{
|
||||
if(ipu1dma->chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
if(ipu1dma.chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -1109,7 +1109,7 @@ void IPUWorker()
|
|||
case SCE_IPU_CSC:
|
||||
if (!ipuCSC(ipu_cmd.current))
|
||||
{
|
||||
if(ipu1dma->chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
if(ipu1dma.chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
}
|
||||
IPU_INT0_FROM();
|
||||
|
@ -1118,7 +1118,7 @@ void IPUWorker()
|
|||
case SCE_IPU_PACK:
|
||||
if (!ipuPACK(ipu_cmd.current))
|
||||
{
|
||||
if(ipu1dma->chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
if(ipu1dma.chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
@ -1126,14 +1126,14 @@ void IPUWorker()
|
|||
case SCE_IPU_IDEC:
|
||||
if (!ipuIDEC(ipu_cmd.current, true))
|
||||
{
|
||||
if(ipu1dma->chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
if(ipu1dma.chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
}
|
||||
|
||||
ipuRegs->ctrl.OFC = 0;
|
||||
ipuRegs->ctrl.BUSY = 0;
|
||||
ipuRegs->topbusy = 0;
|
||||
ipuRegs->cmd.BUSY = 0;
|
||||
ipuRegs.ctrl.OFC = 0;
|
||||
ipuRegs.ctrl.BUSY = 0;
|
||||
ipuRegs.topbusy = 0;
|
||||
ipuRegs.cmd.BUSY = 0;
|
||||
ipu_cmd.current = 0xffffffff;
|
||||
|
||||
// CHECK!: IPU0dma remains when IDEC is done, so we need to clear it
|
||||
|
@ -1143,17 +1143,17 @@ void IPUWorker()
|
|||
case SCE_IPU_BDEC:
|
||||
if (!ipuBDEC(ipu_cmd.current, true))
|
||||
{
|
||||
if(ipu1dma->chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
if(ipu1dma.chcr.STR == false) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
}
|
||||
|
||||
ipuRegs->ctrl.BUSY = 0;
|
||||
ipuRegs->topbusy = 0;
|
||||
ipuRegs->cmd.BUSY = 0;
|
||||
ipuRegs.ctrl.BUSY = 0;
|
||||
ipuRegs.topbusy = 0;
|
||||
ipuRegs.cmd.BUSY = 0;
|
||||
ipu_cmd.current = 0xffffffff;
|
||||
|
||||
IPU_INT0_FROM();
|
||||
if (ipuRegs->ctrl.SCD || ipuRegs->ctrl.ECD) hwIntcIrq(INTC_IPU);
|
||||
if (ipuRegs.ctrl.SCD || ipuRegs.ctrl.ECD) hwIntcIrq(INTC_IPU);
|
||||
return;
|
||||
|
||||
default:
|
||||
|
@ -1162,6 +1162,6 @@ void IPUWorker()
|
|||
}
|
||||
|
||||
// success
|
||||
ipuRegs->ctrl.BUSY = 0;
|
||||
ipuRegs.ctrl.BUSY = 0;
|
||||
ipu_cmd.current = 0xffffffff;
|
||||
}
|
||||
|
|
|
@ -176,8 +176,6 @@ struct IPUregisters {
|
|||
u32 dummy3[2];
|
||||
};
|
||||
|
||||
#define ipuRegs ((IPUregisters*)(&eeHw[0x2000]))
|
||||
|
||||
struct tIPU_cmd
|
||||
{
|
||||
int index;
|
||||
|
@ -202,6 +200,8 @@ struct tIPU_cmd
|
|||
}
|
||||
};
|
||||
|
||||
static IPUregisters& ipuRegs = (IPUregisters&)eeHw[0x2000];
|
||||
|
||||
extern tIPU_cmd ipu_cmd;
|
||||
extern int coded_block_pattern;
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ void IPU_Fifo_Input::clear()
|
|||
{
|
||||
memzero(data);
|
||||
g_BP.IFC = 0;
|
||||
ipuRegs->ctrl.IFC = 0;
|
||||
ipuRegs.ctrl.IFC = 0;
|
||||
readpos = 0;
|
||||
writepos = 0;
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ void IPU_Fifo_Input::clear()
|
|||
void IPU_Fifo_Output::clear()
|
||||
{
|
||||
memzero(data);
|
||||
ipuRegs->ctrl.OFC = 0;
|
||||
ipuRegs.ctrl.OFC = 0;
|
||||
readpos = 0;
|
||||
writepos = 0;
|
||||
}
|
||||
|
@ -90,9 +90,9 @@ int IPU_Fifo_Output::write(const u32 *value, int size)
|
|||
{
|
||||
int transsize, firsttrans;
|
||||
|
||||
if ((int)ipuRegs->ctrl.OFC >= 8) IPU0dma();
|
||||
if ((int)ipuRegs.ctrl.OFC >= 8) IPU0dma();
|
||||
|
||||
transsize = min(size, 8 - (int)ipuRegs->ctrl.OFC);
|
||||
transsize = min(size, 8 - (int)ipuRegs.ctrl.OFC);
|
||||
firsttrans = transsize;
|
||||
|
||||
while (transsize-- > 0)
|
||||
|
@ -105,7 +105,7 @@ int IPU_Fifo_Output::write(const u32 *value, int size)
|
|||
value += 4;
|
||||
}
|
||||
|
||||
ipuRegs->ctrl.OFC += firsttrans;
|
||||
ipuRegs.ctrl.OFC += firsttrans;
|
||||
IPU0dma();
|
||||
|
||||
return firsttrans;
|
||||
|
@ -151,7 +151,7 @@ void IPU_Fifo_Output::_readsingle(void *value)
|
|||
|
||||
void IPU_Fifo_Output::read(void *value, int size)
|
||||
{
|
||||
ipuRegs->ctrl.OFC -= size;
|
||||
ipuRegs.ctrl.OFC -= size;
|
||||
while (size > 0)
|
||||
{
|
||||
_readsingle(value);
|
||||
|
@ -162,9 +162,9 @@ void IPU_Fifo_Output::read(void *value, int size)
|
|||
|
||||
void IPU_Fifo_Output::readsingle(void *value)
|
||||
{
|
||||
if (ipuRegs->ctrl.OFC > 0)
|
||||
if (ipuRegs.ctrl.OFC > 0)
|
||||
{
|
||||
ipuRegs->ctrl.OFC--;
|
||||
ipuRegs.ctrl.OFC--;
|
||||
_readsingle(value);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,11 +47,11 @@ static __fi bool ipuDmacPartialChain(tDMA_TAG tag)
|
|||
switch (tag.ID)
|
||||
{
|
||||
case TAG_REFE: // refe
|
||||
ipu1dma->tadr += 16;
|
||||
ipu1dma.tadr += 16;
|
||||
return true;
|
||||
|
||||
case TAG_END: // end
|
||||
ipu1dma->tadr = ipu1dma->madr;
|
||||
ipu1dma.tadr = ipu1dma.madr;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -62,27 +62,27 @@ static __fi void ipuDmacSrcChain()
|
|||
switch (IPU1Status.ChainMode)
|
||||
{
|
||||
case TAG_REFE: // refe
|
||||
//if(IPU1Status.InProgress == false) ipu1dma->tadr += 16;
|
||||
//if(IPU1Status.InProgress == false) ipu1dma.tadr += 16;
|
||||
IPU1Status.DMAFinished = true;
|
||||
break;
|
||||
case TAG_CNT: // cnt
|
||||
// Set the taddr to the next tag
|
||||
ipu1dma->tadr = ipu1dma->madr;
|
||||
ipu1dma.tadr = ipu1dma.madr;
|
||||
//if(IPU1Status.DMAFinished == false) IPU1Status.DMAFinished = false;
|
||||
break;
|
||||
|
||||
case TAG_NEXT: // next
|
||||
ipu1dma->tadr = IPU1Status.NextMem;
|
||||
ipu1dma.tadr = IPU1Status.NextMem;
|
||||
//if(IPU1Status.DMAFinished == false) IPU1Status.DMAFinished = false;
|
||||
break;
|
||||
|
||||
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;
|
||||
break;
|
||||
|
||||
case TAG_END: // end
|
||||
ipu1dma->tadr = ipu1dma->madr;
|
||||
ipu1dma.tadr = ipu1dma.madr;
|
||||
IPU1Status.DMAFinished = true;
|
||||
break;
|
||||
}
|
||||
|
@ -117,12 +117,12 @@ static __fi int IPU1chain() {
|
|||
|
||||
int totalqwc = 0;
|
||||
|
||||
if (ipu1dma->qwc > 0 && IPU1Status.InProgress == true)
|
||||
if (ipu1dma.qwc > 0 && IPU1Status.InProgress == true)
|
||||
{
|
||||
int qwc = ipu1dma->qwc;
|
||||
int qwc = ipu1dma.qwc;
|
||||
u32 *pMem;
|
||||
|
||||
pMem = (u32*)dmaGetAddr(ipu1dma->madr, false);
|
||||
pMem = (u32*)dmaGetAddr(ipu1dma.madr, false);
|
||||
|
||||
if (pMem == NULL)
|
||||
{
|
||||
|
@ -132,11 +132,11 @@ static __fi int IPU1chain() {
|
|||
|
||||
//Write our data to the fifo
|
||||
qwc = ipu_fifo.in.write(pMem, qwc);
|
||||
ipu1dma->madr += qwc << 4;
|
||||
ipu1dma->qwc -= qwc;
|
||||
ipu1dma.madr += qwc << 4;
|
||||
ipu1dma.qwc -= qwc;
|
||||
totalqwc += qwc;
|
||||
}
|
||||
if( ipu1dma->qwc == 0)
|
||||
if( ipu1dma.qwc == 0)
|
||||
{
|
||||
//Update TADR etc
|
||||
if(IPU1Status.DMAMode == DMA_MODE_CHAIN) ipuDmacSrcChain();
|
||||
|
@ -172,16 +172,16 @@ int IPU1dma()
|
|||
//We need to make sure GIF has flushed before sending IPU data, it seems to REALLY screw FFX videos
|
||||
//if(!WaitGSPaths()) return totalqwc;
|
||||
|
||||
if(ipu1dma->chcr.STR == false || IPU1Status.DMAMode == 2)
|
||||
if(ipu1dma.chcr.STR == false || IPU1Status.DMAMode == 2)
|
||||
{
|
||||
//We MUST stop the IPU from trying to fill the FIFO with more data if the DMA has been suspended
|
||||
//if we don't, we risk causing the data to go out of sync with the fifo and we end up losing some!
|
||||
//This is true for Dragons Quest 8 and probably others which suspend the DMA.
|
||||
DevCon.Warning("IPU1 running when IPU1 DMA disabled! CHCR %x QWC %x", ipu1dma->chcr._u32, ipu1dma->qwc);
|
||||
DevCon.Warning("IPU1 running when IPU1 DMA disabled! CHCR %x QWC %x", ipu1dma.chcr._u32, ipu1dma.qwc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
@ -192,7 +192,7 @@ int IPU1dma()
|
|||
IPU_INT_TO(4); //Give it a short wait.
|
||||
return totalqwc;
|
||||
}
|
||||
IPU_LOG("Processing Normal QWC left %x Finished %d In Progress %d", ipu1dma->qwc, IPU1Status.DMAFinished, IPU1Status.InProgress);
|
||||
IPU_LOG("Processing Normal QWC left %x Finished %d In Progress %d", ipu1dma.qwc, IPU1Status.DMAFinished, IPU1Status.InProgress);
|
||||
if(IPU1Status.InProgress == true) totalqwc += IPU1chain();
|
||||
}
|
||||
break;
|
||||
|
@ -206,7 +206,7 @@ int IPU1dma()
|
|||
IPU_INT_TO(4); //Give it a short wait.
|
||||
return totalqwc;
|
||||
}
|
||||
IPU_LOG("Processing Chain QWC left %x Finished %d In Progress %d", ipu1dma->qwc, IPU1Status.DMAFinished, IPU1Status.InProgress);
|
||||
IPU_LOG("Processing Chain QWC left %x Finished %d In Progress %d", ipu1dma.qwc, IPU1Status.DMAFinished, IPU1Status.InProgress);
|
||||
totalqwc += IPU1chain();
|
||||
//Set the TADR forward
|
||||
}
|
||||
|
@ -214,9 +214,9 @@ int IPU1dma()
|
|||
|
||||
if(IPU1Status.InProgress == false && IPU1Status.DMAFinished == false) //No transfer is ready to go so we need to set one up
|
||||
{
|
||||
tDMA_TAG* ptag = dmaGetAddr(ipu1dma->tadr, false); //Set memory pointer to TADR
|
||||
tDMA_TAG* ptag = dmaGetAddr(ipu1dma.tadr, false); //Set memory pointer to TADR
|
||||
|
||||
if (!ipu1dma->transfer("IPU1", ptag))
|
||||
if (!ipu1dma.transfer("IPU1", ptag))
|
||||
{
|
||||
return totalqwc;
|
||||
}
|
||||
|
@ -224,46 +224,46 @@ int IPU1dma()
|
|||
ipu1cycles += 1; // Add 1 cycles from the QW read for the tag
|
||||
IPU1Status.ChainMode = ptag->ID;
|
||||
|
||||
if(ipu1dma->chcr.TTE) DevCon.Warning("TTE?");
|
||||
if(ipu1dma.chcr.TTE) DevCon.Warning("TTE?");
|
||||
|
||||
switch (IPU1Status.ChainMode)
|
||||
{
|
||||
case TAG_REFE: // refe
|
||||
// do not change tadr
|
||||
//ipu1dma->tadr += 16;
|
||||
ipu1dma->tadr += 16;
|
||||
ipu1dma->madr = ptag[1]._u32;
|
||||
IPU_LOG("Tag should end on %x", ipu1dma->tadr);
|
||||
//ipu1dma.tadr += 16;
|
||||
ipu1dma.tadr += 16;
|
||||
ipu1dma.madr = ptag[1]._u32;
|
||||
IPU_LOG("Tag should end on %x", ipu1dma.tadr);
|
||||
|
||||
break;
|
||||
|
||||
case TAG_CNT: // cnt
|
||||
ipu1dma->madr = ipu1dma->tadr + 16;
|
||||
IPU_LOG("Tag should end on %x", ipu1dma->madr + ipu1dma->qwc * 16);
|
||||
//ipu1dma->tadr = ipu1dma->madr + (ipu1dma->qwc * 16);
|
||||
ipu1dma.madr = ipu1dma.tadr + 16;
|
||||
IPU_LOG("Tag should end on %x", ipu1dma.madr + ipu1dma.qwc * 16);
|
||||
//ipu1dma.tadr = ipu1dma.madr + (ipu1dma.qwc * 16);
|
||||
// Set the taddr to the next tag
|
||||
//IPU1Status.DMAFinished = false;
|
||||
break;
|
||||
|
||||
case TAG_NEXT: // next
|
||||
ipu1dma->madr = ipu1dma->tadr + 16;
|
||||
ipu1dma.madr = ipu1dma.tadr + 16;
|
||||
IPU1Status.NextMem = ptag[1]._u32;
|
||||
IPU_LOG("Tag should end on %x", IPU1Status.NextMem);
|
||||
//IPU1Status.DMAFinished = false;
|
||||
break;
|
||||
|
||||
case TAG_REF: // ref
|
||||
ipu1dma->madr = ptag[1]._u32;
|
||||
ipu1dma->tadr += 16;
|
||||
IPU_LOG("Tag should end on %x", ipu1dma->tadr);
|
||||
ipu1dma.madr = ptag[1]._u32;
|
||||
ipu1dma.tadr += 16;
|
||||
IPU_LOG("Tag should end on %x", ipu1dma.tadr);
|
||||
//IPU1Status.DMAFinished = false;
|
||||
break;
|
||||
|
||||
case TAG_END: // end
|
||||
// do not change tadr
|
||||
ipu1dma->madr = ipu1dma->tadr + 16;
|
||||
ipu1dma->tadr += 16;
|
||||
IPU_LOG("Tag should end on %x", ipu1dma->madr + ipu1dma->qwc * 16);
|
||||
ipu1dma.madr = ipu1dma.tadr + 16;
|
||||
ipu1dma.tadr += 16;
|
||||
IPU_LOG("Tag should end on %x", ipu1dma.madr + ipu1dma.qwc * 16);
|
||||
|
||||
break;
|
||||
|
||||
|
@ -272,21 +272,21 @@ int IPU1dma()
|
|||
break;
|
||||
}
|
||||
|
||||
//if(ipu1dma->qwc == 0) Console.Warning("Blank QWC!");
|
||||
if(ipu1dma->qwc > 0) IPU1Status.InProgress = true;
|
||||
//if(ipu1dma.qwc == 0) Console.Warning("Blank QWC!");
|
||||
if(ipu1dma.qwc > 0) IPU1Status.InProgress = true;
|
||||
IPU_LOG("dmaIPU1 dmaChain %8.8x_%8.8x size=%d, addr=%lx, fifosize=%x",
|
||||
ptag[1]._u32, ptag[0]._u32, 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->IRQ) //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;
|
||||
|
||||
|
||||
if(!WaitGSPaths() && ipu1dma->qwc > 0)
|
||||
if(!WaitGSPaths() && ipu1dma.qwc > 0)
|
||||
{ // legacy WaitGSPaths() for now
|
||||
IPU_INT_TO(4); //Give it a short wait.
|
||||
return totalqwc;
|
||||
}
|
||||
IPU_LOG("Processing Start Chain QWC left %x Finished %d In Progress %d", ipu1dma->qwc, IPU1Status.DMAFinished, IPU1Status.InProgress);
|
||||
IPU_LOG("Processing Start Chain QWC left %x Finished %d In Progress %d", ipu1dma.qwc, IPU1Status.DMAFinished, IPU1Status.InProgress);
|
||||
totalqwc += IPU1chain();
|
||||
//Set the TADR forward
|
||||
}
|
||||
|
@ -296,7 +296,7 @@ int IPU1dma()
|
|||
}
|
||||
|
||||
//Do this here to prevent double settings on Chain DMA's
|
||||
if(totalqwc > 0 || ipu1dma->qwc == 0)
|
||||
if(totalqwc > 0 || ipu1dma.qwc == 0)
|
||||
{
|
||||
IPU_INT_TO(totalqwc * BIAS);
|
||||
IPUProcessInterrupt();
|
||||
|
@ -306,7 +306,7 @@ int IPU1dma()
|
|||
cpuRegs.eCycle[4] = 0x9999;//IPU_INT_TO(2048);
|
||||
}
|
||||
|
||||
IPU_LOG("Completed Call IPU1 DMA QWC Remaining %x Finished %d In Progress %d tadr %x", ipu1dma->qwc, IPU1Status.DMAFinished, IPU1Status.InProgress, ipu1dma->tadr);
|
||||
IPU_LOG("Completed Call IPU1 DMA QWC Remaining %x Finished %d In Progress %d tadr %x", ipu1dma.qwc, IPU1Status.DMAFinished, IPU1Status.InProgress, ipu1dma.tadr);
|
||||
return totalqwc;
|
||||
}
|
||||
|
||||
|
@ -316,30 +316,30 @@ int IPU0dma()
|
|||
static int totalsize = 0;
|
||||
tDMA_TAG* pMem;
|
||||
|
||||
if ((!(ipu0dma->chcr.STR) || (cpuRegs.interrupt & (1 << DMAC_FROM_IPU))) || (ipu0dma->qwc == 0))
|
||||
if ((!(ipu0dma.chcr.STR) || (cpuRegs.interrupt & (1 << DMAC_FROM_IPU))) || (ipu0dma.qwc == 0))
|
||||
return 0;
|
||||
|
||||
pxAssert(!(ipu0dma->chcr.TTE));
|
||||
pxAssert(!(ipu0dma.chcr.TTE));
|
||||
|
||||
IPU_LOG("dmaIPU0 chcr = %lx, madr = %lx, qwc = %lx",
|
||||
ipu0dma->chcr._u32, ipu0dma->madr, ipu0dma->qwc);
|
||||
ipu0dma.chcr._u32, ipu0dma.madr, ipu0dma.qwc);
|
||||
|
||||
pxAssert(ipu0dma->chcr.MOD == NORMAL_MODE);
|
||||
pxAssert(ipu0dma.chcr.MOD == NORMAL_MODE);
|
||||
|
||||
pMem = dmaGetAddr(ipu0dma->madr, true);
|
||||
pMem = dmaGetAddr(ipu0dma.madr, true);
|
||||
|
||||
readsize = min(ipu0dma->qwc, (u16)ipuRegs->ctrl.OFC);
|
||||
readsize = min(ipu0dma.qwc, (u16)ipuRegs.ctrl.OFC);
|
||||
totalsize+=readsize;
|
||||
ipu_fifo.out.read(pMem, readsize);
|
||||
|
||||
ipu0dma->madr += readsize << 4;
|
||||
ipu0dma->qwc -= readsize; // note: qwc is u16
|
||||
ipu0dma.madr += readsize << 4;
|
||||
ipu0dma.qwc -= readsize; // note: qwc is u16
|
||||
|
||||
if (ipu0dma->qwc == 0)
|
||||
if (ipu0dma.qwc == 0)
|
||||
{
|
||||
if (dmacRegs.ctrl.STS == STS_fromIPU) // STS == fromIPU
|
||||
{
|
||||
dmacRegs.stadr.ADDR = ipu0dma->madr;
|
||||
dmacRegs.stadr.ADDR = ipu0dma.madr;
|
||||
switch (dmacRegs.ctrl.STD)
|
||||
{
|
||||
case NO_STD:
|
||||
|
@ -371,14 +371,14 @@ int IPU0dma()
|
|||
|
||||
__fi void dmaIPU0() // fromIPU
|
||||
{
|
||||
if (ipu0dma->pad != 0)
|
||||
if (ipu0dma.pad != 0)
|
||||
{
|
||||
// Note: pad is the padding right above qwc, so we're testing whether qwc
|
||||
// has overflowed into pad.
|
||||
DevCon.Warning(L"IPU0dma's upper 16 bits set to %x", ipu0dma->pad);
|
||||
ipu0dma->qwc = ipu0dma->pad = 0;
|
||||
DevCon.Warning(L"IPU0dma's upper 16 bits set to %x", ipu0dma.pad);
|
||||
ipu0dma.qwc = ipu0dma.pad = 0;
|
||||
//If we are going to clear down IPU0, we should end it too. Going to test this scenario on the PS2 mind - Refraction
|
||||
ipu0dma->chcr.STR = false;
|
||||
ipu0dma.chcr.STR = false;
|
||||
hwDmacIrq(DMAC_FROM_IPU);
|
||||
}
|
||||
IPUProcessInterrupt();
|
||||
|
@ -386,35 +386,35 @@ __fi void dmaIPU0() // fromIPU
|
|||
|
||||
__fi void dmaIPU1() // toIPU
|
||||
{
|
||||
IPU_LOG("IPU1DMAStart QWC %x, MADR %x, CHCR %x, TADR %x", ipu1dma->qwc, ipu1dma->madr, ipu1dma->chcr._u32, ipu1dma->tadr);
|
||||
IPU_LOG("IPU1DMAStart QWC %x, MADR %x, CHCR %x, TADR %x", ipu1dma.qwc, ipu1dma.madr, ipu1dma.chcr._u32, ipu1dma.tadr);
|
||||
|
||||
if (ipu1dma->pad != 0)
|
||||
if (ipu1dma.pad != 0)
|
||||
{
|
||||
// Note: pad is the padding right above qwc, so we're testing whether qwc
|
||||
// has overflowed into pad.
|
||||
DevCon.Warning(L"IPU1dma's upper 16 bits set to %x\n", ipu1dma->pad);
|
||||
ipu1dma->qwc = ipu1dma->pad = 0;
|
||||
DevCon.Warning(L"IPU1dma's upper 16 bits set to %x\n", ipu1dma.pad);
|
||||
ipu1dma.qwc = ipu1dma.pad = 0;
|
||||
// If we are going to clear down IPU1, we should end it too.
|
||||
// Going to test this scenario on the PS2 mind - Refraction
|
||||
ipu1dma->chcr.STR = false;
|
||||
ipu1dma.chcr.STR = false;
|
||||
hwDmacIrq(DMAC_TO_IPU);
|
||||
}
|
||||
|
||||
if (ipu1dma->chcr.MOD == CHAIN_MODE) //Chain Mode
|
||||
if (ipu1dma.chcr.MOD == CHAIN_MODE) //Chain Mode
|
||||
{
|
||||
IPU_LOG("Setting up IPU1 Chain mode");
|
||||
if(ipu1dma->qwc == 0)
|
||||
if(ipu1dma.qwc == 0)
|
||||
{
|
||||
IPU1Status.InProgress = false;
|
||||
IPU1Status.DMAFinished = false;
|
||||
}
|
||||
else
|
||||
{ //Attempting to continue a previous chain
|
||||
IPU_LOG("Resuming DMA TAG %x", (ipu1dma->chcr.TAG >> 12));
|
||||
IPU_LOG("Resuming DMA TAG %x", (ipu1dma.chcr.TAG >> 12));
|
||||
//We MUST check the CHCR for the tag it last knew, it can be manipulated!
|
||||
IPU1Status.ChainMode = (ipu1dma->chcr.TAG >> 12) & 0x7;
|
||||
IPU1Status.ChainMode = (ipu1dma.chcr.TAG >> 12) & 0x7;
|
||||
IPU1Status.InProgress = true;
|
||||
IPU1Status.DMAFinished = ((ipu1dma->chcr.TAG >> 15) && ipu1dma->chcr.TIE) ? true : false;
|
||||
IPU1Status.DMAFinished = ((ipu1dma.chcr.TAG >> 15) && ipu1dma.chcr.TIE) ? true : false;
|
||||
}
|
||||
|
||||
IPU1Status.DMAMode = DMA_MODE_CHAIN;
|
||||
|
@ -422,13 +422,13 @@ __fi void dmaIPU1() // toIPU
|
|||
}
|
||||
else //Normal Mode
|
||||
{
|
||||
if(ipu1dma->qwc == 0)
|
||||
if(ipu1dma.qwc == 0)
|
||||
{
|
||||
ipu1dma->chcr.STR = false;
|
||||
ipu1dma.chcr.STR = false;
|
||||
// Hack to force stop IPU
|
||||
ipuRegs->cmd.BUSY = 0;
|
||||
ipuRegs->ctrl.BUSY = 0;
|
||||
ipuRegs->topbusy = 0;
|
||||
ipuRegs.cmd.BUSY = 0;
|
||||
ipuRegs.ctrl.BUSY = 0;
|
||||
ipuRegs.topbusy = 0;
|
||||
//
|
||||
hwDmacIrq(DMAC_TO_IPU);
|
||||
Console.Warning("IPU1 Normal error!");
|
||||
|
@ -480,7 +480,7 @@ void ipu0Interrupt()
|
|||
|
||||
// Not totally sure whether this needs to be done or not, so I'm
|
||||
// leaving it commented out for the moment.
|
||||
//if (sif1dma->chcr.STR) SIF1Dma();
|
||||
//if (sif1dma.chcr.STR) SIF1Dma();
|
||||
}
|
||||
|
||||
if (g_nDMATransfer.TIE0)
|
||||
|
@ -488,7 +488,7 @@ void ipu0Interrupt()
|
|||
g_nDMATransfer.TIE0 = false;
|
||||
}
|
||||
|
||||
ipu0dma->chcr.STR = false;
|
||||
ipu0dma.chcr.STR = false;
|
||||
hwDmacIrq(DMAC_FROM_IPU);
|
||||
}
|
||||
|
||||
|
@ -503,7 +503,7 @@ IPU_FORCEINLINE void ipu1Interrupt()
|
|||
}
|
||||
|
||||
IPU_LOG("ipu1 finish %x:", cpuRegs.cycle);
|
||||
ipu1dma->chcr.STR = false;
|
||||
ipu1dma.chcr.STR = false;
|
||||
IPU1Status.DMAMode = 2;
|
||||
hwDmacIrq(DMAC_TO_IPU);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,25 @@
|
|||
/* PCSX2 - PS2 Emulator for PCs
|
||||
* Copyright (C) 2002-2010 PCSX2 Dev Team
|
||||
*
|
||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with PCSX2.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "IPU.h"
|
||||
|
||||
static DMACh& ipu0dma = (DMACh&)eeHw[0xb000];
|
||||
static DMACh& ipu1dma = (DMACh&)eeHw[0xb400];
|
||||
|
||||
struct IPUStatus {
|
||||
bool InProgress;
|
||||
u8 DMAMode;
|
||||
|
|
|
@ -680,7 +680,7 @@ static __fi bool slice_non_intra_DCT(s16 * const dest, const int stride, const b
|
|||
|
||||
void __fi finishmpeg2sliceIDEC()
|
||||
{
|
||||
ipuRegs->ctrl.SCD = 0;
|
||||
ipuRegs.ctrl.SCD = 0;
|
||||
coded_block_pattern = decoder.coded_block_pattern;
|
||||
|
||||
g_BP.BP += decoder.bitstream_bits - 16;
|
||||
|
@ -710,8 +710,8 @@ bool mpeg2sliceIDEC()
|
|||
decoder.dc_dct_pred[2] = 128 << decoder.intra_dc_precision;
|
||||
|
||||
decoder.mbc = 0;
|
||||
ipuRegs->top = 0;
|
||||
ipuRegs->ctrl.ECD = 0;
|
||||
ipuRegs.top = 0;
|
||||
ipuRegs.ctrl.ECD = 0;
|
||||
|
||||
case 1:
|
||||
ipu_cmd.pos[0] = 1;
|
||||
|
@ -907,17 +907,17 @@ finish_idec:
|
|||
{
|
||||
if (g_BP.BP & 7) g_BP.BP += 8 - (g_BP.BP & 7);
|
||||
|
||||
ipuRegs->ctrl.SCD = 1;
|
||||
ipuRegs.ctrl.SCD = 1;
|
||||
}
|
||||
|
||||
case 4:
|
||||
if (!getBits32((u8*)&ipuRegs->top, 0))
|
||||
if (!getBits32((u8*)&ipuRegs.top, 0))
|
||||
{
|
||||
ipu_cmd.pos[0] = 4;
|
||||
return false;
|
||||
}
|
||||
|
||||
BigEndian(ipuRegs->top, ipuRegs->top);
|
||||
BigEndian(ipuRegs.top, ipuRegs.top);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -942,8 +942,8 @@ bool mpeg2_slice()
|
|||
decoder.dc_dct_pred[2] = 128 << decoder.intra_dc_precision;
|
||||
}
|
||||
|
||||
ipuRegs->ctrl.ECD = 0;
|
||||
ipuRegs->top = 0;
|
||||
ipuRegs.ctrl.ECD = 0;
|
||||
ipuRegs.top = 0;
|
||||
memzero_sse_a(mb8);
|
||||
memzero_sse_a(mb16);
|
||||
case 1:
|
||||
|
@ -1082,7 +1082,7 @@ bool mpeg2_slice()
|
|||
}
|
||||
|
||||
// Send The MacroBlock via DmaIpuFrom
|
||||
ipuRegs->ctrl.SCD = 0;
|
||||
ipuRegs.ctrl.SCD = 0;
|
||||
coded_block_pattern = decoder.coded_block_pattern;
|
||||
g_BP.BP += (int)decoder.bitstream_bits - 16;
|
||||
|
||||
|
@ -1128,17 +1128,17 @@ bool mpeg2_slice()
|
|||
{
|
||||
if (g_BP.BP & 7) g_BP.BP += 8 - (g_BP.BP & 7);
|
||||
|
||||
ipuRegs->ctrl.SCD = 1;
|
||||
ipuRegs.ctrl.SCD = 1;
|
||||
}
|
||||
|
||||
case 5:
|
||||
if (!getBits32((u8*)&ipuRegs->top, 0))
|
||||
if (!getBits32((u8*)&ipuRegs.top, 0))
|
||||
{
|
||||
ipu_cmd.pos[0] = 5;
|
||||
return false;
|
||||
}
|
||||
|
||||
BigEndian(ipuRegs->top, ipuRegs->top);
|
||||
BigEndian(ipuRegs.top, ipuRegs.top);
|
||||
decoder.bitstream_bits = 0;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -39,14 +39,6 @@ static __fi void ZeroQWC( u128& dest )
|
|||
_mm_store_ps( (float*)&dest, _mm_setzero_ps() );
|
||||
}
|
||||
|
||||
// Various useful locations
|
||||
#define sif0dma ((DMACh*)&eeHw[0xc000])
|
||||
#define sif1dma ((DMACh*)&eeHw[0xc400])
|
||||
#define sif2dma ((DMACh*)&eeHw[0xc800])
|
||||
|
||||
#define ipu0dma ((DMACh *)&eeHw[0xb000])
|
||||
#define ipu1dma ((DMACh *)&eeHw[0xb400])
|
||||
|
||||
#define PSM(mem) (vtlb_GetPhyPtr((mem)&0x1fffffff)) //pcsx2 is a competition.The one with most hacks wins :D
|
||||
|
||||
#define psHs8(mem) (*(s8 *)&eeHw[(mem) & 0xffff])
|
||||
|
|
|
@ -28,9 +28,9 @@ void sifInit()
|
|||
|
||||
__fi void dmaSIF2()
|
||||
{
|
||||
SIF_LOG(wxString(L"dmaSIF2" + sif2dma->cmq_to_str()).To8BitData());
|
||||
SIF_LOG(wxString(L"dmaSIF2" + sif2dma.cmq_to_str()).To8BitData());
|
||||
|
||||
sif2dma->chcr.STR = false;
|
||||
sif2dma.chcr.STR = false;
|
||||
hwDmacIrq(DMAC_SIF2);
|
||||
Console.WriteLn("*PCSX2*: dmaSIF2");
|
||||
}
|
||||
|
|
|
@ -16,7 +16,12 @@
|
|||
#ifndef __SIF_H__
|
||||
#define __SIF_H__
|
||||
|
||||
#define FIFO_SIF_W 128
|
||||
static const int FIFO_SIF_W = 128;
|
||||
|
||||
static DMACh& sif0dma = (DMACh&)eeHw[0xc000];
|
||||
static DMACh& sif1dma = (DMACh&)eeHw[0xc400];
|
||||
static DMACh& sif2dma = (DMACh&)eeHw[0xc800];
|
||||
|
||||
|
||||
struct sifData
|
||||
{
|
||||
|
|
|
@ -35,14 +35,14 @@ static __fi void Sif0Init()
|
|||
// Write from Fifo to EE.
|
||||
static __fi bool WriteFifoToEE()
|
||||
{
|
||||
const int readSize = min((s32)sif0dma->qwc, sif0.fifo.size >> 2);
|
||||
const int readSize = min((s32)sif0dma.qwc, sif0.fifo.size >> 2);
|
||||
|
||||
tDMA_TAG *ptag;
|
||||
|
||||
//SIF_LOG(" EE SIF doing transfer %04Xqw to %08X", readSize, sif0dma->madr);
|
||||
SIF_LOG("Write Fifo to EE: ----------- %lX of %lX", readSize << 2, sif0dma->qwc << 2);
|
||||
//SIF_LOG(" EE SIF doing transfer %04Xqw to %08X", readSize, sif0dma.madr);
|
||||
SIF_LOG("Write Fifo to EE: ----------- %lX of %lX", readSize << 2, sif0dma.qwc << 2);
|
||||
|
||||
ptag = sif0dma->getAddr(sif0dma->madr, DMAC_SIF0, true);
|
||||
ptag = sif0dma.getAddr(sif0dma.madr, DMAC_SIF0, true);
|
||||
if (ptag == NULL)
|
||||
{
|
||||
DevCon.Warning("Write Fifo to EE: ptag == NULL");
|
||||
|
@ -52,11 +52,11 @@ static __fi bool WriteFifoToEE()
|
|||
sif0.fifo.read((u32*)ptag, readSize << 2);
|
||||
|
||||
// Clearing handled by vtlb memory protection and manual blocks.
|
||||
//Cpu->Clear(sif0dma->madr, readSize*4);
|
||||
//Cpu->Clear(sif0dma.madr, readSize*4);
|
||||
|
||||
sif0dma->madr += readSize << 4;
|
||||
sif0dma.madr += readSize << 4;
|
||||
sif0.ee.cycles += readSize; // fixme : BIAS is factored in above
|
||||
sif0dma->qwc -= readSize;
|
||||
sif0dma.qwc -= readSize;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -87,14 +87,14 @@ static __fi bool ProcessEETag()
|
|||
sif0.fifo.read((u32*)&tag[0], 4); // Tag
|
||||
SIF_LOG("SIF0 EE read tag: %x %x %x %x", tag[0], tag[1], tag[2], tag[3]);
|
||||
|
||||
sif0dma->unsafeTransfer(((tDMA_TAG*)(tag)));
|
||||
sif0dma->madr = tag[1];
|
||||
sif0dma.unsafeTransfer(((tDMA_TAG*)(tag)));
|
||||
sif0dma.madr = tag[1];
|
||||
tDMA_TAG ptag(tag[0]);
|
||||
|
||||
SIF_LOG("SIF0 EE dest chain tag madr:%08X qwc:%04X id:%X irq:%d(%08X_%08X)",
|
||||
sif0dma->madr, sif0dma->qwc, ptag.ID, ptag.IRQ, tag[1], tag[0]);
|
||||
sif0dma.madr, sif0dma.qwc, ptag.ID, ptag.IRQ, tag[1], tag[0]);
|
||||
|
||||
if (sif0dma->chcr.TIE && ptag.IRQ)
|
||||
if (sif0dma.chcr.TIE && ptag.IRQ)
|
||||
{
|
||||
//Console.WriteLn("SIF0 TIE");
|
||||
sif0.ee.end = true;
|
||||
|
@ -105,12 +105,12 @@ static __fi bool ProcessEETag()
|
|||
case TAG_REFE:
|
||||
sif0.ee.end = true;
|
||||
if (dmacRegs.ctrl.STS != NO_STS)
|
||||
dmacRegs.stadr.ADDR = sif0dma->madr + (sif0dma->qwc * 16);
|
||||
dmacRegs.stadr.ADDR = sif0dma.madr + (sif0dma.qwc * 16);
|
||||
break;
|
||||
|
||||
case TAG_REFS:
|
||||
if (dmacRegs.ctrl.STS != NO_STS)
|
||||
dmacRegs.stadr.ADDR = sif0dma->madr + (sif0dma->qwc * 16);
|
||||
dmacRegs.stadr.ADDR = sif0dma.madr + (sif0dma.qwc * 16);
|
||||
break;
|
||||
|
||||
case TAG_END:
|
||||
|
@ -177,7 +177,7 @@ static __fi void EndIOP()
|
|||
// Handle the EE transfer.
|
||||
static __fi void HandleEETransfer()
|
||||
{
|
||||
if(sif0dma->chcr.STR == false)
|
||||
if(sif0dma.chcr.STR == false)
|
||||
{
|
||||
DevCon.Warning("Replacement for irq prevention hack EE SIF0");
|
||||
sif0.ee.end = false;
|
||||
|
@ -190,17 +190,17 @@ static __fi void HandleEETransfer()
|
|||
DevCon.Warning("SIF0 stall control");
|
||||
}
|
||||
|
||||
/*if (sif0dma->qwc == 0)
|
||||
if (sif0dma->chcr.MOD == NORMAL_MODE)
|
||||
/*if (sif0dma.qwc == 0)
|
||||
if (sif0dma.chcr.MOD == NORMAL_MODE)
|
||||
if (!sif0.ee.end){
|
||||
DevCon.Warning("sif0 irq prevented");
|
||||
done = true;
|
||||
return;
|
||||
}*/
|
||||
|
||||
if (sif0dma->qwc <= 0)
|
||||
if (sif0dma.qwc <= 0)
|
||||
{
|
||||
if ((sif0dma->chcr.MOD == NORMAL_MODE) || sif0.ee.end)
|
||||
if ((sif0dma.chcr.MOD == NORMAL_MODE) || sif0.ee.end)
|
||||
{
|
||||
// Stop transferring ee, and signal an interrupt.
|
||||
done = true;
|
||||
|
@ -214,7 +214,7 @@ static __fi void HandleEETransfer()
|
|||
}
|
||||
}
|
||||
|
||||
if (sif0dma->qwc > 0) // If we're writing something, continue to do so.
|
||||
if (sif0dma.qwc > 0) // If we're writing something, continue to do so.
|
||||
{
|
||||
// Write from Fifo to EE.
|
||||
if (sif0.fifo.size > 0)
|
||||
|
@ -306,7 +306,7 @@ __fi void SIF0Dma()
|
|||
}
|
||||
if (sif0.ee.busy)
|
||||
{
|
||||
if(sif0.fifo.size >= 4 || (sif0.ee.end == true && sif0dma->qwc == 0))
|
||||
if(sif0.fifo.size >= 4 || (sif0.ee.end == true && sif0dma.qwc == 0))
|
||||
{
|
||||
BusyCheck++;
|
||||
HandleEETransfer();
|
||||
|
@ -326,19 +326,19 @@ __fi void sif0Interrupt()
|
|||
__fi void EEsif0Interrupt()
|
||||
{
|
||||
hwDmacIrq(DMAC_SIF0);
|
||||
sif0dma->chcr.STR = false;
|
||||
sif0dma.chcr.STR = false;
|
||||
}
|
||||
|
||||
__fi void dmaSIF0()
|
||||
{
|
||||
SIF_LOG(wxString(L"dmaSIF0" + sif0dma->cmqt_to_str()).To8BitData());
|
||||
SIF_LOG(wxString(L"dmaSIF0" + sif0dma.cmqt_to_str()).To8BitData());
|
||||
|
||||
if (sif0.fifo.readPos != sif0.fifo.writePos)
|
||||
{
|
||||
SIF_LOG("warning, sif0.fifoReadPos != sif0.fifoWritePos");
|
||||
}
|
||||
|
||||
//if(sif0dma->chcr.MOD == CHAIN_MODE && sif0dma->qwc > 0) DevCon.Warning(L"SIF0 QWC on Chain CHCR " + sif0dma->chcr.desc());
|
||||
//if(sif0dma.chcr.MOD == CHAIN_MODE && sif0dma.qwc > 0) DevCon.Warning(L"SIF0 QWC on Chain CHCR " + sif0dma.chcr.desc());
|
||||
psHu32(SBUS_F240) |= 0x2000;
|
||||
sif0.ee.busy = true;
|
||||
|
||||
|
|
|
@ -38,11 +38,11 @@ static __fi bool WriteEEtoFifo()
|
|||
// There's some data ready to transfer into the fifo..
|
||||
|
||||
SIF_LOG("Sif 1: Write EE to Fifo");
|
||||
const int writeSize = min((s32)sif1dma->qwc, sif1.fifo.free() >> 2);
|
||||
const int writeSize = min((s32)sif1dma.qwc, sif1.fifo.free() >> 2);
|
||||
|
||||
tDMA_TAG *ptag;
|
||||
|
||||
ptag = sif1dma->getAddr(sif1dma->madr, DMAC_SIF1, false);
|
||||
ptag = sif1dma.getAddr(sif1dma.madr, DMAC_SIF1, false);
|
||||
if (ptag == NULL)
|
||||
{
|
||||
DevCon.Warning("Write EE to Fifo: ptag == NULL");
|
||||
|
@ -51,9 +51,9 @@ static __fi bool WriteEEtoFifo()
|
|||
|
||||
sif1.fifo.write((u32*)ptag, writeSize << 2);
|
||||
|
||||
sif1dma->madr += writeSize << 4;
|
||||
sif1dma.madr += writeSize << 4;
|
||||
sif1.ee.cycles += writeSize; // fixme : BIAS is factored in above
|
||||
sif1dma->qwc -= writeSize;
|
||||
sif1dma.qwc -= writeSize;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -84,21 +84,21 @@ static __fi bool ProcessEETag()
|
|||
tDMA_TAG *ptag;
|
||||
SIF_LOG("Sif1: ProcessEETag");
|
||||
|
||||
// Process DMA tag at sif1dma->tadr
|
||||
ptag = sif1dma->DMAtransfer(sif1dma->tadr, DMAC_SIF1);
|
||||
// Process DMA tag at sif1dma.tadr
|
||||
ptag = sif1dma.DMAtransfer(sif1dma.tadr, DMAC_SIF1);
|
||||
if (ptag == NULL)
|
||||
{
|
||||
Console.WriteLn("Sif1 ProcessEETag: ptag = NULL");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sif1dma->chcr.TTE)
|
||||
if (sif1dma.chcr.TTE)
|
||||
{
|
||||
Console.WriteLn("SIF1 TTE");
|
||||
sif1.fifo.write((u32*)ptag + 2, 2);
|
||||
}
|
||||
|
||||
if (sif1dma->chcr.TIE && ptag->IRQ)
|
||||
if (sif1dma.chcr.TIE && ptag->IRQ)
|
||||
{
|
||||
Console.WriteLn("SIF1 TIE");
|
||||
sif1.ee.end = true;
|
||||
|
@ -109,30 +109,30 @@ static __fi bool ProcessEETag()
|
|||
{
|
||||
case TAG_REFE:
|
||||
sif1.ee.end = true;
|
||||
sif1dma->madr = ptag[1]._u32;
|
||||
sif1dma->tadr += 16;
|
||||
sif1dma.madr = ptag[1]._u32;
|
||||
sif1dma.tadr += 16;
|
||||
break;
|
||||
|
||||
case TAG_CNT:
|
||||
sif1dma->madr = sif1dma->tadr + 16;
|
||||
sif1dma->tadr = sif1dma->madr + (sif1dma->qwc << 4);
|
||||
sif1dma.madr = sif1dma.tadr + 16;
|
||||
sif1dma.tadr = sif1dma.madr + (sif1dma.qwc << 4);
|
||||
break;
|
||||
|
||||
case TAG_NEXT:
|
||||
sif1dma->madr = sif1dma->tadr + 16;
|
||||
sif1dma->tadr = ptag[1]._u32;
|
||||
sif1dma.madr = sif1dma.tadr + 16;
|
||||
sif1dma.tadr = ptag[1]._u32;
|
||||
break;
|
||||
|
||||
case TAG_REF:
|
||||
case TAG_REFS:
|
||||
sif1dma->madr = ptag[1]._u32;
|
||||
sif1dma->tadr += 16;
|
||||
sif1dma.madr = ptag[1]._u32;
|
||||
sif1dma.tadr += 16;
|
||||
break;
|
||||
|
||||
case TAG_END:
|
||||
sif1.ee.end = true;
|
||||
sif1dma->madr = sif1dma->tadr + 16;
|
||||
sif1dma->tadr = sif1dma->madr + (sif1dma->qwc << 4);
|
||||
sif1dma.madr = sif1dma.tadr + 16;
|
||||
sif1dma.tadr = sif1dma.madr + (sif1dma.qwc << 4);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -203,7 +203,7 @@ static __fi void EndIOP()
|
|||
// Handle the EE transfer.
|
||||
static __fi void HandleEETransfer()
|
||||
{
|
||||
if(sif1dma->chcr.STR == false)
|
||||
if(sif1dma.chcr.STR == false)
|
||||
{
|
||||
DevCon.Warning("Replacement for irq prevention hack EE SIF1");
|
||||
sif1.ee.end = false;
|
||||
|
@ -215,19 +215,19 @@ static __fi void HandleEETransfer()
|
|||
DevCon.Warning("SIF1 stall control"); // STD == fromSIF1
|
||||
}
|
||||
|
||||
/*if (sif1dma->qwc == 0)
|
||||
if (sif1dma->chcr.MOD == NORMAL_MODE)
|
||||
/*if (sif1dma.qwc == 0)
|
||||
if (sif1dma.chcr.MOD == NORMAL_MODE)
|
||||
if (!sif1.ee.end){
|
||||
DevCon.Warning("sif1 irq prevented CHCR %x QWC %x", sif1dma->chcr, sif1dma->qwc);
|
||||
DevCon.Warning("sif1 irq prevented CHCR %x QWC %x", sif1dma.chcr, sif1dma.qwc);
|
||||
done = true;
|
||||
return;
|
||||
}*/
|
||||
|
||||
// If there's no more to transfer.
|
||||
if (sif1dma->qwc <= 0)
|
||||
if (sif1dma.qwc <= 0)
|
||||
{
|
||||
// If NORMAL mode or end of CHAIN then stop DMA.
|
||||
if ((sif1dma->chcr.MOD == NORMAL_MODE) || sif1.ee.end)
|
||||
if ((sif1dma.chcr.MOD == NORMAL_MODE) || sif1.ee.end)
|
||||
{
|
||||
done = true;
|
||||
EndEE();
|
||||
|
@ -292,7 +292,7 @@ __fi void SIF1Dma()
|
|||
|
||||
if (sif1.ee.busy)
|
||||
{
|
||||
if(sif1.fifo.free() > 0 || (sif1.ee.end == true && sif1dma->qwc == 0))
|
||||
if(sif1.fifo.free() > 0 || (sif1.ee.end == true && sif1dma.qwc == 0))
|
||||
{
|
||||
BusyCheck++;
|
||||
HandleEETransfer();
|
||||
|
@ -322,21 +322,21 @@ __fi void sif1Interrupt()
|
|||
__fi void EEsif1Interrupt()
|
||||
{
|
||||
hwDmacIrq(DMAC_SIF1);
|
||||
sif1dma->chcr.STR = false;
|
||||
sif1dma.chcr.STR = false;
|
||||
}
|
||||
|
||||
// Do almost exactly the same thing as psxDma10 in IopDma.cpp.
|
||||
// Main difference is this checks for iop, where psxDma10 checks for ee.
|
||||
__fi void dmaSIF1()
|
||||
{
|
||||
SIF_LOG(wxString(L"dmaSIF1" + sif1dma->cmqt_to_str()).To8BitData());
|
||||
SIF_LOG(wxString(L"dmaSIF1" + sif1dma.cmqt_to_str()).To8BitData());
|
||||
|
||||
if (sif1.fifo.readPos != sif1.fifo.writePos)
|
||||
{
|
||||
SIF_LOG("warning, sif1.fifoReadPos != sif1.fifoWritePos");
|
||||
}
|
||||
|
||||
//if(sif1dma->chcr.MOD == CHAIN_MODE && sif1dma->qwc > 0) DevCon.Warning(L"SIF1 QWC on Chain CHCR " + sif1dma->chcr.desc());
|
||||
//if(sif1dma.chcr.MOD == CHAIN_MODE && sif1dma.qwc > 0) DevCon.Warning(L"SIF1 QWC on Chain CHCR " + sif1dma.chcr.desc());
|
||||
|
||||
psHu32(SBUS_F240) |= 0x4000;
|
||||
sif1.ee.busy = true;
|
||||
|
|
|
@ -33,14 +33,14 @@ s32 PrepareEERead()
|
|||
"\n\tread tag: %x %x %x %x", hw_dma(9).madr, hw_dma(9).tadr, sif0.iop.counter, sif0words, sif0data,
|
||||
tag[0], tag[1], tag[2], tag[3]);
|
||||
|
||||
sif0dma->unsafeTransfer(((tDMA_TAG*)(tag)));
|
||||
sif0dma->madr = tag[1];
|
||||
sif0dma.unsafeTransfer(((tDMA_TAG*)(tag)));
|
||||
sif0dma.madr = tag[1];
|
||||
tDMA_TAG ptag(tag[0]);
|
||||
|
||||
SIF_LOG("SIF0 EE dest chain tag madr:%08X qwc:%04X id:%X irq:%d(%08X_%08X)",
|
||||
sif0dma->madr, sif0dma->qwc, ptag.ID, ptag.IRQ, tag[1], tag[0]);
|
||||
sif0dma.madr, sif0dma.qwc, ptag.ID, ptag.IRQ, tag[1], tag[0]);
|
||||
|
||||
if (sif0dma->chcr.TIE && ptag.IRQ)
|
||||
if (sif0dma.chcr.TIE && ptag.IRQ)
|
||||
{
|
||||
//Console.WriteLn("SIF0 TIE");
|
||||
sif0.ee.end = true;
|
||||
|
@ -51,12 +51,12 @@ s32 PrepareEERead()
|
|||
case TAG_REFE:
|
||||
sif0.ee.end = true;
|
||||
if (dmacRegs.ctrl.STS != NO_STS)
|
||||
dmacRegs.stadr.ADDR = sif0dma->madr + (sif0dma->qwc * 16);
|
||||
dmacRegs.stadr.ADDR = sif0dma.madr + (sif0dma.qwc * 16);
|
||||
break;
|
||||
|
||||
case TAG_REFS:
|
||||
if (dmacRegs.ctrl.STS != NO_STS)
|
||||
dmacRegs.stadr.ADDR = sif0dma->madr + (sif0dma->qwc * 16);
|
||||
dmacRegs.stadr.ADDR = sif0dma.madr + (sif0dma.qwc * 16);
|
||||
break;
|
||||
|
||||
case TAG_END:
|
||||
|
@ -91,7 +91,7 @@ s32 DoSifRead(u32 iopAvailable)
|
|||
|
||||
SIF_LOG("Write IOP to EE: +++++++++++ %lX of %lX", transferSizeWords, sif0.iop.counter);
|
||||
|
||||
tDMA_TAG *ptag = sif0dma->getAddr(sif0dma->madr, DMAC_SIF0, true);
|
||||
tDMA_TAG *ptag = sif0dma.getAddr(sif0dma.madr, DMAC_SIF0, true);
|
||||
if (ptag == NULL)
|
||||
{
|
||||
DevCon.Warning("Write IOP to EE: ptag == NULL");
|
||||
|
@ -101,11 +101,11 @@ s32 DoSifRead(u32 iopAvailable)
|
|||
memcpy((u32*)ptag, (u32*)iopPhysMem(hw_dma(9).madr), transferSizeBytes);
|
||||
|
||||
// Clearing handled by vtlb memory protection and manual blocks.
|
||||
//Cpu->Clear(sif0dma->madr, readSize*4);
|
||||
//Cpu->Clear(sif0dma.madr, readSize*4);
|
||||
|
||||
sif0dma->madr += transferSizeBytes;
|
||||
sif0dma.madr += transferSizeBytes;
|
||||
sif0.ee.cycles += transferSizeQWords * 2;
|
||||
sif0dma->qwc -= transferSizeQWords;
|
||||
sif0dma.qwc -= transferSizeQWords;
|
||||
|
||||
return transferSizeBytes;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue