コード例 #1
0
        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));
            }
        }
コード例 #2
0
ファイル: Gambatte.cs プロジェクト: stuff2600/RAEmus
        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;
            }));
        }