Ejemplo n.º 1
0
        public C64(CoreLoadParameters <C64Settings, C64SyncSettings> lp)
        {
            PutSyncSettings((C64SyncSettings)lp.SyncSettings ?? new C64SyncSettings());
            PutSettings((C64Settings)lp.Settings ?? new C64Settings());

            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            CoreComm     = lp.Comm;
            _roms        = lp.Roms.Select(r => r.RomData).ToList();
            _currentDisk = 0;
            RomSanityCheck();

            Init(SyncSettings.VicType, Settings.BorderType, SyncSettings.SidType, SyncSettings.TapeDriveType, SyncSettings.DiskDriveType);
            _cyclesPerFrame  = _board.Vic.CyclesPerFrame;
            _memoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" });

            InitMedia(_roms[_currentDisk]);
            HardReset();

            switch (SyncSettings.VicType)
            {
            case VicType.Ntsc:
            case VicType.Drean:
            case VicType.NtscOld:
                Region = DisplayType.NTSC;
                break;

            case VicType.Pal:
                Region = DisplayType.PAL;
                break;
            }

            if (_board.Sid != null)
            {
                _soundProvider = new DCFilter(_board.Sid, 512);
                ser.Register <ISoundProvider>(_soundProvider);
            }

            ser.Register <IVideoProvider>(_board.Vic);
            ser.Register <IDriveLight>(this);

            _tracer = new TraceBuffer {
                Header = _board.Cpu.TraceHeader
            };
            ser.Register <ITraceable>(_tracer);
            ser.Register <IStatable>(new StateSerializer(SyncState));

            if (_board.CartPort.IsConnected)
            {
                // There are no multi-cart cart games, so just hardcode .First()
                RomDetails = $"{lp.Game.Name}\r\nSHA1:{_roms.First().HashSHA1()}\r\nMD5:{_roms.First().HashMD5()}\r\nMapper Impl \"{_board.CartPort.CartridgeType}\"";
            }

            SetupMemoryDomains();
        }
Ejemplo n.º 2
0
        public C64(CoreComm comm, IEnumerable <byte[]> roms, GameInfo game, object settings, object syncSettings)
        {
            PutSyncSettings((C64SyncSettings)syncSettings ?? new C64SyncSettings());
            PutSettings((C64Settings)settings ?? new C64Settings());

            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            InputCallbacks  = new InputCallbackSystem();

            CoreComm     = comm;
            _roms        = roms?.ToList() ?? new List <byte[]>();
            _currentDisk = 0;
            RomSanityCheck();

            Init(SyncSettings.VicType, Settings.BorderType, SyncSettings.SidType, SyncSettings.TapeDriveType, SyncSettings.DiskDriveType);
            _cyclesPerFrame  = _board.Vic.CyclesPerFrame;
            _memoryCallbacks = new MemoryCallbackSystem();

            HardReset();

            switch (SyncSettings.VicType)
            {
            case VicType.Ntsc:
            case VicType.Drean:
            case VicType.NtscOld:
                Region = DisplayType.NTSC;
                break;

            case VicType.Pal:
                Region = DisplayType.PAL;
                break;
            }

            if (_board.Sid != null)
            {
                _soundProvider = new DCFilter(_board.Sid, 512);
                ser.Register <ISoundProvider>(_soundProvider);
            }

            ser.Register <IVideoProvider>(_board.Vic);
            ser.Register <IDriveLight>(this);

            _tracer = new TraceBuffer {
                Header = _board.Cpu.TraceHeader
            };
            ser.Register <ITraceable>(_tracer);

            if (_board.CartPort.IsConnected)
            {
                // There are no multi-cart cart games, so just hardcode .First()
                CoreComm.RomStatusDetails = $"{game.Name}\r\nSHA1:{_roms.First().HashSHA1()}\r\nMD5:{roms.First().HashMD5()}\r\nMapper Impl \"{_board.CartPort.CartridgeType}\"";
            }

            SetupMemoryDomains();
        }
Ejemplo n.º 3
0
        public MGBAHawk(byte[] file, CoreComm comm, SyncSettings syncSettings, Settings settings, bool deterministic, GameInfo game)
        {
            _syncSettings          = syncSettings ?? new SyncSettings();
            _settings              = settings ?? new Settings();
            DeterministicEmulation = deterministic;

            byte[] bios = comm.CoreFileProvider.GetFirmware("GBA", "Bios", false);
            DeterministicEmulation &= bios != null;

            if (DeterministicEmulation != deterministic)
            {
                throw new InvalidOperationException("A BIOS is required for deterministic recordings!");
            }

            if (!DeterministicEmulation && bios != null && !_syncSettings.RTCUseRealTime && !_syncSettings.SkipBios)
            {
                // in these situations, this core is deterministic even though it wasn't asked to be
                DeterministicEmulation = true;
            }

            if (bios != null && bios.Length != 16384)
            {
                throw new InvalidOperationException("BIOS must be exactly 16384 bytes!");
            }

            var skipBios = !DeterministicEmulation && _syncSettings.SkipBios;

            _core = LibmGBA.BizCreate(bios, file, file.Length, GetOverrideInfo(game), skipBios);
            if (_core == IntPtr.Zero)
            {
                throw new InvalidOperationException($"{nameof(LibmGBA.BizCreate)}() returned NULL!  Bad BIOS? and/or ROM?");
            }

            try
            {
                CreateMemoryDomains(file.Length);
                var ser = new BasicServiceProvider(this);
                ser.Register <IDisassemblable>(new ArmV4Disassembler());
                ser.Register <IMemoryDomains>(_memoryDomains);

                ServiceProvider = ser;
                PutSettings(_settings);

                _tracer = new TraceBuffer
                {
                    Header = "ARM7: PC, machine code, mnemonic, operands, registers"
                };
                _tracecb = new LibmGBA.TraceCallback((msg) => _tracer.Put(_traceInfo(msg)));
                ser.Register(_tracer);
            }
            catch
            {
                LibmGBA.BizDestroy(_core);
                throw;
            }
        }
