コード例 #1
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;
            }

            SyncSettings       = (NESSyncSettings)syncSettings ?? new NESSyncSettings();
            ControllerSettings = 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());

            // 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 {
                Header = cpu.TraceHeader
            };
            ser.Register <ITraceable>(Tracer);
            ser.Register <IVideoProvider>(videoProvider);
            ser.Register <ISoundProvider>(magicSoundProvider);

            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);
                }
            }
        }
コード例 #2
0
ファイル: Atari2600.cs プロジェクト: metalloidSmashes/BizHawk
        public Atari2600(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

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

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

            Rom   = rom;
            _game = game;

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

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


            ser.Register <IDisassemblable>(Cpu);
            ser.Register <ITraceable>(Tracer);
            ser.Register <IVideoProvider>(_tia);
        }
コード例 #3
0
ファイル: ColecoVision.cs プロジェクト: Marcin1503/bizhawk
        public ColecoVision(CoreComm comm, GameInfo game, byte[] rom, object SyncSettings)
        {
            ServiceProvider = new BasicServiceProvider(this);
            MemoryCallbacks = new MemoryCallbackSystem();
            CoreComm        = comm;
            _syncSettings   = (ColecoSyncSettings)SyncSettings ?? new ColecoSyncSettings();
            bool skipbios = this._syncSettings.SkipBiosIntro;

            Cpu                 = new Z80A();
            Cpu.ReadMemory      = ReadMemory;
            Cpu.WriteMemory     = WriteMemory;
            Cpu.ReadHardware    = ReadPort;
            Cpu.WriteHardware   = WritePort;
            Cpu.MemoryCallbacks = MemoryCallbacks;

            VDP = new TMS9918A(Cpu);
            (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(VDP);
            PSG = new SN76489();

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

            // gamedb can overwrite the syncsettings; this is ok
            if (game["NoSkip"])
            {
                skipbios = false;
            }
            LoadRom(rom, skipbios);
            this.game = game;
            SetupMemoryDomains();
            (ServiceProvider as BasicServiceProvider).Register <IDisassemblable>(new Disassembler());
        }
コード例 #4
0
ファイル: PCEngine.cs プロジェクト: tustin2121/tpp-BizHawk2
        public PCEngine(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
        {
            MemoryCallbacks = new MemoryCallbackSystem();
            CoreComm        = comm;

            switch (game.System)
            {
            default:
            case "PCE":
                SystemId = "PCE";
                Type     = NecSystemType.TurboGrafx;
                break;

            case "SGX":
                SystemId = "SGX";
                Type     = NecSystemType.SuperGrafx;
                break;
            }

            Settings      = (PCESettings)settings ?? new PCESettings();
            _syncSettings = (PCESyncSettings)syncSettings ?? new PCESyncSettings();
            Init(game, rom);

            _controllerDeck = new PceControllerDeck(
                _syncSettings.Port1,
                _syncSettings.Port2,
                _syncSettings.Port3,
                _syncSettings.Port4,
                _syncSettings.Port5);
        }
コード例 #5
0
ファイル: TI83.cs プロジェクト: metalloidSmashes/BizHawk
        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();
            (ServiceProvider as BasicServiceProvider).Register <IDisassemblable>(new Disassembler());
        }
コード例 #6
0
 /// <summary>
 /// for use in dual core
 /// </summary>
 internal void ConnectMemoryCallbackSystem(MemoryCallbackSystem mcs, int which)
 {
     _memorycallbacks = mcs;
     _readcb          = CreateCallback(MemoryCallbackFlags.AccessRead, () => MemoryCallbacks.HasReads, $"P{which + 1} ");
     _writecb         = CreateCallback(MemoryCallbackFlags.AccessWrite, () => MemoryCallbacks.HasWrites, $"P{which + 1} ");
     _execcb          = CreateCallback(MemoryCallbackFlags.AccessExecute, () => MemoryCallbacks.HasExecutes, $"P{which + 1} ");
     _memorycallbacks.ActiveChanged += SetMemoryCallbacks;
 }
コード例 #7
0
ファイル: C64.cs プロジェクト: mzaman07/BizHawk
        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();
        }
コード例 #8
0
ファイル: C64.cs プロジェクト: red031000/tpp-BizHawk2
        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(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);

            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();
        }
コード例 #9
0
ファイル: PCEngine.cs プロジェクト: lenalia/BizHawk
        public PCEngine(CoreComm comm, GameInfo game, Disc disc, object Settings, object syncSettings)
        {
            CoreComm          = comm;
            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();
        }
コード例 #10
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();
        }
コード例 #11
0
        public ColecoVision(CoreComm comm, GameInfo game, byte[] rom, object syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" });
            CoreComm        = comm;
            _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);

            // TODO: hack to allow bios-less operation would be nice, no idea if its feasible
            _biosRom = CoreComm.CoreFileProvider.GetFirmware("Coleco", "Bios", true, "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();

            _tracer.Header = _cpu.TraceHeader;
            ser.Register <IDisassemblable>(_cpu);
            ser.Register <ITraceable>(_tracer);
        }
コード例 #12
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);
        }
コード例 #13
0
        public Atari2600(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;

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

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

            _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")
            {
                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);
        }
