using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using BizHawk.Common; using BizHawk.Emulation.Common; namespace BizHawk.Emulation.Cores.Atari.Atari2600 { public enum Atari2600ControllerTypes { Unplugged, Joystick, Paddle } /// /// Represents a controller plugged into a controller port on the Colecovision /// public interface IPort { byte Read(IController c); int Read_Pot(IController c, int pot); ControllerDefinition Definition { get; } void SyncState(Serializer ser); int PortNum { get; } } public class UnpluggedController : IPort { public UnpluggedController(int portNum) { PortNum = portNum; Definition = new ControllerDefinition { BoolButtons = new List() }; } public byte Read(IController c) { return 0xFF; } public int Read_Pot(IController c, int pot) { return -1; // indicates not applicable } public ControllerDefinition Definition { get; } public void SyncState(Serializer ser) { // Do nothing } public int PortNum { get; } } public class StandardController : IPort { public StandardController(int portNum) { PortNum = portNum; Definition = new ControllerDefinition { BoolButtons = BaseDefinition .Select(b => $"P{PortNum} " + b) .ToList() }; } public ControllerDefinition Definition { get; } public void SyncState(Serializer ser) { // Nothing todo, I think } public int PortNum { get; } 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) { return -1; // indicates not applicable } private static readonly string[] BaseDefinition = { "Up", "Down", "Left", "Right", "Button" }; } public class PaddleController : IPort { public PaddleController(int portNum) { PortNum = portNum; Definition = new ControllerDefinition { BoolButtons = BaseDefinition .Select(b => $"P{PortNum} " + b) .ToList(), FloatControls = { "P" + PortNum + " Paddle X 1" , "P" + PortNum + " Paddle X 2" }, FloatRanges = { new[] { -127.0f, 0, 127.0f }, new[] { -127.0f, 0, 127.0f } } }; } public int PortNum { get; } public void SyncState(Serializer ser) { // Nothing todo, I think } public ControllerDefinition Definition { get; } private static readonly string[] BaseDefinition = { "Button 1", "Button 2" }; public byte Read(IController c) { byte result = 0xF0; if (c.IsPressed($"P{PortNum} Button 1")) { result &= 0x70; } if (c.IsPressed($"P{PortNum} Button 2")) { result &= 0xB0; } return result; } public int Read_Pot(IController c, int pot) { int x = (int)c.GetFloat(Definition.FloatControls[pot]); x = -x; x += 127; x = x * 64 + 10; return x; } } }