un-refactored input code and added some +keyboard combinations
This commit is contained in:
parent
b38760caeb
commit
64bb08cbb7
|
@ -20,14 +20,22 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
string[] KeyboardMatrix { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// For 16/48k models
|
||||
/// Other keyboard keys that are not in the matrix
|
||||
/// (usually keys derived from key combos)
|
||||
/// </summary>
|
||||
bool Issue2 { get; set; }
|
||||
string[] NonMatrixKeys { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The current keyboard line status
|
||||
/// Represents the spectrum key state
|
||||
/// </summary>
|
||||
//byte[] LineStatus { get; set; }
|
||||
int[] KeyLine { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// There are some slight differences in how PortIN and PortOUT functions
|
||||
/// between Issue2 and Issue3 keyboards (16k/48k spectrum only)
|
||||
/// It is possible that some very old games require Issue2 emulation
|
||||
/// </summary>
|
||||
bool IsIssue2Keyboard { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Sets the spectrum key status
|
||||
|
@ -64,6 +72,8 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
/// <returns></returns>
|
||||
byte GetByteFromKeyMatrix(string key);
|
||||
|
||||
|
||||
|
||||
void SyncState(Serializer ser);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,14 +15,29 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
{
|
||||
Spectrum.InputCallbacks.Call();
|
||||
|
||||
for (var i = 0; i < KeyboardDevice.KeyboardMatrix.Length; i++)
|
||||
{
|
||||
string key = KeyboardDevice.KeyboardMatrix[i];
|
||||
bool prevState = KeyboardDevice.GetKeyStatus(key);
|
||||
bool currState = Spectrum._controller.IsPressed(key);
|
||||
lock (this)
|
||||
{
|
||||
// parse single keyboard matrix keys
|
||||
for (var i = 0; i < KeyboardDevice.KeyboardMatrix.Length; i++)
|
||||
{
|
||||
string key = KeyboardDevice.KeyboardMatrix[i];
|
||||
//bool prevState = KeyboardDevice.GetKeyStatus(key);
|
||||
bool currState = Spectrum._controller.IsPressed(key);
|
||||
|
||||
if (currState != prevState)
|
||||
//if (currState != prevState)
|
||||
KeyboardDevice.SetKeyStatus(key, currState);
|
||||
}
|
||||
|
||||
// non matrix keys
|
||||
foreach (string k in KeyboardDevice.NonMatrixKeys)
|
||||
{
|
||||
if (!k.StartsWith("Key"))
|
||||
continue;
|
||||
|
||||
bool currState = Spectrum._controller.IsPressed(k);
|
||||
|
||||
KeyboardDevice.SetKeyStatus(k, currState);
|
||||
}
|
||||
}
|
||||
|
||||
// Tape control
|
||||
|
@ -45,3 +60,4 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -26,18 +26,19 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
{
|
||||
CPU.TotalExecutedCycles += 4;
|
||||
|
||||
byte result = 0xFF;
|
||||
int result = 0xFF;
|
||||
|
||||
// get the high byte from Regs[6]
|
||||
ushort high = CPU.Regs[6];
|
||||
|
||||
// combine the low byte (passed in as port) and the high byte (maybe not needed)
|
||||
ushort word = Convert.ToUInt16((port << 8 | high));
|
||||
//ushort word = Convert.ToUInt16((port << 8 | high));
|
||||
int word = (high << 8) + port;
|
||||
|
||||
// Check whether the low bit is reset
|
||||
// Technically the ULA should respond to every even I/O address
|
||||
bool lowBitReset = (port & 0x0001) == 0;
|
||||
|
||||
bool lowBitReset = (port & 0x0001) == 0;
|
||||
|
||||
// Kempston Joystick
|
||||
//not implemented yet
|
||||
|
||||
|
@ -53,15 +54,80 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
0xf7fe 1, 2, 3, 4, 5 0x7ffe SPACE, SYM SHFT, M, N, B
|
||||
*/
|
||||
|
||||
if ((word & 0x8000) == 0)
|
||||
result &= KeyboardDevice.KeyLine[7];
|
||||
|
||||
if ((word & 0x4000) == 0)
|
||||
result &= KeyboardDevice.KeyLine[6];
|
||||
|
||||
if ((word & 0x2000) == 0)
|
||||
result &= KeyboardDevice.KeyLine[5];
|
||||
|
||||
if ((word & 0x1000) == 0)
|
||||
result &= KeyboardDevice.KeyLine[4];
|
||||
|
||||
if ((word & 0x800) == 0)
|
||||
result &= KeyboardDevice.KeyLine[3];
|
||||
|
||||
if ((word & 0x400) == 0)
|
||||
result &= KeyboardDevice.KeyLine[2];
|
||||
|
||||
if ((word & 0x200) == 0)
|
||||
result &= KeyboardDevice.KeyLine[1];
|
||||
|
||||
if ((word & 0x100) == 0)
|
||||
result &= KeyboardDevice.KeyLine[0];
|
||||
|
||||
result = result & 0x1f; //mask out lower 4 bits
|
||||
result = result | 0xa0; //set bit 5 & 7 to 1
|
||||
|
||||
if (TapeDevice.CurrentMode == TapeOperationMode.Load)
|
||||
{
|
||||
if (!TapeDevice.GetEarBit(CPU.TotalExecutedCycles))
|
||||
{
|
||||
result &= ~(TAPE_BIT); // reset is EAR ON
|
||||
}
|
||||
else
|
||||
{
|
||||
result |= (TAPE_BIT); // set is EAR Off
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (KeyboardDevice.IsIssue2Keyboard)
|
||||
{
|
||||
if ((LastULAOutByte & (EAR_BIT + MIC_BIT)) == 0)
|
||||
{
|
||||
result &= ~(TAPE_BIT);
|
||||
}
|
||||
else
|
||||
{
|
||||
result |= TAPE_BIT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((LastULAOutByte & EAR_BIT) == 0)
|
||||
{
|
||||
result &= ~(TAPE_BIT);
|
||||
}
|
||||
else
|
||||
{
|
||||
result |= TAPE_BIT;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
// read keyboard input
|
||||
if (high != 0)
|
||||
result = KeyboardDevice.GetLineStatus((byte)high);
|
||||
result &= KeyboardDevice.GetLineStatus((byte)high);
|
||||
|
||||
var ear = TapeDevice.GetEarBit(CPU.TotalExecutedCycles);
|
||||
if (!ear)
|
||||
{
|
||||
result = (byte)(result & Convert.ToInt32("10111111", 2));
|
||||
}
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -75,7 +141,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
// if unused port the floating memory bus should be returned (still todo)
|
||||
}
|
||||
|
||||
return result;
|
||||
return (byte)(result & 0xff);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -103,10 +169,10 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
| | | | E | M | Border |
|
||||
+-------------------------------+
|
||||
*/
|
||||
|
||||
|
||||
// Border - LSB 3 bits hold the border colour
|
||||
BorderColour = value & BORDER_BIT;
|
||||
|
||||
|
||||
// Buzzer
|
||||
BuzzerDevice.ProcessPulseValue(false, (value & EAR_BIT) != 0);
|
||||
|
||||
|
|
|
@ -13,9 +13,23 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
public class Keyboard48 : IKeyboard
|
||||
{
|
||||
public SpectrumBase _machine { get; set; }
|
||||
private byte[] LineStatus;
|
||||
public bool Issue2 { get; set; }
|
||||
private byte[] LineStatus;
|
||||
private string[] _keyboardMatrix;
|
||||
private int[] _keyLine;
|
||||
private bool _isIssue2Keyboard;
|
||||
private string[] _nonMatrixKeys;
|
||||
|
||||
public bool IsIssue2Keyboard
|
||||
{
|
||||
get { return _isIssue2Keyboard; }
|
||||
set { _isIssue2Keyboard = value; }
|
||||
}
|
||||
|
||||
public int[] KeyLine
|
||||
{
|
||||
get { return _keyLine; }
|
||||
set { _keyLine = value; }
|
||||
}
|
||||
|
||||
public string[] KeyboardMatrix
|
||||
{
|
||||
|
@ -23,6 +37,12 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
set { _keyboardMatrix = value; }
|
||||
}
|
||||
|
||||
public string[] NonMatrixKeys
|
||||
{
|
||||
get { return _nonMatrixKeys; }
|
||||
set { _nonMatrixKeys = value; }
|
||||
}
|
||||
|
||||
public Keyboard48(SpectrumBase machine)
|
||||
{
|
||||
_machine = machine;
|
||||
|
@ -44,23 +64,185 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
// 0xbffe - 30 - 34
|
||||
"Key Return", "Key L", "Key K", "Key J", "Key H",
|
||||
// 0x7ffe - 35 - 39
|
||||
"Key Space", "Key Sym Shift", "Key M", "Key N", "Key B"
|
||||
"Key Space", "Key Symbol Shift", "Key M", "Key N", "Key B"
|
||||
};
|
||||
|
||||
var nonMatrix = new List<string>();
|
||||
foreach (var key in ZXSpectrum.ZXSpectrumControllerDefinition.BoolButtons)
|
||||
{
|
||||
if (!KeyboardMatrix.Any(s => s == key))
|
||||
nonMatrix.Add(key);
|
||||
}
|
||||
NonMatrixKeys = nonMatrix.ToArray();
|
||||
|
||||
LineStatus = new byte[8];
|
||||
_keyLine = new int[] { 255, 255, 255, 255, 255, 255, 255, 255 };
|
||||
IsIssue2Keyboard = false;
|
||||
}
|
||||
|
||||
public void SetKeyStatus(string key, bool isPressed)
|
||||
public void SetKeyStatus(string key, bool isPressed)
|
||||
{
|
||||
/*
|
||||
byte keyByte = GetByteFromKeyMatrix(key);
|
||||
var lineIndex = keyByte / 5;
|
||||
var lineMask = 1 << keyByte % 5;
|
||||
|
||||
LineStatus[lineIndex] = isPressed ? (byte)(LineStatus[lineIndex] | lineMask)
|
||||
: (byte)(LineStatus[lineIndex] & ~lineMask);
|
||||
*/
|
||||
|
||||
int k = GetByteFromKeyMatrix(key);
|
||||
|
||||
if (isPressed)
|
||||
{
|
||||
switch (k)
|
||||
{
|
||||
// 0xfefe - 0 - 4
|
||||
case 0: _keyLine[0] = (_keyLine[0] & ~(0x01)); break;
|
||||
case 1: _keyLine[0] = (_keyLine[0] & ~(0x02)); break;
|
||||
case 2: _keyLine[0] = (_keyLine[0] & ~(0x04)); break;
|
||||
case 3: _keyLine[0] = (_keyLine[0] & ~(0x08)); break;
|
||||
case 4: _keyLine[0] = (_keyLine[0] & ~(0x10)); break;
|
||||
// 0xfdfe - 5 - 9
|
||||
case 5: _keyLine[1] = (_keyLine[1] & ~(0x01)); break;
|
||||
case 6: _keyLine[1] = (_keyLine[1] & ~(0x02)); break;
|
||||
case 7: _keyLine[1] = (_keyLine[1] & ~(0x04)); break;
|
||||
case 8: _keyLine[1] = (_keyLine[1] & ~(0x08)); break;
|
||||
case 9: _keyLine[1] = (_keyLine[1] & ~(0x10)); break;
|
||||
// 0xfbfe - 10 - 14
|
||||
case 10: _keyLine[2] = (_keyLine[2] & ~(0x01)); break;
|
||||
case 11: _keyLine[2] = (_keyLine[2] & ~(0x02)); break;
|
||||
case 12: _keyLine[2] = (_keyLine[2] & ~(0x04)); break;
|
||||
case 13: _keyLine[2] = (_keyLine[2] & ~(0x08)); break;
|
||||
case 14: _keyLine[2] = (_keyLine[2] & ~(0x10)); break;
|
||||
// 0xf7fe - 15 - 19
|
||||
case 15: _keyLine[3] = (_keyLine[3] & ~(0x01)); break;
|
||||
case 16: _keyLine[3] = (_keyLine[3] & ~(0x02)); break;
|
||||
case 17: _keyLine[3] = (_keyLine[3] & ~(0x04)); break;
|
||||
case 18: _keyLine[3] = (_keyLine[3] & ~(0x08)); break;
|
||||
case 19: _keyLine[3] = (_keyLine[3] & ~(0x10)); break;
|
||||
// 0xeffe - 20 - 24
|
||||
case 20: _keyLine[4] = (_keyLine[4] & ~(0x01)); break;
|
||||
case 21: _keyLine[4] = (_keyLine[4] & ~(0x02)); break;
|
||||
case 22: _keyLine[4] = (_keyLine[4] & ~(0x04)); break;
|
||||
case 23: _keyLine[4] = (_keyLine[4] & ~(0x08)); break;
|
||||
case 24: _keyLine[4] = (_keyLine[4] & ~(0x10)); break;
|
||||
// 0xdffe - 25 - 29
|
||||
case 25: _keyLine[5] = (_keyLine[5] & ~(0x01)); break;
|
||||
case 26: _keyLine[5] = (_keyLine[5] & ~(0x02)); break;
|
||||
case 27: _keyLine[5] = (_keyLine[5] & ~(0x04)); break;
|
||||
case 28: _keyLine[5] = (_keyLine[5] & ~(0x08)); break;
|
||||
case 29: _keyLine[5] = (_keyLine[5] & ~(0x10)); break;
|
||||
// 0xbffe - 30 - 34
|
||||
case 30: _keyLine[6] = (_keyLine[6] & ~(0x01)); break;
|
||||
case 31: _keyLine[6] = (_keyLine[6] & ~(0x02)); break;
|
||||
case 32: _keyLine[6] = (_keyLine[6] & ~(0x04)); break;
|
||||
case 33: _keyLine[6] = (_keyLine[6] & ~(0x08)); break;
|
||||
case 34: _keyLine[6] = (_keyLine[6] & ~(0x10)); break;
|
||||
// 0x7ffe - 35 - 39
|
||||
case 35: _keyLine[7] = (_keyLine[7] & ~(0x01)); break;
|
||||
case 36: _keyLine[7] = (_keyLine[7] & ~(0x02)); break;
|
||||
case 37: _keyLine[7] = (_keyLine[7] & ~(0x04)); break;
|
||||
case 38: _keyLine[7] = (_keyLine[7] & ~(0x08)); break;
|
||||
case 39: _keyLine[7] = (_keyLine[7] & ~(0x10)); break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (k)
|
||||
{
|
||||
// 0xfefe - 0 - 4
|
||||
case 0: _keyLine[0] = (_keyLine[0] | (0x01)); break;
|
||||
case 1: _keyLine[0] = (_keyLine[0] | (0x02)); break;
|
||||
case 2: _keyLine[0] = (_keyLine[0] | (0x04)); break;
|
||||
case 3: _keyLine[0] = (_keyLine[0] | (0x08)); break;
|
||||
case 4: _keyLine[0] = (_keyLine[0] | (0x10)); break;
|
||||
// 0xfdfe - 5 - 9
|
||||
case 5: _keyLine[1] = (_keyLine[1] | (0x01)); break;
|
||||
case 6: _keyLine[1] = (_keyLine[1] | (0x02)); break;
|
||||
case 7: _keyLine[1] = (_keyLine[1] | (0x04)); break;
|
||||
case 8: _keyLine[1] = (_keyLine[1] | (0x08)); break;
|
||||
case 9: _keyLine[1] = (_keyLine[1] | (0x10)); break;
|
||||
// 0xfbfe - 10 - 14
|
||||
case 10: _keyLine[2] = (_keyLine[2] | (0x01)); break;
|
||||
case 11: _keyLine[2] = (_keyLine[2] | (0x02)); break;
|
||||
case 12: _keyLine[2] = (_keyLine[2] | (0x04)); break;
|
||||
case 13: _keyLine[2] = (_keyLine[2] | (0x08)); break;
|
||||
case 14: _keyLine[2] = (_keyLine[2] | (0x10)); break;
|
||||
// 0xf7fe - 15 - 19
|
||||
case 15: _keyLine[3] = (_keyLine[3] | (0x01)); break;
|
||||
case 16: _keyLine[3] = (_keyLine[3] | (0x02)); break;
|
||||
case 17: _keyLine[3] = (_keyLine[3] | (0x04)); break;
|
||||
case 18: _keyLine[3] = (_keyLine[3] | (0x08)); break;
|
||||
case 19: _keyLine[3] = (_keyLine[3] | (0x10)); break;
|
||||
// 0xeffe - 20 - 24
|
||||
case 20: _keyLine[4] = (_keyLine[4] | (0x01)); break;
|
||||
case 21: _keyLine[4] = (_keyLine[4] | (0x02)); break;
|
||||
case 22: _keyLine[4] = (_keyLine[4] | (0x04)); break;
|
||||
case 23: _keyLine[4] = (_keyLine[4] | (0x08)); break;
|
||||
case 24: _keyLine[4] = (_keyLine[4] | (0x10)); break;
|
||||
// 0xdffe - 25 - 29
|
||||
case 25: _keyLine[5] = (_keyLine[5] | (0x01)); break;
|
||||
case 26: _keyLine[5] = (_keyLine[5] | (0x02)); break;
|
||||
case 27: _keyLine[5] = (_keyLine[5] | (0x04)); break;
|
||||
case 28: _keyLine[5] = (_keyLine[5] | (0x08)); break;
|
||||
case 29: _keyLine[5] = (_keyLine[5] | (0x10)); break;
|
||||
// 0xbffe - 30 - 34
|
||||
case 30: _keyLine[6] = (_keyLine[6] | (0x01)); break;
|
||||
case 31: _keyLine[6] = (_keyLine[6] | (0x02)); break;
|
||||
case 32: _keyLine[6] = (_keyLine[6] | (0x04)); break;
|
||||
case 33: _keyLine[6] = (_keyLine[6] | (0x08)); break;
|
||||
case 34: _keyLine[6] = (_keyLine[6] | (0x10)); break;
|
||||
// 0x7ffe - 35 - 39
|
||||
case 35: _keyLine[7] = (_keyLine[7] | (0x01)); break;
|
||||
case 36: _keyLine[7] = (_keyLine[7] | (0x02)); break;
|
||||
case 37: _keyLine[7] = (_keyLine[7] | (0x04)); break;
|
||||
case 38: _keyLine[7] = (_keyLine[7] | (0x08)); break;
|
||||
case 39: _keyLine[7] = (_keyLine[7] | (0x10)); break;
|
||||
}
|
||||
}
|
||||
|
||||
// Combination keys that are not in the keyboard matrix
|
||||
// but are available on the Spectrum+, 128k +2 & +3
|
||||
// (GetByteFromKeyMatrix() should return 255)
|
||||
// Processed after the matrix keys - only presses handled (unpressed get done above)
|
||||
if (k == 255)
|
||||
{
|
||||
if (isPressed)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
// Delete key (simulates Caps Shift + 0)
|
||||
case "Key Delete":
|
||||
_keyLine[0] = _keyLine[0] & ~(0x1);
|
||||
_keyLine[4] = _keyLine[4] & ~(0x1);
|
||||
break;
|
||||
// Cursor left (simulates Caps Shift + 5)
|
||||
case "Key Left Cursor":
|
||||
_keyLine[0] = _keyLine[0] & ~(0x1);
|
||||
_keyLine[3] = _keyLine[3] & ~(0x10);
|
||||
break;
|
||||
// Cursor right (simulates Caps Shift + 8)
|
||||
case "Key Right Cursor":
|
||||
_keyLine[0] = _keyLine[0] & ~(0x1);
|
||||
_keyLine[4] = _keyLine[4] & ~(0x04);
|
||||
break;
|
||||
// Cursor up (simulates Caps Shift + 7)
|
||||
case "Key Up Cursor":
|
||||
_keyLine[0] = _keyLine[0] & ~(0x1);
|
||||
_keyLine[4] = _keyLine[4] & ~(0x08);
|
||||
break;
|
||||
// Cursor down (simulates Caps Shift + 6)
|
||||
case "Key Down Cursor":
|
||||
_keyLine[0] = _keyLine[0] & ~(0x1);
|
||||
_keyLine[4] = _keyLine[4] & ~(0x10);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool GetKeyStatus(string key)
|
||||
public bool GetKeyStatus(string key)
|
||||
{
|
||||
byte keyByte = GetByteFromKeyMatrix(key);
|
||||
var lineIndex = keyByte / 5;
|
||||
|
@ -68,8 +250,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
return (LineStatus[lineIndex] & lineMask) != 0;
|
||||
}
|
||||
|
||||
public byte GetLineStatus(byte lines)
|
||||
public byte GetLineStatus(byte lines)
|
||||
{
|
||||
/*
|
||||
lock(this)
|
||||
{
|
||||
byte status = 0;
|
||||
|
@ -86,9 +269,23 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
|
||||
return result;
|
||||
}
|
||||
*/
|
||||
|
||||
switch (lines)
|
||||
{
|
||||
case 0xfe: return (byte)KeyLine[0];
|
||||
case 0xfd: return (byte)KeyLine[1];
|
||||
case 0xfb: return (byte)KeyLine[2];
|
||||
case 0xf7: return (byte)KeyLine[3];
|
||||
case 0xef: return (byte)KeyLine[4];
|
||||
case 0xdf: return (byte)KeyLine[5];
|
||||
case 0xbf: return (byte)KeyLine[6];
|
||||
case 0x7f: return (byte)KeyLine[7];
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public byte ReadKeyboardByte(ushort addr)
|
||||
public byte ReadKeyboardByte(ushort addr)
|
||||
{
|
||||
return GetLineStatus((byte)(addr >> 8));
|
||||
}
|
||||
|
@ -103,6 +300,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
{
|
||||
ser.BeginSection("Keyboard");
|
||||
ser.Sync("LineStatus", ref LineStatus, false);
|
||||
ser.Sync("_keyLine", ref _keyLine, false);
|
||||
ser.EndSection();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,79 +4,30 @@ using BizHawk.Emulation.Common;
|
|||
namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
||||
{
|
||||
public partial class ZXSpectrum
|
||||
{
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// The standard 48K Spectrum keyboard
|
||||
/// Controller mapping includes all keyboard keys from the following models:
|
||||
/// https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/ZXSpectrum48k.jpg/1200px-ZXSpectrum48k.jpg
|
||||
/// https://upload.wikimedia.org/wikipedia/commons/c/ca/ZX_Spectrum%2B.jpg
|
||||
/// </summary>
|
||||
private static readonly ControllerDefinition ZXSpectrumControllerDefinition48 = new ControllerDefinition
|
||||
public static readonly ControllerDefinition ZXSpectrumControllerDefinition = new ControllerDefinition
|
||||
{
|
||||
Name = "ZXSpectrum Controller 48K",
|
||||
Name = "ZXSpectrum Controller",
|
||||
BoolButtons =
|
||||
{
|
||||
// Joystick interface (not yet emulated) - Could be Kempston/Cursor/Protek
|
||||
"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Button",
|
||||
// Keyboard - row 1
|
||||
"Key 1", "Key 2", "Key 3", "Key 4", "Key 5", "Key 6", "Key 7", "Key 8", "Key 9", "Key 0",
|
||||
/*"Key True Video", "Key Inv Video",*/ "Key 1", "Key 2", "Key 3", "Key 4", "Key 5", "Key 6", "Key 7", "Key 8", "Key 9", "Key 0", "Key Break",
|
||||
// Keyboard - row 2
|
||||
"Key Q", "Key W", "Key E", "Key R", "Key T", "Key Y", "Key U", "Key I", "Key O", "Key P",
|
||||
"Key Delete", /*"Key Graph",*/ "Key Q", "Key W", "Key E", "Key R", "Key T", "Key Y", "Key U", "Key I", "Key O", "Key P",
|
||||
// Keyboard - row 3
|
||||
"Key A", "Key S", "Key D", "Key F", "Key G", "Key H", "Key J", "Key K", "Key L", "Key Return",
|
||||
/*"Key Extend Mode", "Key Edit",*/ "Key A", "Key S", "Key D", "Key F", "Key G", "Key H", "Key J", "Key K", "Key L", "Key Return",
|
||||
// Keyboard - row 4
|
||||
"Key Caps Shift", "Key Z", "Key X", "Key C", "Key V", "Key B", "Key N", "Key M", "Key Sym Shift", "Key Space",
|
||||
// Tape functions
|
||||
"Play Tape", "Stop Tape", "RTZ Tape", "Record Tape"
|
||||
}
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// The newer spectrum keyboard (models 48k+, 128k)
|
||||
/// https://upload.wikimedia.org/wikipedia/commons/c/ca/ZX_Spectrum%2B.jpg
|
||||
/// </summary>
|
||||
private static readonly ControllerDefinition ZXSpectrumControllerDefinition128 = new ControllerDefinition
|
||||
{
|
||||
Name = "ZXSpectrum Controller 48KPlus",
|
||||
BoolButtons =
|
||||
{
|
||||
// Joystick interface (not yet emulated) - Could be Kempston/Cursor/Protek
|
||||
"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Button",
|
||||
// Keyboard - row 1
|
||||
"Key True Video", "Key Inv Video", "Key 1", "Key 2", "Key 3", "Key 4", "Key 5", "Key 6", "Key 7", "Key 8", "Key 9", "Key 0", "Key Break",
|
||||
// Keyboard - row 2
|
||||
"Key Delete", "Key Graph", "Key Q", "Key W", "Key E", "Key R", "Key T", "Key Y", "Key U", "Key I", "Key O", "Key P",
|
||||
// Keyboard - row 3
|
||||
"Key Extend Mode", "Key Edit", "Key A", "Key S", "Key D", "Key F", "Key G", "Key H", "Key J", "Key K", "Key L", "Key Return",
|
||||
// Keyboard - row 4
|
||||
"Key Caps Shift", "Key Caps Lock", "Key Z", "Key X", "Key C", "Key V", "Key B", "Key N", "Key M", "Key Period",
|
||||
"Key Caps Shift", /*"Key Caps Lock",*/ "Key Z", "Key X", "Key C", "Key V", "Key B", "Key N", "Key M", /*"Key Period",*/
|
||||
// Keyboard - row 5
|
||||
"Key Symbol Shift", "Key Semi-Colon", "Key Inverted-Comma", "Key Left Cursor", "Key Right Cursor", "Key Space", "Key Up Cursor", "Key Down Cursor", "Key Comma", "Key Symbol Shift",
|
||||
// Tape functions
|
||||
"Play Tape", "Stop Tape", "RTZ Tape", "Record Tape"
|
||||
}
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// The amstrad models - same as the previous keyboard layout but with built in ZX Interface 2 joystick ports
|
||||
/// https://upload.wikimedia.org/wikipedia/commons/c/ca/ZX_Spectrum%2B.jpg
|
||||
/// </summary>
|
||||
private static readonly ControllerDefinition ZXSpectrumControllerDefinitionPlus = new ControllerDefinition
|
||||
{
|
||||
Name = "ZXSpectrum Controller 48KPlus",
|
||||
BoolButtons =
|
||||
{
|
||||
// Joystick interface (not yet emulated)
|
||||
"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Button",
|
||||
// Keyboard - row 1
|
||||
"Key True Video", "Key Inv Video", "Key 1", "Key 2", "Key 3", "Key 4", "Key 5", "Key 6", "Key 7", "Key 8", "Key 9", "Key 0", "Key Break",
|
||||
// Keyboard - row 2
|
||||
"Key Delete", "Key Graph", "Key Q", "Key W", "Key E", "Key R", "Key T", "Key Y", "Key U", "Key I", "Key O", "Key P",
|
||||
// Keyboard - row 3
|
||||
"Key Extend Mode", "Key Edit", "Key A", "Key S", "Key D", "Key F", "Key G", "Key H", "Key J", "Key K", "Key L", "Key Return",
|
||||
// Keyboard - row 4
|
||||
"Key Caps Shift", "Key Caps Lock", "Key Z", "Key X", "Key C", "Key V", "Key B", "Key N", "Key M", "Key Period",
|
||||
// Keyboard - row 5
|
||||
"Key Symbol Shift", "Key Semi-Colon", "Key Inverted-Comma", "Key Left Cursor", "Key Right Cursor", "Key Space", "Key Up Cursor", "Key Down Cursor", "Key Comma", "Key Symbol Shift",
|
||||
"Key Symbol Shift", /*"Key Semi-Colon", "Key Quote",*/ "Key Left Cursor", "Key Right Cursor", "Key Space", "Key Up Cursor", "Key Down Cursor", /*"Key Comma",*/
|
||||
// Tape functions
|
||||
"Play Tape", "Stop Tape", "RTZ Tape", "Record Tape"
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
switch (Settings.MachineType)
|
||||
{
|
||||
case MachineType.ZXSpectrum48:
|
||||
ControllerDefinition = ZXSpectrumControllerDefinition48;
|
||||
ControllerDefinition = ZXSpectrumControllerDefinition;
|
||||
Init(MachineType.ZXSpectrum48, Settings.BorderType, SyncSettings.TapeLoadSpeed, _file);
|
||||
break;
|
||||
default:
|
||||
|
|
Loading…
Reference in New Issue