Пример #1
0
        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);
        }
Пример #2
0
        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);
        }