public SaturnusControllerDeck(bool[] multitap, Device[] devices, LibSaturnus core)
        {
            int count = 2 + multitap.Count(b => b) * 5;

            int[] dev = new int[12];
            int[] mt  = new int[2];

            for (int i = 0; i < 12; i++)
            {
                dev[i] = (int)(i < count ? devices[i] : Device.None);
            }
            for (int i = 0; i < 2; i++)
            {
                mt[i] = multitap[i] ? 1 : 0;
            }

            core.SetupInput(dev, mt);

            _devices = dev.Take(count)
                       .Select(i => Activator.CreateInstance(Implementors[i]))
                       .Cast <IDevice>()
                       .ToArray();
            _data = new byte[count * DataSize];

            Definition = ControllerDefinitionMerger.GetMerged(_devices.Select(d => d.Definition),
                                                              out var cdum);
            _unmerger = cdum.ToArray();
        }
示例#2
0
        public Saturnus(CoreComm comm, IEnumerable <Disc> disks, bool deterministic, Settings settings,
                        SyncSettings syncSettings)
            : base(comm, new Configuration
        {
            MaxSamples    = 8192,
            DefaultWidth  = 320,
            DefaultHeight = 240,
            MaxWidth      = 1024,
            MaxHeight     = 1024,
            SystemId      = "SAT"
        })
        {
            settings     = settings ?? new Settings();
            syncSettings = syncSettings ?? new SyncSettings();

            _disks       = disks.ToArray();
            _diskReaders = disks.Select(d => new DiscSectorReader(d)
            {
                Policy = _diskPolicy
            }).ToArray();
            if (!CheckDisks(_diskReaders))
            {
                throw new InvalidOperationException("Some disks are not valid");
            }
            InitCallbacks();

            _core = PreInit <LibSaturnus>(new PeRunnerOptions
            {
                Filename                   = "ss.wbx",
                SbrkHeapSizeKB             = 128,
                SealedHeapSizeKB           = 4096,      // 512KB of bios, 2MB of kof95/ultraman carts
                InvisibleHeapSizeKB        = 8 * 1024,  // 4MB of framebuffer
                MmapHeapSizeKB             = 0,         // not used?
                PlainHeapSizeKB            = 24 * 1024, // up to 16MB of cart ram
                StartAddress               = LibSaturnus.StartAddress,
                SkipCoreConsistencyCheck   = comm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxCoreConsistencyCheck),
                SkipMemoryConsistencyCheck = comm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxMemoryConsistencyCheck),
            });

            SetFirmwareCallbacks();
            SetCdCallbacks();

            if (!_core.Init(_disks.Length, syncSettings.ExpansionCart, syncSettings.Region, syncSettings.RegionAutodetect))
            {
                throw new InvalidOperationException("Core rejected the disks!");
            }
            ClearAllCallbacks();

            _controllerDeck = new SaturnusControllerDeck(new[]
            {
                syncSettings.Port1Multitap,
                syncSettings.Port2Multitap
            }, new[]
            {
                syncSettings.Port1,
                syncSettings.Port2,
                syncSettings.Port3,
                syncSettings.Port4,
                syncSettings.Port5,
                syncSettings.Port6,
                syncSettings.Port7,
                syncSettings.Port8,
                syncSettings.Port9,
                syncSettings.Port10,
                syncSettings.Port11,
                syncSettings.Port12
            }, _core);
            ControllerDefinition      = _controllerDeck.Definition;
            ControllerDefinition.Name = "Saturn Controller";
            ControllerDefinition.BoolButtons.AddRange(new[]
            {
                "Power", "Reset", "Previous Disk", "Next Disk"
            });

            _core.SetRtc((long)syncSettings.InitialTime.Subtract(new DateTime(1970, 1, 1)).TotalSeconds,
                         syncSettings.Language);

            PostInit();
            SetCdCallbacks();
            _core.SetDisk(0, false);
            PutSettings(settings);
            _syncSettings          = syncSettings;
            DeterministicEmulation = deterministic || !_syncSettings.UseRealTime;
        }