Fix opcode timing issues reported in #292

This commit is contained in:
tomcw
2015-05-26 21:58:48 +01:00
parent 614dfc1257
commit 9f32050c60
4 changed files with 190 additions and 137 deletions
+119 -68
View File
@@ -312,259 +312,259 @@ const BYTE g_OpcodeTimings[256][4] =
{7,7,7,7}, // 00
{6,6,6,6}, // 01
{2,2,2,2}, // 02
{8,8,2,2}, // 03
{8,8,1,1}, // 03
{3,3,5,5}, // 04
{3,3,3,3}, // 05
{5,5,5,5}, // 06
{5,5,2,2}, // 07
{5,5,1,1}, // 07
{3,3,3,3}, // 08
{2,2,2,2}, // 09
{2,2,2,2}, // 0A
{2,2,2,2}, // 0B
{2,2,1,1}, // 0B
{4,5,6,6}, // 0C
{4,4,4,4}, // 0D
{6,6,6,6}, // 0E
{6,6,2,2}, // 0F
{6,6,1,1}, // 0F
{3,3,3,3}, // 10
{5,6,5,6}, // 11
{2,2,5,5}, // 12
{8,8,2,2}, // 13
{8,8,1,1}, // 13
{4,4,5,5}, // 14
{4,4,4,4}, // 15
{6,6,6,6}, // 16
{6,6,2,2}, // 17
{6,6,1,1}, // 17
{2,2,2,2}, // 18
{4,5,4,5}, // 19
{2,2,2,2}, // 1A
{7,7,2,2}, // 1B
{7,7,1,1}, // 1B
{4,5,6,6}, // 1C
{4,5,4,5}, // 1D
{7,7,6,7}, // 1E
{7,7,2,2}, // 1F
{7,7,1,1}, // 1F
{6,6,6,6}, // 20
{6,6,6,6}, // 21
{2,2,2,2}, // 22
{8,8,2,2}, // 23
{8,8,1,1}, // 23
{3,3,3,3}, // 24
{3,3,3,3}, // 25
{5,5,5,5}, // 26
{5,5,2,2}, // 27
{5,5,1,1}, // 27
{4,4,4,4}, // 28
{2,2,2,2}, // 29
{2,2,2,2}, // 2A
{2,2,2,2}, // 2B
{2,2,1,1}, // 2B
{4,4,4,4}, // 2C
{2,2,2,2}, // 2D
{4,4,4,4}, // 2D
{6,6,6,6}, // 2E
{6,6,2,2}, // 2F
{6,6,1,1}, // 2F
{2,2,2,2}, // 30
{5,6,5,6}, // 31
{2,2,5,5}, // 32
{8,8,2,2}, // 33
{8,8,1,1}, // 33
{4,4,4,4}, // 34
{4,4,4,4}, // 35
{6,6,6,6}, // 36
{6,6,2,2}, // 37
{6,6,1,1}, // 37
{2,2,2,2}, // 38
{4,5,4,5}, // 39
{2,2,2,2}, // 3A
{7,7,2,2}, // 3B
{7,7,1,1}, // 3B
{4,5,4,5}, // 3C
{4,5,4,5}, // 3D
{6,6,6,7}, // 3E
{7,7,2,2}, // 3F
{7,7,1,1}, // 3F
{6,6,6,6}, // 40
{6,6,6,6}, // 41
{2,2,2,2}, // 42
{8,8,2,2}, // 43
{8,8,1,1}, // 43
{3,3,3,3}, // 44
{3,3,3,3}, // 45
{5,5,5,5}, // 46
{5,5,2,2}, // 47
{5,5,1,1}, // 47
{3,3,3,3}, // 48
{2,2,2,2}, // 49
{2,2,2,2}, // 4A
{2,2,2,2}, // 4B
{2,2,1,1}, // 4B
{3,3,3,3}, // 4C
{4,4,4,4}, // 4D
{6,6,6,6}, // 4E
{6,6,2,2}, // 4F
{6,6,1,1}, // 4F
{3,3,3,3}, // 50
{5,6,5,6}, // 51
{2,2,5,5}, // 52
{8,8,2,2}, // 53
{8,8,1,1}, // 53
{4,4,4,4}, // 54
{4,4,4,4}, // 55
{6,6,6,6}, // 56
{6,6,2,2}, // 57
{6,6,1,1}, // 57
{2,2,2,2}, // 58
{4,5,4,5}, // 59
{2,2,3,3}, // 5A
{7,7,2,2}, // 5B
{4,5,8,9}, // 5C
{7,7,1,1}, // 5B
{4,5,8,8}, // 5C
{4,5,4,5}, // 5D
{6,6,6,7}, // 5E
{7,7,2,2}, // 5F
{7,7,1,1}, // 5F
{6,6,6,6}, // 60
{6,6,6,6}, // 61
{2,2,2,2}, // 62
{8,8,2,2}, // 63
{8,8,1,1}, // 63
{3,3,3,3}, // 64
{3,3,3,3}, // 65
{5,5,5,5}, // 66
{5,5,2,2}, // 67
{5,5,1,1}, // 67
{4,4,4,4}, // 68
{2,2,2,2}, // 69
{2,2,2,2}, // 6A
{2,2,2,2}, // 6B
{2,2,1,1}, // 6B
{5,5,7,7}, // 6C
{4,4,4,4}, // 6D
{6,6,6,6}, // 6E
{6,6,2,2}, // 6F
{6,6,1,1}, // 6F
{2,2,2,2}, // 70
{5,6,5,6}, // 71
{2,2,5,5}, // 72
{8,8,2,2}, // 73
{8,8,1,1}, // 73
{4,4,4,4}, // 74
{4,4,4,4}, // 75
{6,6,6,6}, // 76
{6,6,2,2}, // 77
{6,6,1,1}, // 77
{2,2,2,2}, // 78
{4,5,4,5}, // 79
{2,2,4,4}, // 7A
{7,7,2,2}, // 7B
{7,7,1,1}, // 7B
{4,5,6,6}, // 7C
{4,5,4,5}, // 7D
{6,6,6,7}, // 7E
{7,7,2,2}, // 7F
{7,7,1,1}, // 7F
{2,2,3,3}, // 80
{6,6,6,6}, // 81
{2,2,2,2}, // 82
{6,6,2,2}, // 83
{6,6,1,1}, // 83
{3,3,3,3}, // 84
{3,3,3,3}, // 85
{3,3,3,3}, // 86
{3,3,2,2}, // 87
{3,3,1,1}, // 87
{2,2,2,2}, // 88
{2,2,2,2}, // 89
{2,2,2,2}, // 8A
{2,2,2,2}, // 8B
{2,2,1,1}, // 8B
{4,4,4,4}, // 8C
{4,4,4,4}, // 8D
{4,4,4,4}, // 8E
{4,4,2,2}, // 8F
{4,4,1,1}, // 8F
{3,3,3,3}, // 90
{6,6,6,6}, // 91
{2,2,5,5}, // 92
{6,6,2,2}, // 93
{6,6,1,1}, // 93
{4,4,4,4}, // 94
{4,4,4,4}, // 95
{4,4,4,4}, // 96
{4,4,2,2}, // 97
{4,4,1,1}, // 97
{2,2,2,2}, // 98
{5,5,5,5}, // 99
{2,2,2,2}, // 9A
{5,5,2,2}, // 9B
{5,5,1,1}, // 9B
{5,5,4,4}, // 9C
{5,5,5,5}, // 9D
{5,5,5,5}, // 9E
{5,5,2,2}, // 9F
{5,5,1,1}, // 9F
{2,2,2,2}, // A0
{6,6,6,6}, // A1
{2,2,2,2}, // A2
{6,6,2,2}, // A3
{6,6,1,1}, // A3
{3,3,3,3}, // A4
{3,3,3,3}, // A5
{3,3,3,3}, // A6
{3,3,2,2}, // A7
{3,3,1,1}, // A7
{2,2,2,2}, // A8
{2,2,2,2}, // A9
{2,2,2,2}, // AA
{2,2,2,2}, // AB
{2,2,1,1}, // AB
{4,4,4,4}, // AC
{4,4,4,4}, // AD
{4,4,4,4}, // AE
{4,4,2,2}, // AF
{4,4,1,1}, // AF
{2,2,2,2}, // B0
{5,6,5,6}, // B1
{2,2,5,5}, // B2
{5,6,2,2}, // B3
{5,6,1,1}, // B3
{4,4,4,4}, // B4
{4,4,4,4}, // B5
{4,4,4,4}, // B6
{4,4,2,2}, // B7
{4,4,1,1}, // B7
{2,2,2,2}, // B8
{4,5,4,5}, // B9
{2,2,2,2}, // BA
{4,5,2,2}, // BB
{4,5,1,1}, // BB
{4,5,4,5}, // BC
{4,5,4,5}, // BD
{4,5,4,5}, // BE
{4,5,2,2}, // BF
{4,5,1,1}, // BF
{2,2,2,2}, // C0
{6,6,6,6}, // C1
{2,2,2,2}, // C2
{8,8,2,2}, // C3
{8,8,1,1}, // C3
{3,3,3,3}, // C4
{3,3,3,3}, // C5
{5,5,5,5}, // C6
{5,5,2,2}, // C7
{5,5,1,1}, // C7
{2,2,2,2}, // C8
{2,2,2,2}, // C9
{2,2,2,2}, // CA
{2,2,2,2}, // CB
{2,2,1,1}, // CB
{4,4,4,4}, // CC
{4,4,4,4}, // CD
{6,6,6,6}, // CE
{6,6,2,2}, // CF
{6,6,1,1}, // CF
{3,3,3,3}, // D0
{5,6,5,6}, // D1
{2,2,5,5}, // D2
{8,8,2,2}, // D3
{8,8,1,1}, // D3
{4,4,4,4}, // D4
{4,4,4,4}, // D5
{6,6,6,6}, // D6
{6,6,2,2}, // D7
{6,6,1,1}, // D7
{2,2,2,2}, // D8
{4,5,4,5}, // D9
{2,2,3,3}, // DA
{7,7,2,2}, // DB
{4,5,4,5}, // DC
{7,7,1,1}, // DB
{4,5,4,4}, // DC
{4,5,4,5}, // DD
{7,7,7,7}, // DE
{7,7,2,2}, // DF
{7,7,1,1}, // DF
{2,2,2,2}, // E0
{6,6,6,6}, // E1
{2,2,2,2}, // E2
{8,8,2,2}, // E3
{8,8,1,1}, // E3
{3,3,3,3}, // E4
{3,3,3,3}, // E5
{5,5,5,5}, // E6
{5,5,2,2}, // E7
{5,5,1,1}, // E7
{2,2,2,2}, // E8
{2,2,2,2}, // E9
{2,2,2,2}, // EA
{2,2,2,2}, // EB
{2,2,1,1}, // EB
{4,4,4,4}, // EC
{4,4,4,4}, // ED
{6,6,6,6}, // EE
{6,6,2,2}, // EF
{6,6,1,1}, // EF
{2,2,2,2}, // F0
{5,6,5,6}, // F1
{2,2,5,5}, // F2
{8,8,2,2}, // F3
{8,8,1,1}, // F3
{4,4,4,4}, // F4
{4,4,4,4}, // F5
{6,6,6,6}, // F6
{6,6,2,2}, // F7
{6,6,1,1}, // F7
{2,2,2,2}, // F8
{4,5,4,5}, // F9
{2,2,4,4}, // FA
{7,7,2,2}, // FB
{4,5,4,5}, // FC
{7,7,1,1}, // FB
{4,5,4,4}, // FC
{4,5,4,5}, // FD
{7,7,7,7}, // FE
{7,7,2,2}, // FF
{7,7,1,1}, // FF
};
int GH278_Bcc_Sub(BYTE op, BYTE ps_not_taken, BYTE ps_taken, WORD pc)
@@ -1043,6 +1043,54 @@ int GH282_test(void)
//-------------------------------------
int g_fn_C000_count = 0;
BYTE __stdcall fn_C000(WORD, WORD, BYTE, BYTE, ULONG)
{
g_fn_C000_count++;
return 42;
}
int GH292_test(void)
{
// Undocumented 65C02 NOPs: 1 cycle & 1 byte
for (UINT op=0; op<256; op+=0x10)
{
reset();
WORD base=regs.pc;
mem[regs.pc] = op+0x03; if (Cpu65C02(0) != 1 || regs.pc != base+1) return 1;
mem[regs.pc] = op+0x07; if (Cpu65C02(0) != 1 || regs.pc != base+2) return 1;
mem[regs.pc] = op+0x0B; if (Cpu65C02(0) != 1 || regs.pc != base+3) return 1;
mem[regs.pc] = op+0x0F; if (Cpu65C02(0) != 1 || regs.pc != base+4) return 1;
}
//
// Undocumented 65C02 NOP: LDD - LoaD and Discard
IORead[0] = fn_C000;
reset();
WORD base = regs.pc;
mem[regs.pc+0] = 0xDC;
mem[regs.pc+1] = 0x00;
mem[regs.pc+2] = 0xC0;
if (Cpu65C02(0) != 4 || regs.pc != base+3 || g_fn_C000_count != 1 || regs.a != 0) return 1;
reset();
base = regs.pc;
mem[regs.pc+0] = 0xFC;
mem[regs.pc+1] = 0x00;
mem[regs.pc+2] = 0xC0;
if (Cpu65C02(0) != 4 || regs.pc != base+3 || g_fn_C000_count != 2 || regs.a != 0) return 1;
IORead[0] = NULL;
return 0;
}
//-------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
int res = 1;
@@ -1061,5 +1109,8 @@ int _tmain(int argc, _TCHAR* argv[])
res = GH282_test();
if (res) return res;
res = GH292_test();
if (res) return res;
return 0;
}