un-refactored input code and added some +keyboard combinations

This commit is contained in:
Asnivor 2017-11-30 12:08:36 +00:00
parent b38760caeb
commit 64bb08cbb7
6 changed files with 326 additions and 85 deletions

View File

@ -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);
}
}

View File

@ -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
}
}
}

View File

@ -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);

View File

@ -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();
}
}

View File

@ -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"
}

View File

@ -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: