public static void PasswordUnlock(FamicomDumperLocal dumper, byte[] password) { try { if (password.Length != 8) { throw new InvalidDataException("Invalid password length"); } Console.Write("Unlocking password... "); // Password Protection Set Entry dumper.WriteCpu(0x8AAA, 0xAA); dumper.WriteCpu(0x8555, 0x55); dumper.WriteCpu(0x8AAA, 0x60); // Password unlock dumper.WriteCpu(0x8000, 0x25); dumper.WriteCpu(0x8000, 0x03); for (byte i = 0; i < password.Length; i++) { dumper.WriteCpu((ushort)(0x8000 + i), password[i]); } dumper.WriteCpu(0x8000, 0x29); Console.WriteLine("OK"); } finally { ResetFlash(dumper); } }
public static void PasswordProgramm(FamicomDumperLocal dumper, byte[] password) { if (password.Length != 8) { throw new InvalidDataException("Invalid password length"); } Console.Write("Programming password... "); // Password Protection Set Entry dumper.WriteCpu(0x8AAA, 0xAA); dumper.WriteCpu(0x8555, 0x55); dumper.WriteCpu(0x8AAA, 0x60); try { for (byte i = 0; i < password.Length; i++) { dumper.WriteCpu(0x8000, 0xA0); dumper.WriteCpu((ushort)(0x8000 + i), password[i]); } var verify = dumper.ReadCpu(0x8000, 8); for (byte i = 0; i < password.Length; i++) { if (password[i] != verify[i]) { throw new InvalidDataException("Password verification failed"); } } } finally { ResetFlash(dumper); } Console.WriteLine("OK"); Console.Write("Programming lock register... "); // Lock Register Set Entry dumper.WriteCpu(0x8AAA, 0xAA); dumper.WriteCpu(0x8555, 0x55); dumper.WriteCpu(0x8AAA, 0x40); try { // Bits Program dumper.WriteCpu(0x8000, 0xA0); dumper.WriteCpu(0x8000, (byte)(1 << 2) ^ 0xFF); // password protection var r = dumper.ReadCpu(0x8000); if ((r & 7) != 3) { throw new InvalidDataException("Lock bit verification failed"); } } finally { ResetFlash(dumper); } Console.WriteLine("OK"); }