public void load(Mode cartridge_mode, string[] xml_list) { mode = cartridge_mode; region = Region.NTSC; ram_size = 0; spc7110_data_rom_offset = 0x100000; supergameboy_version = SuperGameBoyVersion.Version1; supergameboy_ram_size = 0; supergameboy_rtc_size = 0; has_bsx_slot = false; has_superfx = false; has_sa1 = false; has_srtc = false; has_sdd1 = false; has_spc7110 = false; has_spc7110rtc = false; has_cx4 = false; has_dsp1 = false; has_dsp2 = false; has_dsp3 = false; has_dsp4 = false; has_obc1 = false; has_st0010 = false; has_st0011 = false; has_st0018 = false; has_msu1 = false; has_serial = false; parse_xml(xml_list); if (ram_size > 0) { MappedRAM.cartram.map(Enumerable.Repeat<byte>(0xff, (int)ram_size).ToArray(), ram_size); } if (has_srtc || has_spc7110rtc) { MappedRAM.cartram.map(Enumerable.Repeat<byte>(0xff, 20).ToArray(), 20); } if (mode == Mode.Bsx) { MappedRAM.bsxram.map(Enumerable.Repeat<byte>(0xff, 32 * 1024).ToArray(), 32 * 1024); MappedRAM.bsxram.map(Enumerable.Repeat<byte>(0xff, 512 * 1024).ToArray(), 512 * 1024); } if (mode == Mode.SufamiTurbo) { if (!ReferenceEquals(MappedRAM.stArom.data(), null)) { MappedRAM.stAram.map(Enumerable.Repeat<byte>(0xff, 128 * 1024).ToArray(), 128 * 1024); } if (!ReferenceEquals(MappedRAM.stBrom.data(), null)) { MappedRAM.stBram.map(Enumerable.Repeat<byte>(0xff, 128 * 1024).ToArray(), 128 * 1024); } } if (mode == Mode.SuperGameBoy) { if (!ReferenceEquals(MappedRAM.gbrom.data(), null)) { if (Convert.ToBoolean(supergameboy_ram_size)) { MappedRAM.gbram.map(Enumerable.Repeat<byte>(0xff, (int)supergameboy_ram_size).ToArray(), supergameboy_ram_size); } if (Convert.ToBoolean(supergameboy_rtc_size)) { MappedRAM.gbrtc.map(Enumerable.Repeat<byte>(0x00, (int)supergameboy_rtc_size).ToArray(), supergameboy_rtc_size); } } } MappedRAM.cartrom.write_protect(true); MappedRAM.cartram.write_protect(false); MappedRAM.cartrtc.write_protect(false); MappedRAM.bsxflash.write_protect(true); MappedRAM.bsxram.write_protect(false); MappedRAM.bsxpram.write_protect(false); MappedRAM.stArom.write_protect(true); MappedRAM.stAram.write_protect(false); MappedRAM.stBrom.write_protect(true); MappedRAM.stBram.write_protect(false); MappedRAM.gbrom.write_protect(true); MappedRAM.gbram.write_protect(false); MappedRAM.gbrtc.write_protect(false); uint checksum = Bit.ToUint32(~0); foreach (var n in MappedRAM.cartrom.data()) { checksum = CRC32.adjust(checksum, n); } if (MappedRAM.bsxflash.size() != 0 && MappedRAM.bsxflash.size() != Bit.ToUint32(~0)) { foreach (var n in MappedRAM.bsxflash.data()) { checksum = CRC32.adjust(checksum, n); } } if (MappedRAM.stArom.size() != 0 && MappedRAM.stArom.size() != Bit.ToUint32(~0)) { foreach (var n in MappedRAM.stArom.data()) { checksum = CRC32.adjust(checksum, n); } } if (MappedRAM.stBrom.size() != 0 && MappedRAM.stBrom.size() != Bit.ToUint32(~0)) { foreach (var n in MappedRAM.stBrom.data()) { checksum = CRC32.adjust(checksum, n); } } if (MappedRAM.gbrom.size() != 0 && MappedRAM.gbrom.size() != Bit.ToUint32(~0)) { foreach (var n in MappedRAM.gbrom.data()) { checksum = CRC32.adjust(checksum, n); } } crc32 = ~checksum; //// TODO: verify hash //var sha = new SHA256Managed(); //var shahash = sha.ComputeHash(MappedRAM.cartrom.data()); //string hash = string.Empty; //foreach (var n in shahash) //{ // hash += n.ToString("X2"); //} //sha256 = hash; Bus.bus.load_cart(); System.system.serialize_init(); loaded = true; }
private void xml_parse_supergameboy(XElement root) { if (mode != Mode.SuperGameBoy) { return; } if (root.Attributes("revision").Any()) { if (root.Attribute("revision").Value == "1") { supergameboy_version = SuperGameBoyVersion.Version1; } if (root.Attribute("revision").Value == "2") { supergameboy_version = SuperGameBoyVersion.Version2; } } foreach (var node in root.Elements("mmio")) { foreach (var leaf in node.Elements("map")) { Mapping m = new Mapping((Memory)SuperGameBoy.supergameboy); if (leaf.Attributes("address").Any()) { xml_parse_address(m, leaf.Attribute("address").Value); } mapping.Add(m); } } }