Intellivision Fix overflow flag bug

This commit is contained in:
alyosha-tas 2016-12-24 13:03:12 -05:00 committed by GitHub
parent f542a438ed
commit 68c3d2abb1
1 changed files with 14 additions and 10 deletions

View File

@ -56,7 +56,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
{ {
bool op1_neg = ((op1 & 0x8000) != 0); bool op1_neg = ((op1 & 0x8000) != 0);
bool op2_neg = ((op2 & 0x8000) != 0); bool op2_neg = ((op2 & 0x8000) != 0);
bool result_neg = ((op1 & 0x8000) != 0); bool result_neg = ((result & 0x8000) != 0);
FlagO = ( FlagO = (
(op1_neg && op2_neg && !result_neg) || (op1_neg && op2_neg && !result_neg) ||
(!op1_neg && !op2_neg && result_neg) (!op1_neg && !op2_neg && result_neg)
@ -189,7 +189,9 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
switch (opcode) switch (opcode)
{ {
case 0x000: // HLT case 0x000: // HLT
throw new ArgumentException(UNEXPECTED_HLT); //throw new ArgumentException(UNEXPECTED_HLT);
cycles = 4;
break;
case 0x001: // SDBD case 0x001: // SDBD
FlagD = true; FlagD = true;
cycles = 4; cycles = 4;
@ -308,6 +310,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
case 0x026: case 0x026:
case 0x027: case 0x027:
// ------------------------NEEDS TESTING--------------------------- // ------------------------NEEDS TESTING---------------------------
Console.WriteLine("here");
dest = (byte)(opcode & 0x7); dest = (byte)(opcode & 0x7);
dest_value = Register[dest]; dest_value = Register[dest];
var ones = (dest_value ^ 0xFFFF); var ones = (dest_value ^ 0xFFFF);
@ -856,7 +859,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
twos = (0xFFFF ^ src_value) + 1; twos = (0xFFFF ^ src_value) + 1;
result = dest_value + twos; result = dest_value + twos;
Calc_FlagC(result); Calc_FlagC(result);
Calc_FlagO_Add(dest_value, src_value, result); Calc_FlagO_Add(dest_value, twos, result);
result &= 0xFFFF; result &= 0xFFFF;
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -936,7 +939,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
twos = (0xFFFF ^ src_value) + 1; twos = (0xFFFF ^ src_value) + 1;
result = dest_value + twos; result = dest_value + twos;
Calc_FlagC(result); Calc_FlagC(result);
Calc_FlagO_Add(dest_value, src_value, result); Calc_FlagO_Add(dest_value, twos, result);
result &= 0xFFFF; result &= 0xFFFF;
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -1165,7 +1168,8 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
// BEXT // BEXT
if (ext != 0) if (ext != 0)
{ {
throw new ArgumentException(UNEXPECTED_BEXT); //throw new ArgumentException(UNEXPECTED_BEXT);
cycles = 4;
} }
else else
{ {
@ -1518,8 +1522,8 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
twos = (0xFFFF ^ addr_read) + 1; twos = (0xFFFF ^ addr_read) + 1;
result = dest_value + twos; result = dest_value + twos;
Calc_FlagC(result); Calc_FlagC(result);
Calc_FlagO_Add(dest_value, addr_read, result); Calc_FlagO_Add(dest_value, twos, result);
result &= 0xFFFF; result &= 0xFFFF;
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
Register[dest] = (ushort)result; Register[dest] = (ushort)result;
@ -1591,7 +1595,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
twos = (0xFFFF ^ mem_read) + 1; twos = (0xFFFF ^ mem_read) + 1;
result = dest_value + twos; result = dest_value + twos;
Calc_FlagC(result); Calc_FlagC(result);
Calc_FlagO_Add(dest_value, mem_read, result); Calc_FlagO_Add(dest_value, twos, result);
result &= 0xFFFF; result &= 0xFFFF;
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -1614,7 +1618,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
twos = (0xFFFF ^ addr_read) + 1; twos = (0xFFFF ^ addr_read) + 1;
result = dest_value + twos; result = dest_value + twos;
Calc_FlagC(result); Calc_FlagC(result);
Calc_FlagO_Add(dest_value, addr_read, result); Calc_FlagO_Add(dest_value, twos, result);
result &= 0xFFFF; result &= 0xFFFF;
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);
@ -1686,7 +1690,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610
twos = (0xFFFF ^ mem_read) + 1; twos = (0xFFFF ^ mem_read) + 1;
result = dest_value + twos; result = dest_value + twos;
Calc_FlagC(result); Calc_FlagC(result);
Calc_FlagO_Add(dest_value, mem_read, result); Calc_FlagO_Add(dest_value, twos, result);
result &= 0xFFFF; result &= 0xFFFF;
Calc_FlagS(result); Calc_FlagS(result);
Calc_FlagZ(result); Calc_FlagZ(result);