public C64(CoreLoadParameters <C64Settings, C64SyncSettings> lp) { PutSyncSettings((C64SyncSettings)lp.SyncSettings ?? new C64SyncSettings()); PutSettings((C64Settings)lp.Settings ?? new C64Settings()); var ser = new BasicServiceProvider(this); ServiceProvider = ser; CoreComm = lp.Comm; _roms = lp.Roms.Select(r => r.RomData).ToList(); _currentDisk = 0; RomSanityCheck(); Init(SyncSettings.VicType, Settings.BorderType, SyncSettings.SidType, SyncSettings.TapeDriveType, SyncSettings.DiskDriveType); _cyclesPerFrame = _board.Vic.CyclesPerFrame; _memoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" }); InitMedia(_roms[_currentDisk]); HardReset(); switch (SyncSettings.VicType) { case VicType.Ntsc: case VicType.Drean: case VicType.NtscOld: Region = DisplayType.NTSC; break; case VicType.Pal: Region = DisplayType.PAL; break; } if (_board.Sid != null) { _soundProvider = new DCFilter(_board.Sid, 512); ser.Register <ISoundProvider>(_soundProvider); } ser.Register <IVideoProvider>(_board.Vic); ser.Register <IDriveLight>(this); _tracer = new TraceBuffer { Header = _board.Cpu.TraceHeader }; ser.Register <ITraceable>(_tracer); ser.Register <IStatable>(new StateSerializer(SyncState)); if (_board.CartPort.IsConnected) { // There are no multi-cart cart games, so just hardcode .First() RomDetails = $"{lp.Game.Name}\r\nSHA1:{_roms.First().HashSHA1()}\r\nMD5:{_roms.First().HashMD5()}\r\nMapper Impl \"{_board.CartPort.CartridgeType}\""; } SetupMemoryDomains(); }
public C64(CoreComm comm, IEnumerable <byte[]> roms, GameInfo game, object settings, object syncSettings) { PutSyncSettings((C64SyncSettings)syncSettings ?? new C64SyncSettings()); PutSettings((C64Settings)settings ?? new C64Settings()); var ser = new BasicServiceProvider(this); ServiceProvider = ser; InputCallbacks = new InputCallbackSystem(); CoreComm = comm; _roms = roms?.ToList() ?? new List <byte[]>(); _currentDisk = 0; RomSanityCheck(); Init(SyncSettings.VicType, Settings.BorderType, SyncSettings.SidType, SyncSettings.TapeDriveType, SyncSettings.DiskDriveType); _cyclesPerFrame = _board.Vic.CyclesPerFrame; _memoryCallbacks = new MemoryCallbackSystem(); HardReset(); switch (SyncSettings.VicType) { case VicType.Ntsc: case VicType.Drean: case VicType.NtscOld: Region = DisplayType.NTSC; break; case VicType.Pal: Region = DisplayType.PAL; break; } if (_board.Sid != null) { _soundProvider = new DCFilter(_board.Sid, 512); ser.Register <ISoundProvider>(_soundProvider); } ser.Register <IVideoProvider>(_board.Vic); ser.Register <IDriveLight>(this); _tracer = new TraceBuffer { Header = _board.Cpu.TraceHeader }; ser.Register <ITraceable>(_tracer); if (_board.CartPort.IsConnected) { // There are no multi-cart cart games, so just hardcode .First() CoreComm.RomStatusDetails = $"{game.Name}\r\nSHA1:{_roms.First().HashSHA1()}\r\nMD5:{roms.First().HashMD5()}\r\nMapper Impl \"{_board.CartPort.CartridgeType}\""; } SetupMemoryDomains(); }
public MGBAHawk(byte[] file, CoreComm comm, SyncSettings syncSettings, Settings settings, bool deterministic, GameInfo game) { _syncSettings = syncSettings ?? new SyncSettings(); _settings = settings ?? new Settings(); DeterministicEmulation = deterministic; byte[] bios = comm.CoreFileProvider.GetFirmware("GBA", "Bios", false); DeterministicEmulation &= bios != null; if (DeterministicEmulation != deterministic) { throw new InvalidOperationException("A BIOS is required for deterministic recordings!"); } if (!DeterministicEmulation && bios != null && !_syncSettings.RTCUseRealTime && !_syncSettings.SkipBios) { // in these situations, this core is deterministic even though it wasn't asked to be DeterministicEmulation = true; } if (bios != null && bios.Length != 16384) { throw new InvalidOperationException("BIOS must be exactly 16384 bytes!"); } var skipBios = !DeterministicEmulation && _syncSettings.SkipBios; _core = LibmGBA.BizCreate(bios, file, file.Length, GetOverrideInfo(game), skipBios); if (_core == IntPtr.Zero) { throw new InvalidOperationException($"{nameof(LibmGBA.BizCreate)}() returned NULL! Bad BIOS? and/or ROM?"); } try { CreateMemoryDomains(file.Length); var ser = new BasicServiceProvider(this); ser.Register <IDisassemblable>(new ArmV4Disassembler()); ser.Register <IMemoryDomains>(_memoryDomains); ServiceProvider = ser; PutSettings(_settings); _tracer = new TraceBuffer { Header = "ARM7: PC, machine code, mnemonic, operands, registers" }; _tracecb = new LibmGBA.TraceCallback((msg) => _tracer.Put(_traceInfo(msg))); ser.Register(_tracer); } catch { LibmGBA.BizDestroy(_core); throw; } }
//[CoreConstructor("GB", "GBC")] public GBHawkLink(CoreComm comm, GameInfo game_L, byte[] rom_L, GameInfo game_R, byte[] rom_R, /*string gameDbFn,*/ object settings, object syncSettings) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; linkSettings = (GBLinkSettings)settings ?? new GBLinkSettings(); linkSyncSettings = (GBLinkSyncSettings)syncSettings ?? new GBLinkSyncSettings(); _controllerDeck = new GBHawkLinkControllerDeck(GBHawkLinkControllerDeck.DefaultControllerName, GBHawkLinkControllerDeck.DefaultControllerName); CoreComm = comm; var temp_set_L = new GBHawk.GBHawk.GBSettings(); var temp_set_R = new GBHawk.GBHawk.GBSettings(); var temp_sync_L = new GBHawk.GBHawk.GBSyncSettings(); var temp_sync_R = new GBHawk.GBHawk.GBSyncSettings(); temp_sync_L.ConsoleMode = linkSyncSettings.ConsoleMode_L; temp_sync_R.ConsoleMode = linkSyncSettings.ConsoleMode_R; temp_sync_L.GBACGB = linkSyncSettings.GBACGB; temp_sync_R.GBACGB = linkSyncSettings.GBACGB; temp_sync_L.RTCInitialTime = linkSyncSettings.RTCInitialTime_L; temp_sync_R.RTCInitialTime = linkSyncSettings.RTCInitialTime_R; temp_sync_L.RTCOffset = linkSyncSettings.RTCOffset_L; temp_sync_R.RTCOffset = linkSyncSettings.RTCOffset_R; L = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider }, game_L, rom_L, temp_set_L, temp_sync_L); R = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider }, game_R, rom_R, temp_set_R, temp_sync_R); ser.Register <IVideoProvider>(this); ser.Register <ISoundProvider>(this); _tracer = new TraceBuffer { Header = L.cpu.TraceHeader }; ser.Register <ITraceable>(_tracer); _lStates = L.ServiceProvider.GetService <IStatable>(); _rStates = R.ServiceProvider.GetService <IStatable>(); SetupMemoryDomains(); HardReset(); }
private void ConnectTracer() { trace_cb = new LibYabause.TraceCallback(YabauseTraceCallback); Tracer = new TraceBuffer() { Header = TraceHeader }; ServiceProvider = new BasicServiceProvider(this); (ServiceProvider as BasicServiceProvider).Register <ITraceable>(Tracer); }
private void ConnectTracer() { trace_cb = new OctoshockDll.ShockCallback_Trace(ShockTraceCallback); Tracer = new TraceBuffer() { Header = TraceHeader }; ServiceProvider = new BasicServiceProvider(this); (ServiceProvider as BasicServiceProvider).Register <ITraceable>(Tracer); }
public PCEngine(CoreComm comm, GameInfo game, Disc disc, object Settings, object syncSettings) { CoreComm = comm; Tracer = new TraceBuffer(); MemoryCallbacks = new MemoryCallbackSystem(); DriveLightEnabled = true; systemid = "PCECD"; Type = NecSystemType.TurboCD; this.disc = disc; this._settings = (PCESettings)Settings ?? new PCESettings(); _syncSettings = (PCESyncSettings)syncSettings ?? new PCESyncSettings(); GameInfo biosInfo; byte[] rom = CoreComm.CoreFileProvider.GetFirmwareWithGameInfo("PCECD", "Bios", true, out biosInfo, "PCE-CD System Card not found. Please check the BIOS settings in Config->Firmwares."); if (biosInfo.Status == RomStatus.BadDump) { CoreComm.ShowMessage( "The PCE-CD System Card you have selected is known to be a bad dump. This may cause problems playing PCE-CD games.\n\n" + "It is recommended that you find a good dump of the system card. Sorry to be the bearer of bad news!"); } else if (biosInfo.NotInDatabase) { CoreComm.ShowMessage( "The PCE-CD System Card you have selected is not recognized in our database. That might mean it's a bad dump, or isn't the correct rom."); } else if (biosInfo["BIOS"] == false) { //zeromus says: someone please write a note about how this could possibly happen. //it seems like this is a relic of using gameDB for storing whether something is a bios? firmwareDB should be handling it now. CoreComm.ShowMessage( "The PCE-CD System Card you have selected is not a BIOS image. You may have selected the wrong rom. FYI-Please report this to developers, I don't think this error message should happen."); } if (biosInfo["SuperSysCard"]) { game.AddOption("SuperSysCard"); } if (game["NeedSuperSysCard"] && game["SuperSysCard"] == false) { CoreComm.ShowMessage( "This game requires a version 3.0 System card and won't run with the system card you've selected. Try selecting a 3.0 System Card in the firmware configuration."); throw new Exception(); } game.FirmwareHash = rom.HashSHA1(); Init(game, rom); // the default RomStatusDetails don't do anything with Disc CoreComm.RomStatusDetails = string.Format("{0}\r\nDisk partial hash:{1}", game.Name, new DiscSystem.DiscHasher(disc).OldHash()); SetControllerButtons(); }
public Intellivision(CoreComm comm, byte[] rom, Intellivision.IntvSettings settings, Intellivision.IntvSyncSettings syncSettings) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; _rom = rom; _settings = (IntvSettings)settings ?? new IntvSettings(); _syncSettings = (IntvSyncSettings)syncSettings ?? new IntvSyncSettings(); _controllerDeck = new IntellivisionControllerDeck(_syncSettings.Port1, _syncSettings.Port2); _cart = new Intellicart(); if (_cart.Parse(_rom) == -1) { _cart = new Cartridge(); _cart.Parse(_rom); } _cpu = new CP1610 { ReadMemory = ReadMemory, WriteMemory = WriteMemory, MemoryCallbacks = MemoryCallbacks }; _cpu.Reset(); _stic = new STIC { ReadMemory = ReadMemory, WriteMemory = WriteMemory }; _stic.Reset(); _psg = new PSG { ReadMemory = ReadMemory, WriteMemory = WriteMemory }; _psg.Reset(); ser.Register <IVideoProvider>(_stic); ser.Register <ISoundProvider>(_psg); Connect(); LoadExecutiveRom(comm.CoreFileProvider.GetFirmware("INTV", "EROM", true, "Executive ROM is required.")); LoadGraphicsRom(comm.CoreFileProvider.GetFirmware("INTV", "GROM", true, "Graphics ROM is required.")); _tracer = new TraceBuffer { Header = _cpu.TraceHeader }; ser.Register <ITraceable>(_tracer); ser.Register <IStatable>(new StateSerializer(SyncState)); SetupMemoryDomains(); }
public GBHawkLink3x(CoreLoadParameters <GBLink3xSettings, GBLink3xSyncSettings> lp) { if (lp.Roms.Count != 3) { throw new InvalidOperationException("Wrong number of roms"); } var ser = new BasicServiceProvider(this); ServiceProvider = ser; Link3xSettings = (GBLink3xSettings)lp.Settings ?? new GBLink3xSettings(); Link3xSyncSettings = (GBLink3xSyncSettings)lp.SyncSettings ?? new GBLink3xSyncSettings(); _controllerDeck = new GBHawkLink3xControllerDeck(GBHawkLink3xControllerDeck.DefaultControllerName, GBHawkLink3xControllerDeck.DefaultControllerName, GBHawkLink3xControllerDeck.DefaultControllerName); var tempSetL = new GBHawk.GBHawk.GBSettings(); var tempSetC = new GBHawk.GBHawk.GBSettings(); var tempSetR = new GBHawk.GBHawk.GBSettings(); var tempSyncL = new GBHawk.GBHawk.GBSyncSettings(); var tempSyncC = new GBHawk.GBHawk.GBSyncSettings(); var tempSyncR = new GBHawk.GBHawk.GBSyncSettings(); tempSyncL.ConsoleMode = Link3xSyncSettings.ConsoleMode_L; tempSyncC.ConsoleMode = Link3xSyncSettings.ConsoleMode_C; tempSyncR.ConsoleMode = Link3xSyncSettings.ConsoleMode_R; tempSyncL.GBACGB = Link3xSyncSettings.GBACGB; tempSyncC.GBACGB = Link3xSyncSettings.GBACGB; tempSyncR.GBACGB = Link3xSyncSettings.GBACGB; tempSyncL.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_L; tempSyncC.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_C; tempSyncR.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_R; tempSyncL.RTCOffset = Link3xSyncSettings.RTCOffset_L; tempSyncC.RTCOffset = Link3xSyncSettings.RTCOffset_C; tempSyncR.RTCOffset = Link3xSyncSettings.RTCOffset_R; L = new GBHawk.GBHawk(lp.Comm, lp.Roms[0].Game, lp.Roms[0].RomData, tempSetL, tempSyncL); C = new GBHawk.GBHawk(lp.Comm, lp.Roms[1].Game, lp.Roms[1].RomData, tempSetC, tempSyncC); R = new GBHawk.GBHawk(lp.Comm, lp.Roms[2].Game, lp.Roms[2].RomData, tempSetR, tempSyncR); ser.Register <IVideoProvider>(this); ser.Register <ISoundProvider>(this); _tracer = new TraceBuffer(L.cpu.TraceHeader); ser.Register(_tracer); _lStates = L.ServiceProvider.GetService <IStatable>(); _cStates = C.ServiceProvider.GetService <IStatable>(); _rStates = R.ServiceProvider.GetService <IStatable>(); SetupMemoryDomains(); HardReset(); }
public Intellivision(CoreComm comm, GameInfo game, byte[] rom, object Settings, object SyncSettings) { ServiceProvider = new BasicServiceProvider(this); CoreComm = comm; _rom = rom; _gameInfo = game; this.Settings = (IntvSettings)Settings ?? new IntvSettings(); this.SyncSettings = (IntvSyncSettings)SyncSettings ?? new IntvSyncSettings(); ControllerDeck = new IntellivisionControllerDeck(this.SyncSettings.Port1, this.SyncSettings.Port2); ControllerDefinition.BoolButtons.Add("Power"); ControllerDefinition.BoolButtons.Add("Reset"); _cart = new Intellicart(); if (_cart.Parse(_rom) == -1) { _cart = new Cartridge(); _cart.Parse(_rom); } _cpu = new CP1610(); _cpu.ReadMemory = ReadMemory; _cpu.WriteMemory = WriteMemory; _cpu.Reset(); _stic = new STIC(); _stic.ReadMemory = ReadMemory; _stic.WriteMemory = WriteMemory; _stic.Reset(); (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(_stic); _psg = new PSG(); _psg.Reset(); _psg.ReadMemory = ReadMemory; _psg.WriteMemory = WriteMemory; (ServiceProvider as BasicServiceProvider).Register <ISoundProvider>(_psg); Connect(); //_cpu.LogData(); LoadExecutiveRom(CoreComm.CoreFileProvider.GetFirmware("INTV", "EROM", true, "Executive ROM is required.")); LoadGraphicsRom(CoreComm.CoreFileProvider.GetFirmware("INTV", "GROM", true, "Graphics ROM is required.")); Tracer = new TraceBuffer { Header = _cpu.TraceHeader }; (ServiceProvider as BasicServiceProvider).Register <ITraceable>(Tracer); SetupMemoryDomains(); }
public ChannelF(CoreLoadParameters <ChannelFSettings, ChannelFSyncSettings> lp) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; CoreComm = lp.Comm; _gameInfo = lp.Roms.Select(r => r.Game).ToList(); _files = lp.Roms.Select(r => r.RomData).ToList(); var settings = lp.Settings ?? new ChannelFSettings(); var syncSettings = lp.SyncSettings ?? new ChannelFSyncSettings(); region = syncSettings.Region; MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" }); ControllerDefinition = ChannelFControllerDefinition; var bios01 = CoreComm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131253")); var bios02 = CoreComm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131254")); //var bios02 = CoreComm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl90025")); Cartridge = VesCartBase.Configure(_gameInfo.First(), _files.First()); BIOS01 = bios01; BIOS02 = bios02; CPU = new F3850 { ReadMemory = ReadBus, WriteMemory = WriteBus, ReadHardware = ReadPort, WriteHardware = WritePort, DummyReadMemory = ReadBus }; _tracer = new TraceBuffer(CPU.TraceHeader); //var rom = _files.First(); //Array.Copy(rom, 0, Rom, 0, rom.Length); CalcClock(); ser.Register <IVideoProvider>(this); ser.Register <ITraceable>(_tracer); ser.Register <IDisassemblable>(CPU); ser.Register <ISoundProvider>(this); ser.Register <IStatable>(new StateSerializer(SyncState)); SetupMemoryDomains(); }
public NES(CoreComm comm, GameInfo game, byte[] rom, object Settings, object SyncSettings) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; byte[] fdsbios = comm.CoreFileProvider.GetFirmware("NES", "Bios_FDS", false); if (fdsbios != null && fdsbios.Length == 40976) { comm.ShowMessage("Your FDS BIOS is a bad dump. BizHawk will attempt to use it, but no guarantees! You should find a new one."); var tmp = new byte[8192]; Buffer.BlockCopy(fdsbios, 16 + 8192 * 3, tmp, 0, 8192); fdsbios = tmp; } this.SyncSettings = (NESSyncSettings)SyncSettings ?? new NESSyncSettings(); this.ControllerSettings = this.SyncSettings.Controls; CoreComm = comm; MemoryCallbacks = new MemoryCallbackSystem(); BootGodDB.Initialize(); videoProvider = new MyVideoProvider(this); Init(game, rom, fdsbios); if (Board is FDS) { DriveLightEnabled = true; (Board as FDS).SetDriveLightCallback((val) => DriveLightOn = val); // bit of a hack: we don't have a private gamedb for FDS, but the frontend // expects this to be set. RomStatus = game.Status; } PutSettings((NESSettings)Settings ?? new NESSettings()); ser.Register <IDisassemblable>(cpu); Tracer = new TraceBuffer { Header = cpu.TraceHeader }; ser.Register <ITraceable>(Tracer); ser.Register <IVideoProvider>(videoProvider); if (Board is BANDAI_FCG_1) { var reader = (Board as BANDAI_FCG_1).reader; // not all BANDAI FCG 1 boards have a barcode reader if (reader != null) { ser.Register <DatachBarcode>(reader); } } }
//[CoreConstructor("GB", "GBC")] public GBHawkLink3x(CoreComm comm, GameInfo game_L, byte[] rom_L, GameInfo game_C, byte[] rom_C, GameInfo game_R, byte[] rom_R, /*string gameDbFn,*/ object settings, object syncSettings) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; Link3xSettings = (GBLink3xSettings)settings ?? new GBLink3xSettings(); Link3xSyncSettings = (GBLink3xSyncSettings)syncSettings ?? new GBLink3xSyncSettings(); _controllerDeck = new GBHawkLink3xControllerDeck(GBHawkLink3xControllerDeck.DefaultControllerName, GBHawkLink3xControllerDeck.DefaultControllerName, GBHawkLink3xControllerDeck.DefaultControllerName); var tempSetL = new GBHawk.GBHawk.GBSettings(); var tempSetC = new GBHawk.GBHawk.GBSettings(); var tempSetR = new GBHawk.GBHawk.GBSettings(); var tempSyncL = new GBHawk.GBHawk.GBSyncSettings(); var tempSyncC = new GBHawk.GBHawk.GBSyncSettings(); var tempSyncR = new GBHawk.GBHawk.GBSyncSettings(); tempSyncL.ConsoleMode = Link3xSyncSettings.ConsoleMode_L; tempSyncC.ConsoleMode = Link3xSyncSettings.ConsoleMode_C; tempSyncR.ConsoleMode = Link3xSyncSettings.ConsoleMode_R; tempSyncL.GBACGB = Link3xSyncSettings.GBACGB; tempSyncC.GBACGB = Link3xSyncSettings.GBACGB; tempSyncR.GBACGB = Link3xSyncSettings.GBACGB; tempSyncL.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_L; tempSyncC.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_C; tempSyncR.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_R; tempSyncL.RTCOffset = Link3xSyncSettings.RTCOffset_L; tempSyncC.RTCOffset = Link3xSyncSettings.RTCOffset_C; tempSyncR.RTCOffset = Link3xSyncSettings.RTCOffset_R; L = new GBHawk.GBHawk(comm, game_L, rom_L, tempSetL, tempSyncL); C = new GBHawk.GBHawk(comm, game_C, rom_C, tempSetC, tempSyncC); R = new GBHawk.GBHawk(comm, game_R, rom_R, tempSetR, tempSyncR); ser.Register <IVideoProvider>(this); ser.Register <ISoundProvider>(this); _tracer = new TraceBuffer { Header = L.cpu.TraceHeader }; ser.Register(_tracer); _lStates = L.ServiceProvider.GetService <IStatable>(); _cStates = C.ServiceProvider.GetService <IStatable>(); _rStates = R.ServiceProvider.GetService <IStatable>(); SetupMemoryDomains(); HardReset(); }
public ColecoVision(CoreComm comm, GameInfo game, byte[] rom, ColecoSettings settings, ColecoSyncSettings syncSettings) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; _syncSettings = (ColecoSyncSettings)syncSettings ?? new ColecoSyncSettings(); bool skipBios = _syncSettings.SkipBiosIntro; _cpu = new Z80A { FetchMemory = ReadMemory, ReadMemory = ReadMemory, WriteMemory = WriteMemory, ReadHardware = ReadPort, WriteHardware = WritePort, MemoryCallbacks = MemoryCallbacks }; PSG = new SN76489col(); SGM_sound = new AY_3_8910_SGM(); _blip.SetRates(3579545, 44100); ControllerDeck = new ColecoVisionControllerDeck(_syncSettings.Port1, _syncSettings.Port2); _vdp = new TMS9918A(_cpu); ser.Register <IVideoProvider>(_vdp); ser.Register <IStatable>(new StateSerializer(SyncState)); // TODO: hack to allow bios-less operation would be nice, no idea if its feasible _biosRom = comm.CoreFileProvider.GetFirmwareOrThrow(new("Coleco", "Bios"), "Coleco BIOS file is required."); // gamedb can overwrite the SyncSettings; this is ok if (game["NoSkip"]) { skipBios = false; } use_SGM = _syncSettings.UseSGM; if (use_SGM) { Console.WriteLine("Using the Super Game Module"); } LoadRom(rom, skipBios); SetupMemoryDomains(); ser.Register <IDisassemblable>(_cpu); ser.Register <ITraceable>(_tracer = new TraceBuffer(_cpu.TraceHeader)); }
public GBHawkLink(CoreLoadParameters <GBHawkLink.GBLinkSettings, GBHawkLink.GBLinkSyncSettings> lp) { if (lp.Roms.Count != 2) { throw new InvalidOperationException("Wrong number of roms"); } var ser = new BasicServiceProvider(this); ServiceProvider = ser; linkSettings = (GBLinkSettings)lp.Settings ?? new GBLinkSettings(); linkSyncSettings = (GBLinkSyncSettings)lp.SyncSettings ?? new GBLinkSyncSettings(); _controllerDeck = new GBHawkLinkControllerDeck(GBHawkLinkControllerDeck.DefaultControllerName, GBHawkLinkControllerDeck.DefaultControllerName); var temp_set_L = new GBHawk.GBHawk.GBSettings(); var temp_set_R = new GBHawk.GBHawk.GBSettings(); var temp_sync_L = new GBHawk.GBHawk.GBSyncSettings(); var temp_sync_R = new GBHawk.GBHawk.GBSyncSettings(); temp_sync_L.ConsoleMode = linkSyncSettings.ConsoleMode_L; temp_sync_R.ConsoleMode = linkSyncSettings.ConsoleMode_R; temp_sync_L.GBACGB = linkSyncSettings.GBACGB; temp_sync_R.GBACGB = linkSyncSettings.GBACGB; temp_sync_L.RTCInitialTime = linkSyncSettings.RTCInitialTime_L; temp_sync_R.RTCInitialTime = linkSyncSettings.RTCInitialTime_R; temp_sync_L.RTCOffset = linkSyncSettings.RTCOffset_L; temp_sync_R.RTCOffset = linkSyncSettings.RTCOffset_R; L = new GBHawk.GBHawk(lp.Comm, lp.Roms[0].Game, lp.Roms[0].RomData, temp_set_L, temp_sync_L); R = new GBHawk.GBHawk(lp.Comm, lp.Roms[1].Game, lp.Roms[1].RomData, temp_set_R, temp_sync_R); ser.Register <IVideoProvider>(this); ser.Register <ISoundProvider>(this); _tracer = new TraceBuffer { Header = L.cpu.TraceHeader }; ser.Register <ITraceable>(_tracer); _lStates = L.ServiceProvider.GetService <IStatable>(); _rStates = R.ServiceProvider.GetService <IStatable>(); SetupMemoryDomains(); HardReset(); }
public SubNESHawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ object settings, object syncSettings) { var subNesSettings = (NES.NES.NESSettings)settings ?? new NES.NES.NESSettings(); var subNesSyncSettings = (NES.NES.NESSyncSettings)syncSettings ?? new NES.NES.NESSyncSettings(); _nesCore = new NES.NES(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider }, game, rom, subNesSettings, subNesSyncSettings) { using_reset_timing = true }; HardReset(); current_cycle = 0; _nesCore.cpu.ext_ppu_cycle = current_cycle; VBL_CNT = 0; _nesStatable = _nesCore.ServiceProvider.GetService <IStatable>(); var ser = new BasicServiceProvider(this); ServiceProvider = ser; ser.Register(_nesCore.ServiceProvider.GetService <IVideoProvider>()); ser.Register(_nesCore.ServiceProvider.GetService <ISoundProvider>()); ser.Register(_nesCore.ServiceProvider.GetService <ITraceable>()); ser.Register(_nesCore.ServiceProvider.GetService <IDisassemblable>()); ser.Register(_nesCore.ServiceProvider.GetService <IMemoryDomains>()); ser.Register(_nesCore.ServiceProvider.GetService <INESPPUViewable>()); ser.Register(_nesCore.ServiceProvider.GetService <IBoardInfo>()); ser.Register(_nesCore.ServiceProvider.GetService <ISaveRam>()); ser.Register(_nesCore.ServiceProvider.GetService <IDebuggable>()); ser.Register(_nesCore.ServiceProvider.GetService <IRegionable>()); ser.Register(_nesCore.ServiceProvider.GetService <ICodeDataLogger>()); _tracer = new TraceBuffer { Header = "6502: PC, machine code, mnemonic, operands, registers (A, X, Y, P, SP), flags (NVTBDIZCR), CPU Cycle, PPU Cycle" }; ser.Register(_tracer); var barCodeService = _nesCore.ServiceProvider.GetService <DatachBarcode>(); if (barCodeService != null) { ser.Register(barCodeService); } }
public SubNESHawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ NES.NES.NESSettings settings, NES.NES.NESSyncSettings syncSettings) { var subNesSettings = (NES.NES.NESSettings)settings ?? new NES.NES.NESSettings(); var subNesSyncSettings = (NES.NES.NESSyncSettings)syncSettings ?? new NES.NES.NESSyncSettings(); _nesCore = new NES.NES(comm, game, rom, subNesSettings, subNesSyncSettings) { using_reset_timing = true }; // Adds Reset timing control to controller definition _nesCore.ResetControllerDefinition(); HardReset(); current_cycle = 0; _nesCore.cpu.ext_ppu_cycle = current_cycle; VblankCount = 0; _nesStatable = _nesCore.ServiceProvider.GetService <IStatable>(); var ser = new BasicServiceProvider(this); ServiceProvider = ser; ser.Register(_nesCore.ServiceProvider.GetService <IVideoProvider>()); ser.Register(_nesCore.ServiceProvider.GetService <ISoundProvider>()); ser.Register(_nesCore.ServiceProvider.GetService <ITraceable>()); ser.Register(_nesCore.ServiceProvider.GetService <IDisassemblable>()); ser.Register(_nesCore.ServiceProvider.GetService <IMemoryDomains>()); ser.Register(_nesCore.ServiceProvider.GetService <INESPPUViewable>()); ser.Register(_nesCore.ServiceProvider.GetService <IBoardInfo>()); ser.Register(_nesCore.ServiceProvider.GetService <ISaveRam>()); ser.Register(_nesCore.ServiceProvider.GetService <IDebuggable>()); ser.Register(_nesCore.ServiceProvider.GetService <IRegionable>()); ser.Register(_nesCore.ServiceProvider.GetService <ICodeDataLogger>()); const string TRACE_HEADER = "6502: PC, machine code, mnemonic, operands, registers (A, X, Y, P, SP), flags (NVTBDIZCR), CPU Cycle, PPU Cycle"; _tracer = new TraceBuffer(TRACE_HEADER); ser.Register(_tracer); var barCodeService = _nesCore.ServiceProvider.GetService <DatachBarcode>(); if (barCodeService != null) { ser.Register(barCodeService); } }
public C64(CoreComm comm, IEnumerable <byte[]> roms, object settings, object syncSettings) { PutSyncSettings((C64SyncSettings)syncSettings ?? new C64SyncSettings()); PutSettings((C64Settings)settings ?? new C64Settings()); var ser = new BasicServiceProvider(this); ServiceProvider = ser; InputCallbacks = new InputCallbackSystem(); CoreComm = comm; Roms = roms?.ToList() ?? new List <byte[]>(); _currentDisk = 0; RomSanityCheck(); Init(SyncSettings.VicType, Settings.BorderType, SyncSettings.SidType, SyncSettings.TapeDriveType, SyncSettings.DiskDriveType); _cyclesPerFrame = _board.Vic.CyclesPerFrame; SetupMemoryDomains(_board.DiskDrive != null); _memoryCallbacks = new MemoryCallbackSystem(); HardReset(); switch (SyncSettings.VicType) { case VicType.Ntsc: case VicType.Drean: case VicType.NtscOld: Region = DisplayType.NTSC; break; case VicType.Pal: Region = DisplayType.PAL; break; } if (_board.Sid != null) { _soundProvider = new DCFilter(_board.Sid, 512); ser.Register <ISoundProvider>(_soundProvider); } ser.Register <IVideoProvider>(_board.Vic); ser.Register <IDriveLight>(this); _tracer = new TraceBuffer { Header = _board.Cpu.TraceHeader }; ser.Register <ITraceable>(_tracer); }
public GGHawkLink(CoreComm comm, GameInfo game_L, byte[] rom_L, GameInfo game_R, byte[] rom_R, /*string gameDbFn,*/ object settings, object syncSettings) { var ser = new BasicServiceProvider(this); linkSettings = (GGLinkSettings)settings ?? new GGLinkSettings(); linkSyncSettings = (GGLinkSyncSettings)syncSettings ?? new GGLinkSyncSettings(); _controllerDeck = new GGHawkLinkControllerDeck(GGHawkLinkControllerDeck.DefaultControllerName, GGHawkLinkControllerDeck.DefaultControllerName); CoreComm = comm; var temp_set_L = new SMS.SmsSettings(); var temp_set_R = new SMS.SmsSettings(); var temp_sync_L = new SMS.SmsSyncSettings(); var temp_sync_R = new SMS.SmsSyncSettings(); L = new SMS(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider }, game_L, rom_L, temp_set_L, temp_sync_L); R = new SMS(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider }, game_R, rom_R, temp_set_R, temp_sync_R); ser.Register <IVideoProvider>(this); ser.Register <ISoundProvider>(this); _tracer = new TraceBuffer { Header = L.Cpu.TraceHeader }; ser.Register <ITraceable>(_tracer); ServiceProvider = ser; SetupMemoryDomains(); HardReset(); L.stand_alone = false; R.stand_alone = false; _lStates = L.ServiceProvider.GetService <IStatable>(); _rStates = R.ServiceProvider.GetService <IStatable>(); }
public Atari2600(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; _ram = new byte[128]; CoreComm = comm; Settings = (A2600Settings)settings ?? new A2600Settings(); SyncSettings = (A2600SyncSettings)syncSettings ?? new A2600SyncSettings(); _controllerDeck = new Atari2600ControllerDeck(SyncSettings.Port1, SyncSettings.Port2); _leftDifficultySwitchPressed = SyncSettings.LeftDifficulty; _rightDifficultySwitchPressed = SyncSettings.RightDifficulty; Rom = rom; _game = game; if (!game.GetOptionsDict().ContainsKey("m")) { game.AddOption("m", DetectMapper(rom)); } if (Rom.HashSHA1() == "3A77DB43B6583E8689435F0F14AA04B9E57BDDED" || Rom.HashSHA1() == "E986E1818E747BEB9B33CE4DFF1CDC6B55BDB620" || Rom.HashSHA1() == "982B8016B393A9AA7DD110295A53C4612ECF2141") { game.RemoveOption("m"); game.AddOption("m", "F8_sega"); } Console.WriteLine("Game uses mapper " + game.GetOptionsDict()["m"]); Console.WriteLine(Rom.HashSHA1()); RebootCore(); SetupMemoryDomains(); Tracer = new TraceBuffer { Header = Cpu.TraceHeader }; ser.Register <IDisassemblable>(Cpu); ser.Register <ITraceable>(Tracer); ser.Register <IVideoProvider>(_tia); ser.Register <ISoundProvider>(_dcfilter); ser.Register <IStatable>(new StateSerializer(SyncState)); }
public MSX(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings) { ServiceProvider = new BasicServiceProvider(this); Settings = (MSXSettings)settings ?? new MSXSettings(); SyncSettings = (MSXSyncSettings)syncSettings ?? new MSXSyncSettings(); CoreComm = comm; RomData = rom; if (RomData.Length % BankSize != 0) { Array.Resize(ref RomData, ((RomData.Length / BankSize) + 1) * BankSize); } MSX_Pntr = LibMSX.MSX_create(); LibMSX.MSX_load(MSX_Pntr, RomData, (uint)RomData.Length, 0); blip_L.SetRates(3579545, 44100); blip_R.SetRates(3579545, 44100); (ServiceProvider as BasicServiceProvider).Register <ISoundProvider>(this); SetupMemoryDomains(); InputCallbacks = new InputCallbackSystem(); Header_Length = LibMSX.MSX_getheaderlength(MSX_Pntr); Disasm_Length = LibMSX.MSX_getdisasmlength(MSX_Pntr); Reg_String_Length = LibMSX.MSX_getregstringlength(MSX_Pntr); StringBuilder new_header = new StringBuilder(Header_Length); LibMSX.MSX_getheader(MSX_Pntr, new_header, Header_Length); Console.WriteLine(Header_Length + " " + Disasm_Length + " " + Reg_String_Length); Tracer = new TraceBuffer { Header = new_header.ToString() }; var serviceProvider = ServiceProvider as BasicServiceProvider; serviceProvider.Register <ITraceable>(Tracer); }
public Atari2600(GameInfo game, byte[] rom, Atari2600.A2600Settings settings, Atari2600.A2600SyncSettings syncSettings) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; _ram = new byte[128]; Settings = (A2600Settings)settings ?? new A2600Settings(); SyncSettings = (A2600SyncSettings)syncSettings ?? new A2600SyncSettings(); _controllerDeck = new Atari2600ControllerDeck(SyncSettings.Port1, SyncSettings.Port2); _leftDifficultySwitchPressed = SyncSettings.LeftDifficulty; _rightDifficultySwitchPressed = SyncSettings.RightDifficulty; Rom = rom; _game = game; if (!game.GetOptions().ContainsKey("m")) { game.AddOption("m", DetectMapper(rom)); } var romHashSHA1 = SHA1Checksum.ComputePrefixedHex(Rom); if (romHashSHA1 is RomChecksums.CongoBongo or RomChecksums.Tapper or RomChecksums.KangarooNotInGameDB) { game.RemoveOption("m"); game.AddOption("m", "F8_sega"); } Console.WriteLine("Game uses mapper " + game.GetOptions()["m"]); Console.WriteLine(romHashSHA1); RebootCore(); SetupMemoryDomains(); Tracer = new TraceBuffer(Cpu.TraceHeader); ser.Register <IDisassemblable>(Cpu); ser.Register <ITraceable>(Tracer); ser.Register <IVideoProvider>(_tia); ser.Register <ISoundProvider>(_dcfilter); ser.Register <IStatable>(new StateSerializer(SyncState)); }
public GGHawkLink(CoreLoadParameters <GGLinkSettings, GGLinkSyncSettings> lp) { if (lp.Roms.Count != 2) { throw new InvalidOperationException("Wrong number of roms"); } var ser = new BasicServiceProvider(this); linkSettings = (GGLinkSettings)lp.Settings ?? new GGLinkSettings(); linkSyncSettings = (GGLinkSyncSettings)lp.SyncSettings ?? new GGLinkSyncSettings(); _controllerDeck = new GGHawkLinkControllerDeck(GGHawkLinkControllerDeck.DefaultControllerName, GGHawkLinkControllerDeck.DefaultControllerName); var temp_set_L = new SMS.SmsSettings(); var temp_set_R = new SMS.SmsSettings(); var temp_sync_L = new SMS.SmsSyncSettings(); var temp_sync_R = new SMS.SmsSyncSettings(); L = new SMS(lp.Comm, lp.Roms[0].Game, lp.Roms[0].RomData, temp_set_L, temp_sync_L); R = new SMS(lp.Comm, lp.Roms[1].Game, lp.Roms[1].RomData, temp_set_R, temp_sync_R); ser.Register <IVideoProvider>(this); ser.Register <ISoundProvider>(this); _tracer = new TraceBuffer { Header = L.Cpu.TraceHeader }; ser.Register(_tracer); ServiceProvider = ser; SetupMemoryDomains(); HardReset(); L.stand_alone = false; R.stand_alone = false; _lStates = L.ServiceProvider.GetService <IStatable>(); _rStates = R.ServiceProvider.GetService <IStatable>(); }
public AppleII(CoreComm comm, GameInfo game, byte[] rom, Settings settings) { GameInfoSet = new List <GameInfo>(); var ser = new BasicServiceProvider(this); ServiceProvider = ser; CoreComm = comm; Tracer = new TraceBuffer { Header = "6502: PC, opcode, register (A, X, Y, P, SP, Cy) flags (NVTBDIZC)" }; MemoryCallbacks = new MemoryCallbackSystem(); InputCallbacks = new InputCallbackSystem(); _disk1 = rom; RomSet.Add(rom); _appleIIRom = comm.CoreFileProvider.GetFirmware( SystemId, "AppleIIe", true, "The Apple IIe BIOS firmware is required"); _diskIIRom = comm.CoreFileProvider.GetFirmware( SystemId, "DiskII", true, "The DiskII firmware is required"); _machine = new Machine(_appleIIRom, _diskIIRom); _machine.BizInitialize(); //make a writeable memory stream cloned from the rom. //for junk.dsk the .dsk is important because it determines the format from that InitDisk(); ser.Register <ITraceable>(Tracer); setCallbacks(); InitSaveStates(); SetupMemoryDomains(); PutSettings(settings ?? new Settings()); }
public ChannelF(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; CoreComm = comm; InputCallbacks = new InputCallbackSystem(); MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" }); ControllerDefinition = ChannelFControllerDefinition; CPU = new F3850 { ReadMemory = ReadBus, WriteMemory = WriteBus, ReadHardware = ReadPort, WriteHardware = WritePort, DummyReadMemory = ReadBus }; _tracer = new TraceBuffer { Header = CPU.TraceHeader }; byte[] bios01 = comm.CoreFileProvider.GetFirmware("ChannelF", "ChannelF_sl131253", true); byte[] bios02 = comm.CoreFileProvider.GetFirmware("ChannelF", "ChannelF_sl131254", true); BIOS01 = bios01; BIOS02 = bios02; Array.Copy(rom, 0, Rom, 0, rom.Length); CalcClock(); ser.Register <IVideoProvider>(this); ser.Register <ITraceable>(_tracer); ser.Register <IDisassemblable>(CPU); ser.Register <ISoundProvider>(this); SetupMemoryDomains(); }
public TI83(CoreComm comm, GameInfo game, byte[] rom, object Settings) { ServiceProvider = new BasicServiceProvider(this); InputCallbacks = new InputCallbackSystem(); MemoryCallbacks = new MemoryCallbackSystem(); PutSettings((TI83Settings)Settings ?? new TI83Settings()); CoreComm = comm; Cpu.ReadMemory = ReadMemory; Cpu.WriteMemory = WriteMemory; Cpu.ReadHardware = ReadHardware; Cpu.WriteHardware = WriteHardware; Cpu.IRQCallback = IRQCallback; Cpu.NMICallback = NMICallback; Cpu.MemoryCallbacks = MemoryCallbacks; Rom = rom; LinkPort = new TI83LinkPort(this); // different calculators (different revisions?) have different initPC. we track this in the game database by rom hash // if( *(unsigned long *)(m_pRom + 0x6ce) == 0x04D3163E ) m_Regs.PC.W = 0x6ce; //KNOWN // else if( *(unsigned long *)(m_pRom + 0x6f6) == 0x04D3163E ) m_Regs.PC.W = 0x6f6; //UNKNOWN if (game["initPC"]) { startPC = ushort.Parse(game.OptionValue("initPC"), NumberStyles.HexNumber); } HardReset(); SetupMemoryDomains(); Tracer = new TraceBuffer { Header = Cpu.TraceHeader }; var serviceProvider = ServiceProvider as BasicServiceProvider; serviceProvider.Register <ITraceable>(Tracer); serviceProvider.Register <IDisassemblable>(new Disassembler()); }
public SubGBHawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ object settings, object syncSettings) { var subGBSettings = (GBHawk.GBHawk.GBSettings)settings ?? new GBHawk.GBHawk.GBSettings(); var subGBSyncSettings = (GBHawk.GBHawk.GBSyncSettings)syncSettings ?? new GBHawk.GBHawk.GBSyncSettings(); _GBCore = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify) { CoreFileProvider = comm.CoreFileProvider }, game, rom, subGBSettings, subGBSyncSettings); HardReset(); current_cycle = 0; VBL_CNT = 0; _GBStatable = _GBCore.ServiceProvider.GetService <IStatable>(); var ser = new BasicServiceProvider(this); ServiceProvider = ser; ser.Register(_GBCore.ServiceProvider.GetService <IVideoProvider>()); ser.Register(_GBCore.ServiceProvider.GetService <ISoundProvider>()); ser.Register(_GBCore.ServiceProvider.GetService <ITraceable>()); ser.Register(_GBCore.ServiceProvider.GetService <IMemoryDomains>()); ser.Register(_GBCore.ServiceProvider.GetService <ISaveRam>()); ser.Register(_GBCore.ServiceProvider.GetService <IDebuggable>()); ser.Register(_GBCore.ServiceProvider.GetService <IRegionable>()); ser.Register(_GBCore.ServiceProvider.GetService <ICodeDataLogger>()); _tracer = new TraceBuffer { Header = _GBCore.cpu.TraceHeader }; ser.Register(_tracer); _GBCore.ControllerDefinition.FloatControls.Add("Input Cycle"); _GBCore.ControllerDefinition.FloatRanges.Add(new ControllerDefinition.FloatRange(0, 70224, 70224)); }
public ChannelF(CoreComm comm, GameInfo game, byte[] rom) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" }); ControllerDefinition = ChannelFControllerDefinition; CPU = new F3850 { ReadMemory = ReadBus, WriteMemory = WriteBus, ReadHardware = ReadPort, WriteHardware = WritePort, DummyReadMemory = ReadBus }; _tracer = new TraceBuffer(CPU.TraceHeader); var bios01 = comm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131253")); var bios02 = comm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131254")); BIOS01 = bios01; BIOS02 = bios02; Array.Copy(rom, 0, Rom, 0, rom.Length); CalcClock(); ser.Register <IVideoProvider>(this); ser.Register <ITraceable>(_tracer); ser.Register <IDisassemblable>(CPU); ser.Register <ISoundProvider>(this); ser.Register <IStatable>(new StateSerializer(SyncState)); SetupMemoryDomains(); }
public NES(CoreComm comm, GameInfo game, byte[] rom, NESSettings settings, NESSyncSettings syncSettings, bool subframe = false) { var ser = new BasicServiceProvider(this); ServiceProvider = ser; var fdsBios = comm.CoreFileProvider.GetFirmware(new("NES", "Bios_FDS")); if (fdsBios != null && fdsBios.Length == 40976) { comm.ShowMessage("Your FDS BIOS is a bad dump. BizHawk will attempt to use it, but no guarantees! You should find a new one."); var tmp = new byte[8192]; Buffer.BlockCopy(fdsBios, 16 + 8192 * 3, tmp, 0, 8192); fdsBios = tmp; } SyncSettings = (NESSyncSettings)syncSettings ?? new NESSyncSettings(); ControllerSettings = SyncSettings.Controls; videoProvider = new MyVideoProvider(this); Init(game, rom, fdsBios); if (Board is FDS fds) { DriveLightEnabled = true; fds.SetDriveLightCallback(val => DriveLightOn = val); // bit of a hack: we don't have a private gamedb for FDS, but the frontend // expects this to be set. RomStatus = game.Status; } PutSettings((NESSettings)settings ?? new NESSettings()); // we need to put this here because the line directly above will overwrite palette intialization anywhere else // TODO: What if settings are later loaded? if (_isVS) { PickVSPalette(cart); } ser.Register <IDisassemblable>(cpu); Tracer = new TraceBuffer(cpu.TraceHeader); ser.Register <ITraceable>(Tracer); ser.Register <IVideoProvider>(videoProvider); ser.Register <ISoundProvider>(this); ser.Register <IStatable>(new StateSerializer(SyncState) { LoadStateCallback = SetupMemoryDomains }); if (Board is BANDAI_FCG_1 bandai) { var reader = bandai.reader; // not all BANDAI FCG 1 boards have a barcode reader if (reader != null) { ser.Register(reader); } } ResetControllerDefinition(subframe); }
public VBANext(byte[] file, CoreComm comm, GameInfo game, bool deterministic, object syncsettings) { var ser = new BasicServiceProvider(this); ser.Register <IDisassemblable>(new ArmV4Disassembler()); ServiceProvider = ser; CoreComm = comm; byte[] biosfile = CoreComm.CoreFileProvider.GetFirmware("GBA", "Bios", true, "GBA bios file is mandatory."); if (file.Length > 32 * 1024 * 1024) { throw new ArgumentException("ROM is too big to be a GBA ROM!"); } if (biosfile.Length != 16 * 1024) { throw new ArgumentException("BIOS file is not exactly 16K!"); } LibVBANext.FrontEndSettings FES = new LibVBANext.FrontEndSettings(); FES.saveType = (LibVBANext.FrontEndSettings.SaveType)game.GetInt("saveType", 0); FES.flashSize = (LibVBANext.FrontEndSettings.FlashSize)game.GetInt("flashSize", 0x10000); FES.enableRtc = game.GetInt("rtcEnabled", 0) != 0; FES.mirroringEnable = game.GetInt("mirroringEnabled", 0) != 0; Console.WriteLine("GameDB loaded settings: saveType={0}, flashSize={1}, rtcEnabled={2}, mirroringEnabled={3}", FES.saveType, FES.flashSize, FES.enableRtc, FES.mirroringEnable); _syncSettings = (SyncSettings)syncsettings ?? new SyncSettings(); DeterministicEmulation = deterministic; FES.skipBios = _syncSettings.SkipBios; FES.RTCUseRealTime = _syncSettings.RTCUseRealTime; FES.RTCwday = (int)_syncSettings.RTCInitialDay; FES.RTCyear = _syncSettings.RTCInitialTime.Year % 100; FES.RTCmonth = _syncSettings.RTCInitialTime.Month - 1; FES.RTCmday = _syncSettings.RTCInitialTime.Day; FES.RTChour = _syncSettings.RTCInitialTime.Hour; FES.RTCmin = _syncSettings.RTCInitialTime.Minute; FES.RTCsec = _syncSettings.RTCInitialTime.Second; if (DeterministicEmulation) { // FES.skipBios = false; // this is OK; it is deterministic and probably accurate FES.RTCUseRealTime = false; } Core = LibVBANext.Create(); if (Core == IntPtr.Zero) { throw new InvalidOperationException("Create() returned nullptr!"); } try { if (!LibVBANext.LoadRom(Core, file, (uint)file.Length, biosfile, (uint)biosfile.Length, FES)) { throw new InvalidOperationException("LoadRom() returned false!"); } Tracer = new TraceBuffer(); ser.Register <ITraceable>(Tracer); CoreComm.VsyncNum = 262144; CoreComm.VsyncDen = 4389; CoreComm.NominalWidth = 240; CoreComm.NominalHeight = 160; GameCode = Encoding.ASCII.GetString(file, 0xac, 4); Console.WriteLine("Game code \"{0}\"", GameCode); savebuff = new byte[LibVBANext.BinStateSize(Core)]; savebuff2 = new byte[savebuff.Length + 13]; InitMemoryDomains(); InitRegisters(); InitCallbacks(); // todo: hook me up as a setting SetupColors(); } catch { Dispose(); throw; } }