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 WriteEeprom(FamicomDumperConnection dumper, string fileName) { var nesFile = new NesFile(fileName); var prg = new byte[0x8000]; int s = 0; while (s < prg.Length) { var n = Math.Min(nesFile.PRG.Length, prg.Length - s); Array.Copy(nesFile.PRG, s % nesFile.PRG.Length, prg, s, n); s += n; } var chr = new byte[0x2000]; s = 0; while (s < chr.Length) { var n = Math.Min(nesFile.CHR.Length, chr.Length - s); Array.Copy(nesFile.CHR, s % nesFile.CHR.Length, chr, s, n); s += n; } dumper.Timeout = 1000; var buff = new byte[64]; Console.Write("Writing PRG EEPROM"); for (UInt16 a = 0; a < prg.Length; a += 64) { Array.Copy(prg, a, buff, 0, buff.Length); dumper.WriteCpu((UInt16)(0x8000 + a), buff); Thread.Sleep(3); Console.Write("."); } Console.WriteLine(" OK"); Console.Write("Writing CHR EEPROM"); for (UInt16 a = 0; a < chr.Length; a += 64) { Array.Copy(chr, a, buff, 0, buff.Length); dumper.WritePpu(a, buff); Thread.Sleep(3); Console.Write("."); } Console.WriteLine(" OK"); }
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--; } }