BizHawk/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.cs

151 lines
4.1 KiB
C#
Raw Normal View History

2012-03-07 00:40:20 +00:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
2012-03-07 00:40:20 +00:00
using BizHawk.Common;
2014-07-03 19:20:34 +00:00
using BizHawk.Common.BufferExtensions;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Atari.Atari2600
2012-03-07 00:40:20 +00:00
{
[CoreAttributes(
"Atari2600Hawk",
"Micro500, adelikat, natt",
isPorted: false,
isReleased: true
)]
[ServiceNotApplicable(typeof(ISaveRam), typeof(IDriveLight))]
public partial class Atari2600 : IEmulator, IStatable, IDebuggable, IInputPollable, ISettable<Atari2600.A2600Settings, Atari2600.A2600SyncSettings>
2012-03-07 00:40:20 +00:00
{
private readonly GameInfo _game;
private int _frame;
2012-03-30 00:35:15 +00:00
private ITraceable Tracer { get; set; }
[CoreConstructor("A26")]
public Atari2600(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
2012-03-07 00:40:20 +00:00
{
2015-01-15 15:56:41 +00:00
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));
}
2012-03-30 00:35:15 +00:00
Console.WriteLine("Game uses mapper " + game.GetOptionsDict()["m"]);
RebootCore();
SetupMemoryDomains();
2015-01-15 15:56:41 +00:00
ser.Register<IDisassemblable>(Cpu);
ser.Register<ITraceable>(Tracer);
ser.Register<IVideoProvider>(_tia);
2012-03-07 00:40:20 +00:00
}
public IEmulatorServiceProvider ServiceProvider { get; private set; }
public string SystemId { get { return "A26"; } }
public string BoardName { get { return _mapper.GetType().Name; } }
public CoreComm CoreComm { get; private set; }
public ISoundProvider SoundProvider { get { return _dcfilter; } }
// todo: make this not so ugly
public ISyncSoundProvider SyncSoundProvider
{
get
{
return new FakeSyncSound(_dcfilter, CoreComm.VsyncRate > 55.0 ? 735 : 882);
}
}
public ControllerDefinition ControllerDefinition { get { return Atari2600ControllerDefinition; } }
public IController Controller { get; set; }
public int Frame { get { return _frame; } set { _frame = value; } }
public bool DeterministicEmulation { get; set; }
public static readonly ControllerDefinition Atari2600ControllerDefinition = new ControllerDefinition
{
Name = "Atari 2600 Basic Controller",
BoolButtons =
{
"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Button",
"P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Button",
"Reset", "Select", "Power"
}
};
public CompactGameInfo GenerateGameDbEntry()
{
return new CompactGameInfo
{
Name = _game.Name,
System = "A26",
MetaData = "m=" + _mapper.GetType().ToString().Split('.').ToList().Last(),
2014-07-03 19:20:34 +00:00
Hash = Rom.HashSHA1(),
Region = _game.Region,
Status = RomStatus.Unknown
};
}
public bool StartAsyncSound() { return true; }
public void EndAsyncSound() { }
public void ResetCounters()
2012-03-07 00:40:20 +00:00
{
_frame = 0;
_lagcount = 0;
_islag = false;
2012-03-07 00:40:20 +00:00
}
public void Dispose() { }
private static bool DetectPal(GameInfo game, byte[] rom)
{
2014-05-23 15:47:48 +00:00
// force NTSC mode for the new core we instantiate
var newgame = game.Clone();
if (newgame["PAL"])
newgame.RemoveOption("PAL");
if (!newgame["NTSC"])
newgame.AddOption("NTSC");
2014-05-21 15:47:18 +00:00
// give the emu a minimal of input\output connections so it doesn't crash
var comm = new CoreComm(null, null);
2014-05-23 15:47:48 +00:00
using (Atari2600 emu = new Atari2600(new CoreComm(null, null), newgame, rom, null, null))
2014-05-21 15:47:18 +00:00
{
emu.Controller = new NullController();
List<int> framecounts = new List<int>();
emu._tia.FrameEndCallBack = (i) => framecounts.Add(i);
for (int i = 0; i < 71; i++) // run for 71 * 262 lines, since we're in NTSC mode
emu.FrameAdvance(false, false);
int numpal = framecounts.Count((i) => i > 287);
2014-05-23 15:47:48 +00:00
bool pal = numpal >= 25;
Console.WriteLine("PAL Detection: {0} lines, {1}", numpal, pal);
return pal;
2014-05-21 15:47:18 +00:00
}
}
2012-03-07 00:40:20 +00:00
}
}