-Simplified the CPU / STIC connection.

-Made FrameAdvance handle the pending cycle loop. During each iteration, it runs one instruction and ticks the STIC accordingly.
This commit is contained in:
brandman211 2012-08-14 03:58:11 +00:00
parent 9100232547
commit 26b1d06b7a
4 changed files with 1753 additions and 1786 deletions

View File

@ -8,7 +8,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
private const ushort RESET = 0x1000; private const ushort RESET = 0x1000;
private const ushort INTERRUPT = 0x1004; private const ushort INTERRUPT = 0x1004;
private bool FlagS, FlagC, FlagZ, FlagO, FlagI, FlagD, 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];
private ushort RegisterSP { get { return Register[6]; } set { Register[6] = value; } } private ushort RegisterSP { get { return Register[6]; } set { Register[6] = value; } }
private ushort RegisterPC { get { return Register[7]; } set { Register[7] = value; } } private ushort RegisterPC { get { return Register[7]; } set { Register[7] = value; } }
@ -18,14 +18,6 @@ namespace BizHawk.Emulation.CPUs.CP1610
public Func<ushort, ushort> ReadMemory; public Func<ushort, ushort> ReadMemory;
public Func<ushort, ushort, bool> WriteMemory; public Func<ushort, ushort, bool> WriteMemory;
public Func<bool> GetIntRM;
public Func<bool> GetBusRq;
public Func<bool> GetBusAk;
public Action<bool> SetBusAk;
private bool IntRM { get { return GetIntRM(); } }
private bool BusRq { get { return GetBusRq(); } }
private bool BusAk { get { return GetBusAk(); } set { SetBusAk(value); } }
private static bool logging = true; private static bool logging = true;
private static StreamWriter log; private static StreamWriter log;
@ -46,6 +38,31 @@ namespace BizHawk.Emulation.CPUs.CP1610
RegisterPC = RESET; RegisterPC = RESET;
} }
public bool GetBusAk()
{
return BusAk;
}
public void SetIntRM(bool value)
{
IntRM = value;
}
public int GetPendingCycles()
{
return PendingCycles;
}
public void SetBusRq(bool value)
{
BusRq = value;
}
public void AddPendingCycles(int cycles)
{
PendingCycles += cycles;
}
public void LogData() public void LogData()
{ {
if (!logging) if (!logging)

View File

@ -49,23 +49,12 @@ namespace BizHawk.Emulation.CPUs.CP1610
if (mem == 0x6) if (mem == 0x6)
RegisterSP--; RegisterSP--;
if (!FlagD) if (!FlagD)
{
value = ReadMemory(Register[mem]); value = ReadMemory(Register[mem]);
if (mem != 0x6)
{
PendingCycles -= 8; TotalExecutedCycles += 8;
}
else
{
PendingCycles -= 11; TotalExecutedCycles += 11;
}
}
else else
{ {
// Double Byte Data. // Double Byte Data.
value = (ushort)(ReadMemory(Register[mem]++) & 0xFF); value = (ushort)(ReadMemory(Register[mem]++) & 0xFF);
value |= (ushort)(ReadMemory(Register[mem]) << 8); value |= (ushort)(ReadMemory(Register[mem]) << 8);
PendingCycles -= 10; TotalExecutedCycles += 10;
} }
// Auto-increment the memory register if it does so on write. // Auto-increment the memory register if it does so on write.
if (mem >= 0x4 && mem != 0x6) if (mem >= 0x4 && mem != 0x6)
@ -73,23 +62,23 @@ namespace BizHawk.Emulation.CPUs.CP1610
return value; return value;
} }
public void Indirect_Get_Cycles(byte mem) public int Indirect_Get_Cycles(byte mem)
{ {
if (!FlagD) if (!FlagD)
{ {
if (mem != 0x6) if (mem != 0x6)
{ {
PendingCycles -= 8; TotalExecutedCycles += 8; return 8;
} }
else else
{ {
PendingCycles -= 11; TotalExecutedCycles += 11; return 11;
} }
} }
else else
{ {
// Double Byte Data. // Double Byte Data.
PendingCycles -= 10; TotalExecutedCycles += 10; return 10;
} }
} }
@ -101,10 +90,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Register[mem]++; Register[mem]++;
} }
public void Execute(int cycles) public void Execute()
{
PendingCycles += cycles;
while (PendingCycles > 0)
{ {
if (logging) if (logging)
{ {
@ -121,7 +107,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
} }
byte dest, src, mem; byte dest, src, mem;
ushort dest_value, src_value, mem_read, addr, addr_read, offset; ushort dest_value, src_value, mem_read, addr, addr_read, offset;
int decle2, decle3, result = 0, ones, carry, status_word, lower, sign, cond, ext; int cycles = 0, decle2, decle3, result = 0, ones, carry, status_word, lower, sign, cond, ext;
bool branch = false; bool branch = false;
bool prev_FlagD = FlagD; bool prev_FlagD = FlagD;
int opcode = ReadMemory(RegisterPC++) & 0x3FF; int opcode = ReadMemory(RegisterPC++) & 0x3FF;
@ -131,17 +117,17 @@ namespace BizHawk.Emulation.CPUs.CP1610
throw new ArgumentException(UNEXPECTED_HLT); throw new ArgumentException(UNEXPECTED_HLT);
case 0x001: // SDBD case 0x001: // SDBD
FlagD = true; FlagD = true;
PendingCycles -= 4; TotalExecutedCycles += 4; cycles = 4;
Interruptible = false; Interruptible = false;
break; break;
case 0x002: // EIS case 0x002: // EIS
FlagI = true; FlagI = true;
PendingCycles -= 4; TotalExecutedCycles += 4; cycles = 4;
Interruptible = false; Interruptible = false;
break; break;
case 0x003: // DIS case 0x003: // DIS
FlagI = false; FlagI = false;
PendingCycles -= 4; TotalExecutedCycles += 4; cycles = 4;
Interruptible = false; Interruptible = false;
break; break;
case 0x004: // J, JE, JD, JSR, JSRE, JSRD case 0x004: // J, JE, JD, JSR, JSRE, JSRD
@ -169,19 +155,19 @@ namespace BizHawk.Emulation.CPUs.CP1610
throw new ArgumentException(); throw new ArgumentException();
} }
RegisterPC = (ushort)addr; RegisterPC = (ushort)addr;
PendingCycles -= 12; TotalExecutedCycles += 12; cycles = 12;
Interruptible = true; Interruptible = true;
break; break;
case 0x005: // TCI case 0x005: // TCI
throw new ArgumentException(UNEXPECTED_TCI); throw new ArgumentException(UNEXPECTED_TCI);
case 0x006: // CLRC case 0x006: // CLRC
FlagC = false; FlagC = false;
PendingCycles -= 4; TotalExecutedCycles += 4; cycles = 4;
Interruptible = false; Interruptible = false;
break; break;
case 0x007: // SETC case 0x007: // SETC
FlagC = true; FlagC = true;
PendingCycles -= 4; TotalExecutedCycles += 4; cycles = 4;
Interruptible = false; Interruptible = false;
break; break;
// INCR // INCR
@ -199,7 +185,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// DECR // DECR
@ -216,7 +202,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// COMR // COMR
@ -234,7 +220,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// NEGR // NEGR
@ -257,7 +243,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagZ(result); Calc_FlagZ(result);
result &= 0xFFFF; result &= 0xFFFF;
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// ADCR // ADCR
@ -280,7 +266,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagZ(result); Calc_FlagZ(result);
result &= 0xFFFF; result &= 0xFFFF;
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// GSWD // GSWD
@ -293,13 +279,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
status_word = ((FlagS ? 1 : 0) << 3) | ((FlagZ ? 1 : 0) << 2) | ((FlagO ? 1 : 0) << 1) | status_word = ((FlagS ? 1 : 0) << 3) | ((FlagZ ? 1 : 0) << 2) | ((FlagO ? 1 : 0) << 1) |
(FlagC ? 1 : 0); (FlagC ? 1 : 0);
Register[dest] = (ushort)((status_word << 12) | (status_word << 4)); Register[dest] = (ushort)((status_word << 12) | (status_word << 4));
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// NOP // NOP
case 0x034: case 0x034:
case 0x035: case 0x035:
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// SIN // SIN
@ -322,7 +308,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
FlagO = ((src_value & 0x40) != 0) ? true : false; FlagO = ((src_value & 0x40) != 0) ? true : false;
FlagZ = ((src_value & 0x20) != 0) ? true : false; FlagZ = ((src_value & 0x20) != 0) ? true : false;
FlagS = ((src_value & 0x10) != 0) ? true : false; FlagS = ((src_value & 0x10) != 0) ? true : false;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// SWAP // SWAP
@ -341,13 +327,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
{ {
// Single swap. // Single swap.
result = (lower << 8) | ((dest_value >> 8) & 0xFF); result = (lower << 8) | ((dest_value >> 8) & 0xFF);
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
} }
else else
{ {
// Double swap. // Double swap.
result = (lower << 8) | lower; result = (lower << 8) | lower;
PendingCycles -= 8; TotalExecutedCycles += 8; cycles = 8;
} }
Calc_FlagS_7(result); Calc_FlagS_7(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -367,15 +353,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
dest = (byte)(opcode & 0x3); dest = (byte)(opcode & 0x3);
result = Register[dest] << 1; result = Register[dest] << 1;
if (((opcode >> 3) & 0x1) == 0) if (((opcode >> 3) & 0x1) == 0)
{
// Single shift. // Single shift.
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
}
else else
{ {
// Double shift. // Double shift.
result <<= 1; result <<= 1;
PendingCycles -= 8; TotalExecutedCycles += 8; cycles = 8;
} }
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -397,17 +381,15 @@ namespace BizHawk.Emulation.CPUs.CP1610
result = (dest_value << 1) | (FlagC ? 1 : 0); result = (dest_value << 1) | (FlagC ? 1 : 0);
FlagC = ((dest_value & 0x8000) != 0); FlagC = ((dest_value & 0x8000) != 0);
if (((opcode >> 3) & 0x1) == 0) if (((opcode >> 3) & 0x1) == 0)
{
// Single rotate. // Single rotate.
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
}
else else
{ {
// Double rotate. // Double rotate.
result <<= 1; result <<= 1;
result |= (FlagO ? 1 : 0); result |= (FlagO ? 1 : 0);
FlagO = ((dest_value & 0x4000) != 0); FlagO = ((dest_value & 0x4000) != 0);
PendingCycles -= 8; TotalExecutedCycles += 8; cycles = 8;
} }
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -429,16 +411,14 @@ namespace BizHawk.Emulation.CPUs.CP1610
result = dest_value << 1; result = dest_value << 1;
FlagC = ((dest_value & 0x8000) != 0); FlagC = ((dest_value & 0x8000) != 0);
if (((opcode >> 3) & 0x1) == 0) if (((opcode >> 3) & 0x1) == 0)
{
// Single shift. // Single shift.
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
}
else else
{ {
// Double shift. // Double shift.
result <<= 1; result <<= 1;
FlagO = ((dest_value & 0x4000) != 0); FlagO = ((dest_value & 0x4000) != 0);
PendingCycles -= 8; TotalExecutedCycles += 8; cycles = 8;
} }
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -458,15 +438,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
dest = (byte)(opcode & 0x3); dest = (byte)(opcode & 0x3);
result = Register[dest] >> 1; result = Register[dest] >> 1;
if (((opcode >> 3) & 0x1) == 0) if (((opcode >> 3) & 0x1) == 0)
{
// Single shift. // Single shift.
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
}
else else
{ {
// Double shift. // Double shift.
result >>= 1; result >>= 1;
PendingCycles -= 8; TotalExecutedCycles += 8; cycles = 8;
} }
Calc_FlagS_7(result); Calc_FlagS_7(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -488,16 +466,14 @@ namespace BizHawk.Emulation.CPUs.CP1610
sign = dest_value & 0x8000; sign = dest_value & 0x8000;
result = (dest_value >> 1) | sign; result = (dest_value >> 1) | sign;
if (((opcode >> 3) & 0x1) == 0) if (((opcode >> 3) & 0x1) == 0)
{
// Single shift. // Single shift.
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
}
else else
{ {
// Double shift. // Double shift.
result >>= 1; result >>= 1;
result |= sign; result |= sign;
PendingCycles -= 8; TotalExecutedCycles += 8; cycles = 8;
} }
Calc_FlagS_7(result); Calc_FlagS_7(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -519,17 +495,15 @@ namespace BizHawk.Emulation.CPUs.CP1610
result = (dest_value >> 1) | ((FlagC ? 1 : 0) << 15); result = (dest_value >> 1) | ((FlagC ? 1 : 0) << 15);
FlagC = ((dest_value & 0x1) != 0); FlagC = ((dest_value & 0x1) != 0);
if (((opcode >> 3) & 0x1) == 0) if (((opcode >> 3) & 0x1) == 0)
{
// Single rotate. // Single rotate.
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
}
else else
{ {
// Double rotate. // Double rotate.
result >>= 1; result >>= 1;
result |= (FlagO ? 1 : 0) << 15; result |= (FlagO ? 1 : 0) << 15;
FlagO = ((dest_value & 0x2) != 0); FlagO = ((dest_value & 0x2) != 0);
PendingCycles -= 8; TotalExecutedCycles += 8; cycles = 8;
} }
Calc_FlagS_7(result); Calc_FlagS_7(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -552,17 +526,15 @@ namespace BizHawk.Emulation.CPUs.CP1610
result = (dest_value >> 1) | sign; result = (dest_value >> 1) | sign;
FlagC = ((dest_value & 0x1) != 0); FlagC = ((dest_value & 0x1) != 0);
if (((opcode >> 3) & 0x1) == 0) if (((opcode >> 3) & 0x1) == 0)
{
// Single shift. // Single shift.
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
}
else else
{ {
// Double shift. // Double shift.
result >>= 1; result >>= 1;
result |= sign; result |= sign;
FlagO = ((dest_value & 0x2) != 0); FlagO = ((dest_value & 0x2) != 0);
PendingCycles -= 8; TotalExecutedCycles += 8; cycles = 8;
} }
Calc_FlagS_7(result); Calc_FlagS_7(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -641,13 +613,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagZ(result); Calc_FlagZ(result);
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
if (dest == 0x6 || dest == 0x7) if (dest == 0x6 || dest == 0x7)
{ cycles = 7;
PendingCycles -= 7; TotalExecutedCycles += 7;
}
else else
{ cycles = 6;
PendingCycles -= 6; TotalExecutedCycles += 6;
}
Interruptible = true; Interruptible = true;
break; break;
// ADDR // ADDR
@ -727,7 +695,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagZ(result); Calc_FlagZ(result);
result &= 0xFFFF; result &= 0xFFFF;
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// SUBR // SUBR
@ -807,7 +775,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagZ(result); Calc_FlagZ(result);
result &= 0xFFFF; result &= 0xFFFF;
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// CMPR // CMPR
@ -885,7 +853,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagO_Add(dest_value, -src_value); Calc_FlagO_Add(dest_value, -src_value);
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// ANDR // ANDR
@ -960,7 +928,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// XORR // XORR
@ -1034,7 +1002,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 6; TotalExecutedCycles += 6; cycles = 6;
Interruptible = true; Interruptible = true;
break; break;
// Branch Forward, no External Condition // Branch Forward, no External Condition
@ -1187,12 +1155,10 @@ namespace BizHawk.Emulation.CPUs.CP1610
if (((opcode >> 5) & 0x1) != 0) if (((opcode >> 5) & 0x1) != 0)
offset = (ushort)(-offset - 1); offset = (ushort)(-offset - 1);
RegisterPC += offset; RegisterPC += offset;
PendingCycles -= 9; TotalExecutedCycles += 9; cycles = 9;
} }
else else
{ cycles = 7;
PendingCycles -= 7; TotalExecutedCycles += 7;
}
Interruptible = true; Interruptible = true;
break; break;
// MVO // MVO
@ -1207,7 +1173,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
src = (byte)(opcode & 0x7); src = (byte)(opcode & 0x7);
addr = ReadMemory(RegisterPC++); addr = ReadMemory(RegisterPC++);
WriteMemory(addr, Register[src]); WriteMemory(addr, Register[src]);
PendingCycles -= 11; TotalExecutedCycles += 11; cycles = 11;
Interruptible = false; Interruptible = false;
break; break;
// MVO@ // MVO@
@ -1270,7 +1236,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
mem = (byte)((opcode >> 3) & 0x7); mem = (byte)((opcode >> 3) & 0x7);
src = (byte)(opcode & 0x7); src = (byte)(opcode & 0x7);
Indirect_Set(mem, src); Indirect_Set(mem, src);
PendingCycles -= 9; TotalExecutedCycles += 9; cycles = 9;
Interruptible = false; Interruptible = false;
break; break;
// MVI // MVI
@ -1286,7 +1252,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
dest = (byte)(opcode & 0x7); dest = (byte)(opcode & 0x7);
addr = ReadMemory(RegisterPC++); addr = ReadMemory(RegisterPC++);
Register[dest] = ReadMemory(addr); Register[dest] = ReadMemory(addr);
PendingCycles -= 10; TotalExecutedCycles += 10; cycles = 10;
Interruptible = true; Interruptible = true;
break; break;
// MVI@ // MVI@
@ -1349,7 +1315,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
mem = (byte)((opcode >> 3) & 0x7); mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7); dest = (byte)(opcode & 0x7);
Register[dest] = Indirect_Get(mem); Register[dest] = Indirect_Get(mem);
Indirect_Get_Cycles(mem); cycles = Indirect_Get_Cycles(mem);
Interruptible = true; Interruptible = true;
break; break;
// ADD // ADD
@ -1373,7 +1339,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagZ(result); Calc_FlagZ(result);
result &= 0xFFFF; result &= 0xFFFF;
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 10; TotalExecutedCycles += 10; cycles = 10;
Interruptible = true; Interruptible = true;
break; break;
// ADD@ // ADD@
@ -1436,7 +1402,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
mem = (byte)((opcode >> 3) & 0x7); mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7); dest = (byte)(opcode & 0x7);
mem_read = Indirect_Get(mem); mem_read = Indirect_Get(mem);
Indirect_Get_Cycles(mem); cycles = Indirect_Get_Cycles(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);
@ -1468,7 +1434,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagZ(result); Calc_FlagZ(result);
result &= 0xFFFF; result &= 0xFFFF;
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 10; TotalExecutedCycles += 10; cycles = 10;
Interruptible = true; Interruptible = true;
break; break;
// SUB@ // SUB@
@ -1532,7 +1498,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
mem = (byte)((opcode >> 3) & 0x7); mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7); dest = (byte)(opcode & 0x7);
mem_read = Indirect_Get(mem); mem_read = Indirect_Get(mem);
Indirect_Get_Cycles(mem); cycles = Indirect_Get_Cycles(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);
@ -1561,7 +1527,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagO_Add(dest_value, -addr_read); Calc_FlagO_Add(dest_value, -addr_read);
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
PendingCycles -= 10; TotalExecutedCycles += 10; cycles = 10;
Interruptible = true; Interruptible = true;
break; break;
// CMP@ // CMP@
@ -1625,7 +1591,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
mem = (byte)((opcode >> 3) & 0x7); mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7); dest = (byte)(opcode & 0x7);
mem_read = Indirect_Get(mem); mem_read = Indirect_Get(mem);
Indirect_Get_Cycles(mem); cycles = Indirect_Get_Cycles(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);
@ -1652,7 +1618,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 10; TotalExecutedCycles += 10; cycles = 10;
Interruptible = true; Interruptible = true;
break; break;
// AND@ // AND@
@ -1715,7 +1681,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
mem = (byte)((opcode >> 3) & 0x7); mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7); dest = (byte)(opcode & 0x7);
mem_read = Indirect_Get(mem); mem_read = Indirect_Get(mem);
Indirect_Get_Cycles(mem); cycles = Indirect_Get_Cycles(mem);
result = Register[dest] & mem_read; result = Register[dest] & mem_read;
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -1740,7 +1706,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
PendingCycles -= 10; TotalExecutedCycles += 10; cycles = 10;
Interruptible = true; Interruptible = true;
break; break;
// XOR@ // XOR@
@ -1804,7 +1770,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
mem = (byte)((opcode >> 3) & 0x7); mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7); dest = (byte)(opcode & 0x7);
mem_read = Indirect_Get(mem); mem_read = Indirect_Get(mem);
Indirect_Get_Cycles(mem); cycles = Indirect_Get_Cycles(mem);
result = Register[dest] ^ mem_read; result = Register[dest] ^ mem_read;
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -1814,8 +1780,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
} }
if (FlagD == prev_FlagD) if (FlagD == prev_FlagD)
FlagD = false; FlagD = false;
LogData(); PendingCycles -= cycles; TotalExecutedCycles += cycles;
}
} }
} }
} }

