using System; using BizHawk.Common.BufferExtensions; using BizHawk.Emulation.Common; using BizHawk.Emulation.Common.Components.LR35902; using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; using BizHawk.Emulation.Cores.Nintendo.GBHawk; using System.Runtime.InteropServices; namespace BizHawk.Emulation.Cores.Nintendo.GBHawkLink { [Core( "GBHawkLink", "", isPorted: false, isReleased: false)] [ServiceNotApplicable(typeof(IDriveLight))] public partial class GBHawkLink : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable, ILinkable, ISettable { // we want to create two GBHawk instances that we will run concurrently // maybe up to 4 eventually? public GBHawk.GBHawk L; public GBHawk.GBHawk R; // if true, the link cable is currently connected private bool _cableconnected = true; // if true, the link cable toggle signal is currently asserted private bool _cablediscosignal = false; //[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); linkSettings = (GBLinkSettings)settings ?? new GBLinkSettings(); linkSyncSettings = (GBLinkSyncSettings)syncSettings ?? new GBLinkSyncSettings(); _controllerDeck = new GBHawkLinkControllerDeck(GBHawkControllerDeck.DefaultControllerName, GBHawkControllerDeck.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.DivInitialTime = linkSyncSettings.DivInitialTime_L; temp_sync_R.DivInitialTime = linkSyncSettings.DivInitialTime_R; temp_sync_L.RTCInitialTime = linkSyncSettings.RTCInitialTime_L; temp_sync_R.RTCInitialTime = linkSyncSettings.RTCInitialTime_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(this); ser.Register(this); _tracer = new TraceBuffer { Header = L.cpu.TraceHeader }; ser.Register(_tracer); ServiceProvider = ser; SetupMemoryDomains(); HardReset(); LinkConnected = _cableconnected; } public void HardReset() { L.HardReset(); R.HardReset(); } public DisplayType Region => DisplayType.NTSC; public int _frame = 0; private readonly GBHawkLinkControllerDeck _controllerDeck; private readonly ITraceable _tracer; public bool LinkConnected { get; private set; } private void ExecFetch(ushort addr) { MemoryCallbacks.CallExecutes(addr, "System Bus"); } } }