Move InputCallbackSystem from CoreComm to IInputPollable, and refactor all cores accordingly. Lua - OnInputPoll() - log to the user when attemping to add a callback of this type to a core that has not implemented input callbacks. Mark all unmanaged cores' implementations of the InputCallbackSystem as FeatureNotImpleented, won't have any effect on functionality, but will help us keep track of the fact that they still have a bit of work to do. Still todo: ActiveChanged event handler on the base implementation of IInputCallbackSystem
This commit is contained in:
parent
7ffe07c44b
commit
a07263c04e
|
@ -3,7 +3,8 @@ using System.Linq;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
|
||||||
using LuaInterface;
|
using LuaInterface;
|
||||||
|
using BizHawk.Emulation.Common;
|
||||||
|
using BizHawk.Emulation.Common.IEmulatorExtensions;
|
||||||
|
|
||||||
namespace BizHawk.Client.Common
|
namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
|
@ -155,7 +156,27 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
var nlf = new NamedLuaFunction(luaf, "OnInputPoll", LogOutputCallback, CurrentThread, name);
|
var nlf = new NamedLuaFunction(luaf, "OnInputPoll", LogOutputCallback, CurrentThread, name);
|
||||||
_luaFunctions.Add(nlf);
|
_luaFunctions.Add(nlf);
|
||||||
Global.Emulator.CoreComm.InputCallback.Add(nlf.Callback);
|
|
||||||
|
if (Global.Emulator.CanPollInput())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
(Global.Emulator as IInputPollable).InputCallbacks.Add(nlf.Callback);
|
||||||
|
}
|
||||||
|
catch (NotImplementedException)
|
||||||
|
{
|
||||||
|
LogNotImplemented();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogNotImplemented();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LogNotImplemented()
|
||||||
|
{
|
||||||
|
Log(string.Format("Error: {0} does not yet implement input polling callbacks"));
|
||||||
}
|
}
|
||||||
|
|
||||||
[LuaMethodAttributes(
|
[LuaMethodAttributes(
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
|
using BizHawk.Emulation.Common;
|
||||||
|
using BizHawk.Emulation.Common.IEmulatorExtensions;
|
||||||
|
|
||||||
namespace BizHawk.Client.Common
|
namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
public class LuaFunctionList : List<NamedLuaFunction>
|
public class LuaFunctionList : List<NamedLuaFunction>
|
||||||
|
@ -15,14 +18,22 @@ namespace BizHawk.Client.Common
|
||||||
|
|
||||||
public new bool Remove(NamedLuaFunction function)
|
public new bool Remove(NamedLuaFunction function)
|
||||||
{
|
{
|
||||||
Global.Emulator.CoreComm.InputCallback.Remove(function.Callback);
|
if (Global.Emulator.CanPollInput())
|
||||||
|
{
|
||||||
|
(Global.Emulator as IInputPollable).InputCallbacks.Remove(function.Callback);
|
||||||
|
}
|
||||||
|
|
||||||
Global.Emulator.CoreComm.MemoryCallbackSystem.Remove(function.Callback);
|
Global.Emulator.CoreComm.MemoryCallbackSystem.Remove(function.Callback);
|
||||||
return base.Remove(function);
|
return base.Remove(function);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearAll()
|
public void ClearAll()
|
||||||
{
|
{
|
||||||
Global.Emulator.CoreComm.InputCallback.RemoveAll(this.Select(x => x.Callback));
|
if (Global.Emulator.CanPollInput())
|
||||||
|
{
|
||||||
|
(Global.Emulator as IInputPollable).InputCallbacks.RemoveAll(this.Select(x => x.Callback));
|
||||||
|
}
|
||||||
|
|
||||||
Global.Emulator.CoreComm.MemoryCallbackSystem.RemoveAll(this.Select(x => x.Callback));
|
Global.Emulator.CoreComm.MemoryCallbackSystem.RemoveAll(this.Select(x => x.Callback));
|
||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace BizHawk.Emulation.Common
|
||||||
|
{
|
||||||
|
public class InputCallbackSystem : List<Action>, IInputCallbackSystem
|
||||||
|
{
|
||||||
|
public void Call()
|
||||||
|
{
|
||||||
|
foreach (var action in this)
|
||||||
|
{
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveAll(IEnumerable<Action> actions)
|
||||||
|
{
|
||||||
|
foreach (var action in actions)
|
||||||
|
{
|
||||||
|
this.Remove(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -50,6 +50,7 @@
|
||||||
<Link>VersionInfo.cs</Link>
|
<Link>VersionInfo.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Base Implementations\ControllerDefinition.cs" />
|
<Compile Include="Base Implementations\ControllerDefinition.cs" />
|
||||||
|
<Compile Include="Base Implementations\InputCallbackSystem.cs" />
|
||||||
<Compile Include="Base Implementations\NullController.cs" />
|
<Compile Include="Base Implementations\NullController.cs" />
|
||||||
<Compile Include="Base Implementations\NullEmulator.cs" />
|
<Compile Include="Base Implementations\NullEmulator.cs" />
|
||||||
<Compile Include="Base Implementations\NullSound.cs" />
|
<Compile Include="Base Implementations\NullSound.cs" />
|
||||||
|
@ -67,6 +68,7 @@
|
||||||
<Compile Include="Interfaces\ICoreService.cs" />
|
<Compile Include="Interfaces\ICoreService.cs" />
|
||||||
<Compile Include="Interfaces\IDebuggable.cs" />
|
<Compile Include="Interfaces\IDebuggable.cs" />
|
||||||
<Compile Include="Interfaces\IEmulator.cs" />
|
<Compile Include="Interfaces\IEmulator.cs" />
|
||||||
|
<Compile Include="Interfaces\IInputCallbackSystem.cs" />
|
||||||
<Compile Include="Interfaces\IInputPollable.cs" />
|
<Compile Include="Interfaces\IInputPollable.cs" />
|
||||||
<Compile Include="Interfaces\IMemoryDomains.cs" />
|
<Compile Include="Interfaces\IMemoryDomains.cs" />
|
||||||
<Compile Include="Interfaces\ISaveRam.cs" />
|
<Compile Include="Interfaces\ISaveRam.cs" />
|
||||||
|
|
|
@ -14,11 +14,6 @@ namespace BizHawk.Emulation.Common
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public TraceBuffer Tracer = new TraceBuffer();
|
public TraceBuffer Tracer = new TraceBuffer();
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// for emu.on_snoop()
|
|
||||||
/// </summary>
|
|
||||||
public InputCallbackSystem InputCallback = new InputCallbackSystem();
|
|
||||||
|
|
||||||
public MemoryCallbackSystem MemoryCallbackSystem = new MemoryCallbackSystem();
|
public MemoryCallbackSystem MemoryCallbackSystem = new MemoryCallbackSystem();
|
||||||
|
|
||||||
public double VsyncRate
|
public double VsyncRate
|
||||||
|
@ -121,25 +116,6 @@ namespace BizHawk.Emulation.Common
|
||||||
private bool logging;
|
private bool logging;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class InputCallbackSystem : List<Action>
|
|
||||||
{
|
|
||||||
public void Call()
|
|
||||||
{
|
|
||||||
foreach (var action in this)
|
|
||||||
{
|
|
||||||
action();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RemoveAll(IEnumerable<Action> actions)
|
|
||||||
{
|
|
||||||
foreach (var action in actions)
|
|
||||||
{
|
|
||||||
this.Remove(action);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MemoryCallbackSystem
|
public class MemoryCallbackSystem
|
||||||
{
|
{
|
||||||
private readonly List<Action> _reads = new List<Action>();
|
private readonly List<Action> _reads = new List<Action>();
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace BizHawk.Emulation.Common
|
||||||
|
{
|
||||||
|
// TODO: This isn't a CoreService, it is a sub class of a core service, it would be nice to make that clear
|
||||||
|
public interface IInputCallbackSystem : IList<Action>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Will iterate and call every callback
|
||||||
|
/// </summary>
|
||||||
|
void Call();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Will remove the given list of callbacks
|
||||||
|
/// </summary>
|
||||||
|
void RemoveAll(IEnumerable<Action> actions);
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,5 +12,7 @@
|
||||||
/// All cores should define it the same, a lag frame is a frame in which input was not polled.
|
/// All cores should define it the same, a lag frame is a frame in which input was not polled.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool IsLagFrame { get; }
|
bool IsLagFrame { get; }
|
||||||
|
|
||||||
|
IInputCallbackSystem InputCallbacks { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@ namespace BizHawk.Emulation.Cores.Calculators
|
||||||
set { _lagCount = value; }
|
set { _lagCount = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IInputCallbackSystem InputCallbacks { get; private set; }
|
||||||
|
|
||||||
public bool IsLagFrame
|
public bool IsLagFrame
|
||||||
{
|
{
|
||||||
get { return _isLag; }
|
get { return _isLag; }
|
||||||
|
|
|
@ -52,6 +52,7 @@ namespace BizHawk.Emulation.Cores.Calculators
|
||||||
[CoreConstructor("TI83")]
|
[CoreConstructor("TI83")]
|
||||||
public TI83(CoreComm comm, GameInfo game, byte[] rom, object Settings)
|
public TI83(CoreComm comm, GameInfo game, byte[] rom, object Settings)
|
||||||
{
|
{
|
||||||
|
InputCallbacks = new InputCallbackSystem();
|
||||||
PutSettings((TI83Settings)Settings ?? new TI83Settings());
|
PutSettings((TI83Settings)Settings ?? new TI83Settings());
|
||||||
|
|
||||||
CoreComm = comm;
|
CoreComm = comm;
|
||||||
|
@ -186,7 +187,7 @@ namespace BizHawk.Emulation.Cores.Calculators
|
||||||
|
|
||||||
private byte ReadKeyboard()
|
private byte ReadKeyboard()
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
//ref TI-9X
|
//ref TI-9X
|
||||||
|
|
||||||
int ret = 0xFF;
|
int ret = 0xFF;
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
public void PollInput()
|
public void PollInput()
|
||||||
{
|
{
|
||||||
_c64.CoreComm.InputCallback.Call();
|
_c64.InputCallbacks.Call();
|
||||||
// scan joysticks
|
// scan joysticks
|
||||||
pollIndex = 0;
|
pollIndex = 0;
|
||||||
for (int j = 0; j < 5; j++)
|
for (int j = 0; j < 5; j++)
|
||||||
|
|
|
@ -186,6 +186,9 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
|
||||||
|
|
||||||
public bool BinarySaveStatesPreferred { get { return false; } }
|
public bool BinarySaveStatesPreferred { get { return false; } }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
public IInputCallbackSystem InputCallbacks { get { return _inputCallbacks; } }
|
||||||
|
|
||||||
private void SetupMemoryDomains()
|
private void SetupMemoryDomains()
|
||||||
{
|
{
|
||||||
// chips must be initialized before this code runs!
|
// chips must be initialized before this code runs!
|
||||||
|
|
|
@ -424,7 +424,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
|
||||||
|
|
||||||
public byte ReadControls1(bool peek)
|
public byte ReadControls1(bool peek)
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
byte value = 0xFF;
|
byte value = 0xFF;
|
||||||
|
|
||||||
if (Controller["P1 Up"]) { value &= 0xEF; }
|
if (Controller["P1 Up"]) { value &= 0xEF; }
|
||||||
|
@ -443,7 +443,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
|
||||||
|
|
||||||
public byte ReadControls2(bool peek)
|
public byte ReadControls2(bool peek)
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
byte value = 0xFF;
|
byte value = 0xFF;
|
||||||
|
|
||||||
if (Controller["P2 Up"]) { value &= 0xEF; }
|
if (Controller["P2 Up"]) { value &= 0xEF; }
|
||||||
|
|
|
@ -15,6 +15,8 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
|
||||||
get { return _islag; }
|
get { return _islag; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IInputCallbackSystem InputCallbacks { get; private set; }
|
||||||
|
|
||||||
private bool _islag = true;
|
private bool _islag = true;
|
||||||
private int _lagcount;
|
private int _lagcount;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
|
||||||
[CoreConstructor("A26")]
|
[CoreConstructor("A26")]
|
||||||
public Atari2600(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
|
public Atari2600(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings)
|
||||||
{
|
{
|
||||||
|
InputCallbacks = new InputCallbackSystem();
|
||||||
Ram = new byte[128];
|
Ram = new byte[128];
|
||||||
CoreComm = comm;
|
CoreComm = comm;
|
||||||
Settings = (A2600Settings)settings ?? new A2600Settings();
|
Settings = (A2600Settings)settings ?? new A2600Settings();
|
||||||
|
@ -137,7 +138,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
|
||||||
|
|
||||||
// give the emu a minimal of input\output connections so it doesn't crash
|
// give the emu a minimal of input\output connections so it doesn't crash
|
||||||
var comm = new CoreComm(null, null);
|
var comm = new CoreComm(null, null);
|
||||||
comm.InputCallback = new InputCallbackSystem();
|
|
||||||
using (Atari2600 emu = new Atari2600(new CoreComm(null, null), newgame, rom, null, null))
|
using (Atari2600 emu = new Atari2600(new CoreComm(null, null), newgame, rom, null, null))
|
||||||
{
|
{
|
||||||
emu.Controller = new NullController();
|
emu.Controller = new NullController();
|
||||||
|
|
|
@ -15,6 +15,8 @@ namespace BizHawk.Emulation.Cores.Atari.Atari7800
|
||||||
get { return _islag; }
|
get { return _islag; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IInputCallbackSystem InputCallbacks { get; private set; }
|
||||||
|
|
||||||
private bool _islag = true;
|
private bool _islag = true;
|
||||||
private int _lagcount;
|
private int _lagcount;
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,6 +122,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari7800
|
||||||
|
|
||||||
public Atari7800(CoreComm comm, GameInfo game, byte[] rom, string GameDBfn)
|
public Atari7800(CoreComm comm, GameInfo game, byte[] rom, string GameDBfn)
|
||||||
{
|
{
|
||||||
|
InputCallbacks = new InputCallbackSystem();
|
||||||
CoreComm = comm;
|
CoreComm = comm;
|
||||||
byte[] highscoreBIOS = comm.CoreFileProvider.GetFirmware("A78", "Bios_HSC", false, "Some functions may not work without the high score BIOS.");
|
byte[] highscoreBIOS = comm.CoreFileProvider.GetFirmware("A78", "Bios_HSC", false, "Some functions may not work without the high score BIOS.");
|
||||||
byte[] pal_bios = comm.CoreFileProvider.GetFirmware("A78", "Bios_PAL", false, "The game will not run if the correct region BIOS is not available.");
|
byte[] pal_bios = comm.CoreFileProvider.GetFirmware("A78", "Bios_PAL", false, "The game will not run if the correct region BIOS is not available.");
|
||||||
|
@ -186,7 +187,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari7800
|
||||||
logger);
|
logger);
|
||||||
|
|
||||||
theMachine.Reset();
|
theMachine.Reset();
|
||||||
theMachine.InputState.InputPollCallback = CoreComm.InputCallback.Call;
|
theMachine.InputState.InputPollCallback = InputCallbacks.Call;
|
||||||
|
|
||||||
ControlAdapter = new Atari7800Control(theMachine);
|
ControlAdapter = new Atari7800Control(theMachine);
|
||||||
ControllerDefinition = ControlAdapter.ControlType;
|
ControllerDefinition = ControlAdapter.ControlType;
|
||||||
|
|
|
@ -139,6 +139,14 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx
|
||||||
public int LagCount { get; set; }
|
public int LagCount { get; set; }
|
||||||
public bool IsLagFrame { get; private set; }
|
public bool IsLagFrame { get; private set; }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks
|
||||||
|
{
|
||||||
|
[FeatureNotImplemented]get { return _inputCallbacks; }
|
||||||
|
}
|
||||||
|
|
||||||
public string SystemId { get { return "Lynx"; } }
|
public string SystemId { get { return "Lynx"; } }
|
||||||
|
|
||||||
public bool DeterministicEmulation { get { return true; } }
|
public bool DeterministicEmulation { get { return true; } }
|
||||||
|
|
|
@ -60,6 +60,9 @@ namespace BizHawk.Emulation.Cores.ColecoVision
|
||||||
SetupMemoryDomains();
|
SetupMemoryDomains();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
public IInputCallbackSystem InputCallbacks { get { return _inputCallbacks; } }
|
||||||
|
|
||||||
public MemoryDomainList MemoryDomains { get { return memoryDomains; } }
|
public MemoryDomainList MemoryDomains { get { return memoryDomains; } }
|
||||||
MemoryDomainList memoryDomains;
|
MemoryDomainList memoryDomains;
|
||||||
const ushort RamSizeMask = 0x03FF;
|
const ushort RamSizeMask = 0x03FF;
|
||||||
|
|
|
@ -87,6 +87,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
|
||||||
public int Frame { get; private set; }
|
public int Frame { get; private set; }
|
||||||
public int LagCount { get; set; }
|
public int LagCount { get; set; }
|
||||||
public bool IsLagFrame { get; private set; }
|
public bool IsLagFrame { get; private set; }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { return _inputCallbacks; } }
|
||||||
|
|
||||||
public string SystemId { get { return "GBA"; } }
|
public string SystemId { get { return "GBA"; } }
|
||||||
public bool DeterministicEmulation { get { return true; } }
|
public bool DeterministicEmulation { get { return true; } }
|
||||||
|
|
||||||
|
@ -309,7 +315,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
|
||||||
|
|
||||||
LibMeteor.Buttons GetInput()
|
LibMeteor.Buttons GetInput()
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
// libmeteor bitflips everything itself, so 0 == off, 1 == on
|
// libmeteor bitflips everything itself, so 0 == off, 1 == on
|
||||||
IsLagFrame = false;
|
IsLagFrame = false;
|
||||||
LibMeteor.Buttons ret = 0;
|
LibMeteor.Buttons ret = 0;
|
||||||
|
|
|
@ -109,6 +109,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
|
||||||
public int LagCount { get; set; }
|
public int LagCount { get; set; }
|
||||||
public bool IsLagFrame { get; private set; }
|
public bool IsLagFrame { get; private set; }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { return _inputCallbacks; } }
|
||||||
|
|
||||||
public string SystemId { get { return "GBA"; } }
|
public string SystemId { get { return "GBA"; } }
|
||||||
|
|
||||||
public bool DeterministicEmulation { get; private set; }
|
public bool DeterministicEmulation { get; private set; }
|
||||||
|
@ -272,7 +277,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
|
||||||
|
|
||||||
void InitCallbacks()
|
void InitCallbacks()
|
||||||
{
|
{
|
||||||
padcb = new LibVBANext.StandardCallback(() => CoreComm.InputCallback.Call());
|
padcb = new LibVBANext.StandardCallback(() => InputCallbacks.Call());
|
||||||
fetchcb = new LibVBANext.AddressCallback((addr) => CoreComm.MemoryCallbackSystem.CallExecute(addr));
|
fetchcb = new LibVBANext.AddressCallback((addr) => CoreComm.MemoryCallbackSystem.CallExecute(addr));
|
||||||
readcb = new LibVBANext.AddressCallback((addr) => CoreComm.MemoryCallbackSystem.CallRead(addr));
|
readcb = new LibVBANext.AddressCallback((addr) => CoreComm.MemoryCallbackSystem.CallRead(addr));
|
||||||
writecb = new LibVBANext.AddressCallback((addr) => CoreComm.MemoryCallbackSystem.CallWrite(addr));
|
writecb = new LibVBANext.AddressCallback((addr) => CoreComm.MemoryCallbackSystem.CallWrite(addr));
|
||||||
|
@ -281,7 +286,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
|
||||||
|
|
||||||
void SyncCallbacks()
|
void SyncCallbacks()
|
||||||
{
|
{
|
||||||
LibVBANext.SetPadCallback(Core, CoreComm.InputCallback.Any() ? padcb : null);
|
LibVBANext.SetPadCallback(Core, InputCallbacks.Any() ? padcb : null);
|
||||||
LibVBANext.SetFetchCallback(Core, CoreComm.MemoryCallbackSystem.HasExecutes ? fetchcb : null);
|
LibVBANext.SetFetchCallback(Core, CoreComm.MemoryCallbackSystem.HasExecutes ? fetchcb : null);
|
||||||
LibVBANext.SetReadCallback(Core, CoreComm.MemoryCallbackSystem.HasReads ? readcb : null);
|
LibVBANext.SetReadCallback(Core, CoreComm.MemoryCallbackSystem.HasReads ? readcb : null);
|
||||||
LibVBANext.SetWriteCallback(Core, CoreComm.MemoryCallbackSystem.HasWrites ? writecb : null);
|
LibVBANext.SetWriteCallback(Core, CoreComm.MemoryCallbackSystem.HasWrites ? writecb : null);
|
||||||
|
|
|
@ -36,6 +36,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
public int LagCount { get; set; }
|
public int LagCount { get; set; }
|
||||||
public bool IsLagFrame { get; private set; }
|
public bool IsLagFrame { get; private set; }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { return _inputCallbacks; } }
|
||||||
|
|
||||||
// all cycle counts are relative to a 2*1024*1024 mhz refclock
|
// all cycle counts are relative to a 2*1024*1024 mhz refclock
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -222,7 +227,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
|
|
||||||
LibGambatte.Buttons ControllerCallback()
|
LibGambatte.Buttons ControllerCallback()
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
IsLagFrame = false;
|
IsLagFrame = false;
|
||||||
return CurrentButtons;
|
return CurrentButtons;
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,10 +79,18 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
|
||||||
|
|
||||||
SetMemoryDomains();
|
SetMemoryDomains();
|
||||||
|
|
||||||
L.CoreComm.InputCallback = CoreComm.InputCallback;
|
foreach (var callback in InputCallbacks)
|
||||||
R.CoreComm.InputCallback = CoreComm.InputCallback;
|
{
|
||||||
|
L.InputCallbacks.Add(callback);
|
||||||
|
R.InputCallbacks.Add(callback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { return _inputCallbacks; } }
|
||||||
|
|
||||||
public IVideoProvider VideoProvider { get { return this; } }
|
public IVideoProvider VideoProvider { get { return this; } }
|
||||||
public ISoundProvider SoundProvider { get { return null; } }
|
public ISoundProvider SoundProvider { get { return null; } }
|
||||||
public ISyncSoundProvider SyncSoundProvider { get { return this; } }
|
public ISyncSoundProvider SyncSoundProvider { get { return this; } }
|
||||||
|
|
|
@ -121,7 +121,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
|
||||||
// Order is important because the register with the mupen core
|
// Order is important because the register with the mupen core
|
||||||
_videoProvider = new N64VideoProvider(api, videosettings);
|
_videoProvider = new N64VideoProvider(api, videosettings);
|
||||||
_audioProvider = new N64Audio(api);
|
_audioProvider = new N64Audio(api);
|
||||||
_inputProvider = new N64Input(api, comm, this._syncSettings.Controllers);
|
_inputProvider = new N64Input(this as IInputPollable, api, comm, this._syncSettings.Controllers);
|
||||||
|
|
||||||
|
|
||||||
string rsp = _syncSettings.Rsp == N64SyncSettings.RspType.Rsp_Hle ?
|
string rsp = _syncSettings.Rsp == N64SyncSettings.RspType.Rsp_Hle ?
|
||||||
|
@ -410,6 +410,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
|
||||||
api.setWriteCallback(writecb);
|
api.setWriteCallback(writecb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { return _inputCallbacks; } }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,8 +48,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public N64Input(mupen64plusApi core, CoreComm comm, N64SyncSettings.N64ControllerSettings[] controllerSettings)
|
private readonly IInputPollable _emuCore;
|
||||||
|
|
||||||
|
public N64Input(IInputPollable emuCore, mupen64plusApi core, CoreComm comm, N64SyncSettings.N64ControllerSettings[] controllerSettings)
|
||||||
{
|
{
|
||||||
|
_emuCore = emuCore;
|
||||||
api = new mupen64plusInputApi(core);
|
api = new mupen64plusInputApi(core);
|
||||||
CoreComm = comm;
|
CoreComm = comm;
|
||||||
|
|
||||||
|
@ -81,7 +84,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
|
||||||
/// <param name="i">Id of controller to update and shove</param>
|
/// <param name="i">Id of controller to update and shove</param>
|
||||||
public int GetControllerInput(int i)
|
public int GetControllerInput(int i)
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
_emuCore.InputCallbacks.Call();
|
||||||
ThisFrameInputPolled = true;
|
ThisFrameInputPolled = true;
|
||||||
|
|
||||||
// Analog stick right = +X
|
// Analog stick right = +X
|
||||||
|
|
|
@ -420,7 +420,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
|
|
||||||
byte read_joyport(int addr)
|
byte read_joyport(int addr)
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
lagged = false;
|
lagged = false;
|
||||||
byte ret = addr == 0x4016 ? ControllerDeck.ReadA(Controller) : ControllerDeck.ReadB(Controller);
|
byte ret = addr == 0x4016 ? ControllerDeck.ReadA(Controller) : ControllerDeck.ReadB(Controller);
|
||||||
ret &= 0x1f;
|
ret &= 0x1f;
|
||||||
|
|
|
@ -322,10 +322,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
public int LagCount { get { return _lagcount; } set { _lagcount = value; } }
|
public int LagCount { get { return _lagcount; } set { _lagcount = value; } }
|
||||||
public bool IsLagFrame { get { return islag; } }
|
public bool IsLagFrame { get { return islag; } }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
public IInputCallbackSystem InputCallbacks { get { return _inputCallbacks; } }
|
||||||
|
|
||||||
public bool DeterministicEmulation { get { return true; } }
|
public bool DeterministicEmulation { get { return true; } }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public byte[] CloneSaveRam()
|
public byte[] CloneSaveRam()
|
||||||
{
|
{
|
||||||
if (board is FDS)
|
if (board is FDS)
|
||||||
|
|
|
@ -392,6 +392,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { throw new NotImplementedException(); } }
|
||||||
|
|
||||||
#region bootgod
|
#region bootgod
|
||||||
|
|
||||||
public RomStatus? BootGodStatus { get; private set; }
|
public RomStatus? BootGodStatus { get; private set; }
|
||||||
|
|
|
@ -241,6 +241,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { return _inputCallbacks; } }
|
||||||
|
|
||||||
[FeatureNotImplemented]
|
[FeatureNotImplemented]
|
||||||
public void SetCpuRegister(string register, int value)
|
public void SetCpuRegister(string register, int value)
|
||||||
{
|
{
|
||||||
|
@ -440,7 +445,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES
|
||||||
{
|
{
|
||||||
// as this is implemented right now, only P1 and P2 normal controllers work
|
// as this is implemented right now, only P1 and P2 normal controllers work
|
||||||
|
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
//Console.WriteLine("{0} {1} {2} {3}", port, device, index, id);
|
//Console.WriteLine("{0} {1} {2} {3}", port, device, index, id);
|
||||||
|
|
||||||
string key = "P" + (1 + port) + " ";
|
string key = "P" + (1 + port) + " ";
|
||||||
|
|
|
@ -64,7 +64,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
|
||||||
|
|
||||||
byte ReadInput()
|
byte ReadInput()
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
byte value = 0x3F;
|
byte value = 0x3F;
|
||||||
|
|
||||||
int player = SelectedController + 1;
|
int player = SelectedController + 1;
|
||||||
|
|
|
@ -295,6 +295,9 @@ namespace BizHawk.Emulation.Cores.PCEngine
|
||||||
public int LagCount { get { return lagCount; } set { lagCount = value; } }
|
public int LagCount { get { return lagCount; } set { lagCount = value; } }
|
||||||
public bool IsLagFrame { get { return isLag; } }
|
public bool IsLagFrame { get { return isLag; } }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
public IInputCallbackSystem InputCallbacks { get { return _inputCallbacks; } }
|
||||||
|
|
||||||
public void ResetCounters()
|
public void ResetCounters()
|
||||||
{
|
{
|
||||||
// this should just be a public setter instead of a new method.
|
// this should just be a public setter instead of a new method.
|
||||||
|
|
|
@ -45,6 +45,9 @@ namespace BizHawk.Emulation.Cores.Sega.Genesis
|
||||||
|
|
||||||
private SoundMixer SoundMixer;
|
private SoundMixer SoundMixer;
|
||||||
|
|
||||||
|
[FeatureNotImplemented]
|
||||||
|
public IInputCallbackSystem InputCallbacks { get { throw new NotImplementedException(); } }
|
||||||
|
|
||||||
public void ResetCounters()
|
public void ResetCounters()
|
||||||
{
|
{
|
||||||
Frame = 0;
|
Frame = 0;
|
||||||
|
|
|
@ -108,7 +108,7 @@ namespace BizHawk.Emulation.Cores.Sega.Genesis
|
||||||
|
|
||||||
void ReadController(ref byte data)
|
void ReadController(ref byte data)
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
data &= 0xC0;
|
data &= 0xC0;
|
||||||
if ((data & 0x40) != 0) // TH high
|
if ((data & 0x40) != 0) // TH high
|
||||||
{
|
{
|
||||||
|
|
|
@ -42,7 +42,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
|
|
||||||
byte ReadControls1()
|
byte ReadControls1()
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
lagged = false;
|
lagged = false;
|
||||||
byte value = 0xFF;
|
byte value = 0xFF;
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
|
|
||||||
byte ReadControls2()
|
byte ReadControls2()
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
lagged = false;
|
lagged = false;
|
||||||
byte value = 0xFF;
|
byte value = 0xFF;
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,10 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
|
||||||
public int Frame { get { return frame; } set { frame = value; } }
|
public int Frame { get { return frame; } set { frame = value; } }
|
||||||
public int LagCount { get { return lagCount; } set { lagCount = value; } }
|
public int LagCount { get { return lagCount; } set { lagCount = value; } }
|
||||||
public bool IsLagFrame { get { return isLag; } }
|
public bool IsLagFrame { get { return isLag; } }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
public IInputCallbackSystem InputCallbacks { get { return _inputCallbacks; } }
|
||||||
|
|
||||||
byte Port01 = 0xFF;
|
byte Port01 = 0xFF;
|
||||||
byte Port02 = 0xFF;
|
byte Port02 = 0xFF;
|
||||||
byte Port3E = 0xAF;
|
byte Port3E = 0xAF;
|
||||||
|
|
|
@ -74,7 +74,7 @@ namespace BizHawk.Emulation.Cores.Sega.Saturn
|
||||||
ActivateGL();
|
ActivateGL();
|
||||||
Init(bios);
|
Init(bios);
|
||||||
|
|
||||||
InputCallbackH = new LibYabause.InputCallback(() => CoreComm.InputCallback.Call());
|
InputCallbackH = new LibYabause.InputCallback(() => InputCallbacks.Call());
|
||||||
LibYabause.libyabause_setinputcallback(InputCallbackH);
|
LibYabause.libyabause_setinputcallback(InputCallbackH);
|
||||||
CoreComm.UsesDriveLed = true;
|
CoreComm.UsesDriveLed = true;
|
||||||
|
|
||||||
|
@ -292,6 +292,11 @@ namespace BizHawk.Emulation.Cores.Sega.Saturn
|
||||||
public int LagCount { get; set; }
|
public int LagCount { get; set; }
|
||||||
public bool IsLagFrame { get; private set; }
|
public bool IsLagFrame { get; private set; }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { return _inputCallbacks; } }
|
||||||
|
|
||||||
public string SystemId { get { return "SAT"; } }
|
public string SystemId { get { return "SAT"; } }
|
||||||
public bool DeterministicEmulation { get { return true; } }
|
public bool DeterministicEmulation { get { return true; } }
|
||||||
|
|
||||||
|
|
|
@ -375,10 +375,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
|
||||||
// core callback for input
|
// core callback for input
|
||||||
void input_callback()
|
void input_callback()
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
IsLagFrame = false;
|
IsLagFrame = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { return _inputCallbacks; } }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
// TODO: use render and rendersound
|
// TODO: use render and rendersound
|
||||||
|
|
|
@ -175,6 +175,10 @@ namespace BizHawk.Emulation.Cores.WonderSwan
|
||||||
public int LagCount { get; set; }
|
public int LagCount { get; set; }
|
||||||
public bool IsLagFrame { get; private set; }
|
public bool IsLagFrame { get; private set; }
|
||||||
|
|
||||||
|
private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem();
|
||||||
|
|
||||||
|
// TODO: optimize managed to unmanaged using the ActiveChanged event
|
||||||
|
public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented]get { return _inputCallbacks; } }
|
||||||
|
|
||||||
public string SystemId { get { return "WSWAN"; } }
|
public string SystemId { get { return "WSWAN"; } }
|
||||||
public bool DeterministicEmulation { get; private set; }
|
public bool DeterministicEmulation { get; private set; }
|
||||||
|
@ -351,7 +355,7 @@ namespace BizHawk.Emulation.Cores.WonderSwan
|
||||||
}
|
}
|
||||||
void ButtonCallback()
|
void ButtonCallback()
|
||||||
{
|
{
|
||||||
CoreComm.InputCallback.Call();
|
InputCallbacks.Call();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitDebugCallbacks()
|
void InitDebugCallbacks()
|
||||||
|
@ -369,7 +373,7 @@ namespace BizHawk.Emulation.Cores.WonderSwan
|
||||||
CoreComm.MemoryCallbackSystem.HasWrites ? WriteCallbackD : null,
|
CoreComm.MemoryCallbackSystem.HasWrites ? WriteCallbackD : null,
|
||||||
CoreComm.MemoryCallbackSystem.HasExecutes ? ExecCallbackD : null);
|
CoreComm.MemoryCallbackSystem.HasExecutes ? ExecCallbackD : null);
|
||||||
BizSwan.bizswan_setbuttoncallback(Core,
|
BizSwan.bizswan_setbuttoncallback(Core,
|
||||||
CoreComm.InputCallback.Any() ? ButtonCallbackD : null);
|
InputCallbacks.Any() ? ButtonCallbackD : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
Loading…
Reference in New Issue