-Changed the amount of pending cycles to add when the STIC sets SR1.

--This number is fairly arbitrary, and I don't know why it works, but for now, it does.
--The values of INTRM don't match up exactly, but I think this is mostly a logging issue, though I still need to look into this.
-Fixed the Overflow Flag calculation.
--My original formula didn't compare the signs of the operands.
--It always needs to use the original operands, not the 2s complement one.
--As such, a result parameter has been added.
-Fixed the detection of a double swap, shift, and rotate in the related instructions. Ironically, I shifted one too many bits in my detection.
-Masked the result of left shifts and rotates to 0xFFFF so that the flags are calculated properly.
-Made RSWD (un)set the right flags.
-Enabled GSWD, MVI, SARC, CMP@, ADD, SUB@, INCR, RRC, SLR, SLL, RLC, ADDR, SUBR, SLLC, CMPR, and RSWD.
-COMR, NEGR, ADCR, SAR, ANDR, SUB, AND, XOR, and XOR@ remain disabled as I have yet to hit any test cases for them.

At this point, IntelliHawk is executing instructions indefinitely with what seems to be perfect results! I think I'm ready to hook up the screen.
This commit is contained in:
brandman211 2012-09-04 19:29:02 +00:00
parent 4903ad240c
commit 44e03b1923
3 changed files with 37 additions and 50 deletions

View File

@ -150,7 +150,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x047:
dest = (byte)(opcode & 0x3);
result = "SWAP R" + dest;
if (((opcode >> 3) & 0x1) != 0)
if (((opcode >> 2) & 0x1) != 0)
result += ", 1";
return result;
case 0x048:
@ -163,7 +163,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x04F:
dest = (byte)(opcode & 0x3);
result = "SLL R" + dest;
if (((opcode >> 3) & 0x1) != 0)
if (((opcode >> 2) & 0x1) != 0)
result += ", 1";
return result;
case 0x050:
@ -176,7 +176,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x057:
dest = (byte)(opcode & 0x3);
result = "RLC R" + dest;
if (((opcode >> 3) & 0x1) != 0)
if (((opcode >> 2) & 0x1) != 0)
result += ", 1";
return result;
case 0x058:
@ -189,7 +189,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x05F:
dest = (byte)(opcode & 0x3);
result = "SLLC R" + dest;
if (((opcode >> 3) & 0x1) != 0)
if (((opcode >> 2) & 0x1) != 0)
result += ", 1";
return result;
case 0x060:
@ -202,7 +202,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x067:
dest = (byte)(opcode & 0x3);
result = "SLR R" + dest;
if (((opcode >> 3) & 0x1) != 0)
if (((opcode >> 2) & 0x1) != 0)
result += ", 1";
return result;
case 0x068:
@ -215,7 +215,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x06F:
dest = (byte)(opcode & 0x3);
result = "SAR R" + dest;
if (((opcode >> 3) & 0x1) != 0)
if (((opcode >> 2) & 0x1) != 0)
result += ", 1";
return result;
case 0x070:
@ -228,7 +228,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x077:
dest = (byte)(opcode & 0x3);
result = "RRC R" + dest;
if (((opcode >> 3) & 0x1) != 0)
if (((opcode >> 2) & 0x1) != 0)
result += ", 1";
return result;
case 0x078:
@ -241,7 +241,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x07F:
dest = (byte)(opcode & 0x3);
result = "SARC R" + dest;
if (((opcode >> 3) & 0x1) != 0)
if (((opcode >> 2) & 0x1) != 0)
result += ", 1";
return result;
case 0x080:

View File

