memory domain: minor refactor and cleanup

This commit is contained in:
goyuken 2014-08-15 21:21:17 +00:00
parent 20f78a579f
commit ceae8d71b5
5 changed files with 40 additions and 69 deletions

View File

@ -25,6 +25,41 @@ namespace BizHawk.Emulation.Common
PokeByte = pokeByte;
}
/// <summary>
/// create a memorydomain that references an unmanaged memory block
/// </summary>
/// <param name="name"></param>
/// <param name="size"></param>
/// <param name="endian"></param>
/// <param name="data">must remain valid as long as the MemoryDomain exists!</param>
/// <returns></returns>
public unsafe static MemoryDomain FromIntPtr(string name, int size, Endian endian, IntPtr data)
{
if (data == IntPtr.Zero)
throw new ArgumentNullException("data");
if (size <= 0)
throw new ArgumentOutOfRangeException("size");
byte *p = (byte*) data;
return new MemoryDomain
(
name,
size,
endian,
delegate(int addr)
{
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
return p[addr];
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
p[addr] = val;
}
);
}
public MemoryDomain() { }
public override string ToString()

View File

@ -243,27 +243,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
if (data == IntPtr.Zero)
throw new Exception("libmeteor_getmemoryarea() returned NULL??");
MemoryDomain md = new MemoryDomain(name, size, MemoryDomain.Endian.Little,
delegate(int addr)
{
unsafe
{
byte* d = (byte*)data;
if (addr < 0 || addr >= size)
throw new IndexOutOfRangeException();
return d[addr];
}
},
delegate(int addr, byte val)
{
unsafe
{
byte* d = (byte*)data;
if (addr < 0 || addr >= size)
throw new IndexOutOfRangeException();
d[addr] = val;
}
});
MemoryDomain md = MemoryDomain.FromIntPtr(name, size, MemoryDomain.Endian.Little, data);
_MemoryDomains.Add(md);
}

View File

@ -689,7 +689,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
#region MemoryDomains
unsafe void CreateMemoryDomain(LibGambatte.MemoryAreas which, string name)
void CreateMemoryDomain(LibGambatte.MemoryAreas which, string name)
{
IntPtr data = IntPtr.Zero;
int length = 0;
@ -702,21 +702,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
if (data == IntPtr.Zero && length > 0)
throw new Exception("bad return from gambatte_getmemoryarea()");
byte* ptr = (byte*)data;
_MemoryDomains.Add(new MemoryDomain(name, length, MemoryDomain.Endian.Little,
delegate(int addr)
{
if (addr < 0 || addr >= length)
throw new ArgumentOutOfRangeException();
return ptr[addr];
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= length)
throw new ArgumentOutOfRangeException();
ptr[addr] = val;
}));
_MemoryDomains.Add(MemoryDomain.FromIntPtr(name, length, MemoryDomain.Endian.Little, data));
}
void InitMemoryDomains()

View File

@ -582,23 +582,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
if (area == IntPtr.Zero || pname == IntPtr.Zero || size == 0)
continue;
string name = Marshal.PtrToStringAnsi(pname);
byte* p = (byte*)area;
mm.Add(new MemoryDomain(name, size, MemoryDomain.Endian.Unknown,
delegate(int addr)
{
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
return p[addr];
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
p[addr] = val;
}));
mm.Add(MemoryDomain.FromIntPtr(name, size, MemoryDomain.Endian.Unknown, area));
}
MemoryDomains = new MemoryDomainList(mm, 0);
}

View File

@ -315,23 +315,7 @@ namespace BizHawk.Emulation.Cores.WonderSwan
if (size == 0)
continue;
string sname = Marshal.PtrToStringAnsi(name);
byte *p = (byte*)data;
mmd.Add(new MemoryDomain(
sname,
size,
MemoryDomain.Endian.Little,
delegate(int addr)
{
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
return p[addr];
},
delegate(int addr, byte value)
{
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
p[addr] = value;
}));
mmd.Add(MemoryDomain.FromIntPtr(sname, size, MemoryDomain.Endian.Little, data));
}
MemoryDomains = new MemoryDomainList(mmd, 0);
}