View File

@ -15,36 +15,11 @@ namespace BizHawk.Emulation.Consoles.Intellivision
STIC Stic; STIC Stic;
PSG Psg; PSG Psg;
private bool Sr1ToIntRM, Sr2ToBusRq, BusAkToSst; public void Connect()
private bool GetSr1ToIntRM()
{ {
return Sr1ToIntRM; Cpu.SetIntRM(Stic.GetSr1());
} Cpu.SetBusRq(Stic.GetSr2());
Stic.SetSst(Cpu.GetBusAk());
private bool GetSr2ToBusRq()
{
return Sr2ToBusRq;
}
private bool GetBusAkToSst()
{
return BusAkToSst;
}
private void SetSr1ToIntRM(bool value)
{
Sr1ToIntRM = value;
}
private void SetSr2ToBusRq(bool value)
{
Sr2ToBusRq = value;
}
private void SetBusAkToSst(bool value)
{
BusAkToSst = value;
} }
public void LoadExecutiveRom() public void LoadExecutiveRom()
@ -87,22 +62,15 @@ namespace BizHawk.Emulation.Consoles.Intellivision
Cpu = new CP1610(); Cpu = new CP1610();
Cpu.ReadMemory = ReadMemory; Cpu.ReadMemory = ReadMemory;
Cpu.WriteMemory = WriteMemory; Cpu.WriteMemory = WriteMemory;
Cpu.GetIntRM = GetSr1ToIntRM;
Cpu.GetBusRq = GetSr2ToBusRq;
Cpu.GetBusAk = GetBusAkToSst;
Cpu.SetBusAk = SetBusAkToSst;
Cpu.Reset(); Cpu.Reset();
Stic = new STIC(); Stic = new STIC();
Stic.GetSr1 = GetSr1ToIntRM;
Stic.GetSr2 = GetSr2ToBusRq;
Stic.GetSst = GetBusAkToSst;
Stic.SetSr1 = SetSr1ToIntRM;
Stic.SetSr2 = SetSr2ToBusRq;
Stic.Reset(); Stic.Reset();
Psg = new PSG(); Psg = new PSG();
Connect();
CoreOutputComm = new CoreOutputComm(); CoreOutputComm = new CoreOutputComm();
Cpu.LogData(); Cpu.LogData();
@ -110,7 +78,14 @@ namespace BizHawk.Emulation.Consoles.Intellivision
public void FrameAdvance(bool render) public void FrameAdvance(bool render)
{ {
Cpu.Execute(999); Cpu.AddPendingCycles(999);
while (Cpu.GetPendingCycles() > 0)
{
Cpu.Execute();
Stic.Execute();
Connect();
Cpu.LogData();
}
} }

