Пример #1
0
        private void UpdateFramerate()
        {
            VsyncNumerator = 1000000000;
            long refresh = (long)LibMAME.mame_lua_get_double(MAMELuaCommand.GetRefresh);

            VsyncDenominator = (int)(refresh / 1000000000);
        }
Пример #2
0
        private void InitMemoryDomains()
        {
            var domains = new List <MemoryDomain>();

            _systemBusAddressShift = LibMAME.mame_lua_get_int(MAMELuaCommand.GetSpaceAddressShift);
            var dataWidth    = LibMAME.mame_lua_get_int(MAMELuaCommand.GetSpaceDataWidth) >> 3;          // mame returns in bits
            var size         = (long)LibMAME.mame_lua_get_double(MAMELuaCommand.GetSpaceAddressMask) + dataWidth;
            var endianString = MameGetString(MAMELuaCommand.GetSpaceEndianness);
            var deviceName   = MameGetString(MAMELuaCommand.GetMainCPUName);

            //var addrSize = (size * 2).ToString();

            MemoryDomain.Endian endian = MemoryDomain.Endian.Unknown;

            if (endianString == "little")
            {
                endian = MemoryDomain.Endian.Little;
            }
            else if (endianString == "big")
            {
                endian = MemoryDomain.Endian.Big;
            }

            var mapCount = LibMAME.mame_lua_get_int(MAMELuaCommand.GetSpaceMapCount);

            for (int i = 1; i <= mapCount; i++)
            {
                var read  = MameGetString($"return { MAMELuaCommand.SpaceMap }[{ i }].readtype");
                var write = MameGetString($"return { MAMELuaCommand.SpaceMap }[{ i }].writetype");

                if (read == "ram" && write == "ram" || read == "rom")
                {
                    var firstOffset = LibMAME.mame_lua_get_int($"return { MAMELuaCommand.SpaceMap }[{ i }].offset");
                    var lastOffset  = LibMAME.mame_lua_get_int($"return { MAMELuaCommand.SpaceMap }[{ i }].endoff");
                    var name        = $"{ deviceName } : { read } : 0x{ firstOffset:X}-0x{ lastOffset:X}";

                    domains.Add(new MemoryDomainDelegate(name, lastOffset - firstOffset + 1, endian,
                                                         delegate(long addr)
                    {
                        return(_peek(addr, firstOffset, size));
                    },
                                                         read == "rom" ? (Action <long, byte>) null : delegate(long addr, byte val)
                    {
                        _poke(addr, val, firstOffset, size);
                    },
                                                         dataWidth));
                }
            }

            domains.Add(new MemoryDomainDelegate(deviceName + " : System Bus", size, endian,
                                                 delegate(long addr)
            {
                return(_peek(addr, 0, size));
            },
                                                 null, dataWidth));

            _memoryDomains = new MemoryDomainList(domains);
            (ServiceProvider as BasicServiceProvider).Register <IMemoryDomains>(_memoryDomains);
        }
Пример #3
0
        private void UpdateAspect()
        {
            int x = (int)LibMAME.mame_lua_get_double(MAMELuaCommand.GetBoundX);
            int y = (int)LibMAME.mame_lua_get_double(MAMELuaCommand.GetBoundY);

            VirtualHeight = BufferWidth > BufferHeight * x / y
                                ? BufferWidth * y / x
                                : BufferHeight;
            VirtualWidth = VirtualHeight * x / y;
        }
Пример #4
0
        private void InitMemoryDomains()
        {
            var domains = new List <MemoryDomain>();

            _systemBusAddressShift = LibMAME.mame_lua_get_int(MAMELuaCommand.GetSpaceAddressShift);
            var size         = (long)LibMAME.mame_lua_get_double(MAMELuaCommand.GetSpaceAddressMask) + 1;
            var dataWidth    = LibMAME.mame_lua_get_int(MAMELuaCommand.GetSpaceDataWidth) >> 3;          // mame returns in bits
            var endianString = MameGetString(MAMELuaCommand.GetSpaceEndianness);

            MemoryDomain.Endian endian = MemoryDomain.Endian.Unknown;

            if (endianString == "little")
            {
                endian = MemoryDomain.Endian.Little;
            }
            else if (endianString == "big")
            {
                endian = MemoryDomain.Endian.Big;
            }

            var mapCount = LibMAME.mame_lua_get_int(MAMELuaCommand.GetSpaceMapCount);

            for (int i = 1; i <= mapCount; i++)
            {
                var read  = MameGetString($"return { MAMELuaCommand.SpaceMap }[{ i }].readtype");
                var write = MameGetString($"return { MAMELuaCommand.SpaceMap }[{ i }].writetype");

                if (read == "ram" && write == "ram" /* || read == "rom" */)
                {
                    var firstOffset = LibMAME.mame_lua_get_int($"return { MAMELuaCommand.SpaceMap }[{ i }].offset");
                    var lastOffset  = LibMAME.mame_lua_get_int($"return { MAMELuaCommand.SpaceMap }[{ i }].endoff");
                    var name        = $"{ read.ToUpper() } { firstOffset:X}-{ lastOffset:X}";

                    domains.Add(new MemoryDomainDelegate(name, lastOffset - firstOffset + 1, endian,
                                                         delegate(long addr)
                    {
                        if (addr < 0 || addr >= size)
                        {
                            throw new ArgumentOutOfRangeException();
                        }

                        _memAccess = true;
                        _mamePeriodicComplete.WaitOne();
                        addr   += firstOffset;
                        var val = (byte)LibMAME.mame_lua_get_int($"{ MAMELuaCommand.GetSpace }:read_u8({ addr << _systemBusAddressShift })");
                        _memoryAccessComplete.Set();
                        _memAccess = false;
                        return(val);
                    },
                                                         read == "rom" ? (Action <long, byte>) null : delegate(long addr, byte val)
                    {
                        if (addr < 0 || addr >= size)
                        {
                            throw new ArgumentOutOfRangeException();
                        }

                        _memAccess = true;
                        _mamePeriodicComplete.WaitOne();
                        addr += firstOffset;
                        LibMAME.mame_lua_execute($"{ MAMELuaCommand.GetSpace }:write_u8({ addr << _systemBusAddressShift }, { val })");
                        _memoryAccessComplete.Set();
                        _memAccess = false;
                    }, dataWidth));
                }
            }

            domains.Add(new MemoryDomainDelegate("System Bus", size, endian,
                                                 delegate(long addr)
            {
                if (addr < 0 || addr >= size)
                {
                    throw new ArgumentOutOfRangeException();
                }

                _memAccess = true;
                _mamePeriodicComplete.WaitOne();
                var val = (byte)LibMAME.mame_lua_get_int($"{ MAMELuaCommand.GetSpace }:read_u8({ addr << _systemBusAddressShift })");
                _memoryAccessComplete.Set();
                _memAccess = false;
                return(val);
            },
                                                 null, dataWidth));

            _memoryDomains = new MemoryDomainList(domains);
            (ServiceProvider as BasicServiceProvider).Register <IMemoryDomains>(_memoryDomains);
        }