Esempio n. 1
0
        public bool ReadRom()
        {
            bool valid = false;

            try
            {
                FileInfo fInfo = new FileInfo(Filename);
                RomSize = fInfo.Length;

                if (!(fInfo.Extension.ToLower() == ".smc") && !(fInfo.Extension.ToLower() == ".sfc"))
                {
                    Console.Error.WriteLine("Invalid ROM extension: " + fInfo.Extension);
                }
                else if (RomSize < 0x300000 || RomSize > 0x600000)
                {
                    Console.Error.WriteLine("Invalid ROM size: $" + RomSize.ToString("X8"));
                }
                else
                {
                    FileStream   fStream = new FileStream(Filename, FileMode.Open, FileAccess.Read);
                    BinaryReader br      = new BinaryReader(fStream);
                    Content = br.ReadBytes((int)fInfo.Length);
                    br.Close();
                    fStream.Close();
                    RemoveHeader();
                    valid = true;
                }
            }
            catch (Exception e)
            {
                Console.Error.WriteLine("Unable to read ROM " + Filename, "Error: " + e.Message);
            }

            return(valid);
        }
        public void WriteToIni(IniData iniData, int romIndex)
        {
            string sectionName = "ROM" + romIndex.ToString();

            iniData.Sections.AddSection(sectionName);
            iniData[sectionName].AddKey("FULL_ID", FullId);
            iniData[sectionName].AddKey("ID", Id);
            iniData[sectionName].AddKey("NAME", Name);
            iniData[sectionName].AddKey("TV", GetTvString());
            iniData[sectionName].AddKey("CIC", GetCicString());
            iniData[sectionName].AddKey("SAVE", GetSaveString());
            iniData[sectionName].AddKey("SAVE_OFFSET", SaveOffset.ToString());
            iniData[sectionName].AddKey("ROM_SIZE", RomSize.ToString());
            iniData[sectionName].AddKey("ROM_CRC", RomCrc.ToString("X08"));

            for (int i = 0; i < 32; i++)
            {
                string mappingKey = "MAPPING" + i.ToString();
                byte   mapping    = 0;
                if (FlashPartitions.Length > i)
                {
                    mapping = FlashPartitions[i].Offset;
                }
                iniData[sectionName].AddKey(mappingKey, mapping.ToString());
            }
        }
Esempio n. 3
0
        private static string GetCartridgeType(RomSize size)
        {
            switch (size)
            {
            case RomSize.Size1Gb: return("1GB");

            case RomSize.Size2Gb: return("2GB");

            case RomSize.Size4Gb: return("4GB");

            case RomSize.Size8Gb: return("8GB");

            case RomSize.Size16Gb: return("16GB");

            case RomSize.Size32Gb: return("32GB");

            default: return(string.Empty);
            }
        }
Esempio n. 4
0
        public SCP_FLASH_IMAGE(RomSize FlashSize)
        {
            switch (FlashSize)
            {
            case RomSize._88k:
                bank1 = new byte[0x8000];
                break;

            case RomSize._112k:
                bank1 = new byte[0xE000];
                break;

            case RomSize._216k:
                bank1 = new byte[0xC000];
                break;

            default:
                throw new ArgumentOutOfRangeException("Invalid romsize when constructing SCP_FLASH_IMAGE");
            }
            flash_size = FlashSize;
            vin        = new SCP_VIN_Parser();
        }
