Fix NES memory domains
This commit is contained in:
parent
4b165089fd
commit
7b19db2d64
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue