-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:
parent
d02f925e13
commit
e51b79e2fa
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue