private void CreateMemoryDomain(LibGambatte.MemoryAreas which, string name) { IntPtr data = IntPtr.Zero; int length = 0; if (!LibGambatte.gambatte_getmemoryarea(GambatteState, which, ref data, ref length)) { throw new Exception($"{nameof(LibGambatte.gambatte_getmemoryarea)}() failed!"); } // if length == 0, it's an empty block; (usually rambank on some carts); that's ok if (data != IntPtr.Zero && length > 0) { _memoryDomains.Add(new MemoryDomainIntPtr(name, MemoryDomain.Endian.Little, data, length, true, 1)); } }
unsafe void CreateMemoryDomain(LibGambatte.MemoryAreas which, string name) { IntPtr data = IntPtr.Zero; int length = 0; if (!LibGambatte.gambatte_getmemoryarea(GambatteState, which, ref data, ref length)) { throw new Exception("gambatte_getmemoryarea() failed!"); } // if length == 0, it's an empty block; (usually rambank on some carts); that's ok // TODO: when length == 0, should we simply not add the memory domain at all? 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; })); }