diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/A26Schema.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/A26Schema.cs index 900eac92db..c15d0f3095 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/A26Schema.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/A26Schema.cs @@ -39,6 +39,8 @@ namespace BizHawk.Client.EmuHawk return StandardController(controller); case Atari2600ControllerTypes.Paddle: return PaddleController(controller); + case Atari2600ControllerTypes.BoostGrip: + return BoostGripController(controller); case Atari2600ControllerTypes.Driving: return DrivingController(controller); } @@ -145,6 +147,73 @@ namespace BizHawk.Client.EmuHawk }; } + private static PadSchema BoostGripController(int controller) + { + return new PadSchema + { + DisplayName = $"Player {controller}", + IsConsole = false, + DefaultSize = new Size(174, 74), + MaxSize = new Size(174, 74), + Buttons = new[] + { + new PadSchema.ButtonSchema + { + Name = $"P{controller} Up", + DisplayName = "", + Icon = Properties.Resources.BlueUp, + Location = new Point(23, 15), + Type = PadSchema.PadInputType.Boolean + }, + new PadSchema.ButtonSchema + { + Name = $"P{controller} Down", + DisplayName = "", + Icon = Properties.Resources.BlueDown, + Location = new Point(23, 36), + Type = PadSchema.PadInputType.Boolean + }, + new PadSchema.ButtonSchema + { + Name = $"P{controller} Left", + DisplayName = "", + Icon = Properties.Resources.Back, + Location = new Point(2, 24), + Type = PadSchema.PadInputType.Boolean + }, + new PadSchema.ButtonSchema + { + Name = $"P{controller} Right", + DisplayName = "", + Icon = Properties.Resources.Forward, + Location = new Point(44, 24), + Type = PadSchema.PadInputType.Boolean + }, + new PadSchema.ButtonSchema + { + Name = $"P{controller} Button", + DisplayName = "B", + Location = new Point(132, 24), + Type = PadSchema.PadInputType.Boolean + }, + new PadSchema.ButtonSchema + { + Name = $"P{controller} Button 1", + DisplayName = "B1", + Location = new Point(68, 36), + Type = PadSchema.PadInputType.Boolean + }, + new PadSchema.ButtonSchema + { + Name = $"P{controller} Button 2", + DisplayName = "B2", + Location = new Point(100, 36), + Type = PadSchema.PadInputType.Boolean + } + } + }; + } + private static PadSchema DrivingController(int controller) { return new PadSchema diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600ControllerDeck.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600ControllerDeck.cs index 2578acdd99..baa68e39ec 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600ControllerDeck.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600ControllerDeck.cs @@ -15,6 +15,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 typeof(UnpluggedController), // Order must match Atari2600ControllerTypes enum values typeof(StandardController), typeof(PaddleController), + typeof(BoostGripController), typeof(DrivingController) }; diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600Controllers.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600Controllers.cs index bbe1d0333e..1b44676c6d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600Controllers.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600Controllers.cs @@ -12,6 +12,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 Unplugged, Joystick, Paddle, + BoostGrip, Driving } @@ -161,6 +162,70 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 } } + public class BoostGripController : IPort + { + public BoostGripController(int portNum) + { + PortNum = portNum; + Definition = new ControllerDefinition + { + BoolButtons = BaseDefinition + .Select(b => $"P{PortNum} " + b) + .ToList() + }; + } + + public int PortNum { get; } + + public void SyncState(Serializer ser) + { + // Nothing todo, I think + } + + public ControllerDefinition Definition { get; } + + private static readonly string[] BaseDefinition = + { + "Up", "Down", "Left", "Right", "Button", + "Button 1", + "Button 2" + }; + + public byte Read(IController c) + { + byte result = 0xFF; + + if (c.IsPressed($"P{PortNum} Up")) { result &= 0xEF; } + if (c.IsPressed($"P{PortNum} Down")) { result &= 0xDF; } + if (c.IsPressed($"P{PortNum} Left")) { result &= 0xBF; } + if (c.IsPressed($"P{PortNum} Right")) { result &= 0x7F; } + if (c.IsPressed($"P{PortNum} Button")) { result &= 0xF7; } + + return result; + } + + public int Read_Pot(IController c, int pot) + { + bool is_pressed = false; + + if (pot == 0) + { + is_pressed = c.IsPressed($"P{PortNum} Button 1"); + } + else + { + is_pressed = c.IsPressed($"P{PortNum} Button 2"); + } + + if (is_pressed) + { + return 10; + } + + return 65535; + } + } + public class DrivingController : IPort { public DrivingController(int portNum) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs index 49d42d352a..93f6a3b1ad 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs @@ -908,7 +908,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 // 6105 roughly centers the paddle in Breakout if (maskedAddr == 0x08) // INPT0 { - if (_core.ReadPot1(0)>0 && _capCharging && _core.Cpu.TotalExecutedCycles - _capChargeStart >= _core.ReadPot1(0)) + if (_core.ReadPot1(0) > 0 && _capCharging && _core.Cpu.TotalExecutedCycles - _capChargeStart >= _core.ReadPot1(0)) { coll = 0x80; } @@ -922,7 +922,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 if (maskedAddr == 0x09) // INPT1 { - if (_core.ReadPot1(1) > 0 && _capCharging && _core.Cpu.TotalExecutedCycles - _capChargeStart >= _core.ReadPot1(1)) + if (_core.ReadPot1(1) > 0 && _capCharging && _core.Cpu.TotalExecutedCycles - _capChargeStart >= _core.ReadPot1(1)) { coll = 0x80; }