Example #1
0
    public void DumpPrg(IFamicomDumperConnection dumper, List <byte> data, int size)
    {
        dumper.Reset();
        version = DetectVersion(dumper);
        UInt16 coolboyReg = (UInt16)(version == 2 ? 0x5000 : 0x6000);
        int    banks      = size / 0x4000;

        for (var bank = 0; bank < banks; bank++)
        {
            var r0 = (byte)(((bank >> 3) & 0x07)          // 5, 4, 3 bits
                            | (((bank >> 9) & 0x03) << 4) // 10, 9 bits
                            | (1 << 6));                  // resets 4th mask bit
            var r1 = (byte)((((bank >> 7) & 0x03) << 2)   // 8, 7
                            | (((bank >> 6) & 1) << 4)    // 6
                            | (1 << 7));                  // resets 5th mask bit
            var r2 = (byte)0;
            var r3 = (byte)((1 << 4)                      // NROM mode
                            | ((bank & 7) << 1));         // 2, 1, 0 bits
            dumper.WriteCpu(coolboyReg, r0, r1, r2, r3);

            Console.Write($"Reading PRG bank #{bank}/{banks}... ");
            data.AddRange(dumper.ReadCpu(0x8000, 0x4000));
            Console.WriteLine("OK");
        }
    }
Example #2
0
 public void EnablePrgRam(IFamicomDumperConnection dumper)
 {
     dumper.Reset();
     dumper.WriteCpu(0xA001, 0x00);
     dumper.WriteCpu(0x6003, 0x80);
     dumper.WriteCpu(0xA001, 0x80);
 }
    public static void TestPrgRam(IFamicomDumperConnection dumper, int count)
    {
        Console.Write("Reset... ");
        dumper.Reset();
        Console.WriteLine("OK");
        dumper.WriteCpu(0x5007, 0x01); // enable PRG RAM
        var rnd = new Random();

        while (count != 0)
        {
            var data = new byte[][] { new byte[0x2000], new byte[0x2000], new byte[0x2000], new byte[0x2000] };
            for (byte bank = 0; bank < 4; bank++)
            {
                Console.WriteLine($"Writing PRG RAM, bank #{bank}/{4}... ");
                rnd.NextBytes(data[bank]);
                dumper.WriteCpu(0x5005, bank);
                dumper.WriteCpu(0x6000, data[bank]);
            }
            for (byte bank = 0; bank < 4; bank++)
            {
                Console.Write($"Reading PRG RAM, bank #{bank}/{4}... ");
                dumper.WriteCpu(0x5005, bank);
                var  rdata = dumper.ReadCpu(0x6000, 0x2000);
                bool ok    = true;
                for (int b = 0; b < 0x2000; b++)
                {
                    if (data[bank][b] != rdata[b])
                    {
                        Console.WriteLine($"Mismatch at {b:X4}: {rdata[b]:X2} != {data[bank][b]:X2}");
                        ok = false;
                    }
                }
                if (!ok)
                {
                    File.WriteAllBytes("prgramgood.bin", data[bank]);
                    Console.WriteLine("prgramgood.bin writed");
                    File.WriteAllBytes("prgrambad.bin", rdata);
                    Console.WriteLine("prgrambad.bin writed");
                    throw new InvalidDataException("Test failed");
                }
                Console.WriteLine("OK");
            }
            count--;
        }
    }
Example #4
0
    public void DumpPrg(IFamicomDumperConnection dumper, List <byte> data, int size)
    {
        var banks = size / 0x8000;

        Console.Write("Reset... ");
        dumper.Reset();
        Console.WriteLine("OK");
        dumper.WriteCpu(0x5002, 0xFE); // mask = 32K
        for (int bank = 0; bank < banks; bank++)
        {
            var r0 = (byte)(bank >> 7);
            var r1 = (byte)(bank << 1);
            dumper.WriteCpu(0x5000, r0);
            dumper.WriteCpu(0x5001, r1);

            Console.Write($"Reading PRG bank #{bank}/{banks}... ");
            data.AddRange(dumper.ReadCpu(0x8000, 0x8000));
            Console.WriteLine("OK");
        }
    }
    public void DumpPrg(IFamicomDumperConnection dumper, List <byte> data, int size)
    {
        var outbanks = size / (256 * 1024);

        for (var outbank = 0; outbank < outbanks; outbank += 1)
        {
            dumper.Reset();
            dumper.WriteCpu(0xA001, 0x80); // RAM protect
            dumper.WriteCpu((ushort)(0x6828 | (outbank << 1)), 0x00);
            dumper.WriteCpu(0xA001, 0);    // disable W-RAM
            const int banks = 32;
            for (var bank = 0; bank < banks; bank += 2)
            {
                Console.Write($"Reading PRG banks #{outbank}|{bank} and #{outbank}|{bank + 1}... ");
                dumper.WriteCpu(0x8000, 6, (byte)bank);
                dumper.WriteCpu(0x8000, 7, (byte)(bank | 1));
                data.AddRange(dumper.ReadCpu(0x8000, 0x4000));
                Console.WriteLine("OK");
            }
            Console.WriteLine("OK");
        }
    }
        public void DumpChr(IFamicomDumperConnection dumper, List <byte> data, int size)
        {
            var outbanks = size / (256 * 1024);

            for (var outbank = 0; outbank < outbanks; outbank += 1)
            {
                dumper.Reset();
                dumper.WriteCpu(0xA001, 0x80); // RAM protect
                dumper.WriteCpu((ushort)(0x6828 | (outbank << 1)), 0x00);
                dumper.WriteCpu(0xA001, 0);    // disable W-RAM

                const int banks = 256;
                for (var bank = 0; bank < banks; bank += 4)
                {
                    Console.Write("Reading CHR banks #{4}|{0}, #{4}|{1}, #{4}|{2}, #{4}|{3}... ", bank, bank + 1, bank + 2, bank + 3, outbank);
                    dumper.WriteCpu(0x8000, new byte[] { 2, (byte)bank });
                    dumper.WriteCpu(0x8000, new byte[] { 3, (byte)(bank | 1) });
                    dumper.WriteCpu(0x8000, new byte[] { 4, (byte)(bank | 2) });
                    dumper.WriteCpu(0x8000, new byte[] { 5, (byte)(bank | 3) });
                    data.AddRange(dumper.ReadPpu(0x1000, 0x1000));
                    Console.WriteLine("OK");
                }
            }
        }
