fix a dumb bug where Auto console mode blocked GBC IR when it shouldn't have; make linked memory domains make a linked system bus for the system bus field using LinkedDisassemblable (this is only relevant for debugger disassembly anyways)

This commit is contained in:
CasualPokePlayer 2022-01-27 22:19:42 -08:00
parent 670a71c6ee
commit 8112be31e1
3 changed files with 46 additions and 18 deletions

View File

@ -1,5 +1,6 @@
#nullable disable
using System;
using System.Collections.Generic;
namespace BizHawk.Emulation.Common
@ -10,10 +11,13 @@ namespace BizHawk.Emulation.Common
/// <seealso cref="IMemoryDomains" />
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<MemoryDomain> 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();
}
}
}

View File

@ -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; }

View File

@ -70,17 +70,17 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
GBLinkController = CreateControllerDefinition();
_linkedSaveRam = new LinkedSaveRam(_linkedCores, _numCores);
_serviceProvider.Register<ISaveRam>(_linkedSaveRam);
_linkedMemoryDomains = new LinkedMemoryDomains(_linkedCores, _numCores);
_serviceProvider.Register<IMemoryDomains>(_linkedMemoryDomains);
_linkedDebuggable = new LinkedDebuggable(_linkedCores, _numCores, _memoryCallbacks);
_serviceProvider.Register<IDebuggable>(_linkedDebuggable);
_linkedDisassemblable = new LinkedDisassemblable(new GBDisassembler(), _numCores);
_serviceProvider.Register<IDisassemblable>(_linkedDisassemblable);
_linkedMemoryDomains = new LinkedMemoryDomains(_linkedCores, _numCores, _linkedDisassemblable);
_serviceProvider.Register<IMemoryDomains>(_linkedMemoryDomains);
_linkedSaveRam = new LinkedSaveRam(_linkedCores, _numCores);
_serviceProvider.Register<ISaveRam>(_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;