TSTHawk: controller stuff
This commit is contained in:
parent
2396ebeb82
commit
110d741cb3
|
@ -470,6 +470,7 @@
|
||||||
<Compile Include="Consoles\Magnavox\O2Em.cs" />
|
<Compile Include="Consoles\Magnavox\O2Em.cs" />
|
||||||
<Compile Include="Consoles\NEC\PCFX\LibTst.cs" />
|
<Compile Include="Consoles\NEC\PCFX\LibTst.cs" />
|
||||||
<Compile Include="Consoles\NEC\PCFX\Tst.cs" />
|
<Compile Include="Consoles\NEC\PCFX\Tst.cs" />
|
||||||
|
<Compile Include="Consoles\NEC\PCFX\TstControllerDeck.cs" />
|
||||||
<Compile Include="Consoles\Nintendo\Gameboy\Gambatte.cs" />
|
<Compile Include="Consoles\Nintendo\Gameboy\Gambatte.cs" />
|
||||||
<Compile Include="Consoles\Nintendo\Gameboy\Gambatte.ICodeDataLog.cs">
|
<Compile Include="Consoles\Nintendo\Gameboy\Gambatte.ICodeDataLog.cs">
|
||||||
<DependentUpon>Gambatte.cs</DependentUpon>
|
<DependentUpon>Gambatte.cs</DependentUpon>
|
||||||
|
|
|
@ -26,6 +26,7 @@ namespace BizHawk.Emulation.Cores.Consoles.NEC.PCFX
|
||||||
private DiscSectorReader[] _diskReaders;
|
private DiscSectorReader[] _diskReaders;
|
||||||
private LibSaturnus.CDTOCCallback _cdTocCallback;
|
private LibSaturnus.CDTOCCallback _cdTocCallback;
|
||||||
private LibSaturnus.CDSectorCallback _cdSectorCallback;
|
private LibSaturnus.CDSectorCallback _cdSectorCallback;
|
||||||
|
private TstControllerDeck _controllerDeck;
|
||||||
|
|
||||||
[CoreConstructor("PCFX")]
|
[CoreConstructor("PCFX")]
|
||||||
public Tst(CoreComm comm, byte[] rom)
|
public Tst(CoreComm comm, byte[] rom)
|
||||||
|
@ -34,7 +35,6 @@ namespace BizHawk.Emulation.Cores.Consoles.NEC.PCFX
|
||||||
throw new InvalidOperationException("To load a PC-FX game, please load the CUE file and not the BIN file.");
|
throw new InvalidOperationException("To load a PC-FX game, please load the CUE file and not the BIN file.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// MDFNGameInfo->fps = (uint32)((double)7159090.90909090 / 455 / 263 * 65536 * 256);
|
|
||||||
public Tst(CoreComm comm, IEnumerable<Disc> disks)
|
public Tst(CoreComm comm, IEnumerable<Disc> disks)
|
||||||
:base(comm, new Configuration
|
:base(comm, new Configuration
|
||||||
{
|
{
|
||||||
|
@ -74,6 +74,8 @@ namespace BizHawk.Emulation.Cores.Consoles.NEC.PCFX
|
||||||
|
|
||||||
PostInit();
|
PostInit();
|
||||||
SetCdCallbacks();
|
SetCdCallbacks();
|
||||||
|
_controllerDeck = new TstControllerDeck(new[] { ControllerType.Gamepad, ControllerType.Gamepad });
|
||||||
|
ControllerDefinition = _controllerDeck.Definition;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadStateBinaryInternal(BinaryReader reader)
|
protected override void LoadStateBinaryInternal(BinaryReader reader)
|
||||||
|
@ -83,7 +85,13 @@ namespace BizHawk.Emulation.Cores.Consoles.NEC.PCFX
|
||||||
|
|
||||||
protected override LibWaterboxCore.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound)
|
protected override LibWaterboxCore.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound)
|
||||||
{
|
{
|
||||||
return new LibTst.FrameInfo();
|
DriveLightOn = false;
|
||||||
|
var ret = new LibTst.FrameInfo();
|
||||||
|
var controls = _controllerDeck.GetData(controller);
|
||||||
|
ret.Port1Buttons = controls[0];
|
||||||
|
ret.Port2Buttons = controls[1];
|
||||||
|
ret.ConsoleButtons = controls[2];
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CDTOCCallback(int disk, [In, Out]LibSaturnus.TOC t)
|
private void CDTOCCallback(int disk, [In, Out]LibSaturnus.TOC t)
|
||||||
|
|
|
@ -0,0 +1,171 @@
|
||||||
|
using BizHawk.Emulation.Common;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace BizHawk.Emulation.Cores.Consoles.NEC.PCFX
|
||||||
|
{
|
||||||
|
public enum ControllerType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Gamepad = 1,
|
||||||
|
Mouse
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TstControllerDeck
|
||||||
|
{
|
||||||
|
private readonly ControlDefUnMerger[] _cdums;
|
||||||
|
private readonly IPortDevice[] _devices;
|
||||||
|
|
||||||
|
private static readonly string[] _consoleButtons =
|
||||||
|
{
|
||||||
|
"Power",
|
||||||
|
"Reset",
|
||||||
|
"Previous Disk",
|
||||||
|
"Next Disk"
|
||||||
|
};
|
||||||
|
|
||||||
|
public TstControllerDeck(IEnumerable<ControllerType> ports)
|
||||||
|
{
|
||||||
|
_devices = ports.Select<ControllerType, IPortDevice>(p =>
|
||||||
|
{
|
||||||
|
switch (p)
|
||||||
|
{
|
||||||
|
case ControllerType.Gamepad:
|
||||||
|
return new Gamepad();
|
||||||
|
case ControllerType.Mouse:
|
||||||
|
return new Mouse();
|
||||||
|
default:
|
||||||
|
return new None();
|
||||||
|
}
|
||||||
|
}).ToArray();
|
||||||
|
|
||||||
|
List<ControlDefUnMerger> tmp;
|
||||||
|
Definition = ControllerDefinitionMerger.GetMerged(
|
||||||
|
_devices.Select(d => d.Definition),
|
||||||
|
out tmp);
|
||||||
|
_cdums = tmp.ToArray();
|
||||||
|
|
||||||
|
Definition.Name = "PC-FX Controller";
|
||||||
|
Definition.BoolButtons.AddRange(_consoleButtons);
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint[] GetData(IController c)
|
||||||
|
{
|
||||||
|
var ret = new uint[_devices.Length + 1];
|
||||||
|
for (int i = 0; i < _devices.Length; i++)
|
||||||
|
ret[i] = _devices[i].GetData(_cdums[i].UnMerge(c));
|
||||||
|
|
||||||
|
uint console = 0;
|
||||||
|
uint val = 1;
|
||||||
|
foreach (var s in _consoleButtons)
|
||||||
|
{
|
||||||
|
if (c.IsPressed(s))
|
||||||
|
console |= val;
|
||||||
|
val <<= 1;
|
||||||
|
}
|
||||||
|
ret[_devices.Length] = console;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ControllerDefinition Definition { get; }
|
||||||
|
|
||||||
|
private interface IPortDevice
|
||||||
|
{
|
||||||
|
ControllerDefinition Definition { get; }
|
||||||
|
uint GetData(IController c);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class None : IPortDevice
|
||||||
|
{
|
||||||
|
private static readonly ControllerDefinition _definition = new ControllerDefinition();
|
||||||
|
|
||||||
|
public ControllerDefinition Definition => _definition;
|
||||||
|
|
||||||
|
public uint GetData(IController c)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Gamepad : IPortDevice
|
||||||
|
{
|
||||||
|
private static readonly ControllerDefinition _definition;
|
||||||
|
static Gamepad()
|
||||||
|
{
|
||||||
|
_definition = new ControllerDefinition
|
||||||
|
{
|
||||||
|
BoolButtons = Buttons
|
||||||
|
.Where(s => s != null)
|
||||||
|
.Select((s, i) => new { s, i })
|
||||||
|
.OrderBy(a => ButtonOrders[a.i])
|
||||||
|
.Select(a => a.s)
|
||||||
|
.ToList()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly string[] Buttons =
|
||||||
|
{
|
||||||
|
"0I", "0II", "0III", "0IV", "0V", "0VI",
|
||||||
|
"0Select", "0Run",
|
||||||
|
"0Up", "0Right", "0Down", "0Left",
|
||||||
|
"0Mode 1", null, "0Mode 2"
|
||||||
|
};
|
||||||
|
|
||||||
|
private static readonly int[] ButtonOrders =
|
||||||
|
{
|
||||||
|
1, 1, 1, 1, 1, 1,
|
||||||
|
1, 1,
|
||||||
|
1, 1, 1, 1,
|
||||||
|
1, 1
|
||||||
|
};
|
||||||
|
|
||||||
|
public ControllerDefinition Definition => _definition;
|
||||||
|
|
||||||
|
public uint GetData(IController c)
|
||||||
|
{
|
||||||
|
uint ret = 0;
|
||||||
|
uint val = 1;
|
||||||
|
foreach (var s in Buttons)
|
||||||
|
{
|
||||||
|
if (s != null && c.IsPressed(s))
|
||||||
|
ret |= val;
|
||||||
|
val <<= 1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Mouse : IPortDevice
|
||||||
|
{
|
||||||
|
private static readonly ControllerDefinition _definition = new ControllerDefinition
|
||||||
|
{
|
||||||
|
BoolButtons = { "0Mouse Left", "0Mouse Right" },
|
||||||
|
FloatControls = { "0X", "0Y" },
|
||||||
|
FloatRanges =
|
||||||
|
{
|
||||||
|
new[] { -127f, 0f, 127f },
|
||||||
|
new[] { -127f, 0f, 127f }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public ControllerDefinition Definition => _definition;
|
||||||
|
|
||||||
|
public uint GetData(IController c)
|
||||||
|
{
|
||||||
|
var dx = (byte)(int)c.GetFloat("0X");
|
||||||
|
var dy = (byte)(int)c.GetFloat("0Y");
|
||||||
|
uint ret = 0;
|
||||||
|
if (c.IsPressed("0Mouse Left"))
|
||||||
|
ret |= 0x10000;
|
||||||
|
if (c.IsPressed("0Mouse Right"))
|
||||||
|
ret |= 0x20000;
|
||||||
|
ret |= dx;
|
||||||
|
ret |= (uint)(dy << 8);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -708,7 +708,7 @@ EXPORT void FrameAdvance(MyFrameInfo& f)
|
||||||
for (int i = 0; i < 2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
InputData[i] = f.Buttons[i];
|
InputData[i] = f.Buttons[i];
|
||||||
|
|
||||||
uint32_t ConsoleButtons = f.Buttons[3];
|
uint32_t ConsoleButtons = f.Buttons[2];
|
||||||
int NewActiveDisk = ActiveDisk;
|
int NewActiveDisk = ActiveDisk;
|
||||||
#define ROSE(n) ((ConsoleButtons & 1 << (n)) > (PrevConsoleButtons & 1 << (n)))
|
#define ROSE(n) ((ConsoleButtons & 1 << (n)) > (PrevConsoleButtons & 1 << (n)))
|
||||||
if (ROSE(0))
|
if (ROSE(0))
|
||||||
|
@ -716,9 +716,9 @@ EXPORT void FrameAdvance(MyFrameInfo& f)
|
||||||
if (ROSE(1))
|
if (ROSE(1))
|
||||||
PCFX_Reset();
|
PCFX_Reset();
|
||||||
if (ROSE(2))
|
if (ROSE(2))
|
||||||
NewActiveDisk++;
|
|
||||||
if (ROSE(3))
|
|
||||||
NewActiveDisk--;
|
NewActiveDisk--;
|
||||||
|
if (ROSE(3))
|
||||||
|
NewActiveDisk++;
|
||||||
#undef ROSE
|
#undef ROSE
|
||||||
NewActiveDisk = std::max(NewActiveDisk, -1);
|
NewActiveDisk = std::max(NewActiveDisk, -1);
|
||||||
NewActiveDisk = std::min<int>(NewActiveDisk, CDInterfaces.size() - 1);
|
NewActiveDisk = std::min<int>(NewActiveDisk, CDInterfaces.size() - 1);
|
||||||
|
|
Loading…
Reference in New Issue