diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj index dddf4adbe9..7b504ed1cd 100644 --- a/BizHawk.Emulation/BizHawk.Emulation.csproj +++ b/BizHawk.Emulation/BizHawk.Emulation.csproj @@ -86,6 +86,7 @@ + diff --git a/BizHawk.Emulation/Computers/Commodore64/C64.cs b/BizHawk.Emulation/Computers/Commodore64/C64.cs index 96e828dc85..6b875d7013 100644 --- a/BizHawk.Emulation/Computers/Commodore64/C64.cs +++ b/BizHawk.Emulation/Computers/Commodore64/C64.cs @@ -101,8 +101,6 @@ namespace BizHawk.Emulation.Computers.Commodore64 for (int i = 0; i < cyclesPerFrame; i++) { - mem.cia0PortA.Data = cia0portAData; - mem.cia0PortB.Data = cia0portBData; cpu.IRQ = signal.CpuIRQ; cpu.NMI = signal.CpuNMI; if (signal.CpuAEC) diff --git a/BizHawk.Emulation/Computers/Commodore64/DataPort.cs b/BizHawk.Emulation/Computers/Commodore64/DataPort.cs index 55bc750e19..d8545130ca 100644 --- a/BizHawk.Emulation/Computers/Commodore64/DataPort.cs +++ b/BizHawk.Emulation/Computers/Commodore64/DataPort.cs @@ -7,13 +7,16 @@ namespace BizHawk.Emulation.Computers.Commodore64 { public class DirectionalDataPort { - private int _data; + protected byte _data; public byte Direction; + public Action WritePort; public DirectionalDataPort(byte initData, byte initDirection) { _data = initData; Direction = initDirection; + WritePort = WritePortDummy; + WritePort(_data); } public byte Data @@ -24,14 +27,14 @@ namespace BizHawk.Emulation.Computers.Commodore64 } set { - _data &= ~Direction; - _data |= (value & Direction); + _data &= (byte)~Direction; + _data |= (byte)(value & Direction); + WritePort(_data); } } - public void ForceSetData(byte newData) + private void WritePortDummy(byte val) { - _data = newData; } } } diff --git a/BizHawk.Emulation/Computers/Commodore64/Input.cs b/BizHawk.Emulation/Computers/Commodore64/Input.cs new file mode 100644 index 0000000000..70159440c2 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/Input.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64 +{ + public class Input + { + static string[,] keyboardMatrix = new string[,] + { + {"Key Insert/Delete", "Key Return", "Key Cursor Left/Right", "Key F7", "Key F1", "Key F3", "Key F5", "Cursor Up/Down"}, + {"Key 3", "Key W", "Key A", "Key 4", "Key Z", "Key S", "Key E", "Key Left Shift"}, + + }; + + static string[,] joystickMatrix = new string[,] + { + {"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Button"}, + {"P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Button"} + }; + + private IController controller; + private byte[] joystickLatch = new byte[2]; + private byte keyboardColumnData; + private byte[] keyboardLatch = new byte[8]; + private byte keyboardRowData; + + public Input(IController newController, Cia newCia) + { + controller = newController; + + // attach input to a CIA I/O port + newCia.ports[0].WritePort = WritePortA; + newCia.ports[1].WritePort = WritePortB; + } + + private byte GetJoystickBits(int index) + { + byte result = 0xE0; + result |= controller[joystickMatrix[index, 0]] ? (byte)0x00 : (byte)0x01; + result |= controller[joystickMatrix[index, 1]] ? (byte)0x00 : (byte)0x02; + result |= controller[joystickMatrix[index, 2]] ? (byte)0x00 : (byte)0x04; + result |= controller[joystickMatrix[index, 3]] ? (byte)0x00 : (byte)0x08; + result |= controller[joystickMatrix[index, 4]] ? (byte)0x00 : (byte)0x10; + return result; + } + + private byte GetKeyboardBits(int row) + { + byte result; + result = controller[keyboardMatrix[row, 0]] ? (byte)0x00 : (byte)0x01; + result |= controller[keyboardMatrix[row, 1]] ? (byte)0x00 : (byte)0x02; + result |= controller[keyboardMatrix[row, 2]] ? (byte)0x00 : (byte)0x04; + result |= controller[keyboardMatrix[row, 3]] ? (byte)0x00 : (byte)0x08; + result |= controller[keyboardMatrix[row, 4]] ? (byte)0x00 : (byte)0x10; + result |= controller[keyboardMatrix[row, 5]] ? (byte)0x00 : (byte)0x20; + result |= controller[keyboardMatrix[row, 6]] ? (byte)0x00 : (byte)0x40; + result |= controller[keyboardMatrix[row, 7]] ? (byte)0x00 : (byte)0x80; + return result; + } + + public void Poll() + { + for (int i = 0; i < 2; i++) + joystickLatch[i] = GetJoystickBits(i); + for (int i = 0; i < 8; i++) + keyboardLatch[i] = GetKeyboardBits(i); + } + + public void WritePortA(byte data) + { + // keyboard matrix column select + keyboardColumnData = data; + } + + public void WritePortB(byte data) + { + // keyboard matrix row select + keyboardRowData = data; + } + } +} \ No newline at end of file diff --git a/BizHawk.Emulation/Computers/Commodore64/MemBus.cs b/BizHawk.Emulation/Computers/Commodore64/MemBus.cs index f84882b17e..3aa31643a1 100644 --- a/BizHawk.Emulation/Computers/Commodore64/MemBus.cs +++ b/BizHawk.Emulation/Computers/Commodore64/MemBus.cs @@ -62,8 +62,6 @@ namespace BizHawk.Emulation.Computers.Commodore64 // registers public byte busData; - public DirectionalDataPort cia0PortA = new DirectionalDataPort(0xFF, 0x00); - public DirectionalDataPort cia0PortB = new DirectionalDataPort(0xFF, 0x00); public DirectionalDataPort cia1PortA = new DirectionalDataPort(0x7F, 0x00); public DirectionalDataPort cia1PortB = new DirectionalDataPort(0xFF, 0x00); public DirectionalDataPort cpuPort; @@ -98,8 +96,6 @@ namespace BizHawk.Emulation.Computers.Commodore64 sid = newSid; cia0 = newCia0; cia1 = newCia1; - cia0.ports[0] = cia0PortA; - cia0.ports[1] = cia0PortB; cia1.ports[0] = cia1PortA; cia1.ports[1] = cia1PortB;