Fix NES memory domains

This commit is contained in:
nattthebear 2016-07-16 16:13:50 -04:00
parent 4b165089fd
commit 7b19db2d64
3 changed files with 45 additions and 2 deletions

View File

@ -84,5 +84,36 @@ namespace BizHawk.Emulation.Common
_systemBus = value;
}
}
/// <summary>
/// for core use only
/// </summary>
public void MergeList(MemoryDomainList other)
{
var domains = this.ToDictionary(m => m.Name);
foreach (var src in other)
{
MemoryDomain dst;
if (domains.TryGetValue(src.Name, out dst))
{
TryMerge<MemoryDomainByteArray>(dst, src, (d, s) => d.Data = s.Data);
TryMerge<MemoryDomainIntPtr>(dst, src, (d, s) => d.Data = s.Data);
TryMerge<MemoryDomainIntPtrSwap16>(dst, src, (d, s) => d.Data = s.Data);
TryMerge<MemoryDomainDelegate>(dst, src, (d, s) => { d.Peek = s.Peek; d.Poke = s.Poke; });
}
}
}
/// <summary>
/// big hacks
/// </summary>
private static void TryMerge<T>(MemoryDomain dest, MemoryDomain src, Action<T, T> func)
where T : MemoryDomain
{
var d1 = dest as T;
var s1 = src as T;
if (d1 != null && s1 != null)
func(d1, s1);
}
}
}

View File

@ -9,6 +9,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public partial class NES
{
private MemoryDomainList _memoryDomains;
private bool _memoryDomainsSetup = false;
private void SetupMemoryDomains()
{
@ -67,8 +68,17 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
domains.Add((Board as ExROM).GetExRAM());
}
_memoryDomains = new MemoryDomainList(domains);
(ServiceProvider as BasicServiceProvider).Register<IMemoryDomains>(_memoryDomains);
if (!_memoryDomainsSetup)
{
_memoryDomains = new MemoryDomainList(domains);
(ServiceProvider as BasicServiceProvider).Register<IMemoryDomains>(_memoryDomains);
_memoryDomainsSetup = true;
}
else
{
var src = new MemoryDomainList(domains);
_memoryDomains.MergeList(src);
}
}
}
}

View File

@ -23,6 +23,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public void LoadStateText(TextReader reader)
{
SyncState(Serializer.CreateTextReader(reader));
SetupMemoryDomains(); // resync the memory domains
}
public void SaveStateBinary(BinaryWriter bw)
@ -33,6 +34,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public void LoadStateBinary(BinaryReader br)
{
SyncState(Serializer.CreateBinaryReader(br));
SetupMemoryDomains(); // resync the memory domains
}
public byte[] SaveStateBinary()