change n64 memdomain so that rdram is big endian, and also working now. not sure about the other memdomains, they could still be broken.
This commit is contained in:
parent
a85b1d58a1
commit
d220b94e76
|
@ -474,7 +474,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
|
||||||
|
|
||||||
#region Memory Domains
|
#region Memory Domains
|
||||||
|
|
||||||
private MemoryDomain MakeMemoryDomain(string name, mupen64plusApi.N64_MEMORY id, MemoryDomain.Endian endian)
|
private MemoryDomain MakeMemoryDomain(string name, mupen64plusApi.N64_MEMORY id, MemoryDomain.Endian endian, bool swizzled = false)
|
||||||
{
|
{
|
||||||
int size = api.get_memory_size(id);
|
int size = api.get_memory_size(id);
|
||||||
|
|
||||||
|
@ -486,28 +486,53 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
|
||||||
|
|
||||||
IntPtr memPtr = api.get_memory_ptr(id);
|
IntPtr memPtr = api.get_memory_ptr(id);
|
||||||
|
|
||||||
var md = new MemoryDomain(
|
Func<int, byte> peekByte;
|
||||||
name,
|
Action<int, byte> pokeByte;
|
||||||
size,
|
|
||||||
endian,
|
if (swizzled)
|
||||||
delegate(int addr)
|
{
|
||||||
|
peekByte = delegate(int addr)
|
||||||
{
|
{
|
||||||
if (addr < 0 || addr >= size)
|
if (addr < 0 || addr >= size)
|
||||||
{
|
{
|
||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Marshal.ReadByte(memPtr, addr);
|
return Marshal.ReadByte(memPtr, (addr ^ 3));
|
||||||
},
|
};
|
||||||
delegate(int addr, byte val)
|
pokeByte = delegate(int addr, byte val)
|
||||||
{
|
{
|
||||||
if (addr < 0 || addr >= size)
|
if (addr < 0 || addr >= size)
|
||||||
{
|
{
|
||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
Marshal.WriteByte(memPtr + addr, val);
|
Marshal.WriteByte(memPtr, (addr ^ 3), val);
|
||||||
});
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
peekByte = delegate(int addr)
|
||||||
|
{
|
||||||
|
if (addr < 0 || addr >= size)
|
||||||
|
{
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Marshal.ReadByte(memPtr, (addr));
|
||||||
|
};
|
||||||
|
pokeByte = delegate(int addr, byte val)
|
||||||
|
{
|
||||||
|
if (addr < 0 || addr >= size)
|
||||||
|
{
|
||||||
|
throw new ArgumentOutOfRangeException();
|
||||||
|
}
|
||||||
|
|
||||||
|
Marshal.WriteByte(memPtr, (addr), val);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var md = new MemoryDomain(name, size, endian, peekByte, pokeByte);
|
||||||
|
|
||||||
_memoryDomains.Add(md);
|
_memoryDomains.Add(md);
|
||||||
|
|
||||||
|
@ -516,7 +541,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
|
||||||
|
|
||||||
private void InitMemoryDomains()
|
private void InitMemoryDomains()
|
||||||
{
|
{
|
||||||
MakeMemoryDomain("RDRAM", mupen64plusApi.N64_MEMORY.RDRAM, MemoryDomain.Endian.Little);
|
//zero 07-sep-2014 - made RDRAM big endian domain, but none others. others need to be studied individually.
|
||||||
|
MakeMemoryDomain("RDRAM", mupen64plusApi.N64_MEMORY.RDRAM, MemoryDomain.Endian.Big, true);
|
||||||
|
|
||||||
MakeMemoryDomain("PI Register", mupen64plusApi.N64_MEMORY.PI_REG, MemoryDomain.Endian.Little);
|
MakeMemoryDomain("PI Register", mupen64plusApi.N64_MEMORY.PI_REG, MemoryDomain.Endian.Little);
|
||||||
MakeMemoryDomain("SI Register", mupen64plusApi.N64_MEMORY.SI_REG, MemoryDomain.Endian.Little);
|
MakeMemoryDomain("SI Register", mupen64plusApi.N64_MEMORY.SI_REG, MemoryDomain.Endian.Little);
|
||||||
MakeMemoryDomain("VI Register", mupen64plusApi.N64_MEMORY.VI_REG, MemoryDomain.Endian.Little);
|
MakeMemoryDomain("VI Register", mupen64plusApi.N64_MEMORY.VI_REG, MemoryDomain.Endian.Little);
|
||||||
|
|
Loading…
Reference in New Issue