コード例 #14
0
        public ColecoVision(CoreComm comm, GameInfo game, byte[] rom, object SyncSettings)
        {
            ServiceProvider = new BasicServiceProvider(this);
            MemoryCallbacks = new MemoryCallbackSystem();
            CoreComm        = comm;
            _syncSettings   = (ColecoSyncSettings)SyncSettings ?? new ColecoSyncSettings();
            bool skipbios = _syncSettings.SkipBiosIntro;

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

            PSG            = new SN76489();
            _fakeSyncSound = new FakeSyncSound(PSG, 735);
            (ServiceProvider as BasicServiceProvider).Register <ISoundProvider>(_fakeSyncSound);

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

            VDP = new TMS9918A(Cpu);
            (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(VDP);

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

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

            LoadRom(rom, skipbios);
            _game = game;
            SetupMemoryDomains();

            Tracer.Header = Cpu.TraceHeader;
            var serviceProvider = ServiceProvider as BasicServiceProvider;

            serviceProvider.Register <IDisassemblable>(new Disassembler());
            serviceProvider.Register <ITraceable>(Tracer);
        }
コード例 #15
0
ファイル: C64.cs プロジェクト: budzikt/BizHawk
        // framework
        public C64(CoreComm comm, GameInfo game, byte[] rom, string romextension, object Settings, object SyncSettings)
        {
            PutSyncSettings((C64SyncSettings)SyncSettings ?? new C64SyncSettings());
            PutSettings((C64Settings)Settings ?? new C64Settings());

            ServiceProvider = new BasicServiceProvider(this);
            InputCallbacks  = new InputCallbackSystem();

            inputFileInfo           = new InputFileInfo();
            inputFileInfo.Data      = rom;
            inputFileInfo.Extension = romextension;
            CoreComm = comm;
            Init(this.SyncSettings.vicType);
            cyclesPerFrame = board.vic.CyclesPerFrame;
            SetupMemoryDomains();
            MemoryCallbacks = new MemoryCallbackSystem();
            HardReset();

            (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(board.vic);
        }
コード例 #16
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();
        }
コード例 #17
0
ファイル: AppleII.cs プロジェクト: zdimension/BizHawk
        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());
        }
コード例 #18
0
ファイル: C64.cs プロジェクト: lenalia/BizHawk
        public C64(CoreComm comm, IEnumerable <byte[]> roms, object settings, object syncSettings)
        {
            PutSyncSettings((C64SyncSettings)syncSettings ?? new C64SyncSettings());
            PutSettings((C64Settings)settings ?? new C64Settings());

            ServiceProvider = new BasicServiceProvider(this);
            InputCallbacks  = new InputCallbackSystem();

            CoreComm = comm;
            Roms     = roms;
            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);
                ((BasicServiceProvider)ServiceProvider).Register <ISoundProvider>(_soundProvider);
            }

            DeterministicEmulation = true;

            ((BasicServiceProvider)ServiceProvider).Register <IVideoProvider>(_board.Vic);
            ((BasicServiceProvider)ServiceProvider).Register <IDriveLight>(this);
        }
コード例 #19
0
        public PCEngine(CoreComm comm, GameInfo game, byte[] rom, object Settings, object syncSettings)
        {
            MemoryCallbacks = new MemoryCallbackSystem();
            CoreComm        = comm;

            switch (game.System)
            {
            case "PCE":
                systemid = "PCE";
                Type     = NecSystemType.TurboGrafx;
                break;

            case "SGX":
                systemid = "SGX";
                Type     = NecSystemType.SuperGrafx;
                break;
            }
            this._settings = (PCESettings)Settings ?? new PCESettings();
            _syncSettings  = (PCESyncSettings)syncSettings ?? new PCESyncSettings();
            Init(game, rom);
            SetControllerButtons();
        }
コード例 #20
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();
        }
コード例 #21
0
        // framework
        public C64(CoreComm comm, GameInfo game, byte[] rom, string romextension, object settings, object syncSettings)
        {
            PutSyncSettings((C64SyncSettings)syncSettings ?? new C64SyncSettings());
            PutSettings((C64Settings)settings ?? new C64Settings());

            ServiceProvider = new BasicServiceProvider(this);
            InputCallbacks  = new InputCallbackSystem();

            _inputFileInfo = new InputFileInfo
            {
                Data      = rom,
                Extension = romextension
            };

            CoreComm = comm;
            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;
            }

            ((BasicServiceProvider)ServiceProvider).Register <IVideoProvider>(_board.Vic);
            ((BasicServiceProvider)ServiceProvider).Register <IDriveLight>(_board.Serial);
        }
