Beispiel #1
0
static void __fastcall _ext_memRead128(u32 mem, mem128_t *out)
{
	switch (p)
	{
		//case 1: // hwm
		//	hwRead128(mem & ~0xa0000000, out); return;
		case 6: // gsm
			CopyQWC(out,PS2GS_BASE(mem));
		return;
	}

	MEM_LOG("Unknown Memory read128 from address %8.8x", mem);
	cpuTlbMissR(mem, cpuRegs.branch);
}
Beispiel #2
0
int GIF_Fifo::read(bool calledFromDMA)
{

	if (!gifUnit.CanDoPath3() || gifRegs.stat.FQC == 0)
	{
		//DevCon.Warning("Path3 not masked");
		if (gifch.chcr.STR == true && !(cpuRegs.interrupt & (1 << DMAC_GIF)) && calledFromDMA == false) {
			GifDMAInt(16);
		}
		//DevCon.Warning("P3 Masked");
		return 0;
	}

	int valueWritePos = 0;
	uint sizeRead;
	uint fifoSize = gifRegs.stat.FQC;
	int oldReadPos = readpos;

	while (gifRegs.stat.FQC) {
		CopyQWC(&readdata[valueWritePos], &data[readpos]);
		readpos = (readpos + 4) & 63;
		valueWritePos = (valueWritePos + 4) & 63;
		gifRegs.stat.FQC--;
	}

	sizeRead = gifUnit.TransferGSPacketData(GIF_TRANS_DMA, (u8*)&readdata[0], fifoSize * 16) / 16; //returns the size actually read

	if (sizeRead < fifoSize) {
		readpos = (oldReadPos + (sizeRead * 4)) & 63; //if we read less than what was in the fifo, move the read position back
		gifRegs.stat.FQC = fifoSize - sizeRead;
	}
		
	if (calledFromDMA == false) {
		GifDMAInt(sizeRead * BIAS);
	}

	CalculateFIFOCSR();
	return gifRegs.stat.FQC;
}
Beispiel #3
0
int GIF_Fifo::write(u32* pMem, int size)
{
	if (gifRegs.stat.FQC == 16) {
		//DevCon.Warning("Full");
		return 0;
	}
	int transsize;
	int firsttrans = std::min(size, 16 - (int)gifRegs.stat.FQC);

	gifRegs.stat.FQC += firsttrans;
	transsize = firsttrans;
	
	
	while (transsize-- > 0)
	{
		CopyQWC(&data[writepos], pMem);
		writepos = (writepos + 4) & 63;
		pMem += 4;
	}
	
	CalculateFIFOCSR();
	return firsttrans;
}