commodore64: implement keyboard matrix (input is not connected, planned)

This commit is contained in:
saxxonpike 2012-11-09 18:44:05 +00:00
parent 80b18cb278
commit f1dbf23bce
5 changed files with 92 additions and 11 deletions

View File

@ -86,6 +86,7 @@
<Compile Include="Computers\Commodore64\Cia.cs" />
<Compile Include="Computers\Commodore64\DataPort.cs" />
<Compile Include="Computers\Commodore64\IMedia.cs" />
<Compile Include="Computers\Commodore64\Input.cs" />
<Compile Include="Computers\Commodore64\PRGFile.cs" />
<Compile Include="Computers\Commodore64\MemBus.cs" />
<Compile Include="Computers\Commodore64\Sid.cs" />

View File

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

View File

@ -7,13 +7,16 @@ namespace BizHawk.Emulation.Computers.Commodore64
{
public class DirectionalDataPort
{
private int _data;
protected byte _data;
public byte Direction;
public Action<byte> 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;
}
}
}

View File

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

View File

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