Ejemplo n.º 4
0
        //[CoreConstructor("GB", "GBC")]
        public GBHawkLink(CoreComm comm, GameInfo game_L, byte[] rom_L, GameInfo game_R, byte[] rom_R, /*string gameDbFn,*/ object settings, object syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            linkSettings     = (GBLinkSettings)settings ?? new GBLinkSettings();
            linkSyncSettings = (GBLinkSyncSettings)syncSettings ?? new GBLinkSyncSettings();
            _controllerDeck  = new GBHawkLinkControllerDeck(GBHawkLinkControllerDeck.DefaultControllerName, GBHawkLinkControllerDeck.DefaultControllerName);

            CoreComm = comm;

            var temp_set_L = new GBHawk.GBHawk.GBSettings();
            var temp_set_R = new GBHawk.GBHawk.GBSettings();

            var temp_sync_L = new GBHawk.GBHawk.GBSyncSettings();
            var temp_sync_R = new GBHawk.GBHawk.GBSyncSettings();

            temp_sync_L.ConsoleMode = linkSyncSettings.ConsoleMode_L;
            temp_sync_R.ConsoleMode = linkSyncSettings.ConsoleMode_R;

            temp_sync_L.GBACGB = linkSyncSettings.GBACGB;
            temp_sync_R.GBACGB = linkSyncSettings.GBACGB;

            temp_sync_L.RTCInitialTime = linkSyncSettings.RTCInitialTime_L;
            temp_sync_R.RTCInitialTime = linkSyncSettings.RTCInitialTime_R;
            temp_sync_L.RTCOffset      = linkSyncSettings.RTCOffset_L;
            temp_sync_R.RTCOffset      = linkSyncSettings.RTCOffset_R;

            L = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify)
            {
                CoreFileProvider = comm.CoreFileProvider
            },
                                  game_L, rom_L, temp_set_L, temp_sync_L);

            R = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify)
            {
                CoreFileProvider = comm.CoreFileProvider
            },
                                  game_R, rom_R, temp_set_R, temp_sync_R);

            ser.Register <IVideoProvider>(this);
            ser.Register <ISoundProvider>(this);

            _tracer = new TraceBuffer {
                Header = L.cpu.TraceHeader
            };
            ser.Register <ITraceable>(_tracer);

            _lStates = L.ServiceProvider.GetService <IStatable>();
            _rStates = R.ServiceProvider.GetService <IStatable>();

            SetupMemoryDomains();

            HardReset();
        }
 private void ConnectTracer()
 {
     trace_cb = new LibYabause.TraceCallback(YabauseTraceCallback);
     Tracer   = new TraceBuffer()
     {
         Header = TraceHeader
     };
     ServiceProvider = new BasicServiceProvider(this);
     (ServiceProvider as BasicServiceProvider).Register <ITraceable>(Tracer);
 }
Ejemplo n.º 6
0
 private void ConnectTracer()
 {
     trace_cb = new OctoshockDll.ShockCallback_Trace(ShockTraceCallback);
     Tracer   = new TraceBuffer()
     {
         Header = TraceHeader
     };
     ServiceProvider = new BasicServiceProvider(this);
     (ServiceProvider as BasicServiceProvider).Register <ITraceable>(Tracer);
 }
Ejemplo n.º 7
0
        public PCEngine(CoreComm comm, GameInfo game, Disc disc, object Settings, object syncSettings)
        {
            CoreComm          = comm;
            Tracer            = new TraceBuffer();
            MemoryCallbacks   = new MemoryCallbackSystem();
            DriveLightEnabled = true;
            systemid          = "PCECD";
            Type           = NecSystemType.TurboCD;
            this.disc      = disc;
            this._settings = (PCESettings)Settings ?? new PCESettings();
            _syncSettings  = (PCESyncSettings)syncSettings ?? new PCESyncSettings();

            GameInfo biosInfo;

            byte[] rom = CoreComm.CoreFileProvider.GetFirmwareWithGameInfo("PCECD", "Bios", true, out biosInfo,
                                                                           "PCE-CD System Card not found. Please check the BIOS settings in Config->Firmwares.");

            if (biosInfo.Status == RomStatus.BadDump)
            {
                CoreComm.ShowMessage(
                    "The PCE-CD System Card you have selected is known to be a bad dump. This may cause problems playing PCE-CD games.\n\n"
                    + "It is recommended that you find a good dump of the system card. Sorry to be the bearer of bad news!");
            }
            else if (biosInfo.NotInDatabase)
            {
                CoreComm.ShowMessage(
                    "The PCE-CD System Card you have selected is not recognized in our database. That might mean it's a bad dump, or isn't the correct rom.");
            }
            else if (biosInfo["BIOS"] == false)
            {
                //zeromus says: someone please write a note about how this could possibly happen.
                //it seems like this is a relic of using gameDB for storing whether something is a bios? firmwareDB should be handling it now.
                CoreComm.ShowMessage(
                    "The PCE-CD System Card you have selected is not a BIOS image. You may have selected the wrong rom. FYI-Please report this to developers, I don't think this error message should happen.");
            }

            if (biosInfo["SuperSysCard"])
            {
                game.AddOption("SuperSysCard");
            }

            if (game["NeedSuperSysCard"] && game["SuperSysCard"] == false)
            {
                CoreComm.ShowMessage(
                    "This game requires a version 3.0 System card and won't run with the system card you've selected. Try selecting a 3.0 System Card in the firmware configuration.");
                throw new Exception();
            }

            game.FirmwareHash = rom.HashSHA1();

            Init(game, rom);
            // the default RomStatusDetails don't do anything with Disc
            CoreComm.RomStatusDetails = string.Format("{0}\r\nDisk partial hash:{1}", game.Name, new DiscSystem.DiscHasher(disc).OldHash());
            SetControllerButtons();
        }
Ejemplo n.º 8
0
        public Intellivision(CoreComm comm, byte[] rom, Intellivision.IntvSettings settings, Intellivision.IntvSyncSettings syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            _rom            = rom;
            _settings       = (IntvSettings)settings ?? new IntvSettings();
            _syncSettings   = (IntvSyncSettings)syncSettings ?? new IntvSyncSettings();

            _controllerDeck = new IntellivisionControllerDeck(_syncSettings.Port1, _syncSettings.Port2);

            _cart = new Intellicart();
            if (_cart.Parse(_rom) == -1)
            {
                _cart = new Cartridge();
                _cart.Parse(_rom);
            }

            _cpu = new CP1610
            {
                ReadMemory      = ReadMemory,
                WriteMemory     = WriteMemory,
                MemoryCallbacks = MemoryCallbacks
            };
            _cpu.Reset();

            _stic = new STIC
            {
                ReadMemory  = ReadMemory,
                WriteMemory = WriteMemory
            };
            _stic.Reset();

            _psg = new PSG
            {
                ReadMemory  = ReadMemory,
                WriteMemory = WriteMemory
            };
            _psg.Reset();

            ser.Register <IVideoProvider>(_stic);
            ser.Register <ISoundProvider>(_psg);

            Connect();

            LoadExecutiveRom(comm.CoreFileProvider.GetFirmware("INTV", "EROM", true, "Executive ROM is required."));
            LoadGraphicsRom(comm.CoreFileProvider.GetFirmware("INTV", "GROM", true, "Graphics ROM is required."));

            _tracer = new TraceBuffer {
                Header = _cpu.TraceHeader
            };
            ser.Register <ITraceable>(_tracer);
            ser.Register <IStatable>(new StateSerializer(SyncState));
            SetupMemoryDomains();
        }
Ejemplo n.º 9
0
        public GBHawkLink3x(CoreLoadParameters <GBLink3xSettings, GBLink3xSyncSettings> lp)
        {
            if (lp.Roms.Count != 3)
            {
                throw new InvalidOperationException("Wrong number of roms");
            }

            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            Link3xSettings     = (GBLink3xSettings)lp.Settings ?? new GBLink3xSettings();
            Link3xSyncSettings = (GBLink3xSyncSettings)lp.SyncSettings ?? new GBLink3xSyncSettings();
            _controllerDeck    = new GBHawkLink3xControllerDeck(GBHawkLink3xControllerDeck.DefaultControllerName, GBHawkLink3xControllerDeck.DefaultControllerName, GBHawkLink3xControllerDeck.DefaultControllerName);

            var tempSetL = new GBHawk.GBHawk.GBSettings();
            var tempSetC = new GBHawk.GBHawk.GBSettings();
            var tempSetR = new GBHawk.GBHawk.GBSettings();

            var tempSyncL = new GBHawk.GBHawk.GBSyncSettings();
            var tempSyncC = new GBHawk.GBHawk.GBSyncSettings();
            var tempSyncR = new GBHawk.GBHawk.GBSyncSettings();

            tempSyncL.ConsoleMode = Link3xSyncSettings.ConsoleMode_L;
            tempSyncC.ConsoleMode = Link3xSyncSettings.ConsoleMode_C;
            tempSyncR.ConsoleMode = Link3xSyncSettings.ConsoleMode_R;

            tempSyncL.GBACGB = Link3xSyncSettings.GBACGB;
            tempSyncC.GBACGB = Link3xSyncSettings.GBACGB;
            tempSyncR.GBACGB = Link3xSyncSettings.GBACGB;

            tempSyncL.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_L;
            tempSyncC.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_C;
            tempSyncR.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_R;
            tempSyncL.RTCOffset      = Link3xSyncSettings.RTCOffset_L;
            tempSyncC.RTCOffset      = Link3xSyncSettings.RTCOffset_C;
            tempSyncR.RTCOffset      = Link3xSyncSettings.RTCOffset_R;

            L = new GBHawk.GBHawk(lp.Comm, lp.Roms[0].Game, lp.Roms[0].RomData, tempSetL, tempSyncL);
            C = new GBHawk.GBHawk(lp.Comm, lp.Roms[1].Game, lp.Roms[1].RomData, tempSetC, tempSyncC);
            R = new GBHawk.GBHawk(lp.Comm, lp.Roms[2].Game, lp.Roms[2].RomData, tempSetR, tempSyncR);

            ser.Register <IVideoProvider>(this);
            ser.Register <ISoundProvider>(this);

            _tracer = new TraceBuffer(L.cpu.TraceHeader);
            ser.Register(_tracer);

            _lStates = L.ServiceProvider.GetService <IStatable>();
            _cStates = C.ServiceProvider.GetService <IStatable>();
            _rStates = R.ServiceProvider.GetService <IStatable>();

            SetupMemoryDomains();
            HardReset();
        }
Ejemplo n.º 10
0
        public Intellivision(CoreComm comm, GameInfo game, byte[] rom, object Settings, object SyncSettings)
        {
            ServiceProvider = new BasicServiceProvider(this);
            CoreComm        = comm;

            _rom      = rom;
            _gameInfo = game;

            this.Settings     = (IntvSettings)Settings ?? new IntvSettings();
            this.SyncSettings = (IntvSyncSettings)SyncSettings ?? new IntvSyncSettings();

            ControllerDeck = new IntellivisionControllerDeck(this.SyncSettings.Port1, this.SyncSettings.Port2);
            ControllerDefinition.BoolButtons.Add("Power");
            ControllerDefinition.BoolButtons.Add("Reset");

            _cart = new Intellicart();
            if (_cart.Parse(_rom) == -1)
            {
                _cart = new Cartridge();
                _cart.Parse(_rom);
            }

            _cpu             = new CP1610();
            _cpu.ReadMemory  = ReadMemory;
            _cpu.WriteMemory = WriteMemory;
            _cpu.Reset();

            _stic             = new STIC();
            _stic.ReadMemory  = ReadMemory;
            _stic.WriteMemory = WriteMemory;
            _stic.Reset();
            (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(_stic);

            _psg = new PSG();
            _psg.Reset();
            _psg.ReadMemory  = ReadMemory;
            _psg.WriteMemory = WriteMemory;
            (ServiceProvider as BasicServiceProvider).Register <ISoundProvider>(_psg);

            Connect();

            //_cpu.LogData();

            LoadExecutiveRom(CoreComm.CoreFileProvider.GetFirmware("INTV", "EROM", true, "Executive ROM is required."));
            LoadGraphicsRom(CoreComm.CoreFileProvider.GetFirmware("INTV", "GROM", true, "Graphics ROM is required."));

            Tracer = new TraceBuffer {
                Header = _cpu.TraceHeader
            };
            (ServiceProvider as BasicServiceProvider).Register <ITraceable>(Tracer);

            SetupMemoryDomains();
        }
Ejemplo n.º 11
0
        public ChannelF(CoreLoadParameters <ChannelFSettings, ChannelFSyncSettings> lp)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            CoreComm        = lp.Comm;
            _gameInfo       = lp.Roms.Select(r => r.Game).ToList();
            _files          = lp.Roms.Select(r => r.RomData).ToList();


            var settings     = lp.Settings ?? new ChannelFSettings();
            var syncSettings = lp.SyncSettings ?? new ChannelFSyncSettings();

            region = syncSettings.Region;


            MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" });

            ControllerDefinition = ChannelFControllerDefinition;

            var bios01 = CoreComm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131253"));
            var bios02 = CoreComm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131254"));

            //var bios02 = CoreComm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl90025"));

            Cartridge = VesCartBase.Configure(_gameInfo.First(), _files.First());

            BIOS01 = bios01;
            BIOS02 = bios02;

            CPU = new F3850
            {
                ReadMemory      = ReadBus,
                WriteMemory     = WriteBus,
                ReadHardware    = ReadPort,
                WriteHardware   = WritePort,
                DummyReadMemory = ReadBus
            };

            _tracer = new TraceBuffer(CPU.TraceHeader);

            //var rom = _files.First();
            //Array.Copy(rom, 0, Rom, 0, rom.Length);

            CalcClock();

            ser.Register <IVideoProvider>(this);
            ser.Register <ITraceable>(_tracer);
            ser.Register <IDisassemblable>(CPU);
            ser.Register <ISoundProvider>(this);
            ser.Register <IStatable>(new StateSerializer(SyncState));
            SetupMemoryDomains();
        }
Ejemplo n.º 12
0
        public NES(CoreComm comm, GameInfo game, byte[] rom, object Settings, object SyncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            byte[] fdsbios = comm.CoreFileProvider.GetFirmware("NES", "Bios_FDS", false);
            if (fdsbios != null && fdsbios.Length == 40976)
            {
                comm.ShowMessage("Your FDS BIOS is a bad dump.  BizHawk will attempt to use it, but no guarantees!  You should find a new one.");
                var tmp = new byte[8192];
                Buffer.BlockCopy(fdsbios, 16 + 8192 * 3, tmp, 0, 8192);
                fdsbios = tmp;
            }

            this.SyncSettings       = (NESSyncSettings)SyncSettings ?? new NESSyncSettings();
            this.ControllerSettings = this.SyncSettings.Controls;
            CoreComm = comm;

            MemoryCallbacks = new MemoryCallbackSystem();
            BootGodDB.Initialize();
            videoProvider = new MyVideoProvider(this);
            Init(game, rom, fdsbios);
            if (Board is FDS)
            {
                DriveLightEnabled = true;
                (Board as FDS).SetDriveLightCallback((val) => DriveLightOn = val);
                // bit of a hack: we don't have a private gamedb for FDS, but the frontend
                // expects this to be set.
                RomStatus = game.Status;
            }
            PutSettings((NESSettings)Settings ?? new NESSettings());


            ser.Register <IDisassemblable>(cpu);

            Tracer = new TraceBuffer {
                Header = cpu.TraceHeader
            };
            ser.Register <ITraceable>(Tracer);
            ser.Register <IVideoProvider>(videoProvider);

            if (Board is BANDAI_FCG_1)
            {
                var reader = (Board as BANDAI_FCG_1).reader;
                // not all BANDAI FCG 1 boards have a barcode reader
                if (reader != null)
                {
                    ser.Register <DatachBarcode>(reader);
                }
            }
        }
Ejemplo n.º 13
0
        //[CoreConstructor("GB", "GBC")]
        public GBHawkLink3x(CoreComm comm, GameInfo game_L, byte[] rom_L, GameInfo game_C, byte[] rom_C, GameInfo game_R, byte[] rom_R, /*string gameDbFn,*/ object settings, object syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            Link3xSettings     = (GBLink3xSettings)settings ?? new GBLink3xSettings();
            Link3xSyncSettings = (GBLink3xSyncSettings)syncSettings ?? new GBLink3xSyncSettings();
            _controllerDeck    = new GBHawkLink3xControllerDeck(GBHawkLink3xControllerDeck.DefaultControllerName, GBHawkLink3xControllerDeck.DefaultControllerName, GBHawkLink3xControllerDeck.DefaultControllerName);

            var tempSetL = new GBHawk.GBHawk.GBSettings();
            var tempSetC = new GBHawk.GBHawk.GBSettings();
            var tempSetR = new GBHawk.GBHawk.GBSettings();

            var tempSyncL = new GBHawk.GBHawk.GBSyncSettings();
            var tempSyncC = new GBHawk.GBHawk.GBSyncSettings();
            var tempSyncR = new GBHawk.GBHawk.GBSyncSettings();

            tempSyncL.ConsoleMode = Link3xSyncSettings.ConsoleMode_L;
            tempSyncC.ConsoleMode = Link3xSyncSettings.ConsoleMode_C;
            tempSyncR.ConsoleMode = Link3xSyncSettings.ConsoleMode_R;

            tempSyncL.GBACGB = Link3xSyncSettings.GBACGB;
            tempSyncC.GBACGB = Link3xSyncSettings.GBACGB;
            tempSyncR.GBACGB = Link3xSyncSettings.GBACGB;

            tempSyncL.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_L;
            tempSyncC.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_C;
            tempSyncR.RTCInitialTime = Link3xSyncSettings.RTCInitialTime_R;
            tempSyncL.RTCOffset      = Link3xSyncSettings.RTCOffset_L;
            tempSyncC.RTCOffset      = Link3xSyncSettings.RTCOffset_C;
            tempSyncR.RTCOffset      = Link3xSyncSettings.RTCOffset_R;

            L = new GBHawk.GBHawk(comm, game_L, rom_L, tempSetL, tempSyncL);
            C = new GBHawk.GBHawk(comm, game_C, rom_C, tempSetC, tempSyncC);
            R = new GBHawk.GBHawk(comm, game_R, rom_R, tempSetR, tempSyncR);

            ser.Register <IVideoProvider>(this);
            ser.Register <ISoundProvider>(this);

            _tracer = new TraceBuffer {
                Header = L.cpu.TraceHeader
            };
            ser.Register(_tracer);

            _lStates = L.ServiceProvider.GetService <IStatable>();
            _cStates = C.ServiceProvider.GetService <IStatable>();
            _rStates = R.ServiceProvider.GetService <IStatable>();

            SetupMemoryDomains();
            HardReset();
        }
        public ColecoVision(CoreComm comm, GameInfo game, byte[] rom,
                            ColecoSettings settings,
                            ColecoSyncSettings syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            _syncSettings   = (ColecoSyncSettings)syncSettings ?? new ColecoSyncSettings();
            bool skipBios = _syncSettings.SkipBiosIntro;

            _cpu = new Z80A
            {
                FetchMemory     = ReadMemory,
                ReadMemory      = ReadMemory,
                WriteMemory     = WriteMemory,
                ReadHardware    = ReadPort,
                WriteHardware   = WritePort,
                MemoryCallbacks = MemoryCallbacks
            };

            PSG       = new SN76489col();
            SGM_sound = new AY_3_8910_SGM();
            _blip.SetRates(3579545, 44100);

            ControllerDeck = new ColecoVisionControllerDeck(_syncSettings.Port1, _syncSettings.Port2);

            _vdp = new TMS9918A(_cpu);
            ser.Register <IVideoProvider>(_vdp);
            ser.Register <IStatable>(new StateSerializer(SyncState));

            // TODO: hack to allow bios-less operation would be nice, no idea if its feasible
            _biosRom = comm.CoreFileProvider.GetFirmwareOrThrow(new("Coleco", "Bios"), "Coleco BIOS file is required.");

            // gamedb can overwrite the SyncSettings; this is ok
            if (game["NoSkip"])
            {
                skipBios = false;
            }

            use_SGM = _syncSettings.UseSGM;

            if (use_SGM)
            {
                Console.WriteLine("Using the Super Game Module");
            }

            LoadRom(rom, skipBios);
            SetupMemoryDomains();

            ser.Register <IDisassemblable>(_cpu);
            ser.Register <ITraceable>(_tracer = new TraceBuffer(_cpu.TraceHeader));
        }
        public GBHawkLink(CoreLoadParameters <GBHawkLink.GBLinkSettings, GBHawkLink.GBLinkSyncSettings> lp)
        {
            if (lp.Roms.Count != 2)
            {
                throw new InvalidOperationException("Wrong number of roms");
            }

            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            linkSettings     = (GBLinkSettings)lp.Settings ?? new GBLinkSettings();
            linkSyncSettings = (GBLinkSyncSettings)lp.SyncSettings ?? new GBLinkSyncSettings();
            _controllerDeck  = new GBHawkLinkControllerDeck(GBHawkLinkControllerDeck.DefaultControllerName, GBHawkLinkControllerDeck.DefaultControllerName);

            var temp_set_L = new GBHawk.GBHawk.GBSettings();
            var temp_set_R = new GBHawk.GBHawk.GBSettings();

            var temp_sync_L = new GBHawk.GBHawk.GBSyncSettings();
            var temp_sync_R = new GBHawk.GBHawk.GBSyncSettings();

            temp_sync_L.ConsoleMode = linkSyncSettings.ConsoleMode_L;
            temp_sync_R.ConsoleMode = linkSyncSettings.ConsoleMode_R;

            temp_sync_L.GBACGB = linkSyncSettings.GBACGB;
            temp_sync_R.GBACGB = linkSyncSettings.GBACGB;

            temp_sync_L.RTCInitialTime = linkSyncSettings.RTCInitialTime_L;
            temp_sync_R.RTCInitialTime = linkSyncSettings.RTCInitialTime_R;
            temp_sync_L.RTCOffset      = linkSyncSettings.RTCOffset_L;
            temp_sync_R.RTCOffset      = linkSyncSettings.RTCOffset_R;

            L = new GBHawk.GBHawk(lp.Comm, lp.Roms[0].Game, lp.Roms[0].RomData, temp_set_L, temp_sync_L);
            R = new GBHawk.GBHawk(lp.Comm, lp.Roms[1].Game, lp.Roms[1].RomData, temp_set_R, temp_sync_R);

            ser.Register <IVideoProvider>(this);
            ser.Register <ISoundProvider>(this);

            _tracer = new TraceBuffer {
                Header = L.cpu.TraceHeader
            };
            ser.Register <ITraceable>(_tracer);

            _lStates = L.ServiceProvider.GetService <IStatable>();
            _rStates = R.ServiceProvider.GetService <IStatable>();

            SetupMemoryDomains();

            HardReset();
        }
