static void TestChrRam(FamicomDumperConnection dumper) { var rnd = new Random(); while (true) { var data = new byte[0x2000]; rnd.NextBytes(data); 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 {0:X4}: {1:X2} != {2:X2}", b, rdata[b], data[b]); ok = false; } } if (!ok) { File.WriteAllBytes("chrgood.bin", data); Console.WriteLine("chrgood.bin writed"); File.WriteAllBytes("chrbad.bin", rdata); Console.WriteLine("chrbad.bin writed"); throw new Exception("Test failed"); } Console.WriteLine("OK!"); } }
public static byte DetectVersion(FamicomDumperConnection dumper) { byte version; Console.Write("Detecting COOLBOY version... "); // 0th CHR bank using both methods dumper.WriteCpu(0x5000, new byte[] { 0, 0, 0, 0x10 }); dumper.WriteCpu(0x6000, new byte[] { 0, 0, 0, 0x10 }); // Writing 0 dumper.WritePpu(0x0000, new byte[] { 0 }); // First CHR bank using both methods dumper.WriteCpu(0x5000, new byte[] { 0, 0, 1, 0x10 }); dumper.WriteCpu(0x6000, new byte[] { 0, 0, 1, 0x10 }); // Writing 1 dumper.WritePpu(0x0000, new byte[] { 1 }); // 0th bank using first method dumper.WriteCpu(0x6000, new byte[] { 0, 0, 0, 0x10 }); byte v6000 = dumper.ReadPpu(0x0000, 1)[0]; // return dumper.WriteCpu(0x6000, new byte[] { 0, 0, 1, 0x10 }); // 0th bank using second method dumper.WriteCpu(0x5000, new byte[] { 0, 0, 0, 0x10 }); byte v5000 = dumper.ReadPpu(0x0000, 1)[0]; if (v6000 == 0 && v5000 == 1) { version = 1; } else if (v6000 == 1 && v5000 == 0) { version = 2; } else { throw new Exception("Can't detect COOLBOY version"); } Console.WriteLine("Version: {0}", version); return(version); }
static void TestChrRamCoolgirl(FamicomDumperConnection dumper, int count = -1) { dumper.Reset(); dumper.WriteCpu(0x5007, 0x2); // enable CHR writing var rnd = new Random(); var data = new byte[0x2000]; rnd.NextBytes(data); Console.WriteLine("Basic 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 {0:X4}: {1:X2} != {2:X2}", b, rdata[b], data[b]); ok = false; } } if (!ok) { File.WriteAllBytes("chrgood.bin", data); Console.WriteLine("chrgood.bin writed"); File.WriteAllBytes("chrbad.bin", rdata); Console.WriteLine("chrbad.bin writed"); throw new Exception("Test failed"); } Console.WriteLine("OK!"); Console.WriteLine("Global test."); data = new byte[256 * 1024]; while (count != 0) { dumper.Reset(); dumper.WriteCpu(0x5007, 0x2); // enable CHR writing rnd.NextBytes(data); for (byte bank = 0; bank < 32; bank++) { Console.WriteLine("Writing CHR RAM bank #{0}...", bank); dumper.WriteCpu(0x5003, bank); // select bank var d = new byte[0x2000]; Array.Copy(data, bank * 0x2000, d, 0, 0x2000); dumper.WritePpu(0x0000, d); } for (byte bank = 0; bank < 32; bank++) { Console.Write("Reading CHR RAM bank #{0}... ", bank); dumper.WriteCpu(0x5003, bank); // select bank 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 {0:X4}: {1:X2} != {2:X2}", b, rdata[b], data[b + bank * 0x2000]); ok = false; } } if (ok) { Console.WriteLine("OK!"); } else { throw new Exception("Test failed"); } } count--; } }