コード例 #22
0
ファイル: SMS.cs プロジェクト: budzikt/BizHawk
        public SMS(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
        {
            ServiceProvider = new BasicServiceProvider(this);
            Settings        = (SMSSettings)settings ?? new SMSSettings();
            SyncSettings    = (SMSSyncSettings)syncSettings ?? new SMSSyncSettings();
            CoreComm        = comm;
            MemoryCallbacks = new MemoryCallbackSystem();

            IsGameGear = game.System == "GG";
            IsSG1000   = game.System == "SG";
            RomData    = rom;
            Tracer     = new TraceBuffer();
            (ServiceProvider as BasicServiceProvider).Register <ITraceable>(Tracer);
            if (RomData.Length % BankSize != 0)
            {
                Array.Resize(ref RomData, ((RomData.Length / BankSize) + 1) * BankSize);
            }
            RomBanks = (byte)(RomData.Length / BankSize);

            Region = DetermineDisplayType(SyncSettings.DisplayType, game.Region);
            if (game["PAL"] && Region != DisplayType.PAL)
            {
                Region = DisplayType.PAL;
                CoreComm.Notify("Display was forced to PAL mode for game compatibility.");
            }
            if (IsGameGear)
            {
                Region = DisplayType.NTSC;                 // all game gears run at 60hz/NTSC mode
            }
            CoreComm.VsyncNum = Region == DisplayType.NTSC ? 60 : 50;
            CoreComm.VsyncDen = 1;

            RegionStr = SyncSettings.ConsoleRegion;
            if (RegionStr == "Auto")
            {
                RegionStr = DetermineRegion(game.Region);
            }

            if (game["Japan"] && RegionStr != "Japan")
            {
                RegionStr = "Japan";
                CoreComm.Notify("Region was forced to Japan for game compatibility.");
            }

            if ((game.NotInDatabase || game["FM"]) && SyncSettings.EnableFM && !IsGameGear)
            {
                HasYM2413 = true;
            }

            if (Controller == null)
            {
                Controller = NullController.GetNullController();
            }

            Cpu                 = new Z80A();
            Cpu.RegisterSP      = 0xDFF0;
            Cpu.ReadHardware    = ReadPort;
            Cpu.WriteHardware   = WritePort;
            Cpu.MemoryCallbacks = MemoryCallbacks;

            Vdp = new VDP(this, Cpu, IsGameGear ? VdpMode.GameGear : VdpMode.SMS, Region);
            (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(Vdp);
            PSG        = new SN76489();
            YM2413     = new YM2413();
            SoundMixer = new SoundMixer(YM2413, PSG);
            if (HasYM2413 && game["WhenFMDisablePSG"])
            {
                SoundMixer.DisableSource(PSG);
            }
            ActiveSoundProvider = HasYM2413 ? (ISoundProvider)SoundMixer : PSG;

            SystemRam = new byte[0x2000];

            if (game["CMMapper"])
            {
                InitCodeMastersMapper();
            }
            else if (game["CMMapperWithRam"])
            {
                InitCodeMastersMapperRam();
            }
            else if (game["ExtRam"])
            {
                InitExt2kMapper(int.Parse(game.OptionValue("ExtRam")));
            }
            else if (game["KoreaMapper"])
            {
                InitKoreaMapper();
            }
            else if (game["MSXMapper"])
            {
                InitMSXMapper();
            }
            else if (game["NemesisMapper"])
            {
                InitNemesisMapper();
            }
            else if (game["TerebiOekaki"])
            {
                InitTerebiOekaki();
            }
            else
            {
                InitSegaMapper();
            }

            if (Settings.ForceStereoSeparation && !IsGameGear)
            {
                if (game["StereoByte"])
                {
                    ForceStereoByte = byte.Parse(game.OptionValue("StereoByte"));
                }
                PSG.StereoPanning = ForceStereoByte;
            }

            if (SyncSettings.AllowOverlock && game["OverclockSafe"])
            {
                Vdp.IPeriod = 512;
            }

            if (Settings.SpriteLimit)
            {
                Vdp.SpriteLimit = true;
            }

            if (game["3D"])
            {
                IsGame3D = true;
            }

            if (game["BIOS"])
            {
                Port3E = 0xF7;                 // Disable cartridge, enable BIOS rom
                InitBiosMapper();
            }
            else if (game.System == "SMS")
            {
                BiosRom = comm.CoreFileProvider.GetFirmware("SMS", RegionStr, false);
                if (BiosRom != null && (game["RequireBios"] || SyncSettings.UseBIOS))
                {
                    Port3E = 0xF7;
                }

                if (BiosRom == null && game["RequireBios"])
                {
                    throw new MissingFirmwareException("BIOS image not available. This game requires BIOS to function.");
                }
                if (SyncSettings.UseBIOS && BiosRom == null)
                {
                    CoreComm.Notify("BIOS was selected, but rom image not available. BIOS not enabled.");
                }
            }

            if (game["SRAM"])
            {
                SaveRAM = new byte[int.Parse(game.OptionValue("SRAM"))];
            }
            else if (game.NotInDatabase)
            {
                SaveRAM = new byte[0x8000];
            }

            SetupMemoryDomains();

            //this manages the linkage between the cpu and mapper callbacks so it needs running before bootup is complete
            ((ICodeDataLogger)this).SetCDL(null);

            (ServiceProvider as BasicServiceProvider).Register <IDisassemblable>(new Disassembler());
        }
コード例 #23
0
ファイル: ZXSpectrum.cs プロジェクト: Asnivor/BizHawk
        public ZXSpectrum(CoreComm comm, IEnumerable <byte[]> files, List <GameInfo> game, object settings, object syncSettings, bool?deterministic)
        {
            var ser = new BasicServiceProvider(this);

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

            CoreComm = comm;

            _gameInfo = game;

            _cpu = new Z80A();

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

            _files = files?.ToList() ?? new List <byte[]>();

            if (settings == null)
            {
                settings = new ZXSpectrumSettings();
            }
            if (syncSettings == null)
            {
                syncSettings = new ZXSpectrumSyncSettings();
            }

            PutSyncSettings((ZXSpectrumSyncSettings)syncSettings ?? new ZXSpectrumSyncSettings());
            PutSettings((ZXSpectrumSettings)settings ?? new ZXSpectrumSettings());

            List <JoystickType> joysticks = new List <JoystickType>();

            joysticks.Add(((ZXSpectrumSyncSettings)syncSettings as ZXSpectrumSyncSettings).JoystickType1);
            joysticks.Add(((ZXSpectrumSyncSettings)syncSettings as ZXSpectrumSyncSettings).JoystickType2);
            joysticks.Add(((ZXSpectrumSyncSettings)syncSettings as ZXSpectrumSyncSettings).JoystickType3);

            deterministicEmulation = ((ZXSpectrumSyncSettings)syncSettings as ZXSpectrumSyncSettings).DeterministicEmulation;

            if (deterministic != null && deterministic == true)
            {
                if (deterministicEmulation == false)
                {
                    CoreComm.Notify("Forcing Deterministic Emulation");
                }

                deterministicEmulation = deterministic.Value;
            }

            MachineType = SyncSettings.MachineType;

            switch (MachineType)
            {
            case MachineType.ZXSpectrum16:
                ControllerDefinition = ZXSpectrumControllerDefinition;
                Init(MachineType.ZXSpectrum16, SyncSettings.BorderType, SyncSettings.TapeLoadSpeed, _files, joysticks);
                break;

            case MachineType.ZXSpectrum48:
                ControllerDefinition = ZXSpectrumControllerDefinition;
                Init(MachineType.ZXSpectrum48, SyncSettings.BorderType, SyncSettings.TapeLoadSpeed, _files, joysticks);
                break;

            case MachineType.ZXSpectrum128:
                ControllerDefinition = ZXSpectrumControllerDefinition;
                Init(MachineType.ZXSpectrum128, SyncSettings.BorderType, SyncSettings.TapeLoadSpeed, _files, joysticks);
                break;

            case MachineType.ZXSpectrum128Plus2:
                ControllerDefinition = ZXSpectrumControllerDefinition;
                Init(MachineType.ZXSpectrum128Plus2, SyncSettings.BorderType, SyncSettings.TapeLoadSpeed, _files, joysticks);
                break;

            case MachineType.ZXSpectrum128Plus2a:
                ControllerDefinition = ZXSpectrumControllerDefinition;
                Init(MachineType.ZXSpectrum128Plus2a, SyncSettings.BorderType, SyncSettings.TapeLoadSpeed, _files, joysticks);
                break;

            case MachineType.ZXSpectrum128Plus3:
                ControllerDefinition = ZXSpectrumControllerDefinition;
                Init(MachineType.ZXSpectrum128Plus3, SyncSettings.BorderType, SyncSettings.TapeLoadSpeed, _files, joysticks);
                break;

            case MachineType.Pentagon128:
                ControllerDefinition = ZXSpectrumControllerDefinition;
                Init(MachineType.Pentagon128, SyncSettings.BorderType, SyncSettings.TapeLoadSpeed, _files, joysticks);
                break;

            default:
                throw new InvalidOperationException("Machine not yet emulated");
            }

            _cpu.MemoryCallbacks = MemoryCallbacks;

            HardReset = _machine.HardReset;
            SoftReset = _machine.SoftReset;

            _cpu.FetchMemory   = _machine.ReadMemory;
            _cpu.ReadMemory    = _machine.ReadMemory;
            _cpu.WriteMemory   = _machine.WriteMemory;
            _cpu.ReadHardware  = _machine.ReadPort;
            _cpu.WriteHardware = _machine.WritePort;
            _cpu.FetchDB       = _machine.PushBus;
            _cpu.OnExecFetch   = _machine.CPUMon.OnExecFetch;

            ser.Register <ITraceable>(_tracer);
            ser.Register <IDisassemblable>(_cpu);
            ser.Register <IVideoProvider>(_machine.ULADevice);

            // initialize sound mixer and attach the various ISoundProvider devices
            SoundMixer = new SoundProviderMixer((int)(32767 / 10), "System Beeper", (ISoundProvider)_machine.BuzzerDevice);
            SoundMixer.AddSource((ISoundProvider)_machine.TapeBuzzer, "Tape Audio");
            if (_machine.AYDevice != null)
            {
                SoundMixer.AddSource(_machine.AYDevice, "AY-3-3912");
            }

            // set audio device settings
            if (_machine.AYDevice != null && _machine.AYDevice.GetType() == typeof(AY38912))
            {
                ((AY38912)_machine.AYDevice as AY38912).PanningConfiguration = ((ZXSpectrumSettings)settings as ZXSpectrumSettings).AYPanConfig;
                _machine.AYDevice.Volume = ((ZXSpectrumSettings)settings as ZXSpectrumSettings).AYVolume;
            }

            if (_machine.BuzzerDevice != null)
            {
                ((Beeper)_machine.BuzzerDevice as Beeper).Volume = ((ZXSpectrumSettings)settings as ZXSpectrumSettings).EarVolume;
            }

            if (_machine.TapeBuzzer != null)
            {
                ((Beeper)_machine.TapeBuzzer as Beeper).Volume = ((ZXSpectrumSettings)settings as ZXSpectrumSettings).TapeVolume;
            }

            DCFilter dc = new DCFilter(SoundMixer, 512);

            ser.Register <ISoundProvider>(dc);

            HardReset();
            SetupMemoryDomains();
        }
コード例 #24
0
ファイル: SMS.cs プロジェクト: m35/BizHawk
        public SMS(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
        {
            ServiceProvider = new BasicServiceProvider(this);
            Settings        = (SmsSettings)settings ?? new SmsSettings();
            SyncSettings    = (SmsSyncSettings)syncSettings ?? new SmsSyncSettings();
            CoreComm        = comm;
            MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" });

            IsGameGear   = game.System == "GG";
            IsGameGear_C = game.System == "GG";
            IsSG1000     = game.System == "SG";
            RomData      = rom;

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

            RomBanks = (byte)(RomData.Length / BankSize);

            Region = DetermineDisplayType(SyncSettings.DisplayType, game.Region);
            if (game["PAL"] && Region != DisplayType.PAL)
            {
                Region = DisplayType.PAL;
                CoreComm.Notify("Display was forced to PAL mode for game compatibility.");
            }

            if (IsGameGear)
            {
                Region = DisplayType.NTSC;                 // all game gears run at 60hz/NTSC mode
            }

            _region = SyncSettings.ConsoleRegion;
            if (_region == SmsSyncSettings.Regions.Auto)
            {
                _region = DetermineRegion(game.Region);
            }

            if (game["Japan"] && _region != SmsSyncSettings.Regions.Japan)
            {
                _region = SmsSyncSettings.Regions.Japan;
                CoreComm.Notify("Region was forced to Japan for game compatibility.");
            }

            if (game["Korea"] && _region != SmsSyncSettings.Regions.Korea)
            {
                _region = SmsSyncSettings.Regions.Korea;
                CoreComm.Notify("Region was forced to Korea for game compatibility.");
            }

            if ((game.NotInDatabase || game["FM"]) && SyncSettings.EnableFm && !IsGameGear)
            {
                HasYM2413 = true;
            }

            Cpu = new Z80A()
            {
                ReadHardware    = ReadPort,
                WriteHardware   = WritePort,
                FetchMemory     = FetchMemory,
                ReadMemory      = ReadMemory,
                WriteMemory     = WriteMemory,
                MemoryCallbacks = MemoryCallbacks,
                OnExecFetch     = OnExecMemory
            };

            if (game["GG_in_SMS"])
            {
                // skip setting the BIOS because this is a game gear game that puts the system
                // in SMS compatibility mode (it will fail the check sum if played on an actual SMS though.)
                IsGameGear   = false;
                IsGameGear_C = true;
                game.System  = "GG";
                Console.WriteLine("Using SMS Compatibility mode for Game Gear System");
            }

            Vdp = new VDP(this, Cpu, IsGameGear ? VdpMode.GameGear : VdpMode.SMS, Region);
            (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(Vdp);
            PSG    = new SN76489sms();
            YM2413 = new YM2413();
            //SoundMixer = new SoundMixer(YM2413, PSG);
            if (HasYM2413 && game["WhenFMDisablePSG"])
            {
                disablePSG = true;
            }

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

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

            SystemRam = new byte[0x2000];

            if (game["CMMapper"])
            {
                InitCodeMastersMapper();
            }
            else if (game["CMMapperWithRam"])
            {
                InitCodeMastersMapperRam();
            }
            else if (game["ExtRam"])
            {
                InitExt2kMapper(int.Parse(game.OptionValue("ExtRam")));
            }
            else if (game["KoreaMapper"])
            {
                InitKoreaMapper();
            }
            else if (game["MSXMapper"])
            {
                InitMSXMapper();
            }
            else if (game["NemesisMapper"])
            {
                InitNemesisMapper();
            }
            else if (game["TerebiOekaki"])
            {
                InitTerebiOekaki();
            }
            else if (game["EEPROM"])
            {
                InitEEPROMMapper();
            }
            else
            {
                InitSegaMapper();
            }

            if (Settings.ForceStereoSeparation && !IsGameGear)
            {
                if (game["StereoByte"])
                {
                    ForceStereoByte = byte.Parse(game.OptionValue("StereoByte"));
                }

                PSG.Set_Panning(ForceStereoByte);
            }

            if (SyncSettings.AllowOverClock && game["OverclockSafe"])
            {
                Vdp.IPeriod = 512;
            }

            if (Settings.SpriteLimit)
            {
                Vdp.SpriteLimit = true;
            }

            if (game["3D"])
            {
                IsGame3D = true;
            }

            if (game["BIOS"])
            {
                Port3E = 0xF7;                 // Disable cartridge, enable BIOS rom
                InitBiosMapper();
            }
            else if (game.System == "SMS" && !game["GG_in_SMS"])
            {
                BiosRom = comm.CoreFileProvider.GetFirmware("SMS", _region.ToString(), false);

                if (BiosRom == null)
                {
                    throw new MissingFirmwareException("No BIOS found");
                }

                if (!game["RequireBios"] && !SyncSettings.UseBios)
                {
                    // we are skipping the BIOS
                    // but only if it won't break the game
                }
                else
                {
                    Port3E = 0xF7;
                }
            }

            if (game["SRAM"])
            {
                SaveRAM = new byte[int.Parse(game.OptionValue("SRAM"))];
                Console.WriteLine(SaveRAM.Length);
            }
            else if (game.NotInDatabase)
            {
                SaveRAM = new byte[0x8000];
            }

            SetupMemoryDomains();

            //this manages the linkage between the cpu and mapper callbacks so it needs running before bootup is complete
            ((ICodeDataLogger)this).SetCDL(null);

            InputCallbacks = new InputCallbackSystem();

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

            var serviceProvider = ServiceProvider as BasicServiceProvider;

            serviceProvider.Register <ITraceable>(Tracer);
            serviceProvider.Register <IDisassemblable>(Cpu);
            Vdp.ProcessOverscan();

            Cpu.ReadMemory  = ReadMemory;
            Cpu.WriteMemory = WriteMemory;

            // Z80 SP initialization
            // stops a few SMS and GG games from crashing
            Cpu.Regs[Cpu.SPl] = 0xF0;
            Cpu.Regs[Cpu.SPh] = 0xDF;
        }
コード例 #25
0
ファイル: N64.cs プロジェクト: Arnyew/RTC-0.7-Deprecated-
        public N64(CoreComm comm, GameInfo game, byte[] file, object settings, object syncSettings)
        {
            ServiceProvider = new BasicServiceProvider(this);
            InputCallbacks  = new InputCallbackSystem();
            MemoryCallbacks = new MemoryCallbackSystem
            {
                ExecuteCallbacksAvailable = false
            };

            int SaveType = 0;

            if (game.OptionValue("SaveType") == "EEPROM_16K")
            {
                SaveType = 1;
            }

            CoreComm = comm;

            _syncSettings = (N64SyncSettings)syncSettings ?? new N64SyncSettings();
            _settings     = (N64Settings)settings ?? new N64Settings();

            _disableExpansionSlot = _syncSettings.DisableExpansionSlot;

            // Override the user's expansion slot setting if it is mentioned in the gamedb (it is mentioned but the game MUST have this setting or else not work
            if (game.OptionValue("expansionpak") != null && game.OptionValue("expansionpak") == "1")
            {
                _disableExpansionSlot = false;
                IsOverridingUserExpansionSlotSetting = true;
            }

            byte country_code = file[0x3E];

            switch (country_code)
            {
            // PAL codes
            case 0x44:
            case 0x46:
            case 0x49:
            case 0x50:
            case 0x53:
            case 0x55:
            case 0x58:
            case 0x59:
                _display_type = DisplayType.PAL;
                break;

            // NTSC codes
            case 0x37:
            case 0x41:
            case 0x45:
            case 0x4a:
            default:                     // Fallback for unknown codes
                _display_type = DisplayType.NTSC;
                break;
            }
            switch (Region)
            {
            case DisplayType.NTSC:
                comm.VsyncNum = 60000;
                comm.VsyncDen = 1001;
                break;

            default:
                comm.VsyncNum = 50;
                comm.VsyncDen = 1;
                break;
            }

            StartThreadLoop();

            var videosettings = _syncSettings.GetVPS(game, _settings.VideoSizeX, _settings.VideoSizeY);
            var coreType      = _syncSettings.Core;

            //zero 19-apr-2014 - added this to solve problem with SDL initialization corrupting the main thread (I think) and breaking subsequent emulators (for example, NES)
            //not sure why this works... if we put the plugin initializations in here, we get deadlocks in some SDL initialization. doesnt make sense to me...
            RunThreadAction(() =>
            {
                api = new mupen64plusApi(this, file, videosettings, SaveType, (int)coreType, _disableExpansionSlot);
            });

            // Order is important because the register with the mupen core
            _videoProvider = new N64VideoProvider(api, videosettings);
            _audioProvider = new N64Audio(api);
            _inputProvider = new N64Input(this.AsInputPollable(), api, comm, this._syncSettings.Controllers);
            (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(_videoProvider);

            string rsp = _syncSettings.Rsp == N64SyncSettings.RspType.Rsp_Hle ?
                         "mupen64plus-rsp-hle.dll" :
                         "mupen64plus-rsp-z64-hlevideo.dll";

            api.AttachPlugin(mupen64plusApi.m64p_plugin_type.M64PLUGIN_RSP, rsp);

            InitMemoryDomains();
            RefreshMemoryCallbacks();

            api.AsyncExecuteEmulator();

            // Hack: Saving a state on frame 0 has been shown to not be sync stable. Advance past that frame to avoid the problem.
            // Advancing 2 frames was chosen to deal with a problem with the dynamic recompiler. The dynarec seems to take 2 frames to set
            // things up correctly. If a state is loaded on frames 0 or 1 mupen tries to access null pointers and the emulator crashes, so instead
            // advance past both to again avoid the problem.
            api.frame_advance();
            api.frame_advance();

            SetControllerButtons();
        }
コード例 #26
0
        public SMS(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
        {
            ServiceProvider = new BasicServiceProvider(this);
            Settings        = (SMSSettings)settings ?? new SMSSettings();
            SyncSettings    = (SMSSyncSettings)syncSettings ?? new SMSSyncSettings();
            CoreComm        = comm;
            MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" });

            IsGameGear = game.System == "GG";
            IsSG1000   = game.System == "SG";
            RomData    = rom;

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

            RomBanks = (byte)(RomData.Length / BankSize);

            Region = DetermineDisplayType(SyncSettings.DisplayType, game.Region);
            if (game["PAL"] && Region != DisplayType.PAL)
            {
                Region = DisplayType.PAL;
                CoreComm.Notify("Display was forced to PAL mode for game compatibility.");
            }

            if (IsGameGear)
            {
                Region = DisplayType.NTSC;                 // all game gears run at 60hz/NTSC mode
            }

            RegionStr = SyncSettings.ConsoleRegion;
            if (RegionStr == "Auto")
            {
                RegionStr = DetermineRegion(game.Region);
            }

            if (game["Japan"] && RegionStr != "Japan")
            {
                RegionStr = "Japan";
                CoreComm.Notify("Region was forced to Japan for game compatibility.");
            }

            if ((game.NotInDatabase || game["FM"]) && SyncSettings.EnableFM && !IsGameGear)
            {
                HasYM2413 = true;
            }

            Cpu = new Z80A()
            {
                ReadHardware    = ReadPort,
                WriteHardware   = WritePort,
                FetchMemory     = FetchMemory,
                ReadMemory      = ReadMemory,
                WriteMemory     = WriteMemory,
                MemoryCallbacks = MemoryCallbacks,
                OnExecFetch     = OnExecMemory
            };

            Vdp = new VDP(this, Cpu, IsGameGear ? VdpMode.GameGear : VdpMode.SMS, Region);
            (ServiceProvider as BasicServiceProvider).Register <IVideoProvider>(Vdp);
            PSG        = new SN76489();
            YM2413     = new YM2413();
            SoundMixer = new SoundMixer(YM2413, PSG);
            if (HasYM2413 && game["WhenFMDisablePSG"])
            {
                SoundMixer.DisableSource(PSG);
            }

            ActiveSoundProvider = HasYM2413 ? (IAsyncSoundProvider)SoundMixer : PSG;
            _fakeSyncSound      = new FakeSyncSound(ActiveSoundProvider, 735);
            (ServiceProvider as BasicServiceProvider).Register <ISoundProvider>(_fakeSyncSound);

            SystemRam = new byte[0x2000];

            if (game["CMMapper"])
            {
                InitCodeMastersMapper();
            }
            else if (game["CMMapperWithRam"])
            {
                InitCodeMastersMapperRam();
            }
            else if (game["ExtRam"])
            {
                InitExt2kMapper(int.Parse(game.OptionValue("ExtRam")));
            }
            else if (game["KoreaMapper"])
            {
                InitKoreaMapper();
            }
            else if (game["MSXMapper"])
            {
                InitMSXMapper();
            }
            else if (game["NemesisMapper"])
            {
                InitNemesisMapper();
            }
            else if (game["TerebiOekaki"])
            {
                InitTerebiOekaki();
            }
            else if (game["EEPROM"])
            {
                InitEEPROMMapper();
            }
            else
            {
                InitSegaMapper();
            }

            if (Settings.ForceStereoSeparation && !IsGameGear)
            {
                if (game["StereoByte"])
                {
                    ForceStereoByte = byte.Parse(game.OptionValue("StereoByte"));
                }

                PSG.StereoPanning = ForceStereoByte;
            }

            if (SyncSettings.AllowOverlock && game["OverclockSafe"])
            {
                Vdp.IPeriod = 512;
            }

            if (Settings.SpriteLimit)
            {
                Vdp.SpriteLimit = true;
            }

            if (game["3D"])
            {
                IsGame3D = true;
            }

            if (game["BIOS"])
            {
                Port3E = 0xF7;                 // Disable cartridge, enable BIOS rom
                InitBiosMapper();
            }
            else if (game.System == "SMS")
            {
                BiosRom = comm.CoreFileProvider.GetFirmware("SMS", RegionStr, false);

                if (BiosRom == null)
                {
                    throw new MissingFirmwareException("No BIOS found");
                }
                else if (!game["RequireBios"] && !SyncSettings.UseBIOS)
                {
                    // we are skipping the BIOS
                    // but only if it won't break the game
                }
                else
                {
                    Port3E = 0xF7;
                }
            }

            if (game["SRAM"])
            {
                SaveRAM = new byte[int.Parse(game.OptionValue("SRAM"))];
                Console.WriteLine(SaveRAM.Length);
            }
            else if (game.NotInDatabase)
            {
                SaveRAM = new byte[0x8000];
            }

            SetupMemoryDomains();

            //this manages the linkage between the cpu and mapper callbacks so it needs running before bootup is complete
            ((ICodeDataLogger)this).SetCDL(null);

            InputCallbacks = new InputCallbackSystem();

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

            var serviceProvider = ServiceProvider as BasicServiceProvider;

            serviceProvider.Register <ITraceable>(Tracer);
            serviceProvider.Register <IDisassemblable>(Cpu);
            Vdp.ProcessOverscan();

            Cpu.ReadMemory  = ReadMemory;
            Cpu.WriteMemory = WriteMemory;
        }
コード例 #27
0
ファイル: GambatteLink.cs プロジェクト: gocha/BizHawk
        public GambatteLink(CoreLoadParameters <GambatteLinkSettings, GambatteLinkSyncSettings> lp)
        {
            if (lp.Roms.Count < MIN_PLAYERS || lp.Roms.Count > MAX_PLAYERS)
            {
                throw new InvalidOperationException("Wrong number of roms");
            }

            _numCores = lp.Roms.Count;

            _serviceProvider = new BasicServiceProvider(this);
            _settings        = lp.Settings ?? new GambatteLinkSettings();
            _syncSettings    = lp.SyncSettings ?? new GambatteLinkSyncSettings();

            _linkedCores    = new Gameboy[_numCores];
            _linkedConts    = new SaveController[_numCores];
            _linkedBlips    = new BlipBuffer[_numCores];
            _linkedLatches  = new int[_numCores];
            _linkedOverflow = new int[_numCores];

            RomDetails = "";

            var scopes = new string[_numCores * 7];

            for (int i = 0; i < _numCores; i++)
            {
                scopes[i * 7 + 0] = $"P{i + 1} System Bus";
                scopes[i * 7 + 1] = $"P{i + 1} ROM";
                scopes[i * 7 + 2] = $"P{i + 1} VRAM";
                scopes[i * 7 + 3] = $"P{i + 1} SRAM";
                scopes[i * 7 + 4] = $"P{i + 1} WRAM";
                scopes[i * 7 + 5] = $"P{i + 1} OAM";
                scopes[i * 7 + 6] = $"P{i + 1} HRAM";
            }

            _memoryCallbacks = new MemoryCallbackSystem(scopes);

            for (int i = 0; i < _numCores; i++)
            {
                _linkedCores[i] = new Gameboy(lp.Comm, lp.Roms[i].Game, lp.Roms[i].RomData, _settings._linkedSettings[i], _syncSettings._linkedSyncSettings[i], lp.DeterministicEmulationRequested);
                _linkedCores[i].ConnectInputCallbackSystem(_inputCallbacks);
                _linkedCores[i].ConnectMemoryCallbackSystem(_memoryCallbacks, i);
                _linkedConts[i] = new SaveController(Gameboy.CreateControllerDefinition(false, false));
                _linkedBlips[i] = new BlipBuffer(1024);
                _linkedBlips[i].SetRates(2097152 * 2, 44100);
                _linkedOverflow[i] = 0;
                _linkedLatches[i]  = 0;
                RomDetails        += $"P{i + 1}:\r\n" + _linkedCores[i].RomDetails;
            }

            LinkConnected = true;

            Frame      = 0;
            LagCount   = 0;
            IsLagFrame = false;

            SoundBuffer = new short[MaxSampsPerFrame * _numCores];

            FrameBuffer = CreateVideoBuffer();
            VideoBuffer = CreateVideoBuffer();

            GBLinkController = CreateControllerDefinition();

            _linkedSaveRam = new LinkedSaveRam(_linkedCores, _numCores);
            _serviceProvider.Register <ISaveRam>(_linkedSaveRam);

            _linkedMemoryDomains = new LinkedMemoryDomains(_linkedCores, _numCores);
            _serviceProvider.Register <IMemoryDomains>(_linkedMemoryDomains);

            _linkedDebuggable = new LinkedDebuggable(_linkedCores, _numCores, _memoryCallbacks);
            _serviceProvider.Register <IDebuggable>(_linkedDebuggable);
        }
コード例 #28
0
 /// <summary>
 /// for use in dual core
 /// </summary>
 internal void ConnectMemoryCallbackSystem(MemoryCallbackSystem mcs)
 {
     _memorycallbacks = mcs;
 }
コード例 #29
0
        public AmstradCPC(CoreComm comm, IEnumerable <byte[]> files, List <GameInfo> game, object settings, object syncSettings)
        {
            var ser = new BasicServiceProvider(this);

            ServiceProvider = ser;
            InputCallbacks  = new InputCallbackSystem();
            MemoryCallbacks = new MemoryCallbackSystem(new[] { "System Bus" });
            CoreComm        = comm;
            _gameInfo       = game;
            _cpu            = new Z80A();
            _tracer         = new TraceBuffer {
                Header = _cpu.TraceHeader
            };
            _files = files?.ToList() ?? new List <byte[]>();

            if (settings == null)
            {
                settings = new AmstradCPCSettings();
            }
            if (syncSettings == null)
            {
                syncSettings = new AmstradCPCSyncSettings();
            }

            PutSyncSettings((AmstradCPCSyncSettings)syncSettings ?? new AmstradCPCSyncSettings());
            PutSettings((AmstradCPCSettings)settings ?? new AmstradCPCSettings());

            deterministicEmulation = ((AmstradCPCSyncSettings)syncSettings as AmstradCPCSyncSettings).DeterministicEmulation;

            switch (SyncSettings.MachineType)
            {
            case MachineType.CPC464:
                ControllerDefinition = AmstradCPCControllerDefinition;
                Init(MachineType.CPC464, _files, ((AmstradCPCSyncSettings)syncSettings as AmstradCPCSyncSettings).AutoStartStopTape,
                     ((AmstradCPCSyncSettings)syncSettings as AmstradCPCSyncSettings).BorderType);
                break;

            case MachineType.CPC6128:
                ControllerDefinition = AmstradCPCControllerDefinition;
                Init(MachineType.CPC6128, _files, ((AmstradCPCSyncSettings)syncSettings as AmstradCPCSyncSettings).AutoStartStopTape, ((AmstradCPCSyncSettings)syncSettings as AmstradCPCSyncSettings).BorderType);
                break;

            default:
                throw new InvalidOperationException("Machine not yet emulated");
            }

            _cpu.MemoryCallbacks = MemoryCallbacks;

            HardReset = _machine.HardReset;
            SoftReset = _machine.SoftReset;

            _cpu.FetchMemory    = _machine.ReadMemory;
            _cpu.ReadMemory     = _machine.ReadMemory;
            _cpu.WriteMemory    = _machine.WriteMemory;
            _cpu.ReadHardware   = _machine.ReadPort;
            _cpu.WriteHardware  = _machine.WritePort;
            _cpu.FetchDB        = _machine.PushBus;
            _cpu.IRQACKCallback = _machine.GateArray.IORQA;
            //_cpu.OnExecFetch = _machine.CPUMon.OnExecFetch;

            ser.Register <ITraceable>(_tracer);
            ser.Register <IDisassemblable>(_cpu);
            ser.Register <IVideoProvider>(_machine.GateArray);

            // initialize sound mixer and attach the various ISoundProvider devices
            SoundMixer = new SoundProviderMixer((int)(32767 / 10), "Tape Audio", (ISoundProvider)_machine.TapeBuzzer);
            if (_machine.AYDevice != null)
            {
                SoundMixer.AddSource(_machine.AYDevice, "AY-3-3912");
            }

            // set audio device settings
            if (_machine.AYDevice != null && _machine.AYDevice.GetType() == typeof(AY38912))
            {
                ((AY38912)_machine.AYDevice as AY38912).PanningConfiguration = ((AmstradCPCSettings)settings as AmstradCPCSettings).AYPanConfig;
                _machine.AYDevice.Volume = ((AmstradCPCSettings)settings as AmstradCPCSettings).AYVolume;
            }

            if (_machine.TapeBuzzer != null)
            {
                ((Beeper)_machine.TapeBuzzer as Beeper).Volume = ((AmstradCPCSettings)settings as AmstradCPCSettings).TapeVolume;
            }

            ser.Register <ISoundProvider>(SoundMixer);

            HardReset();
            SetupMemoryDomains();
        }