Virtu/Virtu/Services/GamePortService.cs

140 lines
6.9 KiB
C#

using System;
namespace Jellyfish.Virtu.Services
{
public class GamePortService : MachineService
{
public GamePortService(Machine machine) :
base(machine)
{
Paddle0 = Paddle1 = Paddle2 = Paddle3 = 255; // not connected
}
public virtual void Update() // main thread
{
var keyboard = Machine.Keyboard;
if (keyboard.UseGamePort)
{
UpdateKey(keyboard.Joystick0UpKey, IsJoystick0Up, ref _isJoystick0UpKeyDown, ref _wasJoystick0UpKeyDown);
UpdateKey(keyboard.Joystick0LeftKey, IsJoystick0Left, ref _isJoystick0LeftKeyDown, ref _wasJoystick0LeftKeyDown);
UpdateKey(keyboard.Joystick0RightKey, IsJoystick0Right, ref _isJoystick0RightKeyDown, ref _wasJoystick0RightKeyDown);
UpdateKey(keyboard.Joystick0DownKey, IsJoystick0Down, ref _isJoystick0DownKeyDown, ref _wasJoystick0DownKeyDown);
UpdateKey(keyboard.Joystick0UpLeftKey, IsJoystick0Up && IsJoystick0Left, ref _isJoystick0UpLeftKeyDown, ref _wasJoystick0UpLeftKeyDown);
UpdateKey(keyboard.Joystick0UpRightKey, IsJoystick0Up && IsJoystick0Right, ref _isJoystick0UpRightKeyDown, ref _wasJoystick0UpRightKeyDown);
UpdateKey(keyboard.Joystick0DownLeftKey, IsJoystick0Down && IsJoystick0Left, ref _isJoystick0DownLeftKeyDown, ref _wasJoystick0DownLeftKeyDown);
UpdateKey(keyboard.Joystick0DownRightKey, IsJoystick0Down && IsJoystick0Right, ref _isJoystick0DownRightKeyDown, ref _wasJoystick0DownRightKeyDown);
UpdateKey(keyboard.Joystick1UpKey, IsJoystick1Up, ref _isJoystick1UpKeyDown, ref _wasJoystick1UpKeyDown);
UpdateKey(keyboard.Joystick1LeftKey, IsJoystick1Left, ref _isJoystick1LeftKeyDown, ref _wasJoystick1LeftKeyDown);
UpdateKey(keyboard.Joystick1RightKey, IsJoystick1Right, ref _isJoystick1RightKeyDown, ref _wasJoystick1RightKeyDown);
UpdateKey(keyboard.Joystick1DownKey, IsJoystick1Down, ref _isJoystick1DownKeyDown, ref _wasJoystick1DownKeyDown);
UpdateKey(keyboard.Joystick1UpLeftKey, IsJoystick1Up && IsJoystick1Left, ref _isJoystick1UpLeftKeyDown, ref _wasJoystick1UpLeftKeyDown);
UpdateKey(keyboard.Joystick1UpRightKey, IsJoystick1Up && IsJoystick1Right, ref _isJoystick1UpRightKeyDown, ref _wasJoystick1UpRightKeyDown);
UpdateKey(keyboard.Joystick1DownLeftKey, IsJoystick1Down && IsJoystick1Left, ref _isJoystick1DownLeftKeyDown, ref _wasJoystick1DownLeftKeyDown);
UpdateKey(keyboard.Joystick1DownRightKey, IsJoystick1Down && IsJoystick1Right, ref _isJoystick1DownRightKeyDown, ref _wasJoystick1DownRightKeyDown);
UpdateKey(keyboard.Button0Key, IsButton0Down, ref _isButton0KeyDown, ref _wasButton0KeyDown);
UpdateKey(keyboard.Button1Key, IsButton1Down, ref _isButton1KeyDown, ref _wasButton1KeyDown);
UpdateKey(keyboard.Button2Key, IsButton2Down, ref _isButton2KeyDown, ref _wasButton2KeyDown);
if (_lastKey > 0) // repeat last key
{
long time = DateTime.UtcNow.Ticks;
if (time - _lastTime >= _repeatTime)
{
_lastTime = time;
_repeatTime = RepeatSpeed;
keyboard.Latch = _lastKey;
}
}
}
}
private void UpdateKey(int key, bool isActive, ref bool isKeyDown, ref bool wasKeyDown)
{
wasKeyDown = isKeyDown;
isKeyDown = (key > 0) && isActive;
if (isKeyDown != wasKeyDown)
{
if (isKeyDown)
{
_lastKey = key;
_lastTime = DateTime.UtcNow.Ticks;
_repeatTime = RepeatDelay;
Machine.Keyboard.Latch = key;
}
else if (key == _lastKey)
{
_lastKey = 0;
}
}
}
public int Paddle0 { get; protected set; }
public int Paddle1 { get; protected set; }
public int Paddle2 { get; protected set; }
public int Paddle3 { get; protected set; }
public bool IsJoystick0Up { get; protected set; }
public bool IsJoystick0Left { get; protected set; }
public bool IsJoystick0Right { get; protected set; }
public bool IsJoystick0Down { get; protected set; }
public bool IsJoystick1Up { get; protected set; }
public bool IsJoystick1Left { get; protected set; }
public bool IsJoystick1Right { get; protected set; }
public bool IsJoystick1Down { get; protected set; }
public bool IsButton0Down { get; protected set; }
public bool IsButton1Down { get; protected set; }
public bool IsButton2Down { get; protected set; }
private static readonly long RepeatDelay = TimeSpan.FromMilliseconds(500).Ticks;
private static readonly long RepeatSpeed = TimeSpan.FromMilliseconds(32).Ticks;
private bool _isJoystick0UpLeftKeyDown;
private bool _isJoystick0UpKeyDown;
private bool _isJoystick0UpRightKeyDown;
private bool _isJoystick0LeftKeyDown;
private bool _isJoystick0RightKeyDown;
private bool _isJoystick0DownLeftKeyDown;
private bool _isJoystick0DownKeyDown;
private bool _isJoystick0DownRightKeyDown;
private bool _isJoystick1UpLeftKeyDown;
private bool _isJoystick1UpKeyDown;
private bool _isJoystick1UpRightKeyDown;
private bool _isJoystick1LeftKeyDown;
private bool _isJoystick1RightKeyDown;
private bool _isJoystick1DownLeftKeyDown;
private bool _isJoystick1DownKeyDown;
private bool _isJoystick1DownRightKeyDown;
private bool _isButton0KeyDown;
private bool _isButton1KeyDown;
private bool _isButton2KeyDown;
private bool _wasJoystick0UpLeftKeyDown;
private bool _wasJoystick0UpKeyDown;
private bool _wasJoystick0UpRightKeyDown;
private bool _wasJoystick0LeftKeyDown;
private bool _wasJoystick0RightKeyDown;
private bool _wasJoystick0DownLeftKeyDown;
private bool _wasJoystick0DownKeyDown;
private bool _wasJoystick0DownRightKeyDown;
private bool _wasJoystick1UpLeftKeyDown;
private bool _wasJoystick1UpKeyDown;
private bool _wasJoystick1UpRightKeyDown;
private bool _wasJoystick1LeftKeyDown;
private bool _wasJoystick1RightKeyDown;
private bool _wasJoystick1DownLeftKeyDown;
private bool _wasJoystick1DownKeyDown;
private bool _wasJoystick1DownRightKeyDown;
private bool _wasButton0KeyDown;
private bool _wasButton1KeyDown;
private bool _wasButton2KeyDown;
private int _lastKey;
private long _lastTime;
private long _repeatTime;
}
}