Ejemplo n.º 16
0
        public SubNESHawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ object settings, object syncSettings)
        {
            var subNesSettings     = (NES.NES.NESSettings)settings ?? new NES.NES.NESSettings();
            var subNesSyncSettings = (NES.NES.NESSyncSettings)syncSettings ?? new NES.NES.NESSyncSettings();

            _nesCore = new NES.NES(new CoreComm(comm.ShowMessage, comm.Notify)
            {
                CoreFileProvider = comm.CoreFileProvider
            },
                                   game, rom, subNesSettings, subNesSyncSettings)
            {
                using_reset_timing = true
            };

            HardReset();
            current_cycle = 0;
            _nesCore.cpu.ext_ppu_cycle = current_cycle;
            VBL_CNT = 0;

            _nesStatable = _nesCore.ServiceProvider.GetService <IStatable>();

            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            ser.Register(_nesCore.ServiceProvider.GetService <IVideoProvider>());
            ser.Register(_nesCore.ServiceProvider.GetService <ISoundProvider>());
            ser.Register(_nesCore.ServiceProvider.GetService <ITraceable>());
            ser.Register(_nesCore.ServiceProvider.GetService <IDisassemblable>());
            ser.Register(_nesCore.ServiceProvider.GetService <IMemoryDomains>());
            ser.Register(_nesCore.ServiceProvider.GetService <INESPPUViewable>());
            ser.Register(_nesCore.ServiceProvider.GetService <IBoardInfo>());
            ser.Register(_nesCore.ServiceProvider.GetService <ISaveRam>());
            ser.Register(_nesCore.ServiceProvider.GetService <IDebuggable>());
            ser.Register(_nesCore.ServiceProvider.GetService <IRegionable>());
            ser.Register(_nesCore.ServiceProvider.GetService <ICodeDataLogger>());

            _tracer = new TraceBuffer {
                Header = "6502: PC, machine code, mnemonic, operands, registers (A, X, Y, P, SP), flags (NVTBDIZCR), CPU Cycle, PPU Cycle"
            };
            ser.Register(_tracer);


            var barCodeService = _nesCore.ServiceProvider.GetService <DatachBarcode>();

            if (barCodeService != null)
            {
                ser.Register(barCodeService);
            }
        }
Ejemplo n.º 17
0
        public SubNESHawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ NES.NES.NESSettings settings, NES.NES.NESSyncSettings syncSettings)
        {
            var subNesSettings     = (NES.NES.NESSettings)settings ?? new NES.NES.NESSettings();
            var subNesSyncSettings = (NES.NES.NESSyncSettings)syncSettings ?? new NES.NES.NESSyncSettings();

            _nesCore = new NES.NES(comm, game, rom, subNesSettings, subNesSyncSettings)
            {
                using_reset_timing = true
            };

            // Adds Reset timing control to controller definition
            _nesCore.ResetControllerDefinition();

            HardReset();
            current_cycle = 0;
            _nesCore.cpu.ext_ppu_cycle = current_cycle;
            VblankCount = 0;

            _nesStatable = _nesCore.ServiceProvider.GetService <IStatable>();

            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            ser.Register(_nesCore.ServiceProvider.GetService <IVideoProvider>());
            ser.Register(_nesCore.ServiceProvider.GetService <ISoundProvider>());
            ser.Register(_nesCore.ServiceProvider.GetService <ITraceable>());
            ser.Register(_nesCore.ServiceProvider.GetService <IDisassemblable>());
            ser.Register(_nesCore.ServiceProvider.GetService <IMemoryDomains>());
            ser.Register(_nesCore.ServiceProvider.GetService <INESPPUViewable>());
            ser.Register(_nesCore.ServiceProvider.GetService <IBoardInfo>());
            ser.Register(_nesCore.ServiceProvider.GetService <ISaveRam>());
            ser.Register(_nesCore.ServiceProvider.GetService <IDebuggable>());
            ser.Register(_nesCore.ServiceProvider.GetService <IRegionable>());
            ser.Register(_nesCore.ServiceProvider.GetService <ICodeDataLogger>());

            const string TRACE_HEADER = "6502: PC, machine code, mnemonic, operands, registers (A, X, Y, P, SP), flags (NVTBDIZCR), CPU Cycle, PPU Cycle";

            _tracer = new TraceBuffer(TRACE_HEADER);
            ser.Register(_tracer);


            var barCodeService = _nesCore.ServiceProvider.GetService <DatachBarcode>();

            if (barCodeService != null)
            {
                ser.Register(barCodeService);
            }
        }
Ejemplo n.º 18
0
        public C64(CoreComm comm, IEnumerable <byte[]> roms, object settings, object syncSettings)
        {
            PutSyncSettings((C64SyncSettings)syncSettings ?? new C64SyncSettings());
            PutSettings((C64Settings)settings ?? new C64Settings());

            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            InputCallbacks  = new InputCallbackSystem();

            CoreComm     = comm;
            Roms         = roms?.ToList() ?? new List <byte[]>();
            _currentDisk = 0;
            RomSanityCheck();

            Init(SyncSettings.VicType, Settings.BorderType, SyncSettings.SidType, SyncSettings.TapeDriveType, SyncSettings.DiskDriveType);
            _cyclesPerFrame = _board.Vic.CyclesPerFrame;
            SetupMemoryDomains(_board.DiskDrive != null);
            _memoryCallbacks = new MemoryCallbackSystem();
            HardReset();

            switch (SyncSettings.VicType)
            {
            case VicType.Ntsc:
            case VicType.Drean:
            case VicType.NtscOld:
                Region = DisplayType.NTSC;
                break;

            case VicType.Pal:
                Region = DisplayType.PAL;
                break;
            }

            if (_board.Sid != null)
            {
                _soundProvider = new DCFilter(_board.Sid, 512);
                ser.Register <ISoundProvider>(_soundProvider);
            }

            ser.Register <IVideoProvider>(_board.Vic);
            ser.Register <IDriveLight>(this);

            _tracer = new TraceBuffer {
                Header = _board.Cpu.TraceHeader
            };
            ser.Register <ITraceable>(_tracer);
        }
