示例#1
0
            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--;
                }
            }
示例#2
0
        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--;
            }
        }