public override bool Configure(NES.EDetectionOrigin origin) { switch (Cart.board_type) { case "MAPPER085": // as in some VRC2/VRC4 cases, this is actually a "composite" mapping that catches // both kinds of VRC7 (but screws up some of the address mirrors) remap = (addr) => (addr & 0xF000) | (addr & 0x30) >> 4 | (addr & 0x8) >> 3; fm = new YM2413(YM2413.ChipType.VRC7); break; case "KONAMI-VRC-7": AssertPrg(128, 512); AssertChr(0, 128); AssertVram(0, 8); AssertWram(0, 8); if (Cart.pcb == "353429") { //tiny toons 2 // for consistency, we map the addr line used for the FM chip even though // there is no resonator or crystal on the board for the fm chip remap = (addr) => (addr & 0xF000) | ((addr & 0x8) >> 3) | (addr & 0x20) >> 4; fm = null; } else if (Cart.pcb == "352402") { //lagrange point remap = (addr) => ((addr & 0xF000) | ((addr & 0x30) >> 4)); fm = new YM2413(YM2413.ChipType.VRC7); } else throw new Exception("Unknown PCB type for VRC7"); break; case "MAPPER117": // not sure quite what this is // different address mapping, and somewhat different irq logic Cart.vram_size = 0; Cart.wram_size = 0; remap = RemapM117; fm = null; break; default: return false; } prg_bank_mask_8k = Cart.prg_size / 8 - 1; chr_bank_mask_1k = Cart.chr_size - 1; SetMirrorType(EMirrorType.Vertical); prg_banks_8k[3] = (byte)(0xFF & prg_bank_mask_8k); return true; }
public SMS(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings) { Settings = (SMSSettings)settings ?? new SMSSettings(); SyncSettings = (SMSSyncSettings)syncSettings ?? new SMSSyncSettings(); CoreComm = comm; IsGameGear = game.System == "GG"; IsSG1000 = game.System == "SG"; RomData = rom; CoreComm.CpuTraceAvailable = true; if (RomData.Length % BankSize != 0) Array.Resize(ref RomData, ((RomData.Length / BankSize) + 1) * BankSize); RomBanks = (byte)(RomData.Length / BankSize); DisplayType = DetermineDisplayType(SyncSettings.DisplayType, game.Region); if (game["PAL"] && DisplayType != DisplayType.PAL) { DisplayType = DisplayType.PAL; CoreComm.Notify("Display was forced to PAL mode for game compatibility."); } if (IsGameGear) DisplayType = DisplayType.NTSC; // all game gears run at 60hz/NTSC mode CoreComm.VsyncNum = DisplayType == DisplayType.NTSC ? 60 : 50; CoreComm.VsyncDen = 1; Region = SyncSettings.ConsoleRegion; if (Region == "Auto") Region = DetermineRegion(game.Region); if (game["Japan"] && Region != "Japan") { Region = "Japan"; CoreComm.Notify("Region was forced to Japan for game compatibility."); } if ((game.NotInDatabase || game["FM"]) && SyncSettings.EnableFM && !IsGameGear) HasYM2413 = true; if (Controller == null) Controller = NullController.GetNullController(); Cpu = new Z80A(); Cpu.RegisterSP = 0xDFF0; Cpu.ReadHardware = ReadPort; Cpu.WriteHardware = WritePort; Vdp = new VDP(this, Cpu, IsGameGear ? VdpMode.GameGear : VdpMode.SMS, DisplayType); PSG = new SN76489(); YM2413 = new YM2413(); SoundMixer = new SoundMixer(YM2413, PSG); if (HasYM2413 && game["WhenFMDisablePSG"]) SoundMixer.DisableSource(PSG); ActiveSoundProvider = HasYM2413 ? (ISoundProvider)SoundMixer : PSG; SystemRam = new byte[0x2000]; if (game["CMMapper"]) InitCodeMastersMapper(); else if (game["CMMapperWithRam"]) InitCodeMastersMapperRam(); else if (game["ExtRam"]) InitExt2kMapper(int.Parse(game.OptionValue("ExtRam"))); else if (game["KoreaMapper"]) InitKoreaMapper(); else if (game["MSXMapper"]) InitMSXMapper(); else if (game["NemesisMapper"]) InitNemesisMapper(); else if (game["TerebiOekaki"]) InitTerebiOekaki(); else InitSegaMapper(); if (Settings.ForceStereoSeparation && !IsGameGear) { if (game["StereoByte"]) { ForceStereoByte = byte.Parse(game.OptionValue("StereoByte")); } PSG.StereoPanning = ForceStereoByte; } if (SyncSettings.AllowOverlock && game["OverclockSafe"]) Vdp.IPeriod = 512; if (Settings.SpriteLimit) Vdp.SpriteLimit = true; if (game["3D"]) IsGame3D = true; if (game["BIOS"]) { Port3E = 0xF7; // Disable cartridge, enable BIOS rom InitBiosMapper(); } else if (game.System == "SMS") { BiosRom = comm.CoreFileProvider.GetFirmware("SMS", Region, false); if (BiosRom != null && (game["RequireBios"] || SyncSettings.UseBIOS)) Port3E = 0xF7; if (BiosRom == null && game["RequireBios"]) CoreComm.Notify("BIOS image not available. This game requires BIOS to function."); if (SyncSettings.UseBIOS && BiosRom == null) CoreComm.Notify("BIOS was selected, but rom image not available. BIOS not enabled."); } if (game["SRAM"]) SaveRAM = new byte[int.Parse(game.OptionValue("SRAM"))]; else if (game.NotInDatabase) SaveRAM = new byte[0x8000]; SetupMemoryDomains(); }