View File

@ -7,25 +7,30 @@ namespace BizHawk.Emulation.Consoles.Intellivision
{ {
public sealed class STIC public sealed class STIC
{ {
private bool Fgbg = false; private bool Sr1, Sr2, Sst, Fgbg = false;
private ushort[] Register = new ushort[64]; private ushort[] Register = new ushort[64];
public Func<bool> GetSr1;
public Func<bool> GetSr2;
public Func<bool> GetSst;
public Action<bool> SetSr1;
public Action<bool> SetSr2;
private bool Sr1 { set { SetSr1(value); } }
private bool Sr2 { set { SetSr2(value); } }
private bool Sst { get { return GetSst(); } }
public void Reset() public void Reset()
{ {
Sr1 = true; Sr1 = true;
Sr2 = true; Sr2 = true;
} }
public bool GetSr1()
{
return Sr1;
}
public bool GetSr2()
{
return Sr2;
}
public void SetSst(bool value)
{
Sst = value;
}
public ushort? ReadSTIC(ushort addr) public ushort? ReadSTIC(ushort addr)
{ {
switch (addr & 0xF000) switch (addr & 0xF000)
@ -120,5 +125,10 @@ namespace BizHawk.Emulation.Consoles.Intellivision
} }
return false; return false;
} }
public void Execute()
{
Sr1 = false;
}
} }
} }