-Moved the reset address to the CP1610 and made RegisterSP/PC private.
-Created helper functions for indirect ops; Indirect_Set will be needed for interrupts.
This commit is contained in:
parent
05b107ed49
commit
0d20c133a5
|
@ -5,10 +5,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
{
|
{
|
||||||
public sealed partial class CP1610
|
public sealed partial class CP1610
|
||||||
{
|
{
|
||||||
|
private const ushort RESET = 0x1000;
|
||||||
|
private const ushort INTERRUPT = 0x1004;
|
||||||
|
|
||||||
private bool FlagS, FlagC, FlagZ, FlagO, FlagI, FlagD, IntRM, BusRq, BusAk, MSync, Interruptible;
|
private bool FlagS, FlagC, FlagZ, FlagO, FlagI, FlagD, IntRM, BusRq, BusAk, MSync, Interruptible;
|
||||||
private ushort[] Register = new ushort[8];
|
private ushort[] Register = new ushort[8];
|
||||||
public ushort RegisterSP { get { return Register[6]; } set { Register[6] = value; } }
|
private ushort RegisterSP { get { return Register[6]; } set { Register[6] = value; } }
|
||||||
public ushort RegisterPC { get { return Register[7]; } set { Register[7] = value; } }
|
private ushort RegisterPC { get { return Register[7]; } set { Register[7] = value; } }
|
||||||
|
|
||||||
public int TotalExecutedCycles;
|
public int TotalExecutedCycles;
|
||||||
public int PendingCycles;
|
public int PendingCycles;
|
||||||
|
@ -25,6 +28,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
log = new StreamWriter("log_CP1610.txt");
|
log = new StreamWriter("log_CP1610.txt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CP1610()
|
||||||
|
{
|
||||||
|
RegisterPC = RESET;
|
||||||
|
}
|
||||||
|
|
||||||
public void LogData()
|
public void LogData()
|
||||||
{
|
{
|
||||||
if (!logging)
|
if (!logging)
|
||||||
|
|
|
@ -42,6 +42,65 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
FlagZ = (result == 0);
|
FlagZ = (result == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ushort Indirect_Get(byte mem)
|
||||||
|
{
|
||||||
|
ushort value;
|
||||||
|
// Auto-decrement the stack pointer if it's the memory register.
|
||||||
|
if (mem == 0x6)
|
||||||
|
RegisterSP--;
|
||||||
|
if (!FlagD)
|
||||||
|
{
|
||||||
|
value = ReadMemory(Register[mem]);
|
||||||
|
if (mem != 0x6)
|
||||||
|
{
|
||||||
|
PendingCycles -= 8; TotalExecutedCycles += 8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PendingCycles -= 11; TotalExecutedCycles += 11;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Double Byte Data.
|
||||||
|
value = (ushort)(ReadMemory(Register[mem]++) & 0xFF);
|
||||||
|
value |= (ushort)(ReadMemory(Register[mem]) << 8);
|
||||||
|
PendingCycles -= 10; TotalExecutedCycles += 10;
|
||||||
|
}
|
||||||
|
// Auto-increment the memory register if it does so on write.
|
||||||
|
if (mem >= 0x4 && mem != 0x6)
|
||||||
|
Register[mem]++;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Indirect_Get_Cycles(byte mem)
|
||||||
|
{
|
||||||
|
if (!FlagD)
|
||||||
|
{
|
||||||
|
if (mem != 0x6)
|
||||||
|
{
|
||||||
|
PendingCycles -= 8; TotalExecutedCycles += 8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PendingCycles -= 11; TotalExecutedCycles += 11;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Double Byte Data.
|
||||||
|
PendingCycles -= 10; TotalExecutedCycles += 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Indirect_Set(byte mem, byte src)
|
||||||
|
{
|
||||||
|
WriteMemory(Register[mem], Register[src]);
|
||||||
|
// Auto-increment the memory register if it does so on read.
|
||||||
|
if (mem >= 0x4)
|
||||||
|
Register[mem]++;
|
||||||
|
}
|
||||||
|
|
||||||
public void Execute(int cycles)
|
public void Execute(int cycles)
|
||||||
{
|
{
|
||||||
PendingCycles += cycles;
|
PendingCycles += cycles;
|
||||||
|
@ -1205,10 +1264,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
case 0x27F:
|
case 0x27F:
|
||||||
mem = (byte)((opcode >> 3) & 0x7);
|
mem = (byte)((opcode >> 3) & 0x7);
|
||||||
src = (byte)(opcode & 0x7);
|
src = (byte)(opcode & 0x7);
|
||||||
WriteMemory(Register[mem], Register[src]);
|
Indirect_Set(mem, src);
|
||||||
// Auto-increment the memory register if it does so on read.
|
|
||||||
if (mem >= 0x4)
|
|
||||||
Register[mem]++;
|
|
||||||
PendingCycles -= 9; TotalExecutedCycles += 9;
|
PendingCycles -= 9; TotalExecutedCycles += 9;
|
||||||
Interruptible = false;
|
Interruptible = false;
|
||||||
break;
|
break;
|
||||||
|
@ -1287,31 +1343,8 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
case 0x2BF:
|
case 0x2BF:
|
||||||
mem = (byte)((opcode >> 3) & 0x7);
|
mem = (byte)((opcode >> 3) & 0x7);
|
||||||
dest = (byte)(opcode & 0x7);
|
dest = (byte)(opcode & 0x7);
|
||||||
// Auto-decrement the stack pointer if it's the memory register.
|
Register[dest] = Indirect_Get(mem);
|
||||||
if (mem == 0x6)
|
Indirect_Get_Cycles(mem);
|
||||||
RegisterSP--;
|
|
||||||
if (!FlagD)
|
|
||||||
{
|
|
||||||
Register[dest] = ReadMemory(Register[mem]);
|
|
||||||
if (mem != 0x6)
|
|
||||||
{
|
|
||||||
PendingCycles -= 8; TotalExecutedCycles += 8;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PendingCycles -= 11; TotalExecutedCycles += 11;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Double Byte Data.
|
|
||||||
Register[dest] = (ushort)(ReadMemory(Register[mem]++) & 0xFF);
|
|
||||||
Register[dest] |= (ushort)(ReadMemory(Register[mem]) << 8);
|
|
||||||
PendingCycles -= 10; TotalExecutedCycles += 10;
|
|
||||||
}
|
|
||||||
// Auto-increment the memory register if it does so on write.
|
|
||||||
if (mem >= 0x4 && mem != 0x6)
|
|
||||||
Register[mem]++;
|
|
||||||
Interruptible = true;
|
Interruptible = true;
|
||||||
break;
|
break;
|
||||||
// ADD
|
// ADD
|
||||||
|
@ -1397,31 +1430,8 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
case 0x2FF:
|
case 0x2FF:
|
||||||
mem = (byte)((opcode >> 3) & 0x7);
|
mem = (byte)((opcode >> 3) & 0x7);
|
||||||
dest = (byte)(opcode & 0x7);
|
dest = (byte)(opcode & 0x7);
|
||||||
// Auto-decrement the stack pointer if it's the memory register.
|
mem_read = Indirect_Get(mem);
|
||||||
if (mem == 0x6)
|
Indirect_Get_Cycles(mem);
|
||||||
RegisterSP--;
|
|
||||||
if (!FlagD)
|
|
||||||
{
|
|
||||||
mem_read = ReadMemory(Register[mem]);
|
|
||||||
if (mem != 0x6)
|
|
||||||
{
|
|
||||||
PendingCycles -= 8; TotalExecutedCycles += 8;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PendingCycles -= 11; TotalExecutedCycles += 11;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Double Byte Data.
|
|
||||||
mem_read = (ushort)(ReadMemory(Register[mem]++) & 0xFF);
|
|
||||||
mem_read |= (ushort)(ReadMemory(Register[mem]) << 8);
|
|
||||||
PendingCycles -= 10; TotalExecutedCycles += 10;
|
|
||||||
}
|
|
||||||
// Auto-increment the memory register if it does so on write.
|
|
||||||
if (mem >= 0x4 && mem != 0x6)
|
|
||||||
Register[mem]++;
|
|
||||||
dest_value = Register[dest];
|
dest_value = Register[dest];
|
||||||
result = dest_value + mem_read;
|
result = dest_value + mem_read;
|
||||||
Calc_FlagC(result);
|
Calc_FlagC(result);
|
||||||
|
@ -1516,31 +1526,8 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
mem = (byte)((opcode >> 3) & 0x7);
|
mem = (byte)((opcode >> 3) & 0x7);
|
||||||
dest = (byte)(opcode & 0x7);
|
dest = (byte)(opcode & 0x7);
|
||||||
// Auto-decrement the stack pointer if it's the memory register.
|
mem_read = Indirect_Get(mem);
|
||||||
if (mem == 0x6)
|
Indirect_Get_Cycles(mem);
|
||||||
RegisterSP--;
|
|
||||||
if (!FlagD)
|
|
||||||
{
|
|
||||||
mem_read = ReadMemory(Register[mem]);
|
|
||||||
if (mem != 0x6)
|
|
||||||
{
|
|
||||||
PendingCycles -= 8; TotalExecutedCycles += 8;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PendingCycles -= 11; TotalExecutedCycles += 11;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Double Byte Data.
|
|
||||||
mem_read = (ushort)(ReadMemory(Register[mem]++) & 0xFF);
|
|
||||||
mem_read |= (ushort)(ReadMemory(Register[mem]) << 8);
|
|
||||||
PendingCycles -= 10; TotalExecutedCycles += 10;
|
|
||||||
}
|
|
||||||
// Auto-increment the memory register if it does so on write.
|
|
||||||
if (mem >= 0x4 && mem != 0x6)
|
|
||||||
Register[mem]++;
|
|
||||||
dest_value = Register[dest];
|
dest_value = Register[dest];
|
||||||
result = dest_value - mem_read;
|
result = dest_value - mem_read;
|
||||||
Calc_FlagC(result);
|
Calc_FlagC(result);
|
||||||
|
@ -1632,31 +1619,8 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
mem = (byte)((opcode >> 3) & 0x7);
|
mem = (byte)((opcode >> 3) & 0x7);
|
||||||
dest = (byte)(opcode & 0x7);
|
dest = (byte)(opcode & 0x7);
|
||||||
// Auto-decrement the stack pointer if it's the memory register.
|
mem_read = Indirect_Get(mem);
|
||||||
if (mem == 0x6)
|
Indirect_Get_Cycles(mem);
|
||||||
RegisterSP--;
|
|
||||||
if (!FlagD)
|
|
||||||
{
|
|
||||||
mem_read = ReadMemory(Register[mem]);
|
|
||||||
if (mem != 0x6)
|
|
||||||
{
|
|
||||||
PendingCycles -= 8; TotalExecutedCycles += 8;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PendingCycles -= 11; TotalExecutedCycles += 11;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Double Byte Data.
|
|
||||||
mem_read = (ushort)(ReadMemory(Register[mem]++) & 0xFF);
|
|
||||||
mem_read |= (ushort)(ReadMemory(Register[mem]) << 8);
|
|
||||||
PendingCycles -= 10; TotalExecutedCycles += 10;
|
|
||||||
}
|
|
||||||
// Auto-increment the memory register if it does so on write.
|
|
||||||
if (mem >= 0x4 && mem != 0x6)
|
|
||||||
Register[mem]++;
|
|
||||||
dest_value = Register[dest];
|
dest_value = Register[dest];
|
||||||
result = dest_value - mem_read;
|
result = dest_value - mem_read;
|
||||||
Calc_FlagC(result);
|
Calc_FlagC(result);
|
||||||
|
@ -1745,31 +1709,8 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
case 0x3BF:
|
case 0x3BF:
|
||||||
mem = (byte)((opcode >> 3) & 0x7);
|
mem = (byte)((opcode >> 3) & 0x7);
|
||||||
dest = (byte)(opcode & 0x7);
|
dest = (byte)(opcode & 0x7);
|
||||||
// Auto-decrement the stack pointer if it's the memory register.
|
mem_read = Indirect_Get(mem);
|
||||||
if (mem == 0x6)
|
Indirect_Get_Cycles(mem);
|
||||||
RegisterSP--;
|
|
||||||
if (!FlagD)
|
|
||||||
{
|
|
||||||
mem_read = ReadMemory(Register[mem]);
|
|
||||||
if (mem != 0x6)
|
|
||||||
{
|
|
||||||
PendingCycles -= 8; TotalExecutedCycles += 8;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PendingCycles -= 11; TotalExecutedCycles += 11;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Double Byte Data.
|
|
||||||
mem_read = (ushort)(ReadMemory(Register[mem]++) & 0xFF);
|
|
||||||
mem_read |= (ushort)(ReadMemory(Register[mem]) << 8);
|
|
||||||
PendingCycles -= 10; TotalExecutedCycles += 10;
|
|
||||||
}
|
|
||||||
// Auto-increment the memory register if it does so on write.
|
|
||||||
if (mem >= 0x4 && mem != 0x6)
|
|
||||||
Register[mem]++;
|
|
||||||
result = Register[dest] & mem_read;
|
result = Register[dest] & mem_read;
|
||||||
Calc_FlagS(result);
|
Calc_FlagS(result);
|
||||||
Calc_FlagZ(result);
|
Calc_FlagZ(result);
|
||||||
|
@ -1857,31 +1798,8 @@ namespace BizHawk.Emulation.CPUs.CP1610
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
mem = (byte)((opcode >> 3) & 0x7);
|
mem = (byte)((opcode >> 3) & 0x7);
|
||||||
dest = (byte)(opcode & 0x7);
|
dest = (byte)(opcode & 0x7);
|
||||||
// Auto-decrement the stack pointer if it's the memory register.
|
mem_read = Indirect_Get(mem);
|
||||||
if (mem == 0x6)
|
Indirect_Get_Cycles(mem);
|
||||||
RegisterSP--;
|
|
||||||
if (!FlagD)
|
|
||||||
{
|
|
||||||
mem_read = ReadMemory(Register[mem]);
|
|
||||||
if (mem != 0x6)
|
|
||||||
{
|
|
||||||
PendingCycles -= 8; TotalExecutedCycles += 8;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PendingCycles -= 11; TotalExecutedCycles += 11;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Double Byte Data.
|
|
||||||
mem_read = (ushort)(ReadMemory(Register[mem]++) & 0xFF);
|
|
||||||
mem_read |= (ushort)(ReadMemory(Register[mem]) << 8);
|
|
||||||
PendingCycles -= 10; TotalExecutedCycles += 10;
|
|
||||||
}
|
|
||||||
// Auto-increment the memory register if it does so on write.
|
|
||||||
if (mem >= 0x4 && mem != 0x6)
|
|
||||||
Register[mem]++;
|
|
||||||
result = Register[dest] ^ mem_read;
|
result = Register[dest] ^ mem_read;
|
||||||
Calc_FlagS(result);
|
Calc_FlagS(result);
|
||||||
Calc_FlagZ(result);
|
Calc_FlagZ(result);
|
||||||
|
|
|
@ -53,7 +53,6 @@ namespace BizHawk.Emulation.Consoles.Intellivision
|
||||||
Cpu = new CP1610();
|
Cpu = new CP1610();
|
||||||
Cpu.ReadMemory = ReadMemory;
|
Cpu.ReadMemory = ReadMemory;
|
||||||
Cpu.WriteMemory = WriteMemory;
|
Cpu.WriteMemory = WriteMemory;
|
||||||
Cpu.RegisterPC = 0x1000;
|
|
||||||
Cpu.LogData();
|
Cpu.LogData();
|
||||||
|
|
||||||
CoreOutputComm = new CoreOutputComm();
|
CoreOutputComm = new CoreOutputComm();
|
||||||
|
@ -61,7 +60,7 @@ namespace BizHawk.Emulation.Consoles.Intellivision
|
||||||
|
|
||||||
public void FrameAdvance(bool render)
|
public void FrameAdvance(bool render)
|
||||||
{
|
{
|
||||||
Cpu.Execute(9999999);
|
Cpu.Execute(999);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue