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"); } }
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--; } }
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"); } } }
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"); }