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;