Esempio n. 5
0
        public void ResetRam(RomSize romSize)
        {
            this.romSize = romSize;
            // Initialize
            ResetSegments();
            // ROM map
            if (romSize == RomSize.ExHiROM || romSize == RomSize.HiROM)
            {
                // HiROM
                AddSegment(0xc00000, 0xffffff, 0);
                AddSegment(0x400000, 0x7fffff, 0);
                for (Int32 a = 0x0; a <= 0x3f0000; a += 0x10000)
                {
                    CopySegment(0x8000 + a, 0x8000 + a + 0x400000);
                    CopySegment(0xa000 + a, 0xa000 + a + 0x400000);
                    CopySegment(0xc000 + a, 0xc000 + a + 0x400000);
                    CopySegment(0xe000 + a, 0xe000 + a + 0x400000);
                    CopySegment(0x808000 + a, 0x8000 + a + 0xc00000);
                    CopySegment(0x80a000 + a, 0xa000 + a + 0xc00000);
                    CopySegment(0x80c000 + a, 0xc000 + a + 0xc00000);
                    CopySegment(0x80e000 + a, 0xe000 + a + 0xc00000);
                }
            }
            else if (romSize == RomSize.LoROM)
            {
                // LoROM
                for (Int32 a = 0; a <= 0x7f0000; a += 0x10000)
                {
                    AddSegment(0x8000 + a, 0xffff + a, 0);
                }
                for (Int32 a = 0x800000; a <= 0xff0000; a += 0x10000)
                {
                    AddSegment(0x8000 + a, 0xffff + a, 0);
                }
                for (Int32 a = 0x400000; a <= 0x7f0000; a += 0x10000)
                {
                    CopySegment(0x0000 + a, 0x8000 + a - 0x400000);
                    CopySegment(0x2000 + a, 0xa000 + a - 0x400000);
                    CopySegment(0x4000 + a, 0xc000 + a - 0x400000);
                    CopySegment(0x6000 + a, 0xe000 + a - 0x400000);
                }
                for (Int32 a = 0xc00000; a <= 0xff0000; a += 0x10000)
                {
                    CopySegment(0x0000 + a, 0x8000 + a - 0x400000);
                    CopySegment(0x2000 + a, 0xa000 + a - 0x400000);
                    CopySegment(0x4000 + a, 0xc000 + a - 0x400000);
                    CopySegment(0x6000 + a, 0xe000 + a - 0x400000);
                }
            }

            // Fix mempointer
            mempointer = (ROMupperbound + 1) >> 13;
            // Main RAM map
            RAMlowerbound = mempointer << 13;
            AddSegment(0x7e0000, 0x7fffff, 0);
            RAMupperbound = ((mempointer) << 13) - 1;
            // I/O
            map[0x1] = -0x10000;    //-0xe000;     //-0x2000;
            map[0x2] = -0x10000;    //-0xc000;     //-0x4000;
            map[0x3] = -0x10000;    //-0xa000;     //-0x6000;
            // Low mirrored memory
            for (Int32 a = 0; a <= 0x3f0000; a += 0x10000)
            {
                CopySegment(0x0000 + a, 0x7e0000);
                CopySegment(0x2000 + a, 0x002000);
                CopySegment(0x4000 + a, 0x004000);
                CopySegment(0x6000 + a, 0x006000);
                CopySegment(0x800000 + a, 0x7e0000);
                CopySegment(0x802000 + a, 0x002000);
                CopySegment(0x804000 + a, 0x004000);
                CopySegment(0x806000 + a, 0x006000);
            }
            // SRam
            SRAMlowerbound = mempointer << 13;
            switch (HeaderGetSRAMsize())
            {
            case 1:
            case 2:
            case 3:        // 0x2000
                AddSegment(0x700000, 0x701fff, 0);
                CopySegment(0x702000, 0x700000);
                CopySegment(0x704000, 0x700000);
                CopySegment(0x706000, 0x700000);
                CopySegment(0x708000, 0x700000);
                CopySegment(0x70a000, 0x700000);
                CopySegment(0x70c000, 0x700000);
                CopySegment(0x70e000, 0x700000);
                SRAMupperbound = SRAMlowerbound - 1 + (1024 << (HeaderGetSRAMsize()));
                break;

            case 4:         // 0x4000
                AddSegment(0x700000, 0x703fff, 0);
                CopySegment(0x704000, 0x700000);
                CopySegment(0x706000, 0x702000);
                CopySegment(0x708000, 0x700000);
                CopySegment(0x70a000, 0x702000);
                CopySegment(0x70c000, 0x700000);
                CopySegment(0x70e000, 0x702000);
                SRAMupperbound = ((mempointer) << 13) - 1;
                break;

            case 5:         // 0x8000
                AddSegment(0x700000, 0x707fff, 0);
                CopySegment(0x708000, 0x700000);
                CopySegment(0x70a000, 0x702000);
                CopySegment(0x70c000, 0x704000);
                CopySegment(0x70e000, 0x706000);
                SRAMupperbound = ((mempointer) << 13) - 1;
                break;

            case 6:         // 0x10000
                AddSegment(0x700000, 0x70ffff, 0);
                SRAMupperbound = ((mempointer) << 13) - 1;
                break;

            default:
                SRAMupperbound = ((mempointer) << 13) - 1;
                break;
            }
            // HiROM sram
            if (SRAMupperbound > SRAMlowerbound)
            {
                Int32 sramMirrors = ((0x400 << HeaderGetSRAMsize()) / 0x2000) - 1;
                if (sramMirrors == -1)
                {
                    sramMirrors = 0;
                }
                Int32 u = 0;
                for (Int32 a = 0; a <= 0x3f0000; a += 0x10000)
                {
                    CopySegment(0x006000 + a, 0x700000 + (sramMirrors & u) * 0x2000);
                    CopySegment(0x806000 + a, 0x700000 + (sramMirrors & u) * 0x2000);
                    u++;
                }
            }
            // Set all ram bytes to 0x55
            for (Int32 i = RAMlowerbound; i <= RAMupperbound; i++)
            {
                mem[i] = 0x55;
            }
        }