diff --git a/BizHawk.Emulation/CPUs/CP1610/Disassembler.cs b/BizHawk.Emulation/CPUs/CP1610/Disassembler.cs index 4e54938a7d..b9a7dc8eff 100644 --- a/BizHawk.Emulation/CPUs/CP1610/Disassembler.cs +++ b/BizHawk.Emulation/CPUs/CP1610/Disassembler.cs @@ -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: diff --git a/BizHawk.Emulation/CPUs/CP1610/Execute.cs b/BizHawk.Emulation/CPUs/CP1610/Execute.cs index 88c204b17d..73c5d3f90d 100644 --- a/BizHawk.Emulation/CPUs/CP1610/Execute.cs +++ b/BizHawk.Emulation/CPUs/CP1610/Execute.cs @@ -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); diff --git a/BizHawk.Emulation/Consoles/Intellivision/STIC.cs b/BizHawk.Emulation/Consoles/Intellivision/STIC.cs index 4df07ef1aa..bc5d368c15 100644 --- a/BizHawk.Emulation/Consoles/Intellivision/STIC.cs +++ b/BizHawk.Emulation/Consoles/Intellivision/STIC.cs @@ -145,7 +145,7 @@ namespace BizHawk.Emulation.Consoles.Intellivision { Sr1 = !Sr1; if (Sr1) - AddPendingCycles(14394); + AddPendingCycles(14394 - 3791 + 530); else AddPendingCycles(3791); }