Ejemplo n.º 19
0
        public GGHawkLink(CoreComm comm, GameInfo game_L, byte[] rom_L, GameInfo game_R, byte[] rom_R, /*string gameDbFn,*/ object settings, object syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            linkSettings     = (GGLinkSettings)settings ?? new GGLinkSettings();
            linkSyncSettings = (GGLinkSyncSettings)syncSettings ?? new GGLinkSyncSettings();
            _controllerDeck  = new GGHawkLinkControllerDeck(GGHawkLinkControllerDeck.DefaultControllerName, GGHawkLinkControllerDeck.DefaultControllerName);

            CoreComm = comm;

            var temp_set_L = new SMS.SmsSettings();
            var temp_set_R = new SMS.SmsSettings();

            var temp_sync_L = new SMS.SmsSyncSettings();
            var temp_sync_R = new SMS.SmsSyncSettings();

            L = new SMS(new CoreComm(comm.ShowMessage, comm.Notify)
            {
                CoreFileProvider = comm.CoreFileProvider
            },
                        game_L, rom_L, temp_set_L, temp_sync_L);

            R = new SMS(new CoreComm(comm.ShowMessage, comm.Notify)
            {
                CoreFileProvider = comm.CoreFileProvider
            },
                        game_R, rom_R, temp_set_R, temp_sync_R);

            ser.Register <IVideoProvider>(this);
            ser.Register <ISoundProvider>(this);

            _tracer = new TraceBuffer {
                Header = L.Cpu.TraceHeader
            };
            ser.Register <ITraceable>(_tracer);

            ServiceProvider = ser;

            SetupMemoryDomains();

            HardReset();

            L.stand_alone = false;
            R.stand_alone = false;

            _lStates = L.ServiceProvider.GetService <IStatable>();
            _rStates = R.ServiceProvider.GetService <IStatable>();
        }
Ejemplo n.º 20
0
        public Atari2600(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            _ram         = new byte[128];
            CoreComm     = comm;
            Settings     = (A2600Settings)settings ?? new A2600Settings();
            SyncSettings = (A2600SyncSettings)syncSettings ?? new A2600SyncSettings();

            _controllerDeck = new Atari2600ControllerDeck(SyncSettings.Port1, SyncSettings.Port2);

            _leftDifficultySwitchPressed  = SyncSettings.LeftDifficulty;
            _rightDifficultySwitchPressed = SyncSettings.RightDifficulty;

            Rom   = rom;
            _game = game;

            if (!game.GetOptionsDict().ContainsKey("m"))
            {
                game.AddOption("m", DetectMapper(rom));
            }

            if (Rom.HashSHA1() == "3A77DB43B6583E8689435F0F14AA04B9E57BDDED" ||
                Rom.HashSHA1() == "E986E1818E747BEB9B33CE4DFF1CDC6B55BDB620" ||
                Rom.HashSHA1() == "982B8016B393A9AA7DD110295A53C4612ECF2141")
            {
                game.RemoveOption("m");
                game.AddOption("m", "F8_sega");
            }

            Console.WriteLine("Game uses mapper " + game.GetOptionsDict()["m"]);
            Console.WriteLine(Rom.HashSHA1());
            RebootCore();
            SetupMemoryDomains();

            Tracer = new TraceBuffer {
                Header = Cpu.TraceHeader
            };

            ser.Register <IDisassemblable>(Cpu);
            ser.Register <ITraceable>(Tracer);
            ser.Register <IVideoProvider>(_tia);
            ser.Register <ISoundProvider>(_dcfilter);
            ser.Register <IStatable>(new StateSerializer(SyncState));
        }
