-Flushed log after interrupt.

-Replaced subtraction with adding the 2s complement in instructions. That way, the Overflow Flag is calculated properly.
-Made it so that the masking of a result to 0xFFFF comes after calculating the Carry and Overflow Flags but before the Sign and Zero Flags.
-The CMPX instructions now use the aforementioned masking to properly calculate the Sign and Zero Flags even though the result doesn't actually get stored.

Thanks to this commit, IntelliHawk executes 1711 instructions properly. Next, it's supposed to take an Interrupt, which is bizarre because INTRM appears to be true at that point. This doesn't seem possible unless I am once again logging at the wrong time, hiding that the INTRM gets set to false before immediately switching back to true after taking the interrupt. Will look into this later.
This commit is contained in:
brandman211 2012-09-04 07:28:36 +00:00
parent d02f925e13
commit e51b79e2fa
1 changed files with 31 additions and 21 deletions

View File

@ -103,6 +103,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
log.WriteLine("------");
log.WriteLine();
log.WriteLine("Interrupt");
log.Flush();
}
Interrupted = true;
Interruptible = false;
@ -120,7 +121,7 @@ namespace BizHawk.Emulation.CPUs.CP1610
}
byte dest, src, mem;
ushort dest_value, src_value, mem_read, addr, addr_read, offset;
int cycles = 0, decle2, decle3, result = 0, ones, carry, status_word, lower, sign, cond, ext;
int cycles = 0, decle2, decle3, result = 0, ones, twos, carry, status_word, lower, sign, cond, ext;
bool branch = false;
bool FlagD_prev = FlagD;
int opcode = ReadMemory(RegisterPC++) & 0x3FF;
@ -252,9 +253,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
result = ones + 1;
Calc_FlagC(result);
Calc_FlagO_Add(ones, 1);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
Register[dest] = (ushort)result;
cycles = 6;
Interruptible = true;
@ -275,9 +276,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
result = dest_value + carry;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, carry);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
Register[dest] = (ushort)result;
cycles = 6;
Interruptible = true;
@ -704,9 +705,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
result = dest_value + src_value;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, src_value);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
Register[dest] = (ushort)result;
cycles = 6;
Interruptible = true;
@ -781,12 +782,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
dest = (byte)(opcode & 0x7);
src_value = Register[src];
dest_value = Register[dest];
result = Register[dest] - Register[src];
twos = (0xFFFF ^ src_value) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, -src_value);
Calc_FlagO_Add(dest_value, twos);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
Register[dest] = (ushort)result;
cycles = 6;
Interruptible = true;
@ -861,9 +863,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
dest = (byte)(opcode & 0x7);
src_value = Register[src];
dest_value = Register[dest];
result = dest_value - src_value;
twos = (0xFFFF ^ src_value) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, -src_value);
Calc_FlagO_Add(dest_value, twos);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
cycles = 6;
@ -1348,9 +1352,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
result = dest_value + addr_read;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, addr_read);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
Register[dest] = (ushort)result;
cycles = 10;
Interruptible = true;
@ -1420,9 +1424,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
result = dest_value + mem_read;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, mem_read);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
Register[dest] = (ushort)result;
Interruptible = true;
break;
@ -1440,12 +1444,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
addr = ReadMemory(RegisterPC++);
dest_value = Register[dest];
addr_read = ReadMemory(addr);
result = dest_value - addr_read;
twos = (0xFFFF ^ addr_read) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, -addr_read);
Calc_FlagO_Add(dest_value, twos);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
Register[dest] = (ushort)result;
cycles = 10;
Interruptible = true;
@ -1513,12 +1518,13 @@ namespace BizHawk.Emulation.CPUs.CP1610
mem_read = Indirect_Get(mem);
cycles = Indirect_Get_Cycles(mem);
dest_value = Register[dest];
result = dest_value - mem_read;
twos = (0xFFFF ^ mem_read) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, -mem_read);
Calc_FlagO_Add(dest_value, twos);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
Register[dest] = (ushort)result;
Interruptible = true;
break;
@ -1535,9 +1541,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
addr = ReadMemory(RegisterPC++);
dest_value = Register[dest];
addr_read = ReadMemory(addr);
result = dest_value - addr_read;
twos = (0xFFFF ^ addr_read) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, -addr_read);
Calc_FlagO_Add(dest_value, twos);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
cycles = 10;
@ -1606,9 +1614,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
mem_read = Indirect_Get(mem);
cycles = Indirect_Get_Cycles(mem);
dest_value = Register[dest];
result = dest_value - mem_read;
twos = (0xFFFF ^ mem_read) + 1;
result = dest_value + twos;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, -mem_read);
Calc_FlagO_Add(dest_value, twos);
result &= 0xFFFF;
Calc_FlagS(result);
Calc_FlagZ(result);
Interruptible = true;