@ -22,9 +22,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
FlagC = ((result & 0x10000) != 0);
}
private void Calc_FlagO_Add(int op1, int op2)
private void Calc_FlagO_Add(int op1, int op2, int result)
{
FlagO = (((op1 ^ (op1 + op2)) & 0x8000) != 0);
FlagO = (((op1 ^ result) & (op1 ^ op2) & 0x8000) != 0);
}
private void Calc_FlagS(int result)
@ -193,7 +193,6 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x00D:
case 0x00E:
case 0x00F:
throw new NotImplementedException();
dest = (byte)(opcode & 0x7);
result = (Register[dest] + 1) & 0xFFFF;
Calc_FlagS(result);
@ -252,7 +251,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
ones = (dest_value ^ 0xFFFF);
result = ones + 1;
Calc_FlagC(result);
Calc_FlagO_Add(ones, 1);
Calc_FlagO_Add(ones, 1, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -275,7 +274,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
carry = FlagC ? 1 : 0;
result = dest_value + carry;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, carry);
Calc_FlagO_Add(dest_value, carry, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -288,7 +287,6 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x031:
case 0x032:
case 0x033:
throw new NotImplementedException();
dest = (byte)(opcode & 0x3);
status_word = ((FlagS ? 1 : 0) << 3) | ((FlagZ ? 1 : 0) << 2) | ((FlagO ? 1 : 0) << 1) |
(FlagC ? 1 : 0);
@ -315,13 +313,12 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x03D:
case 0x03E:
case 0x03F:
throw new NotImplementedException();
src = (byte)(opcode & 0x7);
src_value = Register[src];
FlagC = ((src_value & 0x80) != 0) ? true : false;
FlagO = ((src_value & 0x40) != 0) ? true : false;
FlagZ = ((src_value & 0x20) != 0) ? true : false;
FlagS = ((src_value & 0x10) != 0) ? true : false;
FlagS = ((src_value & 0x80) != 0);
FlagZ = ((src_value & 0x40) != 0);
FlagO = ((src_value & 0x20) != 0);
FlagC = ((src_value & 0x10) != 0);
cycles = 6;
Interruptible = true;
break;
@ -337,7 +334,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
dest = (byte)(opcode & 0x3);
dest_value = Register[dest];
lower = dest_value & 0xFF;
if (((opcode >> 3) & 0x1) == 0)
if (((opcode >> 2) & 0x1) == 0)
{
// Single swap.
result = (lower << 8) | ((dest_value >> 8) & 0xFF);
@ -363,10 +360,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x04D:
case 0x04E:
case 0x04F:
throw new NotImplementedException();
dest = (byte)(opcode & 0x3);
result = Register[dest] << 1;
if (((opcode >> 3) & 0x1) == 0)
if (((opcode >> 2) & 0x1) == 0)
// Single shift.
cycles = 6;
else
@ -375,6 +371,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
result <<= 1;
cycles = 8;
}
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
Register[dest] = (ushort)result;
@ -389,12 +386,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x055:
case 0x056:
case 0x057:
throw new NotImplementedException();
dest = (byte)(opcode & 0x3);
dest_value = Register[dest];
result = (dest_value << 1) | (FlagC ? 1 : 0);
FlagC = ((dest_value & 0x8000) != 0);
if (((opcode >> 3) & 0x1) == 0)
if (((opcode >> 2) & 0x1) == 0)
// Single rotate.
cycles = 6;
else
@ -405,6 +401,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
FlagO = ((dest_value & 0x4000) != 0);
cycles = 8;
}
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
Register[dest] = (ushort)result;
@ -419,12 +416,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x05D:
case 0x05E:
case 0x05F:
throw new NotImplementedException();
dest = (byte)(opcode & 0x3);
dest_value = Register[dest];
result = dest_value << 1;
FlagC = ((dest_value & 0x8000) != 0);
if (((opcode >> 3) & 0x1) == 0)
if (((opcode >> 2) & 0x1) == 0)
// Single shift.
cycles = 6;
else
@ -434,6 +430,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
FlagO = ((dest_value & 0x4000) != 0);
cycles = 8;
}
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
Register[dest] = (ushort)result;
@ -448,10 +445,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x065:
case 0x066:
case 0x067:
throw new NotImplementedException();
dest = (byte)(opcode & 0x3);
result = Register[dest] >> 1;
if (((opcode >> 3) & 0x1) == 0)
if (((opcode >> 2) & 0x1) == 0)
// Single shift.
cycles = 6;
else
@ -479,7 +475,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
dest_value = Register[dest];
sign = dest_value & 0x8000;
result = (dest_value >> 1) | sign;
if (((opcode >> 3) & 0x1) == 0)
if (((opcode >> 2) & 0x1) == 0)
// Single shift.
cycles = 6;
else
@ -503,12 +499,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x075:
case 0x076:
case 0x077:
throw new NotImplementedException();
dest = (byte)(opcode & 0x3);
dest_value = Register[dest];
result = (dest_value >> 1) | ((FlagC ? 1 : 0) << 15);
FlagC = ((dest_value & 0x1) != 0);
if (((opcode >> 3) & 0x1) == 0)
if (((opcode >> 2) & 0x1) == 0)
// Single rotate.
cycles = 6;
else
@ -533,13 +528,12 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x07D:
case 0x07E:
case 0x07F:
throw new NotImplementedException();
dest = (byte)(opcode & 0x3);
dest_value = Register[dest];
sign = dest_value & 0x8000;
result = (dest_value >> 1) | sign;
FlagC = ((dest_value & 0x1) != 0);
if (((opcode >> 3) & 0x1) == 0)
if (((opcode >> 2) & 0x1) == 0)
// Single shift.
cycles = 6;
else
@ -697,14 +691,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x0FD:
case 0x0FE:
case 0x0FF:
throw new NotImplementedException();
src = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
src_value = Register[src];
dest_value = Register[dest];
result = dest_value + src_value;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, src_value);
Calc_FlagO_Add(dest_value, src_value, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -777,7 +770,6 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x13D:
case 0x13E:
case 0x13F:
throw new NotImplementedException();
src = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
src_value = Register[src];
@ -785,7 +777,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
twos = (0xFFFF ^ src_value) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, twos);
Calc_FlagO_Add(dest_value, src_value, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -858,7 +850,6 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x17D:
case 0x17E:
case 0x17F:
throw new NotImplementedException();
src = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
src_value = Register[src];
@ -866,7 +857,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
twos = (0xFFFF ^ src_value) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, twos);
Calc_FlagO_Add(dest_value, src_value, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -1265,7 +1256,6 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x285:
case 0x286:
case 0x287:
throw new NotImplementedException();
dest = (byte)(opcode & 0x7);
addr = ReadMemory(RegisterPC++);
Register[dest] = ReadMemory(addr);
@ -1344,14 +1334,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x2C5:
case 0x2C6:
case 0x2C7:
throw new NotImplementedException();
dest = (byte)(opcode & 0x7);
addr = ReadMemory(RegisterPC++);
dest_value = Register[dest];
addr_read = ReadMemory(addr);
result = dest_value + addr_read;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, addr_read);
Calc_FlagO_Add(dest_value, addr_read, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -1423,7 +1412,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
dest_value = Register[dest];
result = dest_value + mem_read;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, mem_read);
Calc_FlagO_Add(dest_value, mem_read, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -1447,7 +1436,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
twos = (0xFFFF ^ addr_read) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, twos);
Calc_FlagO_Add(dest_value, addr_read, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -1512,7 +1501,6 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x33D:
case 0x33E:
case 0x33F:
throw new NotImplementedException();
mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
mem_read = Indirect_Get(mem);
@ -1521,7 +1509,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
twos = (0xFFFF ^ mem_read) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, twos);
Calc_FlagO_Add(dest_value, mem_read, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -1544,7 +1532,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
twos = (0xFFFF ^ addr_read) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, twos);
Calc_FlagO_Add(dest_value, addr_read, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
@ -1608,7 +1596,6 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x37D:
case 0x37E:
case 0x37F:
throw new NotImplementedException();
mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
mem_read = Indirect_Get(mem);
@ -1617,7 +1604,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
twos = (0xFFFF ^ mem_read) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, twos);
Calc_FlagO_Add(dest_value, mem_read, result);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);

View File

@ -145,7 +145,7 @@ namespace BizHawk.Emulation.Consoles.Intellivision
{
Sr1 = !Sr1;
if (Sr1)
AddPendingCycles(14394);
AddPendingCycles(14394 - 3791 + 530);
else
AddPendingCycles(3791);
}