Example #1
0
        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;
        }
Example #2
0
        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);
                }
            }
        }