1 /*****************************************************************************
2  *
3  *	 tbl6509.c
4  *	 6509 opcode functions and function pointer table
5  *
6  *	 Copyright (c) 2000 Peter Trauner, all rights reserved.
7  *
8  *	 - This source code is released as freeware for non-commercial purposes.
9  *	 - You are free to use and redistribute this code in modified or
10  *	   unmodified form, provided you list me in the credits.
11  *	 - If you modify this source code, you must add a notice to each modified
12  *	   source file that it has been changed.  If you're a nice person, you
13  *	   will clearly mark each change too.  :)
14  *	 - If you wish to use this for commercial purposes, please contact me at
15  *	   pullmoll@t-online.de
16  *	 - The author of this copywritten work reserves the right to change the
17  *	   terms of its usage and license at any time, including retroactively
18  *	 - This entire notice must remain in the source code.
19  *
20  *	 - Opcode information based on an Intel 386 '6510.asm' core
21  *	   written by R.F. van Ee (1993)
22  *	 - Cycle counts are guesswork :-)
23  *
24  *****************************************************************************/
25 
26 #undef	OP
27 #define OP(nn) static INLINE void m6509_##nn(void)
28 
29 OP(00) {		  m6509_ICount -= 7;		 BRK;		  } /* 7 BRK */
30 OP(20) {		  m6509_ICount -= 6;		 JSR;		  } /* 6 JSR */
31 OP(40) {		  m6509_ICount -= 6;		 RTI;		  } /* 6 RTI */
32 OP(60) {		  m6509_ICount -= 6;		 RTS;		  } /* 6 RTS */
33 OP(80) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
OP(a0)34 OP(a0) { int tmp; m6509_ICount -= 2; RD_IMM; LDY;		  } /* 2 LDY IMM */
OP(c0)35 OP(c0) { int tmp; m6509_ICount -= 2; RD_IMM; CPY;		  } /* 2 CPY IMM */
OP(e0)36 OP(e0) { int tmp; m6509_ICount -= 2; RD_IMM; CPX;		  } /* 2 CPX IMM */
37 
38 OP(10) { int tmp;							 BPL;		  } /* 2 BPL REL */
39 OP(30) { int tmp;							 BMI;		  } /* 2 BMI REL */
40 OP(50) { int tmp;							 BVC;		  } /* 2 BVC REL */
41 OP(70) { int tmp;							 BVS;		  } /* 2 BVS REL */
42 OP(90) { int tmp;							 BCC;		  } /* 2 BCC REL */
OP(b0)43 OP(b0) { int tmp;							 BCS;		  } /* 2 BCS REL */
OP(d0)44 OP(d0) { int tmp;							 BNE;		  } /* 2 BNE REL */
OP(f0)45 OP(f0) { int tmp;							 BEQ;		  } /* 2 BEQ REL */
46 
47 OP(01) { int tmp; m6509_ICount -= 6; RD_IDX; ORA;		  } /* 6 ORA IDX */
48 OP(21) { int tmp; m6509_ICount -= 6; RD_IDX; AND;		  } /* 6 AND IDX */
49 OP(41) { int tmp; m6509_ICount -= 6; RD_IDX; EOR;		  } /* 6 EOR IDX */
50 OP(61) { int tmp; m6509_ICount -= 6; RD_IDX; ADC;		  } /* 6 ADC IDX */
51 OP(81) { int tmp; m6509_ICount -= 6;		 STA; WR_IDX; } /* 6 STA IDX */
OP(a1)52 OP(a1) { int tmp; m6509_ICount -= 6; RD_IDX; LDA;		  } /* 6 LDA IDX */
OP(c1)53 OP(c1) { int tmp; m6509_ICount -= 6; RD_IDX; CMP;		  } /* 6 CMP IDX */
OP(e1)54 OP(e1) { int tmp; m6509_ICount -= 6; RD_IDX; SBC;		  } /* 6 SBC IDX */
55 
56 OP(11) { int tmp; m6509_ICount -= 5; RD_IDY; ORA;		  } /* 5 ORA IDY */
57 OP(31) { int tmp; m6509_ICount -= 5; RD_IDY; AND;		  } /* 5 AND IDY */
58 OP(51) { int tmp; m6509_ICount -= 5; RD_IDY; EOR;		  } /* 5 EOR IDY */
59 OP(71) { int tmp; m6509_ICount -= 5; RD_IDY; ADC;		  } /* 5 ADC IDY */
60 OP(91) { int tmp; m6509_ICount -= 6;		 STA; WR_IDY_6509; } /* 6 STA IDY */
OP(b1)61 OP(b1) { int tmp; m6509_ICount -= 5; RD_IDY_6509; LDA;	  } /* 5 LDA IDY */
OP(d1)62 OP(d1) { int tmp; m6509_ICount -= 5; RD_IDY; CMP;		  } /* 5 CMP IDY */
OP(f1)63 OP(f1) { int tmp; m6509_ICount -= 5; RD_IDY; SBC;		  } /* 5 SBC IDY */
64 
65 OP(02) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
66 OP(22) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
67 OP(42) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
68 OP(62) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
69 OP(82) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
OP(a2)70 OP(a2) { int tmp; m6509_ICount -= 2; RD_IMM; LDX;		  } /* 2 LDX IMM */
OP(c2)71 OP(c2) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
OP(e2)72 OP(e2) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
73 
74 OP(12) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
75 OP(32) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
76 OP(52) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
77 OP(72) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
78 OP(92) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
OP(b2)79 OP(b2) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
OP(d2)80 OP(d2) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
OP(f2)81 OP(f2) {		  m6502_ICount -= 2;		 KIL;		  } /* 2 KIL */
82 
83 OP(03) { int tmp; m6502_ICount -= 7; RD_IDX; SLO; WB_EA;  } /* 7 SLO IDX */
84 OP(23) { int tmp; m6502_ICount -= 7; RD_IDX; RLA; WB_EA;  } /* 7 RLA IDX */
85 OP(43) { int tmp; m6502_ICount -= 7; RD_IDX; SRE; WB_EA;  } /* 7 SRE IDX */
86 OP(63) { int tmp; m6502_ICount -= 7; RD_IDX; RRA; WB_EA;  } /* 7 RRA IDX */
87 OP(83) { int tmp; m6502_ICount -= 6;		 SAX; WR_IDX; } /* 6 SAX IDX */
OP(a3)88 OP(a3) { int tmp; m6502_ICount -= 6; RD_IDX; LAX;		  } /* 6 LAX IDX */
OP(c3)89 OP(c3) { int tmp; m6502_ICount -= 7; RD_IDX; DCP; WB_EA;  } /* 7 DCP IDX */
OP(e3)90 OP(e3) { int tmp; m6502_ICount -= 7; RD_IDX; ISB; WB_EA;  } /* 7 ISB IDX */
91 
92 OP(13) { int tmp; m6502_ICount -= 6; RD_IDY; SLO; WB_EA;  } /* 6 SLO IDY */
93 OP(33) { int tmp; m6502_ICount -= 6; RD_IDY; RLA; WB_EA;  } /* 6 RLA IDY */
94 OP(53) { int tmp; m6502_ICount -= 6; RD_IDY; SRE; WB_EA;  } /* 6 SRE IDY */
95 OP(73) { int tmp; m6502_ICount -= 6; RD_IDY; RRA; WB_EA;  } /* 6 RRA IDY */
96 OP(93) { int tmp; m6502_ICount -= 5; EA_IDY; SAH; WB_EA;  } /* 5 SAH IDY */
OP(b3)97 OP(b3) { int tmp; m6502_ICount -= 5; RD_IDY; LAX;		  } /* 5 LAX IDY */
OP(d3)98 OP(d3) { int tmp; m6502_ICount -= 6; RD_IDY; DCP; WB_EA;  } /* 6 DCP IDY */
OP(f3)99 OP(f3) { int tmp; m6502_ICount -= 6; RD_IDY; ISB; WB_EA;  } /* 6 ISB IDY */
100 
101 OP(04) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
102 OP(24) { int tmp; m6509_ICount -= 3; RD_ZPG; BIT;		  } /* 3 BIT ZPG */
103 OP(44) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
104 OP(64) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
105 OP(84) { int tmp; m6509_ICount -= 3;		 STY; WR_ZPG; } /* 3 STY ZPG */
OP(a4)106 OP(a4) { int tmp; m6509_ICount -= 3; RD_ZPG; LDY;		  } /* 3 LDY ZPG */
OP(c4)107 OP(c4) { int tmp; m6509_ICount -= 3; RD_ZPG; CPY;		  } /* 3 CPY ZPG */
OP(e4)108 OP(e4) { int tmp; m6509_ICount -= 3; RD_ZPG; CPX;		  } /* 3 CPX ZPG */
109 
110 OP(14) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
111 OP(34) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
112 OP(54) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
113 OP(74) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
114 OP(94) { int tmp; m6509_ICount -= 4;		 STY; WR_ZPX; } /* 4 STY ZPX */
OP(b4)115 OP(b4) { int tmp; m6509_ICount -= 4; RD_ZPX; LDY;		  } /* 4 LDY ZPX */
OP(d4)116 OP(d4) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
OP(f4)117 OP(f4) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
118 
119 OP(05) { int tmp; m6509_ICount -= 3; RD_ZPG; ORA;		  } /* 3 ORA ZPG */
120 OP(25) { int tmp; m6509_ICount -= 3; RD_ZPG; AND;		  } /* 3 AND ZPG */
121 OP(45) { int tmp; m6509_ICount -= 3; RD_ZPG; EOR;		  } /* 3 EOR ZPG */
122 OP(65) { int tmp; m6509_ICount -= 3; RD_ZPG; ADC;		  } /* 3 ADC ZPG */
123 OP(85) { int tmp; m6509_ICount -= 3;		 STA; WR_ZPG; } /* 3 STA ZPG */
OP(a5)124 OP(a5) { int tmp; m6509_ICount -= 3; RD_ZPG; LDA;		  } /* 3 LDA ZPG */
OP(c5)125 OP(c5) { int tmp; m6509_ICount -= 3; RD_ZPG; CMP;		  } /* 3 CMP ZPG */
OP(e5)126 OP(e5) { int tmp; m6509_ICount -= 3; RD_ZPG; SBC;		  } /* 3 SBC ZPG */
127 
128 OP(15) { int tmp; m6509_ICount -= 4; RD_ZPX; ORA;		  } /* 4 ORA ZPX */
129 OP(35) { int tmp; m6509_ICount -= 4; RD_ZPX; AND;		  } /* 4 AND ZPX */
130 OP(55) { int tmp; m6509_ICount -= 4; RD_ZPX; EOR;		  } /* 4 EOR ZPX */
131 OP(75) { int tmp; m6509_ICount -= 4; RD_ZPX; ADC;		  } /* 4 ADC ZPX */
132 OP(95) { int tmp; m6509_ICount -= 4;		 STA; WR_ZPX; } /* 4 STA ZPX */
OP(b5)133 OP(b5) { int tmp; m6509_ICount -= 4; RD_ZPX; LDA;		  } /* 4 LDA ZPX */
OP(d5)134 OP(d5) { int tmp; m6509_ICount -= 4; RD_ZPX; CMP;		  } /* 4 CMP ZPX */
OP(f5)135 OP(f5) { int tmp; m6509_ICount -= 4; RD_ZPX; SBC;		  } /* 4 SBC ZPX */
136 
137 OP(06) { int tmp; m6509_ICount -= 5; RD_ZPG; ASL; WB_EA;  } /* 5 ASL ZPG */
138 OP(26) { int tmp; m6509_ICount -= 5; RD_ZPG; ROL; WB_EA;  } /* 5 ROL ZPG */
139 OP(46) { int tmp; m6509_ICount -= 5; RD_ZPG; LSR; WB_EA;  } /* 5 LSR ZPG */
140 OP(66) { int tmp; m6509_ICount -= 5; RD_ZPG; ROR; WB_EA;  } /* 5 ROR ZPG */
141 OP(86) { int tmp; m6509_ICount -= 3;		 STX; WR_ZPG; } /* 3 STX ZPG */
OP(a6)142 OP(a6) { int tmp; m6509_ICount -= 3; RD_ZPG; LDX;		  } /* 3 LDX ZPG */
OP(c6)143 OP(c6) { int tmp; m6509_ICount -= 5; RD_ZPG; DEC; WB_EA;  } /* 5 DEC ZPG */
OP(e6)144 OP(e6) { int tmp; m6509_ICount -= 5; RD_ZPG; INC; WB_EA;  } /* 5 INC ZPG */
145 
146 OP(16) { int tmp; m6509_ICount -= 6; RD_ZPX; ASL; WB_EA;  } /* 6 ASL ZPX */
147 OP(36) { int tmp; m6509_ICount -= 6; RD_ZPX; ROL; WB_EA;  } /* 6 ROL ZPX */
148 OP(56) { int tmp; m6509_ICount -= 6; RD_ZPX; LSR; WB_EA;  } /* 6 LSR ZPX */
149 OP(76) { int tmp; m6509_ICount -= 6; RD_ZPX; ROR; WB_EA;  } /* 6 ROR ZPX */
150 OP(96) { int tmp; m6509_ICount -= 4;		 STX; WR_ZPY; } /* 4 STX ZPY */
OP(b6)151 OP(b6) { int tmp; m6509_ICount -= 4; RD_ZPY; LDX;		  } /* 4 LDX ZPY */
OP(d6)152 OP(d6) { int tmp; m6509_ICount -= 6; RD_ZPX; DEC; WB_EA;  } /* 6 DEC ZPX */
OP(f6)153 OP(f6) { int tmp; m6509_ICount -= 6; RD_ZPX; INC; WB_EA;  } /* 6 INC ZPX */
154 
155 OP(07) { int tmp; m6502_ICount -= 5; RD_ZPG; SLO; WB_EA;  } /* 5 SLO ZPG */
156 OP(27) { int tmp; m6502_ICount -= 5; RD_ZPG; RLA; WB_EA;  } /* 5 RLA ZPG */
157 OP(47) { int tmp; m6502_ICount -= 5; RD_ZPG; SRE; WB_EA;  } /* 5 SRE ZPG */
158 OP(67) { int tmp; m6502_ICount -= 5; RD_ZPG; RRA; WB_EA;  } /* 5 RRA ZPG */
159 OP(87) { int tmp; m6502_ICount -= 3;		 SAX; WR_ZPG; } /* 3 SAX ZPG */
OP(a7)160 OP(a7) { int tmp; m6502_ICount -= 3; RD_ZPG; LAX;		  } /* 3 LAX ZPG */
OP(c7)161 OP(c7) { int tmp; m6502_ICount -= 5; RD_ZPG; DCP; WB_EA;  } /* 5 DCP ZPG */
OP(e7)162 OP(e7) { int tmp; m6502_ICount -= 5; RD_ZPG; ISB; WB_EA;  } /* 5 ISB ZPG */
163 
164 OP(17) { int tmp; m6502_ICount -= 6; RD_ZPX; SLO; WB_EA;  } /* 4 SLO ZPX */
165 OP(37) { int tmp; m6502_ICount -= 6; RD_ZPX; RLA; WB_EA;  } /* 4 RLA ZPX */
166 OP(57) { int tmp; m6502_ICount -= 6; RD_ZPX; SRE; WB_EA;  } /* 4 SRE ZPX */
167 OP(77) { int tmp; m6502_ICount -= 6; RD_ZPX; RRA; WB_EA;  } /* 4 RRA ZPX */
168 OP(97) { int tmp; m6502_ICount -= 4;		 SAX; WR_ZPY; } /* 4 SAX ZPY */
OP(b7)169 OP(b7) { int tmp; m6502_ICount -= 4; RD_ZPY; LAX;		  } /* 4 LAX ZPY */
OP(d7)170 OP(d7) { int tmp; m6502_ICount -= 6; RD_ZPX; DCP; WB_EA;  } /* 6 DCP ZPX */
OP(f7)171 OP(f7) { int tmp; m6502_ICount -= 6; RD_ZPX; ISB; WB_EA;  } /* 6 ISB ZPX */
172 
173 OP(08) {		  m6509_ICount -= 2;		 PHP;		  } /* 2 PHP */
174 OP(28) {		  m6509_ICount -= 2;		 PLP;		  } /* 2 PLP */
175 OP(48) {		  m6509_ICount -= 2;		 PHA;		  } /* 2 PHA */
176 OP(68) {		  m6509_ICount -= 2;		 PLA;		  } /* 2 PLA */
177 OP(88) {		  m6509_ICount -= 2;		 DEY;		  } /* 2 DEY */
OP(a8)178 OP(a8) {		  m6509_ICount -= 2;		 TAY;		  } /* 2 TAY */
OP(c8)179 OP(c8) {		  m6509_ICount -= 2;		 INY;		  } /* 2 INY */
OP(e8)180 OP(e8) {		  m6509_ICount -= 2;		 INX;		  } /* 2 INX */
181 
182 OP(18) {		  m6509_ICount -= 2;		 CLC;		  } /* 2 CLC */
183 OP(38) {		  m6509_ICount -= 2;		 SEC;		  } /* 2 SEC */
184 OP(58) {		  m6509_ICount -= 2;		 CLI;		  } /* 2 CLI */
185 OP(78) {		  m6509_ICount -= 2;		 SEI;		  } /* 2 SEI */
186 OP(98) {		  m6509_ICount -= 2;		 TYA;		  } /* 2 TYA */
OP(b8)187 OP(b8) {		  m6509_ICount -= 2;		 CLV;		  } /* 2 CLV */
OP(d8)188 OP(d8) {		  m6509_ICount -= 2;		 CLD;		  } /* 2 CLD */
OP(f8)189 OP(f8) {		  m6509_ICount -= 2;		 SED;		  } /* 2 SED */
190 
191 OP(09) { int tmp; m6509_ICount -= 2; RD_IMM; ORA;		  } /* 2 ORA IMM */
192 OP(29) { int tmp; m6509_ICount -= 2; RD_IMM; AND;		  } /* 2 AND IMM */
193 OP(49) { int tmp; m6509_ICount -= 2; RD_IMM; EOR;		  } /* 2 EOR IMM */
194 OP(69) { int tmp; m6509_ICount -= 2; RD_IMM; ADC;		  } /* 2 ADC IMM */
195 OP(89) {		  m6502_ICount -= 2;		 DOP;		  } /* 2 DOP */
OP(a9)196 OP(a9) { int tmp; m6509_ICount -= 2; RD_IMM; LDA;		  } /* 2 LDA IMM */
OP(c9)197 OP(c9) { int tmp; m6509_ICount -= 2; RD_IMM; CMP;		  } /* 2 CMP IMM */
OP(e9)198 OP(e9) { int tmp; m6509_ICount -= 2; RD_IMM; SBC;		  } /* 2 SBC IMM */
199 
200 OP(19) { int tmp; m6509_ICount -= 4; RD_ABY; ORA;		  } /* 4 ORA ABY */
201 OP(39) { int tmp; m6509_ICount -= 4; RD_ABY; AND;		  } /* 4 AND ABY */
202 OP(59) { int tmp; m6509_ICount -= 4; RD_ABY; EOR;		  } /* 4 EOR ABY */
203 OP(79) { int tmp; m6509_ICount -= 4; RD_ABY; ADC;		  } /* 4 ADC ABY */
204 OP(99) { int tmp; m6509_ICount -= 5;		 STA; WR_ABY; } /* 5 STA ABY */
OP(b9)205 OP(b9) { int tmp; m6509_ICount -= 4; RD_ABY; LDA;		  } /* 4 LDA ABY */
OP(d9)206 OP(d9) { int tmp; m6509_ICount -= 4; RD_ABY; CMP;		  } /* 4 CMP ABY */
OP(f9)207 OP(f9) { int tmp; m6509_ICount -= 4; RD_ABY; SBC;		  } /* 4 SBC ABY */
208 
209 OP(0a) { int tmp; m6509_ICount -= 2; RD_ACC; ASL; WB_ACC; } /* 2 ASL A */
210 OP(2a) { int tmp; m6509_ICount -= 2; RD_ACC; ROL; WB_ACC; } /* 2 ROL A */
211 OP(4a) { int tmp; m6509_ICount -= 2; RD_ACC; LSR; WB_ACC; } /* 2 LSR A */
212 OP(6a) { int tmp; m6509_ICount -= 2; RD_ACC; ROR; WB_ACC; } /* 2 ROR A */
213 OP(8a) {		  m6509_ICount -= 2;		 TXA;		  } /* 2 TXA */
OP(aa)214 OP(aa) {		  m6509_ICount -= 2;		 TAX;		  } /* 2 TAX */
OP(ca)215 OP(ca) {		  m6509_ICount -= 2;		 DEX;		  } /* 2 DEX */
OP(ea)216 OP(ea) {		  m6509_ICount -= 2;		 NOP;		  } /* 2 NOP */
217 
218 OP(1a) {		  m6502_ICount -= 2;		 NOP;		  } /* 2 NOP */
219 OP(3a) {		  m6502_ICount -= 2;		 NOP;		  } /* 2 NOP */
220 OP(5a) {		  m6502_ICount -= 2;		 NOP;		  } /* 2 NOP */
221 OP(7a) {		  m6502_ICount -= 2;		 NOP;		  } /* 2 NOP */
222 OP(9a) {		  m6509_ICount -= 2;		 TXS;		  } /* 2 TXS */
OP(ba)223 OP(ba) {		  m6509_ICount -= 2;		 TSX;		  } /* 2 TSX */
OP(da)224 OP(da) {		  m6502_ICount -= 2;		 NOP;		  } /* 2 NOP */
OP(fa)225 OP(fa) {		  m6502_ICount -= 2;		 NOP;		  } /* 2 NOP */
226 
227 OP(0b) { int tmp; m6502_ICount -= 2; RD_IMM; ANC;		  } /* 2 ANC IMM */
228 OP(2b) { int tmp; m6502_ICount -= 2; RD_IMM; ANC;		  } /* 2 ANC IMM */
229 OP(4b) { int tmp; m6502_ICount -= 2; RD_IMM; ASR; WB_ACC; } /* 2 ASR IMM */
230 OP(6b) { int tmp; m6502_ICount -= 2; RD_IMM; ARR; WB_ACC; } /* 2 ARR IMM */
231 OP(8b) { int tmp; m6502_ICount -= 2; RD_IMM; AXA;         } /* 2 AXA IMM */
OP(ab)232 OP(ab) { int tmp; m6502_ICount -= 2; RD_IMM; OAL;		  } /* 2 OAL IMM */
OP(cb)233 OP(cb) { int tmp; m6502_ICount -= 2; RD_IMM; ASX;		  } /* 2 ASX IMM */
OP(eb)234 OP(eb) { int tmp; m6502_ICount -= 2; RD_IMM; SBC;		  } /* 2 SBC IMM */
235 
236 OP(1b) { int tmp; m6502_ICount -= 4; RD_ABY; SLO; WB_EA;  } /* 4 SLO ABY */
237 OP(3b) { int tmp; m6502_ICount -= 4; RD_ABY; RLA; WB_EA;  } /* 4 RLA ABY */
238 OP(5b) { int tmp; m6502_ICount -= 4; RD_ABY; SRE; WB_EA;  } /* 4 SRE ABY */
239 OP(7b) { int tmp; m6502_ICount -= 4; RD_ABY; RRA; WB_EA;  } /* 4 RRA ABY */
240 OP(9b) { int tmp; m6502_ICount -= 5; EA_ABY; SSH; WB_EA;  } /* 5 SSH ABY */
OP(bb)241 OP(bb) { int tmp; m6502_ICount -= 4; RD_ABY; AST;		  } /* 4 AST ABY */
OP(db)242 OP(db) { int tmp; m6502_ICount -= 6; RD_ABY; DCP; WB_EA;  } /* 6 DCP ABY */
OP(fb)243 OP(fb) { int tmp; m6502_ICount -= 6; RD_ABY; ISB; WB_EA;  } /* 6 ISB ABY */
244 
245 OP(0c) {		  m6502_ICount -= 2;		 TOP;		  } /* 2 TOP */
246 OP(2c) { int tmp; m6509_ICount -= 4; RD_ABS; BIT;		  } /* 4 BIT ABS */
247 OP(4c) {		  m6509_ICount -= 3; EA_ABS; JMP;		  } /* 3 JMP ABS */
248 OP(6c) { int tmp; m6509_ICount -= 5; EA_IND; JMP;		  } /* 5 JMP IND */
249 OP(8c) { int tmp; m6509_ICount -= 4;		 STY; WR_ABS; } /* 4 STY ABS */
OP(ac)250 OP(ac) { int tmp; m6509_ICount -= 4; RD_ABS; LDY;		  } /* 4 LDY ABS */
OP(cc)251 OP(cc) { int tmp; m6509_ICount -= 4; RD_ABS; CPY;		  } /* 4 CPY ABS */
OP(ec)252 OP(ec) { int tmp; m6509_ICount -= 4; RD_ABS; CPX;		  } /* 4 CPX ABS */
253 
254 OP(1c) {		  m6502_ICount -= 2;		 TOP;		  } /* 2 TOP */
255 OP(3c) {		  m6502_ICount -= 2;		 TOP;		  } /* 2 TOP */
256 OP(5c) {		  m6502_ICount -= 2;		 TOP;		  } /* 2 TOP */
257 OP(7c) {		  m6502_ICount -= 2;		 TOP;		  } /* 2 TOP */
258 OP(9c) { int tmp; m6502_ICount -= 5; EA_ABX; SYH; WB_EA;  } /* 5 SYH ABX */
OP(bc)259 OP(bc) { int tmp; m6509_ICount -= 4; RD_ABX; LDY;		  } /* 4 LDY ABX */
OP(dc)260 OP(dc) {		  m6502_ICount -= 2;		 TOP;		  } /* 2 TOP */
OP(fc)261 OP(fc) {		  m6502_ICount -= 2;		 TOP;		  } /* 2 TOP */
262 
263 OP(0d) { int tmp; m6509_ICount -= 4; RD_ABS; ORA;		  } /* 4 ORA ABS */
264 OP(2d) { int tmp; m6509_ICount -= 4; RD_ABS; AND;		  } /* 4 AND ABS */
265 OP(4d) { int tmp; m6509_ICount -= 4; RD_ABS; EOR;		  } /* 4 EOR ABS */
266 OP(6d) { int tmp; m6509_ICount -= 4; RD_ABS; ADC;		  } /* 4 ADC ABS */
267 OP(8d) { int tmp; m6509_ICount -= 4;		 STA; WR_ABS; } /* 4 STA ABS */
OP(ad)268 OP(ad) { int tmp; m6509_ICount -= 4; RD_ABS; LDA;		  } /* 4 LDA ABS */
OP(cd)269 OP(cd) { int tmp; m6509_ICount -= 4; RD_ABS; CMP;		  } /* 4 CMP ABS */
OP(ed)270 OP(ed) { int tmp; m6509_ICount -= 4; RD_ABS; SBC;		  } /* 4 SBC ABS */
271 
272 OP(1d) { int tmp; m6509_ICount -= 4; RD_ABX; ORA;		  } /* 4 ORA ABX */
273 OP(3d) { int tmp; m6509_ICount -= 4; RD_ABX; AND;		  } /* 4 AND ABX */
274 OP(5d) { int tmp; m6509_ICount -= 4; RD_ABX; EOR;		  } /* 4 EOR ABX */
275 OP(7d) { int tmp; m6509_ICount -= 4; RD_ABX; ADC;		  } /* 4 ADC ABX */
276 OP(9d) { int tmp; m6509_ICount -= 5;		 STA; WR_ABX; } /* 5 STA ABX */
OP(bd)277 OP(bd) { int tmp; m6509_ICount -= 4; RD_ABX; LDA;		  } /* 4 LDA ABX */
OP(dd)278 OP(dd) { int tmp; m6509_ICount -= 4; RD_ABX; CMP;		  } /* 4 CMP ABX */
OP(fd)279 OP(fd) { int tmp; m6509_ICount -= 4; RD_ABX; SBC;		  } /* 4 SBC ABX */
280 
281 OP(0e) { int tmp; m6509_ICount -= 6; RD_ABS; ASL; WB_EA;  } /* 6 ASL ABS */
282 OP(2e) { int tmp; m6509_ICount -= 6; RD_ABS; ROL; WB_EA;  } /* 6 ROL ABS */
283 OP(4e) { int tmp; m6509_ICount -= 6; RD_ABS; LSR; WB_EA;  } /* 6 LSR ABS */
284 OP(6e) { int tmp; m6509_ICount -= 6; RD_ABS; ROR; WB_EA;  } /* 6 ROR ABS */
285 OP(8e) { int tmp; m6509_ICount -= 5;		 STX; WR_ABS; } /* 5 STX ABS */
OP(ae)286 OP(ae) { int tmp; m6509_ICount -= 4; RD_ABS; LDX;		  } /* 4 LDX ABS */
OP(ce)287 OP(ce) { int tmp; m6509_ICount -= 6; RD_ABS; DEC; WB_EA;  } /* 6 DEC ABS */
OP(ee)288 OP(ee) { int tmp; m6509_ICount -= 6; RD_ABS; INC; WB_EA;  } /* 6 INC ABS */
289 
290 OP(1e) { int tmp; m6509_ICount -= 7; RD_ABX; ASL; WB_EA;  } /* 7 ASL ABX */
291 OP(3e) { int tmp; m6509_ICount -= 7; RD_ABX; ROL; WB_EA;  } /* 7 ROL ABX */
292 OP(5e) { int tmp; m6509_ICount -= 7; RD_ABX; LSR; WB_EA;  } /* 7 LSR ABX */
293 OP(7e) { int tmp; m6509_ICount -= 7; RD_ABX; ROR; WB_EA;  } /* 7 ROR ABX */
294 OP(9e) { int tmp; m6502_ICount -= 2; EA_ABY; SXH; WB_EA;  } /* 2 SXH ABY */
OP(be)295 OP(be) { int tmp; m6509_ICount -= 4; RD_ABY; LDX;		  } /* 4 LDX ABY */
OP(de)296 OP(de) { int tmp; m6509_ICount -= 7; RD_ABX; DEC; WB_EA;  } /* 7 DEC ABX */
OP(fe)297 OP(fe) { int tmp; m6509_ICount -= 7; RD_ABX; INC; WB_EA;  } /* 7 INC ABX */
298 
299 OP(0f) { int tmp; m6502_ICount -= 6; RD_ABS; SLO; WB_EA;  } /* 4 SLO ABS */
300 OP(2f) { int tmp; m6502_ICount -= 6; RD_ABS; RLA; WB_EA;  } /* 4 RLA ABS */
301 OP(4f) { int tmp; m6502_ICount -= 6; RD_ABS; SRE; WB_EA;  } /* 4 SRE ABS */
302 OP(6f) { int tmp; m6502_ICount -= 6; RD_ABS; RRA; WB_EA;  } /* 4 RRA ABS */
303 OP(8f) { int tmp; m6502_ICount -= 4;		 SAX; WR_ABS; } /* 4 SAX ABS */
OP(af)304 OP(af) { int tmp; m6502_ICount -= 5; RD_ABS; LAX;		  } /* 4 LAX ABS */
OP(cf)305 OP(cf) { int tmp; m6502_ICount -= 6; RD_ABS; DCP; WB_EA;  } /* 6 DCP ABS */
OP(ef)306 OP(ef) { int tmp; m6502_ICount -= 6; RD_ABS; ISB; WB_EA;  } /* 6 ISB ABS */
307 
308 OP(1f) { int tmp; m6502_ICount -= 4; RD_ABX; SLO; WB_EA;  } /* 4 SLO ABX */
309 OP(3f) { int tmp; m6502_ICount -= 4; RD_ABX; RLA; WB_EA;  } /* 4 RLA ABX */
310 OP(5f) { int tmp; m6502_ICount -= 4; RD_ABX; SRE; WB_EA;  } /* 4 SRE ABX */
311 OP(7f) { int tmp; m6502_ICount -= 4; RD_ABX; RRA; WB_EA;  } /* 4 RRA ABX */
312 OP(9f) { int tmp; m6502_ICount -= 6; EA_ABY; SAH; WB_EA;  } /* 5 SAH ABY */
OP(bf)313 OP(bf) { int tmp; m6502_ICount -= 6; RD_ABY; LAX;		  } /* 4 LAX ABY */
OP(df)314 OP(df) { int tmp; m6502_ICount -= 7; RD_ABX; DCP; WB_EA;  } /* 7 DCP ABX */
OP(ff)315 OP(ff) { int tmp; m6502_ICount -= 7; RD_ABX; ISB; WB_EA;  } /* 7 ISB ABX */
316 
317 static void (*insn6509[0x100])(void) = {
318 	m6509_00,m6509_01,m6509_02,m6509_03,m6509_04,m6509_05,m6509_06,m6509_07,
319 	m6509_08,m6509_09,m6509_0a,m6509_0b,m6509_0c,m6509_0d,m6509_0e,m6509_0f,
320 	m6509_10,m6509_11,m6509_12,m6509_13,m6509_14,m6509_15,m6509_16,m6509_17,
321 	m6509_18,m6509_19,m6509_1a,m6509_1b,m6509_1c,m6509_1d,m6509_1e,m6509_1f,
322 	m6509_20,m6509_21,m6509_22,m6509_23,m6509_24,m6509_25,m6509_26,m6509_27,
323 	m6509_28,m6509_29,m6509_2a,m6509_2b,m6509_2c,m6509_2d,m6509_2e,m6509_2f,
324 	m6509_30,m6509_31,m6509_32,m6509_33,m6509_34,m6509_35,m6509_36,m6509_37,
325 	m6509_38,m6509_39,m6509_3a,m6509_3b,m6509_3c,m6509_3d,m6509_3e,m6509_3f,
326 	m6509_40,m6509_41,m6509_42,m6509_43,m6509_44,m6509_45,m6509_46,m6509_47,
327 	m6509_48,m6509_49,m6509_4a,m6509_4b,m6509_4c,m6509_4d,m6509_4e,m6509_4f,
328 	m6509_50,m6509_51,m6509_52,m6509_53,m6509_54,m6509_55,m6509_56,m6509_57,
329 	m6509_58,m6509_59,m6509_5a,m6509_5b,m6509_5c,m6509_5d,m6509_5e,m6509_5f,
330 	m6509_60,m6509_61,m6509_62,m6509_63,m6509_64,m6509_65,m6509_66,m6509_67,
331 	m6509_68,m6509_69,m6509_6a,m6509_6b,m6509_6c,m6509_6d,m6509_6e,m6509_6f,
332 	m6509_70,m6509_71,m6509_72,m6509_73,m6509_74,m6509_75,m6509_76,m6509_77,
333 	m6509_78,m6509_79,m6509_7a,m6509_7b,m6509_7c,m6509_7d,m6509_7e,m6509_7f,
334 	m6509_80,m6509_81,m6509_82,m6509_83,m6509_84,m6509_85,m6509_86,m6509_87,
335 	m6509_88,m6509_89,m6509_8a,m6509_8b,m6509_8c,m6509_8d,m6509_8e,m6509_8f,
336 	m6509_90,m6509_91,m6509_92,m6509_93,m6509_94,m6509_95,m6509_96,m6509_97,
337 	m6509_98,m6509_99,m6509_9a,m6509_9b,m6509_9c,m6509_9d,m6509_9e,m6509_9f,
338 	m6509_a0,m6509_a1,m6509_a2,m6509_a3,m6509_a4,m6509_a5,m6509_a6,m6509_a7,
339 	m6509_a8,m6509_a9,m6509_aa,m6509_ab,m6509_ac,m6509_ad,m6509_ae,m6509_af,
340 	m6509_b0,m6509_b1,m6509_b2,m6509_b3,m6509_b4,m6509_b5,m6509_b6,m6509_b7,
341 	m6509_b8,m6509_b9,m6509_ba,m6509_bb,m6509_bc,m6509_bd,m6509_be,m6509_bf,
342 	m6509_c0,m6509_c1,m6509_c2,m6509_c3,m6509_c4,m6509_c5,m6509_c6,m6509_c7,
343 	m6509_c8,m6509_c9,m6509_ca,m6509_cb,m6509_cc,m6509_cd,m6509_ce,m6509_cf,
344 	m6509_d0,m6509_d1,m6509_d2,m6509_d3,m6509_d4,m6509_d5,m6509_d6,m6509_d7,
345 	m6509_d8,m6509_d9,m6509_da,m6509_db,m6509_dc,m6509_dd,m6509_de,m6509_df,
346 	m6509_e0,m6509_e1,m6509_e2,m6509_e3,m6509_e4,m6509_e5,m6509_e6,m6509_e7,
347 	m6509_e8,m6509_e9,m6509_ea,m6509_eb,m6509_ec,m6509_ed,m6509_ee,m6509_ef,
348 	m6509_f0,m6509_f1,m6509_f2,m6509_f3,m6509_f4,m6509_f5,m6509_f6,m6509_f7,
349 	m6509_f8,m6509_f9,m6509_fa,m6509_fb,m6509_fc,m6509_fd,m6509_fe,m6509_ff
350 };
351