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