commodore64: via6522 - implement more registers

This commit is contained in:
saxxonpike 2012-12-07 11:45:50 +00:00
parent 28d0328a54
commit 38adb50a10
1 changed files with 78 additions and 10 deletions

View File

@ -8,6 +8,24 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
// via // via
public class MOS6522 : Timer public class MOS6522 : Timer
{ {
private const uint acrShiftModeDisabled = 0;
private const uint acrShiftModeInT1 = 1;
private const uint acrShiftModeInClock = 2;
private const uint acrShiftModeInExtClock = 3;
private const uint acrShiftModeOutFree = 4;
private const uint acrShiftModeOutT1 = 5;
private const uint acrShiftModeOutClock = 6;
private const uint acrShiftModeOutExtClock = 7;
private const uint pcrControlInNegative = 0;
private const uint pcrControlInNegativeIndep = 1;
private const uint pcrControlInPositive = 2;
private const uint pcrControlInPositiveIndep = 3;
private const uint pcrControlHandshake = 4;
private const uint pcrControlPulse = 5;
private const uint pcrControlLow = 6;
private const uint pcrControlHigh = 7;
private uint acrShiftMode; private uint acrShiftMode;
private bool[] enableIrqCA; private bool[] enableIrqCA;
private bool[] enableIrqCB; private bool[] enableIrqCB;
@ -17,8 +35,12 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
private bool[] irqCB; private bool[] irqCB;
private bool irqSR; private bool irqSR;
private bool[] irqT; private bool[] irqT;
private byte paLatch;
private byte pbLatch;
private bool paLatchEnable; private bool paLatchEnable;
private bool pbLatchEnable; private bool pbLatchEnable;
private byte paOut;
private byte pbOut;
private uint[] pcrControlA; private uint[] pcrControlA;
private uint[] pcrControlB; private uint[] pcrControlB;
private byte sr; private byte sr;
@ -94,6 +116,22 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
addr &= 0xF; addr &= 0xF;
switch (addr) switch (addr)
{ {
case 0x0:
if (pbLatchEnable)
return Port.ExternalWrite(pbLatch, ReadPortB(), ReadDirB());
else
return ReadPortB();
case 0x1:
if (paLatchEnable)
return Port.ExternalWrite(paLatch, ReadPortA(), ReadDirA());
else
return ReadPortA();
case 0x4:
irqT[0] = false;
return ReadRegister(addr);
case 0x8:
irqT[1] = false;
return ReadRegister(addr);
default: default:
return ReadRegister(addr); return ReadRegister(addr);
} }
@ -135,9 +173,9 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
); );
case 0xC: case 0xC:
return (byte)( return (byte)(
(byte)(pcrControlA[0] & 0x1) | (byte)((pcrControlA[0] & 0x2) >> 1) |
(byte)((pcrControlA[1] & 0x3) << 1) | (byte)((pcrControlA[1] & 0x3) << 1) |
(byte)((pcrControlB[0] & 0x1) << 4) | (byte)((pcrControlB[0] & 0x2) << 3) |
(byte)((pcrControlB[1] & 0x3) << 5) (byte)((pcrControlB[1] & 0x3) << 5)
); );
case 0xD: case 0xD:
@ -172,6 +210,36 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
addr &= 0xF; addr &= 0xF;
switch (addr) switch (addr)
{ {
case 0x0:
pbOut = val;
WritePortB(val);
break;
case 0x1:
paOut = val;
WritePortA(val);
break;
case 0x2:
WriteDirB(val);
WritePortB(val);
break;
case 0x3:
WriteDirA(val);
WritePortA(val);
break;
case 0x4:
case 0x6:
WriteRegister(0x6, val);
break;
case 0x5:
WriteRegister(0x7, val);
WriteRegister(0x4, ReadRegister(0x6));
WriteRegister(0x5, ReadRegister(0x7));
irqT[0] = false;
break;
case 0x9:
timer[1] = timerLatch[1];
irqT[1] = false;
break;
default: default:
WriteRegister(addr, val); WriteRegister(addr, val);
break; break;
@ -195,12 +263,12 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
WriteDirA(val); WriteDirA(val);
break; break;
case 0x4: case 0x4:
timerLatch[0] &= 0xFF00; timer[0] &= 0xFF00;
timerLatch[0] |= val; timer[0] |= val;
break; break;
case 0x5: case 0x5:
timerLatch[0] &= 0x00FF; timer[0] &= 0x00FF;
timerLatch[0] |= (uint)val << 8; timer[0] |= (uint)val << 8;
break; break;
case 0x6: case 0x6:
timerLatch[0] &= 0xFF00; timerLatch[0] &= 0xFF00;
@ -215,8 +283,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
timerLatch[1] |= val; timerLatch[1] |= val;
break; break;
case 0x9: case 0x9:
timerLatch[1] &= 0x00FF; timer[1] &= 0x00FF;
timerLatch[1] |= (uint)val << 8; timer[1] |= (uint)val << 8;
break; break;
case 0xA: case 0xA:
sr = val; sr = val;
@ -229,9 +297,9 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
tControl[0] = (((uint)val >> 6) & 0x3); tControl[0] = (((uint)val >> 6) & 0x3);
break; break;
case 0xC: case 0xC:
pcrControlA[0] = (uint)(val & 0x1); pcrControlA[0] = ((uint)val << 1) & 0x2;
pcrControlA[1] = ((uint)val >> 1) & 0x7; pcrControlA[1] = ((uint)val >> 1) & 0x7;
pcrControlB[0] = ((uint)val >> 4) & 0x1; pcrControlB[0] = ((uint)val >> 3) & 0x2;
pcrControlB[1] = ((uint)val >> 5) & 0x7; pcrControlB[1] = ((uint)val >> 5) & 0x7;
break; break;
case 0xD: case 0xD: