private void blockCopy(uint size) { while (size > 0) { switch (transferDirection) { case 0: //To Ram uint data = 0; //byte[] cdTest = null; switch (channelNumber) { case 1: //MDECout //Console.WriteLine("[DMA] MdecOut to ram " + size); data = dma_transfer.fromMDECout(); break; case 2: //GPU data = dma_transfer.fromGPU(); //Console.WriteLine("[DMA] [C2 GPU] Address: {0} Data: {1} Size {2}", (baseAddress & 0x1F_FFFC).ToString("x8"), data.ToString("x8"), size); break; case 3: //CD data = dma_transfer.fromCD(); //if(step == -4) { // Console.WriteLine("WARNING !!! UNHANDLED REVERSE ON BUFFER CD TRANSFER"); // Console.ReadLine(); //} //cdTest = dma_transfer.fromCD(size); //for (int i = 0; i < cdTest.Length; i++) { // Console.WriteLine(cdTest[i].ToString("x2")); //} //dma_transfer.toRAM(dmaAddress & 0x1F_FFFC, cdTest, size); //return; //Console.WriteLine("[DMA] [C3 CD] TORAM Address: {0} Data: {1} Size {2}", (baseAddress & 0x1F_FFFC).ToString("x8"), data.ToString("x8"), size); break; case 6: //OTC if (size == 1) { data = 0xFF_FFFF; } else { data = (baseAddress - 4) & 0xFF_FFFF; } //Console.WriteLine("[DMA] [C6 OTC] Address: {0} Data: {1}", (baseAddress & 0x1F_FFFC).ToString("x8"), data.ToString("x8")); break; default: data = 0; //Console.WriteLine("[DMA] [BLOCK COPY] Unsupported Channel (to Ram) " + channelNumber); break; } dma_transfer.toRAM(baseAddress & 0x1F_FFFC, data); break; case 1: //From Ram //Console.WriteLine("Size " + size); uint[] load = dma_transfer.fromRAM(baseAddress & 0x1F_FFFC, size); switch (channelNumber) { case 0: //MDECin Console.WriteLine("[DMA] MDEC IN blockCopy " + size); dma_transfer.toMDECin(load); return; case 2: //GPU dma_transfer.toGPU(load); return; default: //MDECin and SPU //Console.WriteLine("[DMA] [BLOCK COPY] Unsupported Channel (from Ram) " + channelNumber); return; } } baseAddress += memoryStep; size--; } }
private void blockCopy(uint syncMode, uint addr, uint control) { uint dmaAddress = getStartAdress(addr); uint size = getSize(syncMode, addr); uint direction = control & 1; int step = ((control >> 1) & 1) == 0 ? 4 : -4; uint channel = (addr & 0x70) >> 4; while (size > 0) { switch (direction) { case 0: //To Ram uint data = 0; //byte[] cdTest = null; switch (channel) { case 2: //GPU data = dma_transfer.fromGPU(); //Console.WriteLine("[DMA] [C2 GPU] Address: {0} Data: {1} Size {2}", (dmaAddress & 0x1F_FFFC).ToString("x8"), data.ToString("x8"), size); break; case 3: //CD data = dma_transfer.fromCD(); //if(step == -4) { // Console.WriteLine("WARNING !!! UNHANDLED REVERSE ON BUFFER CD TRANSFER"); // Console.ReadLine(); //} //cdTest = dma_transfer.fromCD(size); //for (int i = 0; i < cdTest.Length; i++) { // Console.WriteLine(cdTest[i].ToString("x2")); //} //dma_transfer.toRAM(dmaAddress & 0x1F_FFFC, cdTest, size); //return; //Console.WriteLine("[DMA] [C3 CD] TORAM Address: {0} Data: {1} Size {2}", (dmaAddress & 0x1F_FFFC).ToString("x8"), data.ToString("x8"), size); break; case 6: //OTC if (size == 1) { data = 0xFF_FFFF; } else { data = (dmaAddress - 4) & 0xFF_FFFF; } //Console.WriteLine("[DMA] [C6 OTC] Address: {0} Data: {1}", (dmaAddress & 0x1F_FFFC).ToString("x8"), data.ToString("x8")); break; default: data = 0; //Console.WriteLine("[DMA] [BLOCK COPY] Unsupported Channel (to Ram) " + channel); break; } dma_transfer.toRAM(dmaAddress & 0x1F_FFFC, data); break; case 1: //From Ram //Console.WriteLine("Size " + size); uint[] load = dma_transfer.fromRAM(dmaAddress & 0x1F_FFFC, size); switch (channel) { case 2: //GPU dma_transfer.toGPU(load); return; default: //MDECin and SPU Console.WriteLine("[DMA] [BLOCK COPY] Unsupported Channel (from Ram) " + channel); return; } } dmaAddress += (uint)step; size--; } }