Пример #1
0
void __fastcall ReadFIFO_VIF1(mem128_t* out)
{
	if (vif1Regs.stat.test(VIF1_STAT_INT | VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS) )
		DevCon.Warning( "Reading from vif1 fifo when stalled" );

	ZeroQWC(out); // Clear first in case no data gets written...
	pxAssertRel(vif1Regs.stat.FQC != 0, "FQC = 0 on VIF FIFO READ!");
	if (vif1Regs.stat.FDR) {
		if (vif1Regs.stat.FQC > vif1.GSLastDownloadSize) {
			DevCon.Warning("Warning! GS Download size < FIFO count!");
		}
		if (vif1Regs.stat.FQC > 0) {
			GetMTGS().WaitGS();
			if (GSinitReadFIFO) {
				GetMTGS().SendPointerPacket(GS_RINGTYPE_INIT_READ_FIFO1, 0, out);
				GetMTGS().WaitGS(false); // wait without reg sync
			}
			GSreadFIFO((u64*)out);
			vif1.GSLastDownloadSize--;
			GUNIT_LOG("ReadFIFO_VIF1");
			if (vif1.GSLastDownloadSize <= 16)
				gifRegs.stat.OPH = false;
			vif1Regs.stat.FQC = std::min((u32)16, vif1.GSLastDownloadSize);
		}
	}

	VIF_LOG("ReadFIFO/VIF1 -> %ls", WX_STR(out->ToString()));
}
Пример #2
0
void __fastcall WriteFIFO_GIF(const mem128_t *value)
{
    GUNIT_LOG("WriteFIFO_GIF()");
    gifUnit.TransferGSPacketData(GIF_TRANS_FIFO, (u8*)value, 16);

    if(gifUnit.gifPath[GIF_PATH_3].state == GIF_PATH_WAIT)
        gifUnit.gifPath[GIF_PATH_3].state = GIF_PATH_IDLE;

    if( gifRegs.stat.APATH == 3 )
    {
        gifRegs.stat.APATH = 0;
        gifRegs.stat.OPH = 0;

        if(gifUnit.gifPath[GIF_PATH_3].state == GIF_PATH_IDLE || gifUnit.gifPath[GIF_PATH_3].state == GIF_PATH_WAIT)
        {
            if(gifUnit.checkPaths(1,1,0)) gifUnit.Execute(false, true);
        }

    }
}
Пример #3
0
void __fastcall ReadFIFO_VIF1(mem128_t* out)
{
    if (vif1Regs.stat.test(VIF1_STAT_INT | VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS) )
        DevCon.Warning( "Reading from vif1 fifo when stalled" );

    ZeroQWC(out); // Clear first in case no data gets written...
    pxAssertRel(vif1Regs.stat.FQC != 0, "FQC = 0 on VIF FIFO READ!");
    if (vif1Regs.stat.FDR) {
        if (vif1Regs.stat.FQC > vif1.GSLastDownloadSize) {
            DevCon.Warning("Warning! GS Download size < FIFO count!");
        }
        if (vif1Regs.stat.FQC > 0) {
            GetMTGS().WaitGS();
            GSreadFIFO((u64*)out);
            vif1.GSLastDownloadSize--;
            GUNIT_LOG("ReadFIFO_VIF1");
            if (vif1.GSLastDownloadSize <= 16)
                gifRegs.stat.OPH = false;
            vif1Regs.stat.FQC = min((u32)16, vif1.GSLastDownloadSize);
        }
    }

    VIF_LOG("ReadFIFO/VIF1 -> %ls", out->ToString().c_str());
}
Пример #4
0
void __fastcall WriteFIFO_GIF(const mem128_t *value)
{
    GUNIT_LOG("WriteFIFO_GIF()");
    gifUnit.TransferGSPacketData(GIF_TRANS_FIFO, (u8*)value, 16);
}