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:
Jake.Stine 2010-09-05 02:51:36 +00:00
parent 935159ed8e
commit 02b390b0e1
13 changed files with 789 additions and 772 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,71 +1,93 @@
struct IPUStatus {
bool InProgress;
u8 DMAMode;
bool DMAFinished;
bool IRQTriggered;
u8 TagFollow;
u32 TagAddr;
bool stalled;
u8 ChainMode;
u32 NextMem;
};
#define DMA_MODE_NORMAL 0
#define DMA_MODE_CHAIN 1
#define IPU1_TAG_FOLLOW 0
#define IPU1_TAG_QWC 1
#define IPU1_TAG_ADDR 2
#define IPU1_TAG_NONE 3
union tIPU_DMA
{
struct
{
bool GIFSTALL : 1;
bool TIE0 :1;
bool TIE1 : 1;
bool ACTV1 : 1;
bool DOTIE1 : 1;
bool FIREINT0 : 1;
bool FIREINT1 : 1;
bool VIFSTALL : 1;
bool SIFSTALL : 1;
};
u32 _u32;
tIPU_DMA( u32 val ){ _u32 = val; }
tIPU_DMA() { }
bool test(u32 flags) const { return !!(_u32 & flags); }
void set_flags(u32 flags) { _u32 |= flags; }
void clear_flags(u32 flags) { _u32 &= ~flags; }
void reset() { _u32 = 0; }
wxString desc() const
{
wxString temp(L"g_nDMATransfer[");
if (GIFSTALL) temp += L" GIFSTALL ";
if (TIE0) temp += L" TIE0 ";
if (TIE1) temp += L" TIE1 ";
if (ACTV1) temp += L" ACTV1 ";
if (DOTIE1) temp += L" DOTIE1 ";
if (FIREINT0) temp += L" FIREINT0 ";
if (FIREINT1) temp += L" FIREINT1 ";
if (VIFSTALL) temp += L" VIFSTALL ";
if (SIFSTALL) temp += L" SIFSTALL ";
temp += L"]";
return temp;
}
};
extern void ipu0Interrupt();
extern void ipu1Interrupt();
extern void dmaIPU0();
extern void dmaIPU1();
extern int IPU0dma();
extern int IPU1dma();
extern void ipuDmaReset();
/* 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;
bool DMAFinished;
bool IRQTriggered;
u8 TagFollow;
u32 TagAddr;
bool stalled;
u8 ChainMode;
u32 NextMem;
};
#define DMA_MODE_NORMAL 0
#define DMA_MODE_CHAIN 1
#define IPU1_TAG_FOLLOW 0
#define IPU1_TAG_QWC 1
#define IPU1_TAG_ADDR 2
#define IPU1_TAG_NONE 3
union tIPU_DMA
{
struct
{
bool GIFSTALL : 1;
bool TIE0 :1;
bool TIE1 : 1;
bool ACTV1 : 1;
bool DOTIE1 : 1;
bool FIREINT0 : 1;
bool FIREINT1 : 1;
bool VIFSTALL : 1;
bool SIFSTALL : 1;
};
u32 _u32;
tIPU_DMA( u32 val ){ _u32 = val; }
tIPU_DMA() { }
bool test(u32 flags) const { return !!(_u32 & flags); }
void set_flags(u32 flags) { _u32 |= flags; }
void clear_flags(u32 flags) { _u32 &= ~flags; }
void reset() { _u32 = 0; }
wxString desc() const
{
wxString temp(L"g_nDMATransfer[");
if (GIFSTALL) temp += L" GIFSTALL ";
if (TIE0) temp += L" TIE0 ";
if (TIE1) temp += L" TIE1 ";
if (ACTV1) temp += L" ACTV1 ";
if (DOTIE1) temp += L" DOTIE1 ";
if (FIREINT0) temp += L" FIREINT0 ";
if (FIREINT1) temp += L" FIREINT1 ";
if (VIFSTALL) temp += L" VIFSTALL ";
if (SIFSTALL) temp += L" SIFSTALL ";
temp += L"]";
return temp;
}
};
extern void ipu0Interrupt();
extern void ipu1Interrupt();
extern void dmaIPU0();
extern void dmaIPU1();
extern int IPU0dma();
extern int IPU1dma();
extern void ipuDmaReset();

View File

@ -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;
}

View File

@ -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])

View File

@ -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");
}

View File

@ -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
{

View File

@ -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;

View File

@ -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;

View File

@ -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;
}