private MemoryDomain MakeMemoryDomain(string name, mupen64plusApi.N64_MEMORY id, MemoryDomain.Endian endian) { int size = api.get_memory_size(id); //if this type of memory isnt available, dont make the memory domain if (size == 0) { return(null); } IntPtr memPtr = api.get_memory_ptr(id); var md = new MemoryDomain( name, size, endian, delegate(int addr) { if (addr < 0 || addr >= size) { throw new ArgumentOutOfRangeException(); } return(Marshal.ReadByte(memPtr, addr)); }, delegate(int addr, byte val) { if (addr < 0 || addr >= size) { throw new ArgumentOutOfRangeException(); } Marshal.WriteByte(memPtr + addr, val); }); _memoryDomains.Add(md); return(md); }
private void MakeMemoryDomain(string name, mupen64plusApi.N64_MEMORY id, MemoryDomain.Endian endian, bool swizzled = false) { int size = api.get_memory_size(id); //if this type of memory isnt available, don't make the memory domain if (size == 0) { return; } IntPtr memPtr = api.get_memory_ptr(id); Func <long, byte> peekByte; Action <long, byte> pokeByte; if (swizzled) { peekByte = addr => { if (addr < 0 || addr >= size) { throw new ArgumentOutOfRangeException(); } return(Marshal.ReadByte(memPtr, (int)(addr ^ 3))); }; pokeByte = (addr, val) => { if (addr < 0 || addr >= size) { throw new ArgumentOutOfRangeException(); } Marshal.WriteByte(memPtr, (int)(addr ^ 3), val); }; } else { peekByte = addr => { if (addr < 0 || addr >= size) { throw new ArgumentOutOfRangeException(); } return(Marshal.ReadByte(memPtr, (int)(addr))); }; pokeByte = (addr, val) => { if (addr < 0 || addr >= size) { throw new ArgumentOutOfRangeException(); } Marshal.WriteByte(memPtr, (int)(addr), val); }; } var md = new MemoryDomainDelegate(name, size, endian, peekByte, pokeByte, 4); _memoryDomains.Add(md); }