Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/cpu/core/table.cpp
2 views
1
#ifdef CPUCORE_CPP
2
3
void CPUcore::initialize_opcode_table() {
4
#define opA( id, name ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name;
5
#define opAII(id, name, x, y ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name<x, y>;
6
#define opE( id, name ) op_table[table_EM + id] = &CPUcore::op_##name##_e; op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_n;
7
#define opEI( id, name, x ) op_table[table_EM + id] = &CPUcore::op_##name##_e<x>; op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_n<x>;
8
#define opEII(id, name, x, y ) op_table[table_EM + id] = &CPUcore::op_##name##_e<x, y>; op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_n<x, y>;
9
#define opM( id, name ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w;
10
#define opMI( id, name, x ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<x>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x>;
11
#define opMII(id, name, x, y ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<x, y>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x, y>;
12
#define opMF( id, name, fn ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w>;
13
#define opMFI(id, name, fn, x) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b, x>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w, x>;
14
#define opX( id, name ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w;
15
#define opXI( id, name, x ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<x>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x>;
16
#define opXII(id, name, x, y ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<x, y>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<x, y>;
17
#define opXF( id, name, fn ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w>;
18
#define opXFI(id, name, fn, x) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b, x>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w, x>;
19
20
opEII(0x00, interrupt, 0xfffe, 0xffe6)
21
opMF (0x01, read_idpx, ora)
22
opEII(0x02, interrupt, 0xfff4, 0xffe4)
23
opMF (0x03, read_sr, ora)
24
opMF (0x04, adjust_dp, tsb)
25
opMF (0x05, read_dp, ora)
26
opMF (0x06, adjust_dp, asl)
27
opMF (0x07, read_ildp, ora)
28
opA (0x08, php)
29
opMF (0x09, read_const, ora)
30
opM (0x0a, asl_imm)
31
opE (0x0b, phd)
32
opMF (0x0c, adjust_addr, tsb)
33
opMF (0x0d, read_addr, ora)
34
opMF (0x0e, adjust_addr, asl)
35
opMF (0x0f, read_long, ora)
36
opAII(0x10, branch, 0x80, false)
37
opMF (0x11, read_idpy, ora)
38
opMF (0x12, read_idp, ora)
39
opMF (0x13, read_isry, ora)
40
opMF (0x14, adjust_dp, trb)
41
opMFI(0x15, read_dpr, ora, X)
42
opMF (0x16, adjust_dpx, asl)
43
opMF (0x17, read_ildpy, ora)
44
opAII(0x18, flag, 0x01, 0x00)
45
opMF (0x19, read_addry, ora)
46
opMII(0x1a, adjust_imm, A, +1)
47
opE (0x1b, tcs)
48
opMF (0x1c, adjust_addr, trb)
49
opMF (0x1d, read_addrx, ora)
50
opMF (0x1e, adjust_addrx, asl)
51
opMF (0x1f, read_longx, ora)
52
opA (0x20, jsr_addr)
53
opMF (0x21, read_idpx, and)
54
opE (0x22, jsr_long)
55
opMF (0x23, read_sr, and)
56
opMF (0x24, read_dp, bit)
57
opMF (0x25, read_dp, and)
58
opMF (0x26, adjust_dp, rol)
59
opMF (0x27, read_ildp, and)
60
opE (0x28, plp)
61
opMF (0x29, read_const, and)
62
opM (0x2a, rol_imm)
63
opE (0x2b, pld)
64
opMF (0x2c, read_addr, bit)
65
opMF (0x2d, read_addr, and)
66
opMF (0x2e, adjust_addr, rol)
67
opMF (0x2f, read_long, and)
68
opAII(0x30, branch, 0x80, true)
69
opMF (0x31, read_idpy, and)
70
opMF (0x32, read_idp, and)
71
opMF (0x33, read_isry, and)
72
opMFI(0x34, read_dpr, bit, X)
73
opMFI(0x35, read_dpr, and, X)
74
opMF (0x36, adjust_dpx, rol)
75
opMF (0x37, read_ildpy, and)
76
opAII(0x38, flag, 0x01, 0x01)
77
opMF (0x39, read_addry, and)
78
opMII(0x3a, adjust_imm, A, -1)
79
opAII(0x3b, transfer_w, S, A)
80
opMF (0x3c, read_addrx, bit)
81
opMF (0x3d, read_addrx, and)
82
opMF (0x3e, adjust_addrx, rol)
83
opMF (0x3f, read_longx, and)
84
opE (0x40, rti)
85
opMF (0x41, read_idpx, eor)
86
opA (0x42, wdm)
87
opMF (0x43, read_sr, eor)
88
opXI (0x44, move, -1)
89
opMF (0x45, read_dp, eor)
90
opMF (0x46, adjust_dp, lsr)
91
opMF (0x47, read_ildp, eor)
92
opMI (0x48, push, A)
93
opMF (0x49, read_const, eor)
94
opM (0x4a, lsr_imm)
95
opA (0x4b, phk)
96
opA (0x4c, jmp_addr)
97
opMF (0x4d, read_addr, eor)
98
opMF (0x4e, adjust_addr, lsr)
99
opMF (0x4f, read_long, eor)
100
opAII(0x50, branch, 0x40, false)
101
opMF (0x51, read_idpy, eor)
102
opMF (0x52, read_idp, eor)
103
opMF (0x53, read_isry, eor)
104
opXI (0x54, move, +1)
105
opMFI(0x55, read_dpr, eor, X)
106
opMF (0x56, adjust_dpx, lsr)
107
opMF (0x57, read_ildpy, eor)
108
opAII(0x58, flag, 0x04, 0x00)
109
opMF (0x59, read_addry, eor)
110
opXI (0x5a, push, Y)
111
opAII(0x5b, transfer_w, A, D)
112
opA (0x5c, jmp_long)
113
opMF (0x5d, read_addrx, eor)
114
opMF (0x5e, adjust_addrx, lsr)
115
opMF (0x5f, read_longx, eor)
116
opA (0x60, rts)
117
opMF (0x61, read_idpx, adc)
118
opE (0x62, per)
119
opMF (0x63, read_sr, adc)
120
opMI (0x64, write_dp, Z)
121
opMF (0x65, read_dp, adc)
122
opMF (0x66, adjust_dp, ror)
123
opMF (0x67, read_ildp, adc)
124
opMI (0x68, pull, A)
125
opMF (0x69, read_const, adc)
126
opM (0x6a, ror_imm)
127
opE (0x6b, rtl)
128
opA (0x6c, jmp_iaddr)
129
opMF (0x6d, read_addr, adc)
130
opMF (0x6e, adjust_addr, ror)
131
opMF (0x6f, read_long, adc)
132
opAII(0x70, branch, 0x40, true)
133
opMF (0x71, read_idpy, adc)
134
opMF (0x72, read_idp, adc)
135
opMF (0x73, read_isry, adc)
136
opMII(0x74, write_dpr, Z, X)
137
opMFI(0x75, read_dpr, adc, X)
138
opMF (0x76, adjust_dpx, ror)
139
opMF (0x77, read_ildpy, adc)
140
opAII(0x78, flag, 0x04, 0x04)
141
opMF (0x79, read_addry, adc)
142
opXI (0x7a, pull, Y)
143
opAII(0x7b, transfer_w, D, A)
144
opA (0x7c, jmp_iaddrx)
145
opMF (0x7d, read_addrx, adc)
146
opMF (0x7e, adjust_addrx, ror)
147
opMF (0x7f, read_longx, adc)
148
opA (0x80, bra)
149
opM (0x81, sta_idpx)
150
opA (0x82, brl)
151
opM (0x83, sta_sr)
152
opXI (0x84, write_dp, Y)
153
opMI (0x85, write_dp, A)
154
opXI (0x86, write_dp, X)
155
opM (0x87, sta_ildp)
156
opXII(0x88, adjust_imm, Y, -1)
157
opM (0x89, read_bit_const)
158
opMII(0x8a, transfer, X, A)
159
opA (0x8b, phb)
160
opXI (0x8c, write_addr, Y)
161
opMI (0x8d, write_addr, A)
162
opXI (0x8e, write_addr, X)
163
opMI (0x8f, write_longr, Z)
164
opAII(0x90, branch, 0x01, false)
165
opM (0x91, sta_idpy)
166
opM (0x92, sta_idp)
167
opM (0x93, sta_isry)
168
opXII(0x94, write_dpr, Y, X)
169
opMII(0x95, write_dpr, A, X)
170
opXII(0x96, write_dpr, X, Y)
171
opM (0x97, sta_ildpy)
172
opMII(0x98, transfer, Y, A)
173
opMII(0x99, write_addrr, A, Y)
174
opE (0x9a, txs)
175
opXII(0x9b, transfer, X, Y)
176
opMI (0x9c, write_addr, Z)
177
opMII(0x9d, write_addrr, A, X)
178
opMII(0x9e, write_addrr, Z, X)
179
opMI (0x9f, write_longr, X)
180
opXF (0xa0, read_const, ldy)
181
opMF (0xa1, read_idpx, lda)
182
opXF (0xa2, read_const, ldx)
183
opMF (0xa3, read_sr, lda)
184
opXF (0xa4, read_dp, ldy)
185
opMF (0xa5, read_dp, lda)
186
opXF (0xa6, read_dp, ldx)
187
opMF (0xa7, read_ildp, lda)
188
opXII(0xa8, transfer, A, Y)
189
opMF (0xa9, read_const, lda)
190
opXII(0xaa, transfer, A, X)
191
opA (0xab, plb)
192
opXF (0xac, read_addr, ldy)
193
opMF (0xad, read_addr, lda)
194
opXF (0xae, read_addr, ldx)
195
opMF (0xaf, read_long, lda)
196
opAII(0xb0, branch, 0x01, true)
197
opMF (0xb1, read_idpy, lda)
198
opMF (0xb2, read_idp, lda)
199
opMF (0xb3, read_isry, lda)
200
opXFI(0xb4, read_dpr, ldy, X)
201
opMFI(0xb5, read_dpr, lda, X)
202
opXFI(0xb6, read_dpr, ldx, Y)
203
opMF (0xb7, read_ildpy, lda)
204
opAII(0xb8, flag, 0x40, 0x00)
205
opMF (0xb9, read_addry, lda)
206
opX (0xba, tsx)
207
opXII(0xbb, transfer, Y, X)
208
opXF (0xbc, read_addrx, ldy)
209
opMF (0xbd, read_addrx, lda)
210
opXF (0xbe, read_addry, ldx)
211
opMF (0xbf, read_longx, lda)
212
opXF (0xc0, read_const, cpy)
213
opMF (0xc1, read_idpx, cmp)
214
opEI (0xc2, pflag, 0)
215
opMF (0xc3, read_sr, cmp)
216
opXF (0xc4, read_dp, cpy)
217
opMF (0xc5, read_dp, cmp)
218
opMF (0xc6, adjust_dp, dec)
219
opMF (0xc7, read_ildp, cmp)
220
opXII(0xc8, adjust_imm, Y, +1)
221
opMF (0xc9, read_const, cmp)
222
opXII(0xca, adjust_imm, X, -1)
223
opA (0xcb, wai)
224
opXF (0xcc, read_addr, cpy)
225
opMF (0xcd, read_addr, cmp)
226
opMF (0xce, adjust_addr, dec)
227
opMF (0xcf, read_long, cmp)
228
opAII(0xd0, branch, 0x02, false)
229
opMF (0xd1, read_idpy, cmp)
230
opMF (0xd2, read_idp, cmp)
231
opMF (0xd3, read_isry, cmp)
232
opE (0xd4, pei)
233
opMFI(0xd5, read_dpr, cmp, X)
234
opMF (0xd6, adjust_dpx, dec)
235
opMF (0xd7, read_ildpy, cmp)
236
opAII(0xd8, flag, 0x08, 0x00)
237
opMF (0xd9, read_addry, cmp)
238
opXI (0xda, push, X)
239
opA (0xdb, stp)
240
opA (0xdc, jmp_iladdr)
241
opMF (0xdd, read_addrx, cmp)
242
opMF (0xde, adjust_addrx, dec)
243
opMF (0xdf, read_longx, cmp)
244
opXF (0xe0, read_const, cpx)
245
opMF (0xe1, read_idpx, sbc)
246
opEI (0xe2, pflag, 1)
247
opMF (0xe3, read_sr, sbc)
248
opXF (0xe4, read_dp, cpx)
249
opMF (0xe5, read_dp, sbc)
250
opMF (0xe6, adjust_dp, inc)
251
opMF (0xe7, read_ildp, sbc)
252
opXII(0xe8, adjust_imm, X, +1)
253
opMF (0xe9, read_const, sbc)
254
opA (0xea, nop)
255
opA (0xeb, xba)
256
opXF (0xec, read_addr, cpx)
257
opMF (0xed, read_addr, sbc)
258
opMF (0xee, adjust_addr, inc)
259
opMF (0xef, read_long, sbc)
260
opAII(0xf0, branch, 0x02, true)
261
opMF (0xf1, read_idpy, sbc)
262
opMF (0xf2, read_idp, sbc)
263
opMF (0xf3, read_isry, sbc)
264
opE (0xf4, pea)
265
opMFI(0xf5, read_dpr, sbc, X)
266
opMF (0xf6, adjust_dpx, inc)
267
opMF (0xf7, read_ildpy, sbc)
268
opAII(0xf8, flag, 0x08, 0x08)
269
opMF (0xf9, read_addry, sbc)
270
opXI (0xfa, pull, X)
271
opA (0xfb, xce)
272
opE (0xfc, jsr_iaddrx)
273
opMF (0xfd, read_addrx, sbc)
274
opMF (0xfe, adjust_addrx, inc)
275
opMF (0xff, read_longx, sbc)
276
277
#undef opA
278
#undef opAII
279
#undef opE
280
#undef opEI
281
#undef opEII
282
#undef opM
283
#undef opMI
284
#undef opMII
285
#undef opMF
286
#undef opMFI
287
#undef opX
288
#undef opXI
289
#undef opXII
290
#undef opXF
291
#undef opXFI
292
}
293
294
void CPUcore::update_table() {
295
if(regs.e) {
296
opcode_table = &op_table[table_EM];
297
} else if(regs.p.m) {
298
if(regs.p.x) {
299
opcode_table = &op_table[table_MX];
300
} else {
301
opcode_table = &op_table[table_Mx];
302
}
303
} else {
304
if(regs.p.x) {
305
opcode_table = &op_table[table_mX];
306
} else {
307
opcode_table = &op_table[table_mx];
308
}
309
}
310
}
311
312
#endif
313
314