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