-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:
parent
4903ad240c
commit
44e03b1923
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -145,7 +145,7 @@ namespace BizHawk.Emulation.Consoles.Intellivision
|
|||
{
|
||||
Sr1 = !Sr1;
|
||||
if (Sr1)
|
||||
AddPendingCycles(14394);
|
||||
AddPendingCycles(14394 - 3791 + 530);
|
||||
else
|
||||
AddPendingCycles(3791);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue