示例#1
0
    //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);
        }
    }
示例#2
0
    //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;
        }
    }