Example #7
0
 public void EnablePrgRam(IFamicomDumperConnection dumper)
 {
     dumper.Reset();
     dumper.WriteCpu(0x5007, 0x01); // enable SRAM
     dumper.WriteCpu(0x5005, 0x02); // select bank
 }
    public static void TestChrRam(IFamicomDumperConnection dumper, int count, int chrSize)
    {
        Console.WriteLine($"Testing CHR RAM, size: {chrSize / 1024}KB");
        Console.Write("Reset... ");
        dumper.Reset();
        Console.WriteLine("OK");
        dumper.WriteCpu(0x5007, 0x2); // enable CHR writing
        var rnd  = new Random();
        var data = new byte[0x2000];

        rnd.NextBytes(data);
        Console.WriteLine("Single bank test.");
        Console.Write("Writing CHR RAM... ");
        dumper.WritePpu(0x0000, data);
        Console.Write("Reading CHR RAM... ");
        var  rdata = dumper.ReadPpu(0x0000, 0x2000);
        bool ok    = true;

        for (int b = 0; b < 0x2000; b++)
        {
            if (data[b] != rdata[b])
            {
                Console.WriteLine($"Mismatch at {b:X4}: {rdata[b]:X2} != {data[b]:X2}");
                ok = false;
            }
        }
        if (!ok)
        {
            File.WriteAllBytes("chrramgood.bin", data);
            Console.WriteLine("chrramgood.bin writed");
            File.WriteAllBytes("chrrambad.bin", rdata);
            Console.WriteLine("chrrambad.bin writed");
            throw new IOException("Test failed");
        }
        Console.WriteLine("OK");

        Console.WriteLine("Multibank test.");
        data = new byte[chrSize];
        for (; count != 0; count--)
        {
            dumper.WriteCpu(0x5007, 0x2); // enable CHR writing
            rnd.NextBytes(data);
            for (byte bank = 0; bank < data.Length / 0x2000; bank++)
            {
                Console.WriteLine($"Writing CHR RAM bank #{bank}/{data.Length / 0x2000}...");
                dumper.WriteCpu(0x5003, (byte)(bank & 0b00011111));        // select bank, low 5 bits
                dumper.WriteCpu(0x5005, (byte)((bank & 0b00100000) << 2)); // select bank, 6th bit
                var d = new byte[0x2000];
                Array.Copy(data, bank * 0x2000, d, 0, 0x2000);
                dumper.WritePpu(0x0000, d);
            }
            for (byte bank = 0; bank < data.Length / 0x2000; bank++)
            {
                Console.Write($"Reading CHR RAM bank #{bank}/{data.Length / 0x2000}... ");
                dumper.WriteCpu(0x5003, (byte)(bank & 0b00011111));        // select bank, low 5 bits
                dumper.WriteCpu(0x5005, (byte)((bank & 0b00100000) << 2)); // select bank, 6th bit
                rdata = dumper.ReadPpu(0x0000, 0x2000);
                ok    = true;
                for (int b = 0; b < 0x2000; b++)
                {
                    if (data[b + bank * 0x2000] != rdata[b])
                    {
                        Console.WriteLine($"Mismatch at {b:X4}: {rdata[b]:X2} != {data[b + bank * 0x2000]:X2}");
                        ok = false;
                    }
                }
                if (!ok)
                {
                    File.WriteAllBytes("chrramgoodf.bin", data);
                    Console.WriteLine("chrramgoodf.bin writed");
                    File.WriteAllBytes("chrrambad.bin", rdata);
                    Console.WriteLine("chrrambad.bin writed");
                    throw new InvalidDataException("Test failed");
                }
                Console.WriteLine("OK");
            }
        }
    }
 void Reset(IFamicomDumperConnection dumper)
 {
     Console.Write("Reset... ");
     dumper.Reset();
     Console.WriteLine("OK");
 }