diff --git a/src/BizHawk.Emulation.Common/Base Implementations/LinkedMemoryDomains.cs b/src/BizHawk.Emulation.Common/Base Implementations/LinkedMemoryDomains.cs index ab4dc731be..4670c57c0b 100644 --- a/src/BizHawk.Emulation.Common/Base Implementations/LinkedMemoryDomains.cs +++ b/src/BizHawk.Emulation.Common/Base Implementations/LinkedMemoryDomains.cs @@ -1,5 +1,6 @@ #nullable disable +using System; using System.Collections.Generic; namespace BizHawk.Emulation.Common @@ -10,10 +11,13 @@ namespace BizHawk.Emulation.Common /// public class LinkedMemoryDomains : MemoryDomainList { - public LinkedMemoryDomains(IEmulator[] linkedCores, int numCores) + public LinkedMemoryDomains(IEmulator[] linkedCores, int numCores, LinkedDisassemblable linkedDisassemblable) : base(LinkMemoryDomains(linkedCores, numCores)) { - SystemBus = linkedCores[0].AsMemoryDomains().SystemBus; + if (linkedDisassemblable is not null) + { + SystemBus = new LinkedSystemBus(linkedCores, numCores, linkedDisassemblable); + } } private static List LinkMemoryDomains(IEmulator[] linkedCores, int numCores) @@ -46,15 +50,34 @@ namespace BizHawk.Emulation.Common Writable = m.Writable; } - public override byte PeekByte(long addr) + public override byte PeekByte(long addr) => _m.PeekByte(addr); + + public override void PokeByte(long addr, byte val) => _m.PokeByte(addr, val); + } + + private class LinkedSystemBus : MemoryDomain + { + private readonly MemoryDomain[] _linkedSystemBuses; + private readonly LinkedDisassemblable _linkedDisassemblable; + + public LinkedSystemBus(IEmulator[] linkedCores, int numCores, LinkedDisassemblable linkedDisassemblable) { - return _m.PeekByte(addr); + _linkedSystemBuses = new MemoryDomain[numCores]; + _linkedDisassemblable = linkedDisassemblable; + for (int i = 0; i < numCores; i++) + { + _linkedSystemBuses[i] = linkedCores[i].AsMemoryDomains().SystemBus; + } + Name = "System Bus"; + Size = _linkedSystemBuses[0].Size; + WordSize = _linkedSystemBuses[0].WordSize; + EndianType = _linkedSystemBuses[0].EndianType; + Writable = false; } - public override void PokeByte(long addr, byte val) - { - _m.PokeByte(addr, val); - } + public override byte PeekByte(long addr) => _linkedSystemBuses[int.Parse(_linkedDisassemblable.Cpu.Substring(1, 1)) - 1].PeekByte(addr); + + public override void PokeByte(long addr, byte val) => throw new NotImplementedException(); } } } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IEmulator.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IEmulator.cs index 36d7751441..728ec1adff 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IEmulator.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IEmulator.cs @@ -261,8 +261,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy { // the GB and GBA have no IR port, so ignore them for now // todo: cart based IR - return _syncSettings._linkedSyncSettings[one].ConsoleMode is Gameboy.GambatteSyncSettings.ConsoleModeType.GBC - && _syncSettings._linkedSyncSettings[two].ConsoleMode is Gameboy.GambatteSyncSettings.ConsoleModeType.GBC; + if (IsCGBMode(one) && IsCGBMode(two)) + { + return _syncSettings._linkedSyncSettings[one].ConsoleMode is not Gameboy.GambatteSyncSettings.ConsoleModeType.GBA + && _syncSettings._linkedSyncSettings[two].ConsoleMode is not Gameboy.GambatteSyncSettings.ConsoleModeType.GBA; + } + + return false; } public int Frame { get; private set; } diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.cs index 59778a9176..bf8cc183f9 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.cs @@ -70,17 +70,17 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy GBLinkController = CreateControllerDefinition(); - _linkedSaveRam = new LinkedSaveRam(_linkedCores, _numCores); - _serviceProvider.Register(_linkedSaveRam); - - _linkedMemoryDomains = new LinkedMemoryDomains(_linkedCores, _numCores); - _serviceProvider.Register(_linkedMemoryDomains); - _linkedDebuggable = new LinkedDebuggable(_linkedCores, _numCores, _memoryCallbacks); _serviceProvider.Register(_linkedDebuggable); _linkedDisassemblable = new LinkedDisassemblable(new GBDisassembler(), _numCores); _serviceProvider.Register(_linkedDisassemblable); + + _linkedMemoryDomains = new LinkedMemoryDomains(_linkedCores, _numCores, _linkedDisassemblable); + _serviceProvider.Register(_linkedMemoryDomains); + + _linkedSaveRam = new LinkedSaveRam(_linkedCores, _numCores); + _serviceProvider.Register(_linkedSaveRam); } private readonly BasicServiceProvider _serviceProvider; @@ -105,10 +105,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy private int _numCores = 0; private readonly Gameboy[] _linkedCores; - private readonly LinkedSaveRam _linkedSaveRam; - private readonly LinkedMemoryDomains _linkedMemoryDomains; private readonly LinkedDebuggable _linkedDebuggable; private readonly LinkedDisassemblable _linkedDisassemblable; + private readonly LinkedMemoryDomains _linkedMemoryDomains; + private readonly LinkedSaveRam _linkedSaveRam; // counters to ensure we do 35112 samples per frame private readonly int[] _linkedOverflow;