//the mother method-- currently just used for correcting checksums... //but could be used for a lot of other things public static bool FixROM() { //will be ignoring copier headers completely... cause DON'T USE THEM //ROM is loaded elsewhere int totalFileSize = ROM.Length; int hi_score = ScoreHiROM(false, 0); int lo_score = ScoreLoROM(false, 0); CalculatedSize = (uint)((totalFileSize / 0x2000) * 0x2000); if (CalculatedSize > 0x400000 && (ROM[0x7fd5] + (ROM[0x7fd6] << 8)) != 0x4332 && // exclude S-DD1 (ROM[0x7fd5] + (ROM[0x7fd6] << 8)) != 0x4532 && (ROM[0xffd5] + (ROM[0xffd6] << 8)) != 0xF93a && // exclude SPC7110 (ROM[0xffd5] + (ROM[0xffd6] << 8)) != 0xF53a) { ExtendedFormat = EXTFMT.YEAH; } // if both vectors are invalid, it's type 1 interleaved LoROM if (ExtendedFormat == EXTFMT.NOPE && ((ROM[0x7ffc] + (ROM[0x7ffd] << 8)) < 0x8000) && ((ROM[0xfffc] + (ROM[0xfffd] << 8)) < 0x8000)) { Debug.WriteLine("Interleaved ROMs are unsupported. Because WHY?"); } // CalculatedSize is now set, so rescore hi_score = ScoreHiROM(false, 0); lo_score = ScoreLoROM(false, 0); if (String.Compare(Encoding.ASCII.GetString(ROM, 0x7FC0, 22), "YUYU NO QUIZ DE GO!GO!") == 0 || String.Compare(Encoding.ASCII.GetString(ROM, 0xFFC0, 21), "BATMAN--REVENGE JOKER") == 0) { HiROM = false; } if (lo_score >= hi_score) { HiROM = false; // ignore map type byte if not 0x2x or 0x3x if ((ROM[0x7fd5] & 0xf0) == 0x20 || (ROM[0x7fd5] & 0xf0) == 0x30) { switch (ROM[0x7fd5] & 0xf) { case 1: case 5: Debug.WriteLine("Interleaved ROMs are unsupported. Because WHY?"); break; } } } else { HiROM = true; if ((ROM[0xffd5] & 0xf0) == 0x20 || (ROM[0xffd5] & 0xf0) == 0x30) { switch (ROM[0xffd5] & 0xf) { case 0: case 3: Debug.WriteLine("Interleaved ROMs are unsupported. Because WHY?"); break; } } } int hPos = (HiROM) ? 0xFFB0 : 0x7FB0; ROMId = Encoding.ASCII.GetString(ROM, hPos + 2, 4); //get ROM Name Array.Copy(ROM, hPos + 0x10, RawROMName, 0, ROM_NAME_LEN); ROMName = Encoding.ASCII.GetString(RawROMName); //BS ROMs are unsupported ROMSize = ROM[hPos + 0x27]; SRAMSize = ROM[hPos + 0x28]; ROMSpeed = ROM[hPos + 0x25]; ROMType = ROM[hPos + 0x26]; ROMRegion = ROM[hPos + 0x29]; ROMChecksum = (uint)(ROM[hPos + 0x2E] + (ROM[hPos + 0x2F] << 8)); ROMComplementChecksum = (uint)(ROM[hPos + 0x2C] + (ROM[hPos + 0x2D] << 8)); if (ROM[hPos + 0x2A] != 0x33) { CompanyId = ((ROM[hPos + 0x2A] >> 4) & 0x0F) * 36 + (ROM[hPos + 0x2A] & 0x0F); } else { string co = Encoding.ASCII.GetString(ROM, hPos, 2); if (char.IsNumber(co[0]) && char.IsNumber(co[1])) { int l, r, l2, r2; l = co[0]; r = co[1]; l2 = (l > '9') ? l - '7' : l - '0'; r2 = (r > '9') ? r - '7' : r - '0'; CompanyId = l2 * 36 + r2; } } CalculatedChecksum = Checksum_Calculate(hPos); bool isChecksumOK = (ROMChecksum + ROMComplementChecksum == 0xffff) & (ROMChecksum == CalculatedChecksum); if (!isChecksumOK) { //Console.WriteLine("Correcting checksum..."); uint CalcComplement = 0xffff - CalculatedChecksum; //Write New Checksum ROM[hPos + 0x2F] = (byte)(CalculatedChecksum >> 8); ROM[hPos + 0x2E] = (byte)(CalculatedChecksum & 0xFF); //Write New Compliment ROM[hPos + 0x2D] = (byte)(CalcComplement >> 8); ROM[hPos + 0x2C] = (byte)(CalcComplement & 0xFF); return(true); } //Console.WriteLine("Checksum OK"); else { return(false); } }
//the mother method-- currently just used for correcting checksums... but could be used for a lot of other things private static bool FixROM() { //will be ignoring copier headers completely... cause DON'T USE THEM //ROM is loaded elsewhere int totalFileSize = ROM.Length; int hi_score = ScoreHiROM(false, 0); int lo_score = ScoreLoROM(false, 0); CalculatedSize = (uint)((totalFileSize / 0x2000) * 0x2000); if (CalculatedSize > 0x400000 && (ROM[0x7fd5] + (ROM[0x7fd6] << 8)) != 0x4332 && // exclude S-DD1 (ROM[0x7fd5] + (ROM[0x7fd6] << 8)) != 0x4532 && (ROM[0xffd5] + (ROM[0xffd6] << 8)) != 0xF93a && // exclude SPC7110 (ROM[0xffd5] + (ROM[0xffd6] << 8)) != 0xF53a) ExtendedFormat = EXTFMT.YEAH; // if both vectors are invalid, it's type 1 interleaved LoROM if (ExtendedFormat == EXTFMT.NOPE && ((ROM[0x7ffc] + (ROM[0x7ffd] << 8)) < 0x8000) && ((ROM[0xfffc] + (ROM[0xfffd] << 8)) < 0x8000)) { Debug.WriteLine("Interleaved ROMs are unsupported. Because WHY?"); } // CalculatedSize is now set, so rescore hi_score = ScoreHiROM(false, 0); lo_score = ScoreLoROM(false, 0); if (String.Compare(Encoding.ASCII.GetString(ROM, 0x7fc0, 22), "YUYU NO QUIZ DE GO!GO!") == 0 || String.Compare(Encoding.ASCII.GetString(ROM, 0xffc0, 21), "BATMAN--REVENGE JOKER") == 0) { LoROM = true; HiROM = false; } if (lo_score >= hi_score) { LoROM = true; HiROM = false; // ignore map type byte if not 0x2x or 0x3x if ((ROM[0x7fd5] & 0xf0) == 0x20 || (ROM[0x7fd5] & 0xf0) == 0x30) { switch (ROM[0x7fd5] & 0xf) { case 1: case 5: Debug.WriteLine("Interleaved ROMs are unsupported. Because WHY?"); break; } } } else { LoROM = false; HiROM = true; if ((ROM[0xffd5] & 0xf0) == 0x20 || (ROM[0xffd5] & 0xf0) == 0x30) { switch (ROM[0xffd5] & 0xf) { case 0: case 3: Debug.WriteLine("Interleaved ROMs are unsupported. Because WHY?"); break; } } } int hPos = (HiROM) ? 0xFFB0 : 0x7FB0; ROMId = Encoding.ASCII.GetString(ROM, hPos + 2, 4); //get ROM Name Array.Copy(ROM, hPos + 0x10, RawROMName, 0, ROM_NAME_LEN); ROMName = Encoding.ASCII.GetString(RawROMName); //BS ROMs are unsupported ROMSize = ROM[hPos + 0x27]; SRAMSize = ROM[hPos + 0x28]; ROMSpeed = ROM[hPos + 0x25]; ROMType = ROM[hPos + 0x26]; ROMRegion = ROM[hPos + 0x29]; ROMChecksum = (uint)(ROM[hPos + 0x2E] + (ROM[hPos + 0x2F] << 8)); ROMComplementChecksum = (uint)(ROM[hPos + 0x2C] + (ROM[hPos + 0x2D] << 8)); if (ROM[hPos + 0x2A] != 0x33) { CompanyId = ((ROM[hPos + 0x2A] >> 4) & 0x0F) * 36 + (ROM[hPos + 0x2A] & 0x0F); } else { string co = Encoding.ASCII.GetString(ROM, hPos, 2); if (char.IsNumber(co[0]) && char.IsNumber(co[1])) { int l, r, l2, r2; l = co[0]; r = co[1]; l2 = (l > '9') ? l - '7' : l - '0'; r2 = (r > '9') ? r - '7' : r - '0'; CompanyId = l2 * 36 + r2; } } CalculatedChecksum = Checksum_Calculate(hPos); bool isChecksumOK = (ROMChecksum + ROMComplementChecksum == 0xffff) & (ROMChecksum == CalculatedChecksum); if (!isChecksumOK) { Console.WriteLine("Correcting checksum..."); uint CalcComplement = 0xffff - CalculatedChecksum; //Write New Checksum ROM[hPos + 0x2F] = (byte)(CalculatedChecksum >> 8); ROM[hPos + 0x2E] = (byte)(CalculatedChecksum & 0xFF); //Write New Compliment ROM[hPos + 0x2D] = (byte)(CalcComplement >> 8); ROM[hPos + 0x2C] = (byte)(CalcComplement & 0xFF); return true; } else { Console.WriteLine("Checksum OK"); return false; } }