commodore64: Add 6526 2-cycle timer delay, seems to pass more tests now. CPU Dataport inputs on lower 3 bits are always high now, may fix some paging issues. Fix joystick input so that only port A is affected on pure outputs.
This commit is contained in:
parent
207e974d9e
commit
d951094e6d
|
@ -97,9 +97,8 @@ namespace BizHawk.Emulation.Computers.Commodore64
|
||||||
}
|
}
|
||||||
|
|
||||||
inputAdapter0.Data = resultA;
|
inputAdapter0.Data = resultA;
|
||||||
inputAdapter1.Data = resultB;
|
inputAdapter1.Data = (byte)(joyB & resultB);
|
||||||
inputAdapter0.MaskWrite(joyB);
|
inputAdapter0.MaskWrite(joyB);
|
||||||
inputAdapter1.MaskWrite(joyA);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
private bool pinCharen;
|
private bool pinCharen;
|
||||||
private bool pinLoram;
|
private bool pinLoram;
|
||||||
private bool pinHiram;
|
private bool pinHiram;
|
||||||
|
private bool pinNMILast;
|
||||||
private byte portDir;
|
private byte portDir;
|
||||||
private bool unusedPin0;
|
private bool unusedPin0;
|
||||||
private bool unusedPin1;
|
private bool unusedPin1;
|
||||||
|
@ -41,13 +42,16 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
cpu.WriteMemory = Write;
|
cpu.WriteMemory = Write;
|
||||||
|
|
||||||
// configure data port defaults
|
// configure data port defaults
|
||||||
portDir = 0x2F;
|
portDir = 0xEF;
|
||||||
SetPortData(0x37);
|
SetPortData(0x37);
|
||||||
|
|
||||||
// todo: verify this value (I only know that unconnected bits fade after a number of cycles)
|
// todo: verify this value (I only know that unconnected bits fade after a number of cycles)
|
||||||
unusedPinTTLCycles = 40;
|
unusedPinTTLCycles = 40;
|
||||||
unusedPinTTL0 = 0;
|
unusedPinTTL0 = 0;
|
||||||
unusedPinTTL1 = 0;
|
unusedPinTTL1 = 0;
|
||||||
|
|
||||||
|
// NMI is high on startup (todo: verify)
|
||||||
|
pinNMILast = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HardReset()
|
public void HardReset()
|
||||||
|
@ -73,7 +77,13 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
{
|
{
|
||||||
// the 6502 core expects active high
|
// the 6502 core expects active high
|
||||||
// so we reverse the polarity here
|
// so we reverse the polarity here
|
||||||
cpu.NMI = !(chips.cia1.IRQ & chips.cartPort.NMI);
|
bool thisNMI = (chips.cia1.IRQ & chips.cartPort.NMI);
|
||||||
|
if (!thisNMI && pinNMILast)
|
||||||
|
cpu.NMI = true;
|
||||||
|
else
|
||||||
|
cpu.NMI = false;
|
||||||
|
pinNMILast = thisNMI;
|
||||||
|
|
||||||
cpu.IRQ = !(chips.vic.IRQ && chips.cia0.IRQ && chips.cartPort.IRQ);
|
cpu.IRQ = !(chips.vic.IRQ && chips.cia0.IRQ && chips.cartPort.IRQ);
|
||||||
cpu.ExecuteOne();
|
cpu.ExecuteOne();
|
||||||
}
|
}
|
||||||
|
@ -105,7 +115,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
public void Poke(int addr, byte val)
|
public void Poke(int addr, byte val)
|
||||||
{
|
{
|
||||||
if (addr == 0x0000)
|
if (addr == 0x0000)
|
||||||
portDir = val;
|
SetPortDir(val);
|
||||||
else if (addr == 0x0001)
|
else if (addr == 0x0001)
|
||||||
SetPortData(val);
|
SetPortData(val);
|
||||||
else
|
else
|
||||||
|
@ -182,7 +192,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
Console.WriteLine("CPU write DIR: val=" + C64Util.ToBinary(value, 8));
|
Console.WriteLine("CPU write DIR: val=" + C64Util.ToBinary(value, 8));
|
||||||
portDir = value;
|
SetPortDir(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,6 +212,12 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
unusedPinTTL1 = unusedPinTTLCycles;
|
unusedPinTTL1 = unusedPinTTLCycles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetPortDir(byte val)
|
||||||
|
{
|
||||||
|
portDir = val;
|
||||||
|
SetPortData((byte)(PortData | ((byte)~val & 0x1F)));
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
private bool pinFlag;
|
private bool pinFlag;
|
||||||
private bool pinPC;
|
private bool pinPC;
|
||||||
private byte sr;
|
private byte sr;
|
||||||
|
private uint[] timerDelay;
|
||||||
private InMode[] timerInMode;
|
private InMode[] timerInMode;
|
||||||
private OutMode[] timerOutMode;
|
private OutMode[] timerOutMode;
|
||||||
private bool[] timerPortEnable;
|
private bool[] timerPortEnable;
|
||||||
|
@ -82,6 +83,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
chipRegion = region;
|
chipRegion = region;
|
||||||
enableIntTimer = new bool[2];
|
enableIntTimer = new bool[2];
|
||||||
intTimer = new bool[2];
|
intTimer = new bool[2];
|
||||||
|
timerDelay = new uint[2];
|
||||||
timerInMode = new InMode[2];
|
timerInMode = new InMode[2];
|
||||||
timerOutMode = new OutMode[2];
|
timerOutMode = new OutMode[2];
|
||||||
timerPortEnable = new bool[2];
|
timerPortEnable = new bool[2];
|
||||||
|
@ -111,8 +113,16 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
if (timerPulse[1])
|
if (timerPulse[1])
|
||||||
portData[1] &= PBOnMask[0];
|
portData[1] &= PBOnMask[0];
|
||||||
|
|
||||||
|
if (timerDelay[0] == 0)
|
||||||
TimerRun(0);
|
TimerRun(0);
|
||||||
|
else
|
||||||
|
timerDelay[0]--;
|
||||||
|
|
||||||
|
if (timerDelay[1] == 0)
|
||||||
TimerRun(1);
|
TimerRun(1);
|
||||||
|
else
|
||||||
|
timerDelay[1]--;
|
||||||
|
|
||||||
intAlarm |= (
|
intAlarm |= (
|
||||||
tod[0] == todAlarm[0] &&
|
tod[0] == todAlarm[0] &&
|
||||||
tod[1] == todAlarm[1] &&
|
tod[1] == todAlarm[1] &&
|
||||||
|
@ -149,8 +159,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
intTimer[0] = false;
|
intTimer[0] = false;
|
||||||
intTimer[1] = false;
|
intTimer[1] = false;
|
||||||
sr = 0;
|
sr = 0;
|
||||||
timerPortEnable[0] = false;
|
timerDelay[0] = 0;
|
||||||
timerPortEnable[1] = false;
|
timerDelay[1] = 0;
|
||||||
timerInMode[0] = InMode.Phase2;
|
timerInMode[0] = InMode.Phase2;
|
||||||
timerInMode[1] = InMode.Phase2;
|
timerInMode[1] = InMode.Phase2;
|
||||||
timerOn[0] = false;
|
timerOn[0] = false;
|
||||||
|
@ -402,6 +412,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
private byte ReadRegister(ushort addr)
|
private byte ReadRegister(ushort addr)
|
||||||
{
|
{
|
||||||
byte val = 0x00; //unused pin value
|
byte val = 0x00; //unused pin value
|
||||||
|
uint timerVal;
|
||||||
|
|
||||||
switch (addr)
|
switch (addr)
|
||||||
{
|
{
|
||||||
|
@ -418,16 +429,20 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
val = portDir[1];
|
val = portDir[1];
|
||||||
break;
|
break;
|
||||||
case 0x4:
|
case 0x4:
|
||||||
val = (byte)(timer[0] & 0xFF);
|
timerVal = ReadTimerValue(0);
|
||||||
|
val = (byte)(timerVal & 0xFF);
|
||||||
break;
|
break;
|
||||||
case 0x5:
|
case 0x5:
|
||||||
val = (byte)(timer[0] >> 8);
|
timerVal = ReadTimerValue(0);
|
||||||
|
val = (byte)(timerVal >> 8);
|
||||||
break;
|
break;
|
||||||
case 0x6:
|
case 0x6:
|
||||||
val = (byte)(timer[1] & 0xFF);
|
timerVal = ReadTimerValue(1);
|
||||||
|
val = (byte)(timerVal & 0xFF);
|
||||||
break;
|
break;
|
||||||
case 0x7:
|
case 0x7:
|
||||||
val = (byte)(timer[1] >> 8);
|
timerVal = ReadTimerValue(1);
|
||||||
|
val = (byte)(timerVal >> 8);
|
||||||
break;
|
break;
|
||||||
case 0x8:
|
case 0x8:
|
||||||
val = tod[0];
|
val = tod[0];
|
||||||
|
@ -495,6 +510,21 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private uint ReadTimerValue(uint index)
|
||||||
|
{
|
||||||
|
if (timerOn[index])
|
||||||
|
{
|
||||||
|
if (timer[index] == 0)
|
||||||
|
return timerLatch[index];
|
||||||
|
else
|
||||||
|
return timer[index];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return timer[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Write(ushort addr, byte val)
|
public void Write(ushort addr, byte val)
|
||||||
{
|
{
|
||||||
Write(addr, val, 0xFF);
|
Write(addr, val, 0xFF);
|
||||||
|
@ -622,6 +652,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
enableIntFlag = intReg;
|
enableIntFlag = intReg;
|
||||||
break;
|
break;
|
||||||
case 0xE:
|
case 0xE:
|
||||||
|
if ((val & 0x01) != 0 && !timerOn[0])
|
||||||
|
timerDelay[0] = 2;
|
||||||
timerOn[0] = ((val & 0x01) != 0);
|
timerOn[0] = ((val & 0x01) != 0);
|
||||||
timerPortEnable[0] = ((val & 0x02) != 0);
|
timerPortEnable[0] = ((val & 0x02) != 0);
|
||||||
timerOutMode[0] = ((val & 0x04) != 0) ? OutMode.Toggle : OutMode.Pulse;
|
timerOutMode[0] = ((val & 0x04) != 0) ? OutMode.Toggle : OutMode.Pulse;
|
||||||
|
@ -631,6 +663,8 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS
|
||||||
todIn = ((val & 0x80) != 0);
|
todIn = ((val & 0x80) != 0);
|
||||||
break;
|
break;
|
||||||
case 0xF:
|
case 0xF:
|
||||||
|
if ((val & 0x01) != 0 && !timerOn[1])
|
||||||
|
timerDelay[1] = 2;
|
||||||
timerOn[1] = ((val & 0x01) != 0);
|
timerOn[1] = ((val & 0x01) != 0);
|
||||||
timerPortEnable[1] = ((val & 0x02) != 0);
|
timerPortEnable[1] = ((val & 0x02) != 0);
|
||||||
timerOutMode[1] = ((val & 0x04) != 0) ? OutMode.Toggle : OutMode.Pulse;
|
timerOutMode[1] = ((val & 0x04) != 0) ? OutMode.Toggle : OutMode.Pulse;
|
||||||
|
|
Loading…
Reference in New Issue