BizHawk/BizHawk.Emulation.Cores/Computers/AmstradCPC/Hardware/Input/StandardKeyboard.cs

154 lines
4.8 KiB
C#

using BizHawk.Common;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace BizHawk.Emulation.Cores.Computers.AmstradCPC
{
/// <summary>
/// The 48k keyboard device
/// </summary>
public class StandardKeyboard : IKeyboard
{
public CPCBase _machine { get; set; }
private int _currentLine;
public int CurrentLine
{
get { return _currentLine; }
set
{
// bits 0-3 contain the line
var line = value & 0x0f;
if (line > 0)
{
}
_currentLine = line;
}
}
private bool[] _keyStatus;
public bool[] KeyStatus
{
get { return _keyStatus; }
set { _keyStatus = value; }
}
private string[] _keyboardMatrix;
public string[] KeyboardMatrix
{
get { return _keyboardMatrix; }
set { _keyboardMatrix = value; }
}
private string[] _nonMatrixKeys;
public string[] NonMatrixKeys
{
get { return _nonMatrixKeys; }
set { _nonMatrixKeys = value; }
}
public StandardKeyboard(CPCBase machine)
{
_machine = machine;
//_machine.AYDevice.PortA_IN_CallBack = INCallback;
//_machine.AYDevice.PortA_OUT_CallBack = OUTCallback;
// scancode rows, ascending (Bit0 - Bit7)
KeyboardMatrix = new string[]
{
// 0x40
"Key CURUP", "Key CURRIGHT", "Key CURDOWN", "Key NUM9", "Key NUM6", "Key NUM3", "Key ENTER", "Key NUMPERIOD",
// 0x41
"Key CURLEFT", "Key COPY", "Key NUM7", "Key NUM8", "Key NUM5", "Key NUM1", "Key NUM2", "Key NUM0",
// 0x42
"Key CLR", "Key LeftBracket", "Key RETURN", "Key RightBracket", "Key NUM4", "Key SHIFT", "Key BackSlash", "Key CONTROL",
// 0x43
"Key Hat", "Key Dash", "Key @", "Key P", "Key SemiColon", "Key Colon", "Key ForwardSlash", "Key Period",
// 0x44
"Key 0", "Key 9", "Key O", "Key I", "Key L", "Key K", "Key M", "Key Comma",
// 0x45
"Key 8", "Key 7", "Key U", "Key Y", "Key H", "Key J", "Key N", "Key SPACE",
// 0x46
"Key 6", "Key 5", "Key R", "Key T", "Key G", "Key F", "Key B", "Key V",
// 0x47
"Key 4", "Key 3", "Key E", "Key W", "Key S", "Key D", "Key C", "Key X",
// 0x48
"Key 1", "Key 2", "Key ESC", "Key Q", "Key TAB", "Key A", "Key CAPSLOCK", "Key Z",
// 0x49
"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Fire1", "P1 Fire2", "P1 Fire3", "Key DEL",
};
// keystatus array to match the matrix
KeyStatus = new bool[8 * 10];
// nonmatrix keys (anything that hasnt already been taken)
var nonMatrix = new List<string>();
foreach (var key in _machine.CPC.AmstradCPCControllerDefinition.BoolButtons)
{
if (!KeyboardMatrix.Any(s => s == key))
nonMatrix.Add(key);
}
NonMatrixKeys = nonMatrix.ToArray();
}
/// <summary>
/// Reads the currently selected line
/// </summary>
public byte ReadCurrentLine()
{
var lin = _currentLine; // - 0x40;
var pos = lin * 8;
var l = KeyStatus.Skip(pos).Take(8).ToArray();
BitArray bi = new BitArray(l);
byte[] bytes = new byte[1];
bi.CopyTo(bytes, 0);
byte inv = (byte)(~bytes[0]);
return inv;
}
/// <summary>
/// Returns the index of the key within the matrix
/// </summary>
public int GetKeyIndexFromMatrix(string key)
{
int index = Array.IndexOf(KeyboardMatrix, key);
return index;
}
/// <summary>
/// Sets key status
/// </summary>
public void SetKeyStatus(string key, bool isPressed)
{
int index = GetKeyIndexFromMatrix(key);
KeyStatus[index] = isPressed;
}
/// <summary>
/// Gets a key's status
/// </summary>
public bool GetKeyStatus(string key)
{
int index = GetKeyIndexFromMatrix(key);
return KeyStatus[index];
}
public void SyncState(Serializer ser)
{
ser.BeginSection("Keyboard");
ser.Sync("currentLine", ref _currentLine);
ser.Sync("keyStatus", ref _keyStatus, false);
ser.EndSection();
}
}
}