Ejemplo n.º 21
0
        public MSX(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
        {
            ServiceProvider = new BasicServiceProvider(this);
            Settings        = (MSXSettings)settings ?? new MSXSettings();
            SyncSettings    = (MSXSyncSettings)syncSettings ?? new MSXSyncSettings();
            CoreComm        = comm;

            RomData = rom;

            if (RomData.Length % BankSize != 0)
            {
                Array.Resize(ref RomData, ((RomData.Length / BankSize) + 1) * BankSize);
            }

            MSX_Pntr = LibMSX.MSX_create();
            LibMSX.MSX_load(MSX_Pntr, RomData, (uint)RomData.Length, 0);

            blip_L.SetRates(3579545, 44100);
            blip_R.SetRates(3579545, 44100);

            (ServiceProvider as BasicServiceProvider).Register <ISoundProvider>(this);

            SetupMemoryDomains();

            InputCallbacks = new InputCallbackSystem();

            Header_Length     = LibMSX.MSX_getheaderlength(MSX_Pntr);
            Disasm_Length     = LibMSX.MSX_getdisasmlength(MSX_Pntr);
            Reg_String_Length = LibMSX.MSX_getregstringlength(MSX_Pntr);

            StringBuilder new_header = new StringBuilder(Header_Length);

            LibMSX.MSX_getheader(MSX_Pntr, new_header, Header_Length);



            Console.WriteLine(Header_Length + " " + Disasm_Length + " " + Reg_String_Length);

            Tracer = new TraceBuffer {
                Header = new_header.ToString()
            };

            var serviceProvider = ServiceProvider as BasicServiceProvider;

            serviceProvider.Register <ITraceable>(Tracer);
        }
Ejemplo n.º 22
0
        public Atari2600(GameInfo game, byte[] rom, Atari2600.A2600Settings settings, Atari2600.A2600SyncSettings syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            _ram         = new byte[128];
            Settings     = (A2600Settings)settings ?? new A2600Settings();
            SyncSettings = (A2600SyncSettings)syncSettings ?? new A2600SyncSettings();

            _controllerDeck = new Atari2600ControllerDeck(SyncSettings.Port1, SyncSettings.Port2);

            _leftDifficultySwitchPressed  = SyncSettings.LeftDifficulty;
            _rightDifficultySwitchPressed = SyncSettings.RightDifficulty;

            Rom   = rom;
            _game = game;

            if (!game.GetOptions().ContainsKey("m"))
            {
                game.AddOption("m", DetectMapper(rom));
            }

            var romHashSHA1 = SHA1Checksum.ComputePrefixedHex(Rom);

            if (romHashSHA1 is RomChecksums.CongoBongo or RomChecksums.Tapper or RomChecksums.KangarooNotInGameDB)
            {
                game.RemoveOption("m");
                game.AddOption("m", "F8_sega");
            }

            Console.WriteLine("Game uses mapper " + game.GetOptions()["m"]);
            Console.WriteLine(romHashSHA1);
            RebootCore();
            SetupMemoryDomains();

            Tracer = new TraceBuffer(Cpu.TraceHeader);

            ser.Register <IDisassemblable>(Cpu);
            ser.Register <ITraceable>(Tracer);
            ser.Register <IVideoProvider>(_tia);
            ser.Register <ISoundProvider>(_dcfilter);
            ser.Register <IStatable>(new StateSerializer(SyncState));
        }
Ejemplo n.º 23
0
        public GGHawkLink(CoreLoadParameters <GGLinkSettings, GGLinkSyncSettings> lp)
        {
            if (lp.Roms.Count != 2)
            {
                throw new InvalidOperationException("Wrong number of roms");
            }

            var ser = new BasicServiceProvider(this);

            linkSettings     = (GGLinkSettings)lp.Settings ?? new GGLinkSettings();
            linkSyncSettings = (GGLinkSyncSettings)lp.SyncSettings ?? new GGLinkSyncSettings();
            _controllerDeck  = new GGHawkLinkControllerDeck(GGHawkLinkControllerDeck.DefaultControllerName, GGHawkLinkControllerDeck.DefaultControllerName);

            var temp_set_L = new SMS.SmsSettings();
            var temp_set_R = new SMS.SmsSettings();

            var temp_sync_L = new SMS.SmsSyncSettings();
            var temp_sync_R = new SMS.SmsSyncSettings();

            L = new SMS(lp.Comm, lp.Roms[0].Game, lp.Roms[0].RomData, temp_set_L, temp_sync_L);
            R = new SMS(lp.Comm, lp.Roms[1].Game, lp.Roms[1].RomData, temp_set_R, temp_sync_R);

            ser.Register <IVideoProvider>(this);
            ser.Register <ISoundProvider>(this);

            _tracer = new TraceBuffer {
                Header = L.Cpu.TraceHeader
            };
            ser.Register(_tracer);

            ServiceProvider = ser;

            SetupMemoryDomains();

            HardReset();

            L.stand_alone = false;
            R.stand_alone = false;

            _lStates = L.ServiceProvider.GetService <IStatable>();
            _rStates = R.ServiceProvider.GetService <IStatable>();
        }
Ejemplo n.º 24
0
        public AppleII(CoreComm comm, GameInfo game, byte[] rom, Settings settings)
        {
            GameInfoSet = new List <GameInfo>();

            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            CoreComm        = comm;

            Tracer = new TraceBuffer
            {
                Header = "6502: PC, opcode, register (A, X, Y, P, SP, Cy) flags (NVTBDIZC)"
            };

            MemoryCallbacks = new MemoryCallbackSystem();
            InputCallbacks  = new InputCallbackSystem();

            _disk1 = rom;
            RomSet.Add(rom);

            _appleIIRom = comm.CoreFileProvider.GetFirmware(
                SystemId, "AppleIIe", true, "The Apple IIe BIOS firmware is required");
            _diskIIRom = comm.CoreFileProvider.GetFirmware(
                SystemId, "DiskII", true, "The DiskII firmware is required");

            _machine = new Machine(_appleIIRom, _diskIIRom);

            _machine.BizInitialize();

            //make a writeable memory stream cloned from the rom.
            //for junk.dsk the .dsk is important because it determines the format from that
            InitDisk();

            ser.Register <ITraceable>(Tracer);

            setCallbacks();

            InitSaveStates();
            SetupMemoryDomains();
            PutSettings(settings ?? new Settings());
        }
Ejemplo n.º 25
0
        public ChannelF(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            CoreComm        = comm;
            InputCallbacks  = new InputCallbackSystem();
            MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" });

            ControllerDefinition = ChannelFControllerDefinition;

            CPU = new F3850
            {
                ReadMemory      = ReadBus,
                WriteMemory     = WriteBus,
                ReadHardware    = ReadPort,
                WriteHardware   = WritePort,
                DummyReadMemory = ReadBus
            };

            _tracer = new TraceBuffer {
                Header = CPU.TraceHeader
            };

            byte[] bios01 = comm.CoreFileProvider.GetFirmware("ChannelF", "ChannelF_sl131253", true);
            byte[] bios02 = comm.CoreFileProvider.GetFirmware("ChannelF", "ChannelF_sl131254", true);

            BIOS01 = bios01;
            BIOS02 = bios02;

            Array.Copy(rom, 0, Rom, 0, rom.Length);

            CalcClock();

            ser.Register <IVideoProvider>(this);
            ser.Register <ITraceable>(_tracer);
            ser.Register <IDisassemblable>(CPU);
            ser.Register <ISoundProvider>(this);

            SetupMemoryDomains();
        }
Ejemplo n.º 26
0
        public TI83(CoreComm comm, GameInfo game, byte[] rom, object Settings)
        {
            ServiceProvider = new BasicServiceProvider(this);
            InputCallbacks  = new InputCallbackSystem();
            MemoryCallbacks = new MemoryCallbackSystem();
            PutSettings((TI83Settings)Settings ?? new TI83Settings());

            CoreComm            = comm;
            Cpu.ReadMemory      = ReadMemory;
            Cpu.WriteMemory     = WriteMemory;
            Cpu.ReadHardware    = ReadHardware;
            Cpu.WriteHardware   = WriteHardware;
            Cpu.IRQCallback     = IRQCallback;
            Cpu.NMICallback     = NMICallback;
            Cpu.MemoryCallbacks = MemoryCallbacks;

            Rom      = rom;
            LinkPort = new TI83LinkPort(this);

            // different calculators (different revisions?) have different initPC. we track this in the game database by rom hash
            // if( *(unsigned long *)(m_pRom + 0x6ce) == 0x04D3163E ) m_Regs.PC.W = 0x6ce; //KNOWN
            // else if( *(unsigned long *)(m_pRom + 0x6f6) == 0x04D3163E ) m_Regs.PC.W = 0x6f6; //UNKNOWN

            if (game["initPC"])
            {
                startPC = ushort.Parse(game.OptionValue("initPC"), NumberStyles.HexNumber);
            }

            HardReset();
            SetupMemoryDomains();

            Tracer = new TraceBuffer {
                Header = Cpu.TraceHeader
            };

            var serviceProvider = ServiceProvider as BasicServiceProvider;

            serviceProvider.Register <ITraceable>(Tracer);
            serviceProvider.Register <IDisassemblable>(new Disassembler());
        }
Ejemplo n.º 27
0
        public SubGBHawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ object settings, object syncSettings)
        {
            var subGBSettings     = (GBHawk.GBHawk.GBSettings)settings ?? new GBHawk.GBHawk.GBSettings();
            var subGBSyncSettings = (GBHawk.GBHawk.GBSyncSettings)syncSettings ?? new GBHawk.GBHawk.GBSyncSettings();

            _GBCore = new GBHawk.GBHawk(new CoreComm(comm.ShowMessage, comm.Notify)
            {
                CoreFileProvider = comm.CoreFileProvider
            },
                                        game, rom, subGBSettings, subGBSyncSettings);

            HardReset();
            current_cycle = 0;
            VBL_CNT       = 0;

            _GBStatable = _GBCore.ServiceProvider.GetService <IStatable>();

            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            ser.Register(_GBCore.ServiceProvider.GetService <IVideoProvider>());
            ser.Register(_GBCore.ServiceProvider.GetService <ISoundProvider>());
            ser.Register(_GBCore.ServiceProvider.GetService <ITraceable>());
            ser.Register(_GBCore.ServiceProvider.GetService <IMemoryDomains>());
            ser.Register(_GBCore.ServiceProvider.GetService <ISaveRam>());
            ser.Register(_GBCore.ServiceProvider.GetService <IDebuggable>());
            ser.Register(_GBCore.ServiceProvider.GetService <IRegionable>());
            ser.Register(_GBCore.ServiceProvider.GetService <ICodeDataLogger>());

            _tracer = new TraceBuffer {
                Header = _GBCore.cpu.TraceHeader
            };
            ser.Register(_tracer);

            _GBCore.ControllerDefinition.FloatControls.Add("Input Cycle");
            _GBCore.ControllerDefinition.FloatRanges.Add(new ControllerDefinition.FloatRange(0, 70224, 70224));
        }
Ejemplo n.º 28
0
        public ChannelF(CoreComm comm, GameInfo game, byte[] rom)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" });

            ControllerDefinition = ChannelFControllerDefinition;

            CPU = new F3850
            {
                ReadMemory      = ReadBus,
                WriteMemory     = WriteBus,
                ReadHardware    = ReadPort,
                WriteHardware   = WritePort,
                DummyReadMemory = ReadBus
            };

            _tracer = new TraceBuffer(CPU.TraceHeader);

            var bios01 = comm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131253"));
            var bios02 = comm.CoreFileProvider.GetFirmwareOrThrow(new("ChannelF", "ChannelF_sl131254"));

            BIOS01 = bios01;
            BIOS02 = bios02;

            Array.Copy(rom, 0, Rom, 0, rom.Length);

            CalcClock();

            ser.Register <IVideoProvider>(this);
            ser.Register <ITraceable>(_tracer);
            ser.Register <IDisassemblable>(CPU);
            ser.Register <ISoundProvider>(this);
            ser.Register <IStatable>(new StateSerializer(SyncState));
            SetupMemoryDomains();
        }
Ejemplo n.º 29
0
        public NES(CoreComm comm, GameInfo game, byte[] rom, NESSettings settings, NESSyncSettings syncSettings, bool subframe = false)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

            var fdsBios = comm.CoreFileProvider.GetFirmware(new("NES", "Bios_FDS"));

            if (fdsBios != null && fdsBios.Length == 40976)
            {
                comm.ShowMessage("Your FDS BIOS is a bad dump.  BizHawk will attempt to use it, but no guarantees!  You should find a new one.");
                var tmp = new byte[8192];
                Buffer.BlockCopy(fdsBios, 16 + 8192 * 3, tmp, 0, 8192);
                fdsBios = tmp;
            }

            SyncSettings       = (NESSyncSettings)syncSettings ?? new NESSyncSettings();
            ControllerSettings = SyncSettings.Controls;

            videoProvider = new MyVideoProvider(this);
            Init(game, rom, fdsBios);
            if (Board is FDS fds)
            {
                DriveLightEnabled = true;
                fds.SetDriveLightCallback(val => DriveLightOn = val);
                // bit of a hack: we don't have a private gamedb for FDS, but the frontend
                // expects this to be set.
                RomStatus = game.Status;
            }
            PutSettings((NESSettings)settings ?? new NESSettings());

            // we need to put this here because the line directly above will overwrite palette intialization anywhere else
            // TODO: What if settings are later loaded?
            if (_isVS)
            {
                PickVSPalette(cart);
            }

            ser.Register <IDisassemblable>(cpu);

            Tracer = new TraceBuffer(cpu.TraceHeader);
            ser.Register <ITraceable>(Tracer);
            ser.Register <IVideoProvider>(videoProvider);
            ser.Register <ISoundProvider>(this);
            ser.Register <IStatable>(new StateSerializer(SyncState)
            {
                LoadStateCallback = SetupMemoryDomains
            });

            if (Board is BANDAI_FCG_1 bandai)
            {
                var reader = bandai.reader;
                // not all BANDAI FCG 1 boards have a barcode reader
                if (reader != null)
                {
                    ser.Register(reader);
                }
            }

            ResetControllerDefinition(subframe);
        }
Ejemplo n.º 30
0
        public VBANext(byte[] file, CoreComm comm, GameInfo game, bool deterministic, object syncsettings)
        {
            var ser = new BasicServiceProvider(this);

            ser.Register <IDisassemblable>(new ArmV4Disassembler());
            ServiceProvider = ser;

            CoreComm = comm;

            byte[] biosfile = CoreComm.CoreFileProvider.GetFirmware("GBA", "Bios", true, "GBA bios file is mandatory.");
            if (file.Length > 32 * 1024 * 1024)
            {
                throw new ArgumentException("ROM is too big to be a GBA ROM!");
            }
            if (biosfile.Length != 16 * 1024)
            {
                throw new ArgumentException("BIOS file is not exactly 16K!");
            }

            LibVBANext.FrontEndSettings FES = new LibVBANext.FrontEndSettings();
            FES.saveType        = (LibVBANext.FrontEndSettings.SaveType)game.GetInt("saveType", 0);
            FES.flashSize       = (LibVBANext.FrontEndSettings.FlashSize)game.GetInt("flashSize", 0x10000);
            FES.enableRtc       = game.GetInt("rtcEnabled", 0) != 0;
            FES.mirroringEnable = game.GetInt("mirroringEnabled", 0) != 0;

            Console.WriteLine("GameDB loaded settings: saveType={0}, flashSize={1}, rtcEnabled={2}, mirroringEnabled={3}",
                              FES.saveType, FES.flashSize, FES.enableRtc, FES.mirroringEnable);

            _syncSettings          = (SyncSettings)syncsettings ?? new SyncSettings();
            DeterministicEmulation = deterministic;

            FES.skipBios       = _syncSettings.SkipBios;
            FES.RTCUseRealTime = _syncSettings.RTCUseRealTime;
            FES.RTCwday        = (int)_syncSettings.RTCInitialDay;
            FES.RTCyear        = _syncSettings.RTCInitialTime.Year % 100;
            FES.RTCmonth       = _syncSettings.RTCInitialTime.Month - 1;
            FES.RTCmday        = _syncSettings.RTCInitialTime.Day;
            FES.RTChour        = _syncSettings.RTCInitialTime.Hour;
            FES.RTCmin         = _syncSettings.RTCInitialTime.Minute;
            FES.RTCsec         = _syncSettings.RTCInitialTime.Second;
            if (DeterministicEmulation)
            {
                // FES.skipBios = false; // this is OK; it is deterministic and probably accurate
                FES.RTCUseRealTime = false;
            }

            Core = LibVBANext.Create();
            if (Core == IntPtr.Zero)
            {
                throw new InvalidOperationException("Create() returned nullptr!");
            }
            try
            {
                if (!LibVBANext.LoadRom(Core, file, (uint)file.Length, biosfile, (uint)biosfile.Length, FES))
                {
                    throw new InvalidOperationException("LoadRom() returned false!");
                }

                Tracer = new TraceBuffer();
                ser.Register <ITraceable>(Tracer);

                CoreComm.VsyncNum      = 262144;
                CoreComm.VsyncDen      = 4389;
                CoreComm.NominalWidth  = 240;
                CoreComm.NominalHeight = 160;

                GameCode = Encoding.ASCII.GetString(file, 0xac, 4);
                Console.WriteLine("Game code \"{0}\"", GameCode);

                savebuff  = new byte[LibVBANext.BinStateSize(Core)];
                savebuff2 = new byte[savebuff.Length + 13];
                InitMemoryDomains();
                InitRegisters();
                InitCallbacks();

                // todo: hook me up as a setting
                SetupColors();
            }
            catch
            {
                Dispose();
                throw;
            }
        }