140 lines
6.9 KiB
C#
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;
|
|
}
|
|
}
|