From e51b79e2fab0962be0fde2d9ab01798cb2914488 Mon Sep 17 00:00:00 2001 From: brandman211 Date: Tue, 4 Sep 2012 07:28:36 +0000 Subject: [PATCH] -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. --- BizHawk.Emulation/CPUs/CP1610/Execute.cs | 52 ++++++++++++++---------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/BizHawk.Emulation/CPUs/CP1610/Execute.cs b/BizHawk.Emulation/CPUs/CP1610/Execute.cs index ff818502dd..88c204b17d 100644 --- a/BizHawk.Emulation/CPUs/CP1610/Execute.cs +++ b/BizHawk.Emulation/CPUs/CP1610/Execute.cs @@ -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;