diff options
Diffstat (limited to 'apps/codecs/libasap/acpu.c')
-rw-r--r-- | apps/codecs/libasap/acpu.c | 2270 |
1 files changed, 1135 insertions, 1135 deletions
diff --git a/apps/codecs/libasap/acpu.c b/apps/codecs/libasap/acpu.c index 7c3c8f6f28..c5bff47a5d 100644 --- a/apps/codecs/libasap/acpu.c +++ b/apps/codecs/libasap/acpu.c | |||
@@ -52,105 +52,105 @@ | |||
52 | #include "asap_internal.h" | 52 | #include "asap_internal.h" |
53 | 53 | ||
54 | CONST_ARRAY(int, opcode_cycles) | 54 | CONST_ARRAY(int, opcode_cycles) |
55 | /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ | 55 | /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ |
56 | 7, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6, /* 0x */ | 56 | 7, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6, /* 0x */ |
57 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 1x */ | 57 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 1x */ |
58 | 6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6, /* 2x */ | 58 | 6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6, /* 2x */ |
59 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 3x */ | 59 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 3x */ |
60 | 6, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6, /* 4x */ | 60 | 6, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6, /* 4x */ |
61 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 5x */ | 61 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 5x */ |
62 | 6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6, /* 6x */ | 62 | 6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6, /* 6x */ |
63 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 7x */ | 63 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 7x */ |
64 | 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, /* 8x */ | 64 | 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, /* 8x */ |
65 | 2, 6, 2, 6, 4, 4, 4, 4, 2, 5, 2, 5, 5, 5, 5, 5, /* 9x */ | 65 | 2, 6, 2, 6, 4, 4, 4, 4, 2, 5, 2, 5, 5, 5, 5, 5, /* 9x */ |
66 | 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, /* Ax */ | 66 | 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, /* Ax */ |
67 | 2, 5, 2, 5, 4, 4, 4, 4, 2, 4, 2, 4, 4, 4, 4, 4, /* Bx */ | 67 | 2, 5, 2, 5, 4, 4, 4, 4, 2, 4, 2, 4, 4, 4, 4, 4, /* Bx */ |
68 | 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, /* Cx */ | 68 | 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, /* Cx */ |
69 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* Dx */ | 69 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* Dx */ |
70 | 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, /* Ex */ | 70 | 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, /* Ex */ |
71 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7 /* Fx */ | 71 | 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7 /* Fx */ |
72 | END_CONST_ARRAY; | 72 | END_CONST_ARRAY; |
73 | 73 | ||
74 | #ifdef ACPU_NO_DECIMAL | 74 | #ifdef ACPU_NO_DECIMAL |
75 | 75 | ||
76 | #define DO_ADC \ | 76 | #define DO_ADC \ |
77 | { \ | 77 | { \ |
78 | /* binary mode */ \ | 78 | /* binary mode */ \ |
79 | V(int, tmp) = a + data + c; \ | 79 | V(int, tmp) = a + data + c; \ |
80 | c = tmp >> 8; \ | 80 | c = tmp >> 8; \ |
81 | vdi &= D_FLAG | I_FLAG; \ | 81 | vdi &= D_FLAG | I_FLAG; \ |
82 | if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ | 82 | if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ |
83 | vdi += V_FLAG; \ | 83 | vdi += V_FLAG; \ |
84 | nz = a = tmp & 0xff; \ | 84 | nz = a = tmp & 0xff; \ |
85 | } | 85 | } |
86 | 86 | ||
87 | #define DO_SBC \ | 87 | #define DO_SBC \ |
88 | { \ | 88 | { \ |
89 | /* binary mode */ \ | 89 | /* binary mode */ \ |
90 | V(int, tmp) = a - data - 1 + c; \ | 90 | V(int, tmp) = a - data - 1 + c; \ |
91 | c = (tmp >= 0) ? 1 : 0; \ | 91 | c = (tmp >= 0) ? 1 : 0; \ |
92 | vdi &= D_FLAG | I_FLAG; \ | 92 | vdi &= D_FLAG | I_FLAG; \ |
93 | if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ | 93 | if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ |
94 | vdi += V_FLAG; \ | 94 | vdi += V_FLAG; \ |
95 | nz = a = tmp & 0xff; \ | 95 | nz = a = tmp & 0xff; \ |
96 | } | 96 | } |
97 | 97 | ||
98 | #else /* ACPU_NO_DECIMAL */ | 98 | #else /* ACPU_NO_DECIMAL */ |
99 | 99 | ||
100 | #define DO_ADC \ | 100 | #define DO_ADC \ |
101 | if ((vdi & D_FLAG) == 0) { \ | 101 | if ((vdi & D_FLAG) == 0) { \ |
102 | /* binary mode */ \ | 102 | /* binary mode */ \ |
103 | V(int, tmp) = a + data + c; \ | 103 | V(int, tmp) = a + data + c; \ |
104 | c = tmp >> 8; \ | 104 | c = tmp >> 8; \ |
105 | vdi &= D_FLAG | I_FLAG; \ | 105 | vdi &= D_FLAG | I_FLAG; \ |
106 | if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ | 106 | if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ |
107 | vdi += V_FLAG; \ | 107 | vdi += V_FLAG; \ |
108 | nz = a = tmp & 0xff; \ | 108 | nz = a = tmp & 0xff; \ |
109 | } \ | 109 | } \ |
110 | else { \ | 110 | else { \ |
111 | /* decimal mode */ \ | 111 | /* decimal mode */ \ |
112 | V(int, tmp) = (a & 0x0f) + (data & 0x0f) + c; \ | 112 | V(int, tmp) = (a & 0x0f) + (data & 0x0f) + c; \ |
113 | if (tmp >= 10) \ | 113 | if (tmp >= 10) \ |
114 | tmp = (tmp - 10) | 0x10; \ | 114 | tmp = (tmp - 10) | 0x10; \ |
115 | tmp += (a & 0xf0) + (data & 0xf0); \ | 115 | tmp += (a & 0xf0) + (data & 0xf0); \ |
116 | nz = ((tmp & 0x80) << 1) + ((a + data + c) & 0xff); \ | 116 | nz = ((tmp & 0x80) << 1) + ((a + data + c) & 0xff); \ |
117 | vdi &= D_FLAG | I_FLAG; \ | 117 | vdi &= D_FLAG | I_FLAG; \ |
118 | if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ | 118 | if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ |
119 | vdi += V_FLAG; \ | 119 | vdi += V_FLAG; \ |
120 | if (tmp > 0x9f) \ | 120 | if (tmp > 0x9f) \ |
121 | tmp += 0x60; \ | 121 | tmp += 0x60; \ |
122 | c = (tmp > 0xff) ? 1 : 0; \ | 122 | c = (tmp > 0xff) ? 1 : 0; \ |
123 | a = tmp & 0xff; \ | 123 | a = tmp & 0xff; \ |
124 | } | 124 | } |
125 | 125 | ||
126 | #define DO_SBC \ | 126 | #define DO_SBC \ |
127 | if ((vdi & D_FLAG) == 0) { \ | 127 | if ((vdi & D_FLAG) == 0) { \ |
128 | /* binary mode */ \ | 128 | /* binary mode */ \ |
129 | V(int, tmp) = a - data - 1 + c; \ | 129 | V(int, tmp) = a - data - 1 + c; \ |
130 | c = (tmp >= 0) ? 1 : 0; \ | 130 | c = (tmp >= 0) ? 1 : 0; \ |
131 | vdi &= D_FLAG | I_FLAG; \ | 131 | vdi &= D_FLAG | I_FLAG; \ |
132 | if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ | 132 | if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ |
133 | vdi += V_FLAG; \ | 133 | vdi += V_FLAG; \ |
134 | nz = a = tmp & 0xff; \ | 134 | nz = a = tmp & 0xff; \ |
135 | } \ | 135 | } \ |
136 | else { \ | 136 | else { \ |
137 | /* decimal mode */ \ | 137 | /* decimal mode */ \ |
138 | V(int, tmp) = a - data - 1 + c; \ | 138 | V(int, tmp) = a - data - 1 + c; \ |
139 | V(int, al) = (a & 0x0f) - (data & 0x0f) - 1 + c; \ | 139 | V(int, al) = (a & 0x0f) - (data & 0x0f) - 1 + c; \ |
140 | V(int, ah) = (a >> 4) - (data >> 4); \ | 140 | V(int, ah) = (a >> 4) - (data >> 4); \ |
141 | if ((al & 0x10) != 0) { \ | 141 | if ((al & 0x10) != 0) { \ |
142 | al -= 6; \ | 142 | al -= 6; \ |
143 | ah--; \ | 143 | ah--; \ |
144 | } \ | 144 | } \ |
145 | if ((ah & 0x10) != 0) \ | 145 | if ((ah & 0x10) != 0) \ |
146 | ah -= 6; \ | 146 | ah -= 6; \ |
147 | c = tmp >= 0 ? 1 : 0; \ | 147 | c = tmp >= 0 ? 1 : 0; \ |
148 | vdi &= D_FLAG | I_FLAG; \ | 148 | vdi &= D_FLAG | I_FLAG; \ |
149 | if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ | 149 | if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ |
150 | vdi += V_FLAG; \ | 150 | vdi += V_FLAG; \ |
151 | nz = tmp & 0xff; \ | 151 | nz = tmp & 0xff; \ |
152 | a = ((ah & 0xf) << 4) + (al & 0x0f); \ | 152 | a = ((ah & 0xf) << 4) + (al & 0x0f); \ |
153 | } | 153 | } |
154 | 154 | ||
155 | #endif /* ACPU_NO_DECIMAL */ | 155 | #endif /* ACPU_NO_DECIMAL */ |
156 | 156 | ||
@@ -239,1068 +239,1068 @@ END_CONST_ARRAY; | |||
239 | #define INS_ZP INC_ZP; data = nz; DO_SBC | 239 | #define INS_ZP INC_ZP; data = nz; DO_SBC |
240 | 240 | ||
241 | #define BRANCH(cond) \ | 241 | #define BRANCH(cond) \ |
242 | if (cond) { \ | 242 | if (cond) { \ |
243 | addr = SBYTE(PEEK); \ | 243 | addr = SBYTE(PEEK); \ |
244 | pc++; \ | 244 | pc++; \ |
245 | addr += pc; \ | 245 | addr += pc; \ |
246 | if ((addr ^ pc) >> 8 != 0) \ | 246 | if ((addr ^ pc) >> 8 != 0) \ |
247 | ast _ cycle++; \ | 247 | ast _ cycle++; \ |
248 | ast _ cycle++; \ | 248 | ast _ cycle++; \ |
249 | pc = addr; \ | 249 | pc = addr; \ |
250 | break; \ | 250 | break; \ |
251 | } \ | 251 | } \ |
252 | pc++; \ | 252 | pc++; \ |
253 | break | 253 | break |
254 | 254 | ||
255 | #define CHECK_IRQ \ | 255 | #define CHECK_IRQ \ |
256 | if ((vdi & I_FLAG) == 0 && ast _ irqst != 0xff) { \ | 256 | if ((vdi & I_FLAG) == 0 && ast _ irqst != 0xff) { \ |
257 | PHPC; \ | 257 | PHPC; \ |
258 | PHPB0; \ | 258 | PHPB0; \ |
259 | vdi |= I_FLAG; \ | 259 | vdi |= I_FLAG; \ |
260 | pc = dGetWord(0xfffe); \ | 260 | pc = dGetWord(0xfffe); \ |
261 | ast _ cycle += 7; \ | 261 | ast _ cycle += 7; \ |
262 | } | 262 | } |
263 | 263 | ||
264 | /* Runs 6502 emulation for the specified number of Atari scanlines. | 264 | /* Runs 6502 emulation for the specified number of Atari scanlines. |
265 | Each scanline is 114 cycles of which 9 is taken by ANTIC for memory refresh. */ | 265 | Each scanline is 114 cycles of which 9 is taken by ANTIC for memory refresh. */ |
266 | FUNC(void, Cpu_RunScanlines, (P(ASAP_State PTR, ast), P(int, scanlines))) | 266 | FUNC(void, Cpu_RunScanlines, (P(ASAP_State PTR, ast), P(int, scanlines))) |
267 | { | 267 | { |
268 | /* copy registers from ASAP_State to local variables for improved performance */ | 268 | /* copy registers from ASAP_State to local variables for improved performance */ |
269 | V(int, pc); | 269 | V(int, pc); |
270 | V(int, nz); | 270 | V(int, nz); |
271 | V(int, a); | 271 | V(int, a); |
272 | V(int, x); | 272 | V(int, x); |
273 | V(int, y); | 273 | V(int, y); |
274 | V(int, c); | 274 | V(int, c); |
275 | V(int, s); | 275 | V(int, s); |
276 | V(int, vdi); | 276 | V(int, vdi); |
277 | V(int, next_event_cycle); | 277 | V(int, next_event_cycle); |
278 | V(int, cycle_limit); | 278 | V(int, cycle_limit); |
279 | pc = ast _ cpu_pc; | 279 | pc = ast _ cpu_pc; |
280 | nz = ast _ cpu_nz; | 280 | nz = ast _ cpu_nz; |
281 | a = ast _ cpu_a; | 281 | a = ast _ cpu_a; |
282 | x = ast _ cpu_x; | 282 | x = ast _ cpu_x; |
283 | y = ast _ cpu_y; | 283 | y = ast _ cpu_y; |
284 | c = ast _ cpu_c; | 284 | c = ast _ cpu_c; |
285 | s = ast _ cpu_s; | 285 | s = ast _ cpu_s; |
286 | vdi = ast _ cpu_vdi; | 286 | vdi = ast _ cpu_vdi; |
287 | ast _ next_scanline_cycle = 114; | 287 | ast _ next_scanline_cycle = 114; |
288 | next_event_cycle = 114; | 288 | next_event_cycle = 114; |
289 | cycle_limit = 114 * scanlines; | 289 | cycle_limit = 114 * scanlines; |
290 | if (next_event_cycle > ast _ timer1_cycle) | 290 | if (next_event_cycle > ast _ timer1_cycle) |
291 | next_event_cycle = ast _ timer1_cycle; | 291 | next_event_cycle = ast _ timer1_cycle; |
292 | if (next_event_cycle > ast _ timer2_cycle) | 292 | if (next_event_cycle > ast _ timer2_cycle) |
293 | next_event_cycle = ast _ timer2_cycle; | 293 | next_event_cycle = ast _ timer2_cycle; |
294 | if (next_event_cycle > ast _ timer4_cycle) | 294 | if (next_event_cycle > ast _ timer4_cycle) |
295 | next_event_cycle = ast _ timer4_cycle; | 295 | next_event_cycle = ast _ timer4_cycle; |
296 | ast _ nearest_event_cycle = next_event_cycle; | 296 | ast _ nearest_event_cycle = next_event_cycle; |
297 | for (;;) { | 297 | for (;;) { |
298 | V(int, cycle); | 298 | V(int, cycle); |
299 | V(int, addr); | 299 | V(int, addr); |
300 | V(int, data); | 300 | V(int, data); |
301 | cycle = ast _ cycle; | 301 | cycle = ast _ cycle; |
302 | if (cycle >= ast _ nearest_event_cycle) { | 302 | if (cycle >= ast _ nearest_event_cycle) { |
303 | if (cycle >= ast _ next_scanline_cycle) { | 303 | if (cycle >= ast _ next_scanline_cycle) { |
304 | if (++ast _ scanline_number == 312) | 304 | if (++ast _ scanline_number == 312) |
305 | ast _ scanline_number = 0; | 305 | ast _ scanline_number = 0; |
306 | ast _ cycle = cycle += 9; | 306 | ast _ cycle = cycle += 9; |
307 | ast _ next_scanline_cycle += 114; | 307 | ast _ next_scanline_cycle += 114; |
308 | if (--scanlines <= 0) | 308 | if (--scanlines <= 0) |
309 | break; | 309 | break; |
310 | } | 310 | } |
311 | next_event_cycle = ast _ next_scanline_cycle; | 311 | next_event_cycle = ast _ next_scanline_cycle; |
312 | #define CHECK_TIMER_IRQ(ch) \ | 312 | #define CHECK_TIMER_IRQ(ch) \ |
313 | if (cycle >= ast _ timer##ch##_cycle) { \ | 313 | if (cycle >= ast _ timer##ch##_cycle) { \ |
314 | ast _ irqst &= ~ch; \ | 314 | ast _ irqst &= ~ch; \ |
315 | ast _ timer##ch##_cycle = NEVER; \ | 315 | ast _ timer##ch##_cycle = NEVER; \ |
316 | } \ | 316 | } \ |
317 | else if (next_event_cycle > ast _ timer##ch##_cycle) \ | 317 | else if (next_event_cycle > ast _ timer##ch##_cycle) \ |
318 | next_event_cycle = ast _ timer##ch##_cycle; | 318 | next_event_cycle = ast _ timer##ch##_cycle; |
319 | CHECK_TIMER_IRQ(1); | 319 | CHECK_TIMER_IRQ(1); |
320 | CHECK_TIMER_IRQ(2); | 320 | CHECK_TIMER_IRQ(2); |
321 | CHECK_TIMER_IRQ(4); | 321 | CHECK_TIMER_IRQ(4); |
322 | ast _ nearest_event_cycle = next_event_cycle; | 322 | ast _ nearest_event_cycle = next_event_cycle; |
323 | CHECK_IRQ; | 323 | CHECK_IRQ; |
324 | } | 324 | } |
325 | #ifdef ASAPSCAN | 325 | #ifdef ASAPSCAN |
326 | if (cpu_trace != 0) | 326 | if (cpu_trace != 0) |
327 | trace_cpu(ast, pc, a, x, y, s, nz, vdi, c); | 327 | trace_cpu(ast, pc, a, x, y, s, nz, vdi, c); |
328 | #endif | 328 | #endif |
329 | data = FETCH; | 329 | data = FETCH; |
330 | ast _ cycle += opcode_cycles[data]; | 330 | ast _ cycle += opcode_cycles[data]; |
331 | switch (data) { | 331 | switch (data) { |
332 | case 0x00: /* BRK */ | 332 | case 0x00: /* BRK */ |
333 | pc++; | 333 | pc++; |
334 | PHPC; | 334 | PHPC; |
335 | PHPB1; | 335 | PHPB1; |
336 | vdi |= I_FLAG; | 336 | vdi |= I_FLAG; |
337 | pc = dGetWord(0xfffe); | 337 | pc = dGetWord(0xfffe); |
338 | break; | 338 | break; |
339 | case 0x01: /* ORA (ab,x) */ | 339 | case 0x01: /* ORA (ab,x) */ |
340 | INDIRECT_X; | 340 | INDIRECT_X; |
341 | ORA; | 341 | ORA; |
342 | break; | 342 | break; |
343 | case 0x02: /* CIM [unofficial] */ | 343 | case 0x02: /* CIM [unofficial] */ |
344 | case 0x12: | 344 | case 0x12: |
345 | case 0x22: | 345 | case 0x22: |
346 | case 0x32: | 346 | case 0x32: |
347 | case 0x42: | 347 | case 0x42: |
348 | case 0x52: | 348 | case 0x52: |
349 | case 0x62: | 349 | case 0x62: |
350 | case 0x72: | 350 | case 0x72: |
351 | case 0x92: | 351 | case 0x92: |
352 | case 0xb2: | 352 | case 0xb2: |
353 | case 0xd2: | 353 | case 0xd2: |
354 | case 0xf2: | 354 | case 0xf2: |
355 | ast _ scanline_number = (ast _ scanline_number + scanlines - 1) % 312; | 355 | ast _ scanline_number = (ast _ scanline_number + scanlines - 1) % 312; |
356 | scanlines = 1; | 356 | scanlines = 1; |
357 | ast _ cycle = cycle_limit; | 357 | ast _ cycle = cycle_limit; |
358 | break; | 358 | break; |
359 | #ifndef ACPU_NO_UNOFFICIAL | 359 | #ifndef ACPU_NO_UNOFFICIAL |
360 | case 0x03: /* ASO (ab,x) [unofficial] */ | 360 | case 0x03: /* ASO (ab,x) [unofficial] */ |
361 | INDIRECT_X; | 361 | INDIRECT_X; |
362 | ASO; | 362 | ASO; |
363 | break; | 363 | break; |
364 | case 0x04: /* NOP ab [unofficial] */ | 364 | case 0x04: /* NOP ab [unofficial] */ |
365 | case 0x44: | 365 | case 0x44: |
366 | case 0x64: | 366 | case 0x64: |
367 | case 0x14: /* NOP ab,x [unofficial] */ | 367 | case 0x14: /* NOP ab,x [unofficial] */ |
368 | case 0x34: | 368 | case 0x34: |
369 | case 0x54: | 369 | case 0x54: |
370 | case 0x74: | 370 | case 0x74: |
371 | case 0xd4: | 371 | case 0xd4: |
372 | case 0xf4: | 372 | case 0xf4: |
373 | case 0x80: /* NOP #ab [unofficial] */ | 373 | case 0x80: /* NOP #ab [unofficial] */ |
374 | case 0x82: | 374 | case 0x82: |
375 | case 0x89: | 375 | case 0x89: |
376 | case 0xc2: | 376 | case 0xc2: |
377 | case 0xe2: | 377 | case 0xe2: |
378 | pc++; | 378 | pc++; |
379 | break; | 379 | break; |
380 | case 0x07: /* ASO ab [unofficial] */ | 380 | case 0x07: /* ASO ab [unofficial] */ |
381 | ZPAGE; | 381 | ZPAGE; |
382 | ASO_ZP; | 382 | ASO_ZP; |
383 | break; | 383 | break; |
384 | case 0x0b: /* ANC #ab [unofficial] */ | 384 | case 0x0b: /* ANC #ab [unofficial] */ |
385 | case 0x2b: | 385 | case 0x2b: |
386 | nz = a &= FETCH; | 386 | nz = a &= FETCH; |
387 | c = nz >> 7; | 387 | c = nz >> 7; |
388 | break; | 388 | break; |
389 | case 0x0c: /* NOP abcd [unofficial] */ | 389 | case 0x0c: /* NOP abcd [unofficial] */ |
390 | pc += 2; | 390 | pc += 2; |
391 | break; | 391 | break; |
392 | case 0x0f: /* ASO abcd [unofficial] */ | 392 | case 0x0f: /* ASO abcd [unofficial] */ |
393 | ABSOLUTE; | 393 | ABSOLUTE; |
394 | ASO; | 394 | ASO; |
395 | break; | 395 | break; |
396 | case 0x13: /* ASO (ab),y [unofficial] */ | 396 | case 0x13: /* ASO (ab),y [unofficial] */ |
397 | INDIRECT_Y; | 397 | INDIRECT_Y; |
398 | ASO; | 398 | ASO; |
399 | break; | 399 | break; |
400 | case 0x17: /* ASO ab,x [unofficial] */ | 400 | case 0x17: /* ASO ab,x [unofficial] */ |
401 | ZPAGE_X; | 401 | ZPAGE_X; |
402 | ASO_ZP; | 402 | ASO_ZP; |
403 | break; | 403 | break; |
404 | case 0x1b: /* ASO abcd,y [unofficial] */ | 404 | case 0x1b: /* ASO abcd,y [unofficial] */ |
405 | ABSOLUTE_Y; | 405 | ABSOLUTE_Y; |
406 | ASO; | 406 | ASO; |
407 | break; | 407 | break; |
408 | case 0x1c: /* NOP abcd,x [unofficial] */ | 408 | case 0x1c: /* NOP abcd,x [unofficial] */ |
409 | case 0x3c: | 409 | case 0x3c: |
410 | case 0x5c: | 410 | case 0x5c: |
411 | case 0x7c: | 411 | case 0x7c: |
412 | case 0xdc: | 412 | case 0xdc: |
413 | case 0xfc: | 413 | case 0xfc: |
414 | if (FETCH + x >= 0x100) | 414 | if (FETCH + x >= 0x100) |
415 | ast _ cycle++; | 415 | ast _ cycle++; |
416 | pc++; | 416 | pc++; |
417 | break; | 417 | break; |
418 | case 0x1f: /* ASO abcd,x [unofficial] */ | 418 | case 0x1f: /* ASO abcd,x [unofficial] */ |
419 | ABSOLUTE_X; | 419 | ABSOLUTE_X; |
420 | ASO; | 420 | ASO; |
421 | break; | 421 | break; |
422 | case 0x23: /* RLA (ab,x) [unofficial] */ | 422 | case 0x23: /* RLA (ab,x) [unofficial] */ |
423 | INDIRECT_X; | 423 | INDIRECT_X; |
424 | RLA; | 424 | RLA; |
425 | break; | 425 | break; |
426 | case 0x27: /* RLA ab [unofficial] */ | 426 | case 0x27: /* RLA ab [unofficial] */ |
427 | ZPAGE; | 427 | ZPAGE; |
428 | RLA_ZP; | 428 | RLA_ZP; |
429 | break; | 429 | break; |
430 | case 0x2f: /* RLA abcd [unofficial] */ | 430 | case 0x2f: /* RLA abcd [unofficial] */ |
431 | ABSOLUTE; | 431 | ABSOLUTE; |
432 | RLA; | 432 | RLA; |
433 | break; | 433 | break; |
434 | case 0x33: /* RLA (ab),y [unofficial] */ | 434 | case 0x33: /* RLA (ab),y [unofficial] */ |
435 | INDIRECT_Y; | 435 | INDIRECT_Y; |
436 | RLA; | 436 | RLA; |
437 | break; | 437 | break; |
438 | case 0x37: /* RLA ab,x [unofficial] */ | 438 | case 0x37: /* RLA ab,x [unofficial] */ |
439 | ZPAGE_X; | 439 | ZPAGE_X; |
440 | RLA_ZP; | 440 | RLA_ZP; |
441 | break; | 441 | break; |
442 | case 0x3b: /* RLA abcd,y [unofficial] */ | 442 | case 0x3b: /* RLA abcd,y [unofficial] */ |
443 | ABSOLUTE_Y; | 443 | ABSOLUTE_Y; |
444 | RLA; | 444 | RLA; |
445 | break; | 445 | break; |
446 | case 0x3f: /* RLA abcd,x [unofficial] */ | 446 | case 0x3f: /* RLA abcd,x [unofficial] */ |
447 | ABSOLUTE_X; | 447 | ABSOLUTE_X; |
448 | RLA; | 448 | RLA; |
449 | break; | 449 | break; |
450 | case 0x43: /* LSE (ab,x) [unofficial] */ | 450 | case 0x43: /* LSE (ab,x) [unofficial] */ |
451 | INDIRECT_X; | 451 | INDIRECT_X; |
452 | LSE; | 452 | LSE; |
453 | break; | 453 | break; |
454 | case 0x47: /* LSE ab [unofficial] */ | 454 | case 0x47: /* LSE ab [unofficial] */ |
455 | ZPAGE; | 455 | ZPAGE; |
456 | LSE_ZP; | 456 | LSE_ZP; |
457 | break; | 457 | break; |
458 | case 0x4b: /* ALR #ab [unofficial] */ | 458 | case 0x4b: /* ALR #ab [unofficial] */ |
459 | a &= FETCH; | 459 | a &= FETCH; |
460 | c = a & 1; | 460 | c = a & 1; |
461 | nz = a >>= 1; | 461 | nz = a >>= 1; |
462 | break; | 462 | break; |
463 | case 0x4f: /* LSE abcd [unofficial] */ | 463 | case 0x4f: /* LSE abcd [unofficial] */ |
464 | ABSOLUTE; | 464 | ABSOLUTE; |
465 | LSE; | 465 | LSE; |
466 | break; | 466 | break; |
467 | case 0x53: /* LSE (ab),y [unofficial] */ | 467 | case 0x53: /* LSE (ab),y [unofficial] */ |
468 | INDIRECT_Y; | 468 | INDIRECT_Y; |
469 | LSE; | 469 | LSE; |
470 | break; | 470 | break; |
471 | case 0x57: /* LSE ab,x [unofficial] */ | 471 | case 0x57: /* LSE ab,x [unofficial] */ |
472 | ZPAGE_X; | 472 | ZPAGE_X; |
473 | LSE_ZP; | 473 | LSE_ZP; |
474 | break; | 474 | break; |
475 | case 0x5b: /* LSE abcd,y [unofficial] */ | 475 | case 0x5b: /* LSE abcd,y [unofficial] */ |
476 | ABSOLUTE_Y; | 476 | ABSOLUTE_Y; |
477 | LSE; | 477 | LSE; |
478 | break; | 478 | break; |
479 | case 0x5f: /* LSE abcd,x [unofficial] */ | 479 | case 0x5f: /* LSE abcd,x [unofficial] */ |
480 | ABSOLUTE_X; | 480 | ABSOLUTE_X; |
481 | LSE; | 481 | LSE; |
482 | break; | 482 | break; |
483 | case 0x63: /* RRA (ab,x) [unofficial] */ | 483 | case 0x63: /* RRA (ab,x) [unofficial] */ |
484 | INDIRECT_X; | 484 | INDIRECT_X; |
485 | RRA; | 485 | RRA; |
486 | break; | 486 | break; |
487 | case 0x67: /* RRA ab [unofficial] */ | 487 | case 0x67: /* RRA ab [unofficial] */ |
488 | ZPAGE; | 488 | ZPAGE; |
489 | RRA_ZP; | 489 | RRA_ZP; |
490 | break; | 490 | break; |
491 | case 0x6b: /* ARR #ab [unofficial] */ | 491 | case 0x6b: /* ARR #ab [unofficial] */ |
492 | data = a & FETCH; | 492 | data = a & FETCH; |
493 | nz = a = (data >> 1) + (c << 7); | 493 | nz = a = (data >> 1) + (c << 7); |
494 | vdi = (vdi & (D_FLAG | I_FLAG)) + ((a ^ data) & V_FLAG); | 494 | vdi = (vdi & (D_FLAG | I_FLAG)) + ((a ^ data) & V_FLAG); |
495 | #ifdef ACPU_NO_DECIMAL | 495 | #ifdef ACPU_NO_DECIMAL |
496 | c = data >> 7; | 496 | c = data >> 7; |
497 | #else | 497 | #else |
498 | if ((vdi & D_FLAG) == 0) | 498 | if ((vdi & D_FLAG) == 0) |
499 | c = data >> 7; | 499 | c = data >> 7; |
500 | else { | 500 | else { |
501 | if ((data & 0xf) >= 5) | 501 | if ((data & 0xf) >= 5) |
502 | a = (a & 0xf0) + ((a + 6) & 0xf); | 502 | a = (a & 0xf0) + ((a + 6) & 0xf); |
503 | if (data >= 0x50) { | 503 | if (data >= 0x50) { |
504 | a = (a + 0x60) & 0xff; | 504 | a = (a + 0x60) & 0xff; |
505 | c = 1; | 505 | c = 1; |
506 | } | 506 | } |
507 | else | 507 | else |
508 | c = 0; | 508 | c = 0; |
509 | } | 509 | } |
510 | #endif | 510 | #endif |
511 | break; | 511 | break; |
512 | case 0x6f: /* RRA abcd [unofficial] */ | 512 | case 0x6f: /* RRA abcd [unofficial] */ |
513 | ABSOLUTE; | 513 | ABSOLUTE; |
514 | RRA; | 514 | RRA; |
515 | break; | 515 | break; |
516 | case 0x73: /* RRA (ab),y [unofficial] */ | 516 | case 0x73: /* RRA (ab),y [unofficial] */ |
517 | INDIRECT_Y; | 517 | INDIRECT_Y; |
518 | RRA; | 518 | RRA; |
519 | break; | 519 | break; |
520 | case 0x77: /* RRA ab,x [unofficial] */ | 520 | case 0x77: /* RRA ab,x [unofficial] */ |
521 | ZPAGE_X; | 521 | ZPAGE_X; |
522 | RRA_ZP; | 522 | RRA_ZP; |
523 | break; | 523 | break; |
524 | case 0x7b: /* RRA abcd,y [unofficial] */ | 524 | case 0x7b: /* RRA abcd,y [unofficial] */ |
525 | ABSOLUTE_Y; | 525 | ABSOLUTE_Y; |
526 | RRA; | 526 | RRA; |
527 | break; | 527 | break; |
528 | case 0x7f: /* RRA abcd,x [unofficial] */ | 528 | case 0x7f: /* RRA abcd,x [unofficial] */ |
529 | ABSOLUTE_X; | 529 | ABSOLUTE_X; |
530 | RRA; | 530 | RRA; |
531 | break; | 531 | break; |
532 | case 0x83: /* SAX (ab,x) [unofficial] */ | 532 | case 0x83: /* SAX (ab,x) [unofficial] */ |
533 | INDIRECT_X; | 533 | INDIRECT_X; |
534 | SAX; | 534 | SAX; |
535 | break; | 535 | break; |
536 | case 0x87: /* SAX ab [unofficial] */ | 536 | case 0x87: /* SAX ab [unofficial] */ |
537 | ZPAGE; | 537 | ZPAGE; |
538 | SAX_ZP; | 538 | SAX_ZP; |
539 | break; | 539 | break; |
540 | case 0x8b: /* ANE #ab [unofficial] */ | 540 | case 0x8b: /* ANE #ab [unofficial] */ |
541 | data = FETCH; | 541 | data = FETCH; |
542 | a &= x; | 542 | a &= x; |
543 | nz = a & data; | 543 | nz = a & data; |
544 | a &= data | 0xef; | 544 | a &= data | 0xef; |
545 | break; | 545 | break; |
546 | case 0x8f: /* SAX abcd [unofficial] */ | 546 | case 0x8f: /* SAX abcd [unofficial] */ |
547 | ABSOLUTE; | 547 | ABSOLUTE; |
548 | SAX; | 548 | SAX; |
549 | break; | 549 | break; |
550 | case 0x93: /* SHA (ab),y [unofficial, unstable] */ | 550 | case 0x93: /* SHA (ab),y [unofficial, unstable] */ |
551 | ZPAGE; | 551 | ZPAGE; |
552 | data = zGetByte(addr + 1); | 552 | data = zGetByte(addr + 1); |
553 | addr = (dGetByte(addr) + (data << 8) + y) & 0xffff; | 553 | addr = (dGetByte(addr) + (data << 8) + y) & 0xffff; |
554 | data = a & x & (data + 1); | 554 | data = a & x & (data + 1); |
555 | PutByte(addr, data); | 555 | PutByte(addr, data); |
556 | break; | 556 | break; |
557 | case 0x97: /* SAX ab,y [unofficial] */ | 557 | case 0x97: /* SAX ab,y [unofficial] */ |
558 | ZPAGE_Y; | 558 | ZPAGE_Y; |
559 | SAX_ZP; | 559 | SAX_ZP; |
560 | break; | 560 | break; |
561 | case 0x9b: /* SHS abcd,y [unofficial, unstable] */ | 561 | case 0x9b: /* SHS abcd,y [unofficial, unstable] */ |
562 | /* S seems to be stable, only memory values vary */ | 562 | /* S seems to be stable, only memory values vary */ |
563 | addr = FETCH; | 563 | addr = FETCH; |
564 | data = FETCH; | 564 | data = FETCH; |
565 | addr = (addr + (data << 8) + y) & 0xffff; | 565 | addr = (addr + (data << 8) + y) & 0xffff; |
566 | s = a & x; | 566 | s = a & x; |
567 | data = s & (data + 1); | 567 | data = s & (data + 1); |
568 | PutByte(addr, data); | 568 | PutByte(addr, data); |
569 | break; | 569 | break; |
570 | case 0x9c: /* SHY abcd,x [unofficial] */ | 570 | case 0x9c: /* SHY abcd,x [unofficial] */ |
571 | addr = FETCH; | 571 | addr = FETCH; |
572 | data = FETCH; | 572 | data = FETCH; |
573 | addr = (addr + (data << 8) + x) & 0xffff; | 573 | addr = (addr + (data << 8) + x) & 0xffff; |
574 | data = y & (data + 1); | 574 | data = y & (data + 1); |
575 | PutByte(addr, data); | 575 | PutByte(addr, data); |
576 | break; | 576 | break; |
577 | case 0x9e: /* SHX abcd,y [unofficial] */ | 577 | case 0x9e: /* SHX abcd,y [unofficial] */ |
578 | addr = FETCH; | 578 | addr = FETCH; |
579 | data = FETCH; | 579 | data = FETCH; |
580 | addr = (addr + (data << 8) + y) & 0xffff; | 580 | addr = (addr + (data << 8) + y) & 0xffff; |
581 | data = x & (data + 1); | 581 | data = x & (data + 1); |
582 | PutByte(addr, data); | 582 | PutByte(addr, data); |
583 | break; | 583 | break; |
584 | case 0x9f: /* SHA abcd,y [unofficial, unstable] */ | 584 | case 0x9f: /* SHA abcd,y [unofficial, unstable] */ |
585 | addr = FETCH; | 585 | addr = FETCH; |
586 | data = FETCH; | 586 | data = FETCH; |
587 | addr = (addr + (data << 8) + y) & 0xffff; | 587 | addr = (addr + (data << 8) + y) & 0xffff; |
588 | data = a & x & (data + 1); | 588 | data = a & x & (data + 1); |
589 | PutByte(addr, data); | 589 | PutByte(addr, data); |
590 | break; | 590 | break; |
591 | case 0xa3: /* LAX (ab,x) [unofficial] */ | 591 | case 0xa3: /* LAX (ab,x) [unofficial] */ |
592 | INDIRECT_X; | 592 | INDIRECT_X; |
593 | LAX; | 593 | LAX; |
594 | break; | 594 | break; |
595 | case 0xa7: /* LAX ab [unofficial] */ | 595 | case 0xa7: /* LAX ab [unofficial] */ |
596 | ZPAGE; | 596 | ZPAGE; |
597 | LAX_ZP; | 597 | LAX_ZP; |
598 | break; | 598 | break; |
599 | case 0xab: /* ANX #ab [unofficial] */ | 599 | case 0xab: /* ANX #ab [unofficial] */ |
600 | nz = x = a &= FETCH; | 600 | nz = x = a &= FETCH; |
601 | break; | 601 | break; |
602 | case 0xaf: /* LAX abcd [unofficial] */ | 602 | case 0xaf: /* LAX abcd [unofficial] */ |
603 | ABSOLUTE; | 603 | ABSOLUTE; |
604 | LAX; | 604 | LAX; |
605 | break; | 605 | break; |
606 | case 0xb3: /* LAX (ab),y [unofficial] */ | 606 | case 0xb3: /* LAX (ab),y [unofficial] */ |
607 | INDIRECT_Y; | 607 | INDIRECT_Y; |
608 | NCYCLES_Y; | 608 | NCYCLES_Y; |
609 | LAX; | 609 | LAX; |
610 | break; | 610 | break; |
611 | case 0xb7: /* LAX ab,y [unofficial] */ | 611 | case 0xb7: /* LAX ab,y [unofficial] */ |
612 | ZPAGE_Y; | 612 | ZPAGE_Y; |
613 | LAX_ZP; | 613 | LAX_ZP; |
614 | break; | 614 | break; |
615 | case 0xbb: /* LAS abcd,y [unofficial] */ | 615 | case 0xbb: /* LAS abcd,y [unofficial] */ |
616 | ABSOLUTE_Y; | 616 | ABSOLUTE_Y; |
617 | NCYCLES_Y; | 617 | NCYCLES_Y; |
618 | nz = x = a = s &= GetByte(addr); | 618 | nz = x = a = s &= GetByte(addr); |
619 | break; | 619 | break; |
620 | case 0xbf: /* LAX abcd,y [unofficial] */ | 620 | case 0xbf: /* LAX abcd,y [unofficial] */ |
621 | ABSOLUTE_Y; | 621 | ABSOLUTE_Y; |
622 | NCYCLES_Y; | 622 | NCYCLES_Y; |
623 | LAX; | 623 | LAX; |
624 | break; | 624 | break; |
625 | case 0xc3: /* DCM (ab,x) [unofficial] */ | 625 | case 0xc3: /* DCM (ab,x) [unofficial] */ |
626 | INDIRECT_X; | 626 | INDIRECT_X; |
627 | DCM; | 627 | DCM; |
628 | break; | 628 | break; |
629 | case 0xc7: /* DCM ab [unofficial] */ | 629 | case 0xc7: /* DCM ab [unofficial] */ |
630 | ZPAGE; | 630 | ZPAGE; |
631 | DCM_ZP; | 631 | DCM_ZP; |
632 | break; | 632 | break; |
633 | case 0xcb: /* SBX #ab [unofficial] */ | 633 | case 0xcb: /* SBX #ab [unofficial] */ |
634 | nz = FETCH; | 634 | nz = FETCH; |
635 | x &= a; | 635 | x &= a; |
636 | c = (x >= nz) ? 1 : 0; | 636 | c = (x >= nz) ? 1 : 0; |
637 | nz = x = (x - nz) & 0xff; | 637 | nz = x = (x - nz) & 0xff; |
638 | break; | 638 | break; |
639 | case 0xcf: /* DCM abcd [unofficial] */ | 639 | case 0xcf: /* DCM abcd [unofficial] */ |
640 | ABSOLUTE; | 640 | ABSOLUTE; |
641 | DCM; | 641 | DCM; |
642 | break; | 642 | break; |
643 | case 0xd3: /* DCM (ab),y [unofficial] */ | 643 | case 0xd3: /* DCM (ab),y [unofficial] */ |
644 | INDIRECT_Y; | 644 | INDIRECT_Y; |
645 | DCM; | 645 | DCM; |
646 | break; | 646 | break; |
647 | case 0xd7: /* DCM ab,x [unofficial] */ | 647 | case 0xd7: /* DCM ab,x [unofficial] */ |
648 | ZPAGE_X; | 648 | ZPAGE_X; |
649 | DCM_ZP; | 649 | DCM_ZP; |
650 | break; | 650 | break; |
651 | case 0xdb: /* DCM abcd,y [unofficial] */ | 651 | case 0xdb: /* DCM abcd,y [unofficial] */ |
652 | ABSOLUTE_Y; | 652 | ABSOLUTE_Y; |
653 | DCM; | 653 | DCM; |
654 | break; | 654 | break; |
655 | case 0xdf: /* DCM abcd,x [unofficial] */ | 655 | case 0xdf: /* DCM abcd,x [unofficial] */ |
656 | ABSOLUTE_X; | 656 | ABSOLUTE_X; |
657 | DCM; | 657 | DCM; |
658 | break; | 658 | break; |
659 | case 0xe3: /* INS (ab,x) [unofficial] */ | 659 | case 0xe3: /* INS (ab,x) [unofficial] */ |
660 | INDIRECT_X; | 660 | INDIRECT_X; |
661 | INS; | 661 | INS; |
662 | break; | 662 | break; |
663 | case 0xe7: /* INS ab [unofficial] */ | 663 | case 0xe7: /* INS ab [unofficial] */ |
664 | ZPAGE; | 664 | ZPAGE; |
665 | INS_ZP; | 665 | INS_ZP; |
666 | break; | 666 | break; |
667 | case 0xef: /* INS abcd [unofficial] */ | 667 | case 0xef: /* INS abcd [unofficial] */ |
668 | ABSOLUTE; | 668 | ABSOLUTE; |
669 | INS; | 669 | INS; |
670 | break; | 670 | break; |
671 | case 0xf3: /* INS (ab),y [unofficial] */ | 671 | case 0xf3: /* INS (ab),y [unofficial] */ |
672 | INDIRECT_Y; | 672 | INDIRECT_Y; |
673 | INS; | 673 | INS; |
674 | break; | 674 | break; |
675 | case 0xf7: /* INS ab,x [unofficial] */ | 675 | case 0xf7: /* INS ab,x [unofficial] */ |
676 | ZPAGE_X; | 676 | ZPAGE_X; |
677 | INS_ZP; | 677 | INS_ZP; |
678 | break; | 678 | break; |
679 | case 0xfb: /* INS abcd,y [unofficial] */ | 679 | case 0xfb: /* INS abcd,y [unofficial] */ |
680 | ABSOLUTE_Y; | 680 | ABSOLUTE_Y; |
681 | INS; | 681 | INS; |
682 | break; | 682 | break; |
683 | case 0xff: /* INS abcd,x [unofficial] */ | 683 | case 0xff: /* INS abcd,x [unofficial] */ |
684 | ABSOLUTE_X; | 684 | ABSOLUTE_X; |
685 | INS; | 685 | INS; |
686 | break; | 686 | break; |
687 | #endif /* ACPU_NO_UNOFFICIAL */ | 687 | #endif /* ACPU_NO_UNOFFICIAL */ |
688 | case 0x05: /* ORA ab */ | 688 | case 0x05: /* ORA ab */ |
689 | ZPAGE; | 689 | ZPAGE; |
690 | ORA_ZP; | 690 | ORA_ZP; |
691 | break; | 691 | break; |
692 | case 0x06: /* ASL ab */ | 692 | case 0x06: /* ASL ab */ |
693 | ZPAGE; | 693 | ZPAGE; |
694 | ASL_ZP; | 694 | ASL_ZP; |
695 | break; | 695 | break; |
696 | case 0x08: /* PHP */ | 696 | case 0x08: /* PHP */ |
697 | PHPB1; | 697 | PHPB1; |
698 | break; | 698 | break; |
699 | case 0x09: /* ORA #ab */ | 699 | case 0x09: /* ORA #ab */ |
700 | nz = a |= FETCH; | 700 | nz = a |= FETCH; |
701 | break; | 701 | break; |
702 | case 0x0a: /* ASL */ | 702 | case 0x0a: /* ASL */ |
703 | c = a >> 7; | 703 | c = a >> 7; |
704 | nz = a = (a << 1) & 0xff; | 704 | nz = a = (a << 1) & 0xff; |
705 | break; | 705 | break; |
706 | case 0x0d: /* ORA abcd */ | 706 | case 0x0d: /* ORA abcd */ |
707 | ABSOLUTE; | 707 | ABSOLUTE; |
708 | ORA; | 708 | ORA; |
709 | break; | 709 | break; |
710 | case 0x0e: /* ASL abcd */ | 710 | case 0x0e: /* ASL abcd */ |
711 | ABSOLUTE; | 711 | ABSOLUTE; |
712 | ASL; | 712 | ASL; |
713 | break; | 713 | break; |
714 | case 0x10: /* BPL */ | 714 | case 0x10: /* BPL */ |
715 | BRANCH(nz < 0x80); | 715 | BRANCH(nz < 0x80); |
716 | case 0x11: /* ORA (ab),y */ | 716 | case 0x11: /* ORA (ab),y */ |
717 | INDIRECT_Y; | 717 | INDIRECT_Y; |
718 | NCYCLES_Y; | 718 | NCYCLES_Y; |
719 | ORA; | 719 | ORA; |
720 | break; | 720 | break; |
721 | case 0x15: /* ORA ab,x */ | 721 | case 0x15: /* ORA ab,x */ |
722 | ZPAGE_X; | 722 | ZPAGE_X; |
723 | ORA_ZP; | 723 | ORA_ZP; |
724 | break; | 724 | break; |
725 | case 0x16: /* ASL ab,x */ | 725 | case 0x16: /* ASL ab,x */ |
726 | ZPAGE_X; | 726 | ZPAGE_X; |
727 | ASL_ZP; | 727 | ASL_ZP; |
728 | break; | 728 | break; |
729 | case 0x18: /* CLC */ | 729 | case 0x18: /* CLC */ |
730 | c = 0; | 730 | c = 0; |
731 | break; | 731 | break; |
732 | case 0x19: /* ORA abcd,y */ | 732 | case 0x19: /* ORA abcd,y */ |
733 | ABSOLUTE_Y; | 733 | ABSOLUTE_Y; |
734 | NCYCLES_Y; | 734 | NCYCLES_Y; |
735 | ORA; | 735 | ORA; |
736 | break; | 736 | break; |
737 | case 0x1d: /* ORA abcd,x */ | 737 | case 0x1d: /* ORA abcd,x */ |
738 | ABSOLUTE_X; | 738 | ABSOLUTE_X; |
739 | NCYCLES_X; | 739 | NCYCLES_X; |
740 | ORA; | 740 | ORA; |
741 | break; | 741 | break; |
742 | case 0x1e: /* ASL abcd,x */ | 742 | case 0x1e: /* ASL abcd,x */ |
743 | ABSOLUTE_X; | 743 | ABSOLUTE_X; |
744 | ASL; | 744 | ASL; |
745 | break; | 745 | break; |
746 | case 0x20: /* JSR abcd */ | 746 | case 0x20: /* JSR abcd */ |
747 | addr = FETCH; | 747 | addr = FETCH; |
748 | PHPC; | 748 | PHPC; |
749 | pc = addr + (PEEK << 8); | 749 | pc = addr + (PEEK << 8); |
750 | break; | 750 | break; |
751 | case 0x21: /* AND (ab,x) */ | 751 | case 0x21: /* AND (ab,x) */ |
752 | INDIRECT_X; | 752 | INDIRECT_X; |
753 | AND; | 753 | AND; |
754 | break; | 754 | break; |
755 | case 0x24: /* BIT ab */ | 755 | case 0x24: /* BIT ab */ |
756 | ZPAGE; | 756 | ZPAGE; |
757 | nz = dGetByte(addr); | 757 | nz = dGetByte(addr); |
758 | vdi = (vdi & (D_FLAG | I_FLAG)) + (nz & V_FLAG); | 758 | vdi = (vdi & (D_FLAG | I_FLAG)) + (nz & V_FLAG); |
759 | nz = ((nz & 0x80) << 1) + (nz & a); | 759 | nz = ((nz & 0x80) << 1) + (nz & a); |
760 | break; | 760 | break; |
761 | case 0x25: /* AND ab */ | 761 | case 0x25: /* AND ab */ |
762 | ZPAGE; | 762 | ZPAGE; |
763 | AND_ZP; | 763 | AND_ZP; |
764 | break; | 764 | break; |
765 | case 0x26: /* ROL ab */ | 765 | case 0x26: /* ROL ab */ |
766 | ZPAGE; | 766 | ZPAGE; |
767 | ROL_ZP; | 767 | ROL_ZP; |
768 | break; | 768 | break; |
769 | case 0x28: /* PLP */ | 769 | case 0x28: /* PLP */ |
770 | PLP; | 770 | PLP; |
771 | CHECK_IRQ; | 771 | CHECK_IRQ; |
772 | break; | 772 | break; |
773 | case 0x29: /* AND #ab */ | 773 | case 0x29: /* AND #ab */ |
774 | nz = a &= FETCH; | 774 | nz = a &= FETCH; |
775 | break; | 775 | break; |
776 | case 0x2a: /* ROL */ | 776 | case 0x2a: /* ROL */ |
777 | a = (a << 1) + c; | 777 | a = (a << 1) + c; |
778 | c = a >> 8; | 778 | c = a >> 8; |
779 | nz = a &= 0xff; | 779 | nz = a &= 0xff; |
780 | break; | 780 | break; |
781 | case 0x2c: /* BIT abcd */ | 781 | case 0x2c: /* BIT abcd */ |
782 | ABSOLUTE; | 782 | ABSOLUTE; |
783 | nz = GetByte(addr); | 783 | nz = GetByte(addr); |
784 | vdi = (vdi & (D_FLAG | I_FLAG)) + (nz & V_FLAG); | 784 | vdi = (vdi & (D_FLAG | I_FLAG)) + (nz & V_FLAG); |
785 | nz = ((nz & 0x80) << 1) + (nz & a); | 785 | nz = ((nz & 0x80) << 1) + (nz & a); |
786 | break; | 786 | break; |
787 | case 0x2d: /* AND abcd */ | 787 | case 0x2d: /* AND abcd */ |
788 | ABSOLUTE; | 788 | ABSOLUTE; |
789 | AND; | 789 | AND; |
790 | break; | 790 | break; |
791 | case 0x2e: /* ROL abcd */ | 791 | case 0x2e: /* ROL abcd */ |
792 | ABSOLUTE; | 792 | ABSOLUTE; |
793 | ROL; | 793 | ROL; |
794 | break; | 794 | break; |
795 | case 0x30: /* BMI */ | 795 | case 0x30: /* BMI */ |
796 | BRANCH(nz >= 0x80); | 796 | BRANCH(nz >= 0x80); |
797 | case 0x31: /* AND (ab),y */ | 797 | case 0x31: /* AND (ab),y */ |
798 | INDIRECT_Y; | 798 | INDIRECT_Y; |
799 | NCYCLES_Y; | 799 | NCYCLES_Y; |
800 | AND; | 800 | AND; |
801 | break; | 801 | break; |
802 | case 0x35: /* AND ab,x */ | 802 | case 0x35: /* AND ab,x */ |
803 | ZPAGE_X; | 803 | ZPAGE_X; |
804 | AND_ZP; | 804 | AND_ZP; |
805 | break; | 805 | break; |
806 | case 0x36: /* ROL ab,x */ | 806 | case 0x36: /* ROL ab,x */ |
807 | ZPAGE_X; | 807 | ZPAGE_X; |
808 | ROL_ZP; | 808 | ROL_ZP; |
809 | break; | 809 | break; |
810 | case 0x38: /* SEC */ | 810 | case 0x38: /* SEC */ |
811 | c = 1; | 811 | c = 1; |
812 | break; | 812 | break; |
813 | case 0x39: /* AND abcd,y */ | 813 | case 0x39: /* AND abcd,y */ |
814 | ABSOLUTE_Y; | 814 | ABSOLUTE_Y; |
815 | NCYCLES_Y; | 815 | NCYCLES_Y; |
816 | AND; | 816 | AND; |
817 | break; | 817 | break; |
818 | case 0x3d: /* AND abcd,x */ | 818 | case 0x3d: /* AND abcd,x */ |
819 | ABSOLUTE_X; | 819 | ABSOLUTE_X; |
820 | NCYCLES_X; | 820 | NCYCLES_X; |
821 | AND; | 821 | AND; |
822 | break; | 822 | break; |
823 | case 0x3e: /* ROL abcd,x */ | 823 | case 0x3e: /* ROL abcd,x */ |
824 | ABSOLUTE_X; | 824 | ABSOLUTE_X; |
825 | ROL; | 825 | ROL; |
826 | break; | 826 | break; |
827 | case 0x40: /* RTI */ | 827 | case 0x40: /* RTI */ |
828 | PLP; | 828 | PLP; |
829 | PL(pc); | 829 | PL(pc); |
830 | PL(addr); | 830 | PL(addr); |
831 | pc += addr << 8; | 831 | pc += addr << 8; |
832 | CHECK_IRQ; | 832 | CHECK_IRQ; |
833 | break; | 833 | break; |
834 | case 0x41: /* EOR (ab,x) */ | 834 | case 0x41: /* EOR (ab,x) */ |
835 | INDIRECT_X; | 835 | INDIRECT_X; |
836 | EOR; | 836 | EOR; |
837 | break; | 837 | break; |
838 | case 0x45: /* EOR ab */ | 838 | case 0x45: /* EOR ab */ |
839 | ZPAGE; | 839 | ZPAGE; |
840 | EOR_ZP; | 840 | EOR_ZP; |
841 | break; | 841 | break; |
842 | case 0x46: /* LSR ab */ | 842 | case 0x46: /* LSR ab */ |
843 | ZPAGE; | 843 | ZPAGE; |
844 | LSR_ZP; | 844 | LSR_ZP; |
845 | break; | 845 | break; |
846 | case 0x48: /* PHA */ | 846 | case 0x48: /* PHA */ |
847 | PH(a); | 847 | PH(a); |
848 | break; | 848 | break; |
849 | case 0x49: /* EOR #ab */ | 849 | case 0x49: /* EOR #ab */ |
850 | nz = a ^= FETCH; | 850 | nz = a ^= FETCH; |
851 | break; | 851 | break; |
852 | case 0x4a: /* LSR */ | 852 | case 0x4a: /* LSR */ |
853 | c = a & 1; | 853 | c = a & 1; |
854 | nz = a >>= 1; | 854 | nz = a >>= 1; |
855 | break; | 855 | break; |
856 | case 0x4c: /* JMP abcd */ | 856 | case 0x4c: /* JMP abcd */ |
857 | addr = FETCH; | 857 | addr = FETCH; |
858 | pc = addr + (PEEK << 8); | 858 | pc = addr + (PEEK << 8); |
859 | break; | 859 | break; |
860 | case 0x4d: /* EOR abcd */ | 860 | case 0x4d: /* EOR abcd */ |
861 | ABSOLUTE; | 861 | ABSOLUTE; |
862 | EOR; | 862 | EOR; |
863 | break; | 863 | break; |
864 | case 0x4e: /* LSR abcd */ | 864 | case 0x4e: /* LSR abcd */ |
865 | ABSOLUTE; | 865 | ABSOLUTE; |
866 | LSR; | 866 | LSR; |
867 | break; | 867 | break; |
868 | case 0x50: /* BVC */ | 868 | case 0x50: /* BVC */ |
869 | BRANCH((vdi & V_FLAG) == 0); | 869 | BRANCH((vdi & V_FLAG) == 0); |
870 | case 0x51: /* EOR (ab),y */ | 870 | case 0x51: /* EOR (ab),y */ |
871 | INDIRECT_Y; | 871 | INDIRECT_Y; |
872 | NCYCLES_Y; | 872 | NCYCLES_Y; |
873 | EOR; | 873 | EOR; |
874 | break; | 874 | break; |
875 | case 0x55: /* EOR ab,x */ | 875 | case 0x55: /* EOR ab,x */ |
876 | ZPAGE_X; | 876 | ZPAGE_X; |
877 | EOR_ZP; | 877 | EOR_ZP; |
878 | break; | 878 | break; |
879 | case 0x56: /* LSR ab,x */ | 879 | case 0x56: /* LSR ab,x */ |
880 | ZPAGE_X; | 880 | ZPAGE_X; |
881 | LSR_ZP; | 881 | LSR_ZP; |
882 | break; | 882 | break; |
883 | case 0x58: /* CLI */ | 883 | case 0x58: /* CLI */ |
884 | vdi &= V_FLAG | D_FLAG; | 884 | vdi &= V_FLAG | D_FLAG; |
885 | CHECK_IRQ; | 885 | CHECK_IRQ; |
886 | break; | 886 | break; |
887 | case 0x59: /* EOR abcd,y */ | 887 | case 0x59: /* EOR abcd,y */ |
888 | ABSOLUTE_Y; | 888 | ABSOLUTE_Y; |
889 | NCYCLES_Y; | 889 | NCYCLES_Y; |
890 | EOR; | 890 | EOR; |
891 | break; | 891 | break; |
892 | case 0x5d: /* EOR abcd,x */ | 892 | case 0x5d: /* EOR abcd,x */ |
893 | ABSOLUTE_X; | 893 | ABSOLUTE_X; |
894 | NCYCLES_X; | 894 | NCYCLES_X; |
895 | EOR; | 895 | EOR; |
896 | break; | 896 | break; |
897 | case 0x5e: /* LSR abcd,x */ | 897 | case 0x5e: /* LSR abcd,x */ |
898 | ABSOLUTE_X; | 898 | ABSOLUTE_X; |
899 | LSR; | 899 | LSR; |
900 | break; | 900 | break; |
901 | case 0x60: /* RTS */ | 901 | case 0x60: /* RTS */ |
902 | PL(pc); | 902 | PL(pc); |
903 | PL(addr); | 903 | PL(addr); |
904 | pc += (addr << 8) + 1; | 904 | pc += (addr << 8) + 1; |
905 | break; | 905 | break; |
906 | case 0x61: /* ADC (ab,x) */ | 906 | case 0x61: /* ADC (ab,x) */ |
907 | INDIRECT_X; | 907 | INDIRECT_X; |
908 | ADC; | 908 | ADC; |
909 | break; | 909 | break; |
910 | case 0x65: /* ADC ab */ | 910 | case 0x65: /* ADC ab */ |
911 | ZPAGE; | 911 | ZPAGE; |
912 | ADC_ZP; | 912 | ADC_ZP; |
913 | break; | 913 | break; |
914 | case 0x66: /* ROR ab */ | 914 | case 0x66: /* ROR ab */ |
915 | ZPAGE; | 915 | ZPAGE; |
916 | ROR_ZP; | 916 | ROR_ZP; |
917 | break; | 917 | break; |
918 | case 0x68: /* PLA */ | 918 | case 0x68: /* PLA */ |
919 | PL(a); | 919 | PL(a); |
920 | nz = a; | 920 | nz = a; |
921 | break; | 921 | break; |
922 | case 0x69: /* ADC #ab */ | 922 | case 0x69: /* ADC #ab */ |
923 | data = FETCH; | 923 | data = FETCH; |
924 | DO_ADC; | 924 | DO_ADC; |
925 | break; | 925 | break; |
926 | case 0x6a: /* ROR */ | 926 | case 0x6a: /* ROR */ |
927 | nz = (c << 7) + (a >> 1); | 927 | nz = (c << 7) + (a >> 1); |
928 | c = a & 1; | 928 | c = a & 1; |
929 | a = nz; | 929 | a = nz; |
930 | break; | 930 | break; |
931 | case 0x6c: /* JMP (abcd) */ | 931 | case 0x6c: /* JMP (abcd) */ |
932 | ABSOLUTE; | 932 | ABSOLUTE; |
933 | if ((addr & 0xff) == 0xff) | 933 | if ((addr & 0xff) == 0xff) |
934 | pc = (dGetByte(addr - 0xff) << 8) + dGetByte(addr); | 934 | pc = (dGetByte(addr - 0xff) << 8) + dGetByte(addr); |
935 | else | 935 | else |
936 | pc = dGetWord(addr); | 936 | pc = dGetWord(addr); |
937 | break; | 937 | break; |
938 | case 0x6d: /* ADC abcd */ | 938 | case 0x6d: /* ADC abcd */ |
939 | ABSOLUTE; | 939 | ABSOLUTE; |
940 | ADC; | 940 | ADC; |
941 | break; | 941 | break; |
942 | case 0x6e: /* ROR abcd */ | 942 | case 0x6e: /* ROR abcd */ |
943 | ABSOLUTE; | 943 | ABSOLUTE; |
944 | ROR; | 944 | ROR; |
945 | break; | 945 | break; |
946 | case 0x70: /* BVS */ | 946 | case 0x70: /* BVS */ |
947 | BRANCH((vdi & V_FLAG) != 0); | 947 | BRANCH((vdi & V_FLAG) != 0); |
948 | case 0x71: /* ADC (ab),y */ | 948 | case 0x71: /* ADC (ab),y */ |
949 | INDIRECT_Y; | 949 | INDIRECT_Y; |
950 | NCYCLES_Y; | 950 | NCYCLES_Y; |
951 | ADC; | 951 | ADC; |
952 | break; | 952 | break; |
953 | case 0x75: /* ADC ab,x */ | 953 | case 0x75: /* ADC ab,x */ |
954 | ZPAGE_X; | 954 | ZPAGE_X; |
955 | ADC_ZP; | 955 | ADC_ZP; |
956 | break; | 956 | break; |
957 | case 0x76: /* ROR ab,x */ | 957 | case 0x76: /* ROR ab,x */ |
958 | ZPAGE_X; | 958 | ZPAGE_X; |
959 | ROR_ZP; | 959 | ROR_ZP; |
960 | break; | 960 | break; |
961 | case 0x78: /* SEI */ | 961 | case 0x78: /* SEI */ |
962 | vdi |= I_FLAG; | 962 | vdi |= I_FLAG; |
963 | break; | 963 | break; |
964 | case 0x79: /* ADC abcd,y */ | 964 | case 0x79: /* ADC abcd,y */ |
965 | ABSOLUTE_Y; | 965 | ABSOLUTE_Y; |
966 | NCYCLES_Y; | 966 | NCYCLES_Y; |
967 | ADC; | 967 | ADC; |
968 | break; | 968 | break; |
969 | case 0x7d: /* ADC abcd,x */ | 969 | case 0x7d: /* ADC abcd,x */ |
970 | ABSOLUTE_X; | 970 | ABSOLUTE_X; |
971 | NCYCLES_X; | 971 | NCYCLES_X; |
972 | ADC; | 972 | ADC; |
973 | break; | 973 | break; |
974 | case 0x7e: /* ROR abcd,x */ | 974 | case 0x7e: /* ROR abcd,x */ |
975 | ABSOLUTE_X; | 975 | ABSOLUTE_X; |
976 | ROR; | 976 | ROR; |
977 | break; | 977 | break; |
978 | case 0x81: /* STA (ab,x) */ | 978 | case 0x81: /* STA (ab,x) */ |
979 | INDIRECT_X; | 979 | INDIRECT_X; |
980 | STA; | 980 | STA; |
981 | break; | 981 | break; |
982 | case 0x84: /* STY ab */ | 982 | case 0x84: /* STY ab */ |
983 | ZPAGE; | 983 | ZPAGE; |
984 | STY_ZP; | 984 | STY_ZP; |
985 | break; | 985 | break; |
986 | case 0x85: /* STA ab */ | 986 | case 0x85: /* STA ab */ |
987 | ZPAGE; | 987 | ZPAGE; |
988 | STA_ZP; | 988 | STA_ZP; |
989 | break; | 989 | break; |
990 | case 0x86: /* STX ab */ | 990 | case 0x86: /* STX ab */ |
991 | ZPAGE; | 991 | ZPAGE; |
992 | STX_ZP; | 992 | STX_ZP; |
993 | break; | 993 | break; |
994 | case 0x88: /* DEY */ | 994 | case 0x88: /* DEY */ |
995 | nz = y = (y - 1) & 0xff; | 995 | nz = y = (y - 1) & 0xff; |
996 | break; | 996 | break; |
997 | case 0x8a: /* TXA */ | 997 | case 0x8a: /* TXA */ |
998 | nz = a = x; | 998 | nz = a = x; |
999 | break; | 999 | break; |
1000 | case 0x8c: /* STY abcd */ | 1000 | case 0x8c: /* STY abcd */ |
1001 | ABSOLUTE; | 1001 | ABSOLUTE; |
1002 | STY; | 1002 | STY; |
1003 | break; | 1003 | break; |
1004 | case 0x8d: /* STA abcd */ | 1004 | case 0x8d: /* STA abcd */ |
1005 | ABSOLUTE; | 1005 | ABSOLUTE; |
1006 | STA; | 1006 | STA; |
1007 | break; | 1007 | break; |
1008 | case 0x8e: /* STX abcd */ | 1008 | case 0x8e: /* STX abcd */ |
1009 | ABSOLUTE; | 1009 | ABSOLUTE; |
1010 | STX; | 1010 | STX; |
1011 | break; | 1011 | break; |
1012 | case 0x90: /* BCC */ | 1012 | case 0x90: /* BCC */ |
1013 | BRANCH(c == 0); | 1013 | BRANCH(c == 0); |
1014 | case 0x91: /* STA (ab),y */ | 1014 | case 0x91: /* STA (ab),y */ |
1015 | INDIRECT_Y; | 1015 | INDIRECT_Y; |
1016 | STA; | 1016 | STA; |
1017 | break; | 1017 | break; |
1018 | case 0x94: /* STY ab,x */ | 1018 | case 0x94: /* STY ab,x */ |
1019 | ZPAGE_X; | 1019 | ZPAGE_X; |
1020 | STY_ZP; | 1020 | STY_ZP; |
1021 | break; | 1021 | break; |
1022 | case 0x95: /* STA ab,x */ | 1022 | case 0x95: /* STA ab,x */ |
1023 | ZPAGE_X; | 1023 | ZPAGE_X; |
1024 | STA_ZP; | 1024 | STA_ZP; |
1025 | break; | 1025 | break; |
1026 | case 0x96: /* STX ab,y */ | 1026 | case 0x96: /* STX ab,y */ |
1027 | ZPAGE_Y; | 1027 | ZPAGE_Y; |
1028 | STX_ZP; | 1028 | STX_ZP; |
1029 | break; | 1029 | break; |
1030 | case 0x98: /* TYA */ | 1030 | case 0x98: /* TYA */ |
1031 | nz = a = y; | 1031 | nz = a = y; |
1032 | break; | 1032 | break; |
1033 | case 0x99: /* STA abcd,y */ | 1033 | case 0x99: /* STA abcd,y */ |
1034 | ABSOLUTE_Y; | 1034 | ABSOLUTE_Y; |
1035 | STA; | 1035 | STA; |
1036 | break; | 1036 | break; |
1037 | case 0x9a: /* TXS */ | 1037 | case 0x9a: /* TXS */ |
1038 | s = x; | 1038 | s = x; |
1039 | break; | 1039 | break; |
1040 | case 0x9d: /* STA abcd,x */ | 1040 | case 0x9d: /* STA abcd,x */ |
1041 | ABSOLUTE_X; | 1041 | ABSOLUTE_X; |
1042 | STA; | 1042 | STA; |
1043 | break; | 1043 | break; |
1044 | case 0xa0: /* LDY #ab */ | 1044 | case 0xa0: /* LDY #ab */ |
1045 | nz = y = FETCH; | 1045 | nz = y = FETCH; |
1046 | break; | 1046 | break; |
1047 | case 0xa1: /* LDA (ab,x) */ | 1047 | case 0xa1: /* LDA (ab,x) */ |
1048 | INDIRECT_X; | 1048 | INDIRECT_X; |
1049 | LDA; | 1049 | LDA; |
1050 | break; | 1050 | break; |
1051 | case 0xa2: /* LDX #ab */ | 1051 | case 0xa2: /* LDX #ab */ |
1052 | nz = x = FETCH; | 1052 | nz = x = FETCH; |
1053 | break; | 1053 | break; |
1054 | case 0xa4: /* LDY ab */ | 1054 | case 0xa4: /* LDY ab */ |
1055 | ZPAGE; | 1055 | ZPAGE; |
1056 | LDY_ZP; | 1056 | LDY_ZP; |
1057 | break; | 1057 | break; |
1058 | case 0xa5: /* LDA ab */ | 1058 | case 0xa5: /* LDA ab */ |
1059 | ZPAGE; | 1059 | ZPAGE; |
1060 | LDA_ZP; | 1060 | LDA_ZP; |
1061 | break; | 1061 | break; |
1062 | case 0xa6: /* LDX ab */ | 1062 | case 0xa6: /* LDX ab */ |
1063 | ZPAGE; | 1063 | ZPAGE; |
1064 | LDX_ZP; | 1064 | LDX_ZP; |
1065 | break; | 1065 | break; |
1066 | case 0xa8: /* TAY */ | 1066 | case 0xa8: /* TAY */ |
1067 | nz = y = a; | 1067 | nz = y = a; |
1068 | break; | 1068 | break; |
1069 | case 0xa9: /* LDA #ab */ | 1069 | case 0xa9: /* LDA #ab */ |
1070 | nz = a = FETCH; | 1070 | nz = a = FETCH; |
1071 | break; | 1071 | break; |
1072 | case 0xaa: /* TAX */ | 1072 | case 0xaa: /* TAX */ |
1073 | nz = x = a; | 1073 | nz = x = a; |
1074 | break; | 1074 | break; |
1075 | case 0xac: /* LDY abcd */ | 1075 | case 0xac: /* LDY abcd */ |
1076 | ABSOLUTE; | 1076 | ABSOLUTE; |
1077 | LDY; | 1077 | LDY; |
1078 | break; | 1078 | break; |
1079 | case 0xad: /* LDA abcd */ | 1079 | case 0xad: /* LDA abcd */ |
1080 | ABSOLUTE; | 1080 | ABSOLUTE; |
1081 | LDA; | 1081 | LDA; |
1082 | break; | 1082 | break; |
1083 | case 0xae: /* LDX abcd */ | 1083 | case 0xae: /* LDX abcd */ |
1084 | ABSOLUTE; | 1084 | ABSOLUTE; |
1085 | LDX; | 1085 | LDX; |
1086 | break; | 1086 | break; |
1087 | case 0xb0: /* BCS */ | 1087 | case 0xb0: /* BCS */ |
1088 | BRANCH(c != 0); | 1088 | BRANCH(c != 0); |
1089 | case 0xb1: /* LDA (ab),y */ | 1089 | case 0xb1: /* LDA (ab),y */ |
1090 | INDIRECT_Y; | 1090 | INDIRECT_Y; |
1091 | NCYCLES_Y; | 1091 | NCYCLES_Y; |
1092 | LDA; | 1092 | LDA; |
1093 | break; | 1093 | break; |
1094 | case 0xb4: /* LDY ab,x */ | 1094 | case 0xb4: /* LDY ab,x */ |
1095 | ZPAGE_X; | 1095 | ZPAGE_X; |
1096 | LDY_ZP; | 1096 | LDY_ZP; |
1097 | break; | 1097 | break; |
1098 | case 0xb5: /* LDA ab,x */ | 1098 | case 0xb5: /* LDA ab,x */ |
1099 | ZPAGE_X; | 1099 | ZPAGE_X; |
1100 | LDA_ZP; | 1100 | LDA_ZP; |
1101 | break; | 1101 | break; |
1102 | case 0xb6: /* LDX ab,y */ | 1102 | case 0xb6: /* LDX ab,y */ |
1103 | ZPAGE_Y; | 1103 | ZPAGE_Y; |
1104 | LDX_ZP; | 1104 | LDX_ZP; |
1105 | break; | 1105 | break; |
1106 | case 0xb8: /* CLV */ | 1106 | case 0xb8: /* CLV */ |
1107 | vdi &= D_FLAG | I_FLAG; | 1107 | vdi &= D_FLAG | I_FLAG; |
1108 | break; | 1108 | break; |
1109 | case 0xb9: /* LDA abcd,y */ | 1109 | case 0xb9: /* LDA abcd,y */ |
1110 | ABSOLUTE_Y; | 1110 | ABSOLUTE_Y; |
1111 | NCYCLES_Y; | 1111 | NCYCLES_Y; |
1112 | LDA; | 1112 | LDA; |
1113 | break; | 1113 | break; |
1114 | case 0xba: /* TSX */ | 1114 | case 0xba: /* TSX */ |
1115 | nz = x = s; | 1115 | nz = x = s; |
1116 | break; | 1116 | break; |
1117 | case 0xbc: /* LDY abcd,x */ | 1117 | case 0xbc: /* LDY abcd,x */ |
1118 | ABSOLUTE_X; | 1118 | ABSOLUTE_X; |
1119 | NCYCLES_X; | 1119 | NCYCLES_X; |
1120 | LDY; | 1120 | LDY; |
1121 | break; | 1121 | break; |
1122 | case 0xbd: /* LDA abcd,x */ | 1122 | case 0xbd: /* LDA abcd,x */ |
1123 | ABSOLUTE_X; | 1123 | ABSOLUTE_X; |
1124 | NCYCLES_X; | 1124 | NCYCLES_X; |
1125 | LDA; | 1125 | LDA; |
1126 | break; | 1126 | break; |
1127 | case 0xbe: /* LDX abcd,y */ | 1127 | case 0xbe: /* LDX abcd,y */ |
1128 | ABSOLUTE_Y; | 1128 | ABSOLUTE_Y; |
1129 | NCYCLES_Y; | 1129 | NCYCLES_Y; |
1130 | LDX; | 1130 | LDX; |
1131 | break; | 1131 | break; |
1132 | case 0xc0: /* CPY #ab */ | 1132 | case 0xc0: /* CPY #ab */ |
1133 | nz = FETCH; | 1133 | nz = FETCH; |
1134 | c = (y >= nz) ? 1 : 0; | 1134 | c = (y >= nz) ? 1 : 0; |
1135 | nz = (y - nz) & 0xff; | 1135 | nz = (y - nz) & 0xff; |
1136 | break; | 1136 | break; |
1137 | case 0xc1: /* CMP (ab,x) */ | 1137 | case 0xc1: /* CMP (ab,x) */ |
1138 | INDIRECT_X; | 1138 | INDIRECT_X; |
1139 | CMP; | 1139 | CMP; |
1140 | break; | 1140 | break; |
1141 | case 0xc4: /* CPY ab */ | 1141 | case 0xc4: /* CPY ab */ |
1142 | ZPAGE; | 1142 | ZPAGE; |
1143 | CPY_ZP; | 1143 | CPY_ZP; |
1144 | break; | 1144 | break; |
1145 | case 0xc5: /* CMP ab */ | 1145 | case 0xc5: /* CMP ab */ |
1146 | ZPAGE; | 1146 | ZPAGE; |
1147 | CMP_ZP; | 1147 | CMP_ZP; |
1148 | break; | 1148 | break; |
1149 | case 0xc6: /* DEC ab */ | 1149 | case 0xc6: /* DEC ab */ |
1150 | ZPAGE; | 1150 | ZPAGE; |
1151 | DEC_ZP; | 1151 | DEC_ZP; |
1152 | break; | 1152 | break; |
1153 | case 0xc8: /* INY */ | 1153 | case 0xc8: /* INY */ |
1154 | nz = y = (y + 1) & 0xff; | 1154 | nz = y = (y + 1) & 0xff; |
1155 | break; | 1155 | break; |
1156 | case 0xc9: /* CMP #ab */ | 1156 | case 0xc9: /* CMP #ab */ |
1157 | nz = FETCH; | 1157 | nz = FETCH; |
1158 | c = (a >= nz) ? 1 : 0; | 1158 | c = (a >= nz) ? 1 : 0; |
1159 | nz = (a - nz) & 0xff; | 1159 | nz = (a - nz) & 0xff; |
1160 | break; | 1160 | break; |
1161 | case 0xca: /* DEX */ | 1161 | case 0xca: /* DEX */ |
1162 | nz = x = (x - 1) & 0xff; | 1162 | nz = x = (x - 1) & 0xff; |
1163 | break; | 1163 | break; |
1164 | case 0xcc: /* CPY abcd */ | 1164 | case 0xcc: /* CPY abcd */ |
1165 | ABSOLUTE; | 1165 | ABSOLUTE; |
1166 | CPY; | 1166 | CPY; |
1167 | break; | 1167 | break; |
1168 | case 0xcd: /* CMP abcd */ | 1168 | case 0xcd: /* CMP abcd */ |
1169 | ABSOLUTE; | 1169 | ABSOLUTE; |
1170 | CMP; | 1170 | CMP; |
1171 | break; | 1171 | break; |
1172 | case 0xce: /* DEC abcd */ | 1172 | case 0xce: /* DEC abcd */ |
1173 | ABSOLUTE; | 1173 | ABSOLUTE; |
1174 | DEC; | 1174 | DEC; |
1175 | break; | 1175 | break; |
1176 | case 0xd0: /* BNE */ | 1176 | case 0xd0: /* BNE */ |
1177 | BRANCH((nz & 0xff) != 0); | 1177 | BRANCH((nz & 0xff) != 0); |
1178 | case 0xd1: /* CMP (ab),y */ | 1178 | case 0xd1: /* CMP (ab),y */ |
1179 | INDIRECT_Y; | 1179 | INDIRECT_Y; |
1180 | NCYCLES_Y; | 1180 | NCYCLES_Y; |
1181 | CMP; | 1181 | CMP; |
1182 | break; | 1182 | break; |
1183 | case 0xd5: /* CMP ab,x */ | 1183 | case 0xd5: /* CMP ab,x */ |
1184 | ZPAGE_X; | 1184 | ZPAGE_X; |
1185 | CMP_ZP; | 1185 | CMP_ZP; |
1186 | break; | 1186 | break; |
1187 | case 0xd6: /* DEC ab,x */ | 1187 | case 0xd6: /* DEC ab,x */ |
1188 | ZPAGE_X; | 1188 | ZPAGE_X; |
1189 | DEC_ZP; | 1189 | DEC_ZP; |
1190 | break; | 1190 | break; |
1191 | case 0xd8: /* CLD */ | 1191 | case 0xd8: /* CLD */ |
1192 | vdi &= V_FLAG | I_FLAG; | 1192 | vdi &= V_FLAG | I_FLAG; |
1193 | break; | 1193 | break; |
1194 | case 0xd9: /* CMP abcd,y */ | 1194 | case 0xd9: /* CMP abcd,y */ |
1195 | ABSOLUTE_Y; | 1195 | ABSOLUTE_Y; |
1196 | NCYCLES_Y; | 1196 | NCYCLES_Y; |
1197 | CMP; | 1197 | CMP; |
1198 | break; | 1198 | break; |
1199 | case 0xdd: /* CMP abcd,x */ | 1199 | case 0xdd: /* CMP abcd,x */ |
1200 | ABSOLUTE_X; | 1200 | ABSOLUTE_X; |
1201 | NCYCLES_X; | 1201 | NCYCLES_X; |
1202 | CMP; | 1202 | CMP; |
1203 | break; | 1203 | break; |
1204 | case 0xde: /* DEC abcd,x */ | 1204 | case 0xde: /* DEC abcd,x */ |
1205 | ABSOLUTE_X; | 1205 | ABSOLUTE_X; |
1206 | DEC; | 1206 | DEC; |
1207 | break; | 1207 | break; |
1208 | case 0xe0: /* CPX #ab */ | 1208 | case 0xe0: /* CPX #ab */ |
1209 | nz = FETCH; | 1209 | nz = FETCH; |
1210 | c = (x >= nz) ? 1 : 0; | 1210 | c = (x >= nz) ? 1 : 0; |
1211 | nz = (x - nz) & 0xff; | 1211 | nz = (x - nz) & 0xff; |
1212 | break; | 1212 | break; |
1213 | case 0xe1: /* SBC (ab,x) */ | 1213 | case 0xe1: /* SBC (ab,x) */ |
1214 | INDIRECT_X; | 1214 | INDIRECT_X; |
1215 | SBC; | 1215 | SBC; |
1216 | break; | 1216 | break; |
1217 | case 0xe4: /* CPX ab */ | 1217 | case 0xe4: /* CPX ab */ |
1218 | ZPAGE; | 1218 | ZPAGE; |
1219 | CPX_ZP; | 1219 | CPX_ZP; |
1220 | break; | 1220 | break; |
1221 | case 0xe5: /* SBC ab */ | 1221 | case 0xe5: /* SBC ab */ |
1222 | ZPAGE; | 1222 | ZPAGE; |
1223 | SBC_ZP; | 1223 | SBC_ZP; |
1224 | break; | 1224 | break; |
1225 | case 0xe6: /* INC ab */ | 1225 | case 0xe6: /* INC ab */ |
1226 | ZPAGE; | 1226 | ZPAGE; |
1227 | INC_ZP; | 1227 | INC_ZP; |
1228 | break; | 1228 | break; |
1229 | case 0xe8: /* INX */ | 1229 | case 0xe8: /* INX */ |
1230 | nz = x = (x + 1) & 0xff; | 1230 | nz = x = (x + 1) & 0xff; |
1231 | break; | 1231 | break; |
1232 | case 0xe9: /* SBC #ab */ | 1232 | case 0xe9: /* SBC #ab */ |
1233 | case 0xeb: /* SBC #ab [unofficial] */ | 1233 | case 0xeb: /* SBC #ab [unofficial] */ |
1234 | data = FETCH; | 1234 | data = FETCH; |
1235 | DO_SBC; | 1235 | DO_SBC; |
1236 | break; | 1236 | break; |
1237 | case 0xea: /* NOP */ | 1237 | case 0xea: /* NOP */ |
1238 | case 0x1a: /* NOP [unofficial] */ | 1238 | case 0x1a: /* NOP [unofficial] */ |
1239 | case 0x3a: | 1239 | case 0x3a: |
1240 | case 0x5a: | 1240 | case 0x5a: |
1241 | case 0x7a: | 1241 | case 0x7a: |
1242 | case 0xda: | 1242 | case 0xda: |
1243 | case 0xfa: | 1243 | case 0xfa: |
1244 | break; | 1244 | break; |
1245 | case 0xec: /* CPX abcd */ | 1245 | case 0xec: /* CPX abcd */ |
1246 | ABSOLUTE; | 1246 | ABSOLUTE; |
1247 | CPX; | 1247 | CPX; |
1248 | break; | 1248 | break; |
1249 | case 0xed: /* SBC abcd */ | 1249 | case 0xed: /* SBC abcd */ |
1250 | ABSOLUTE; | 1250 | ABSOLUTE; |
1251 | SBC; | 1251 | SBC; |
1252 | break; | 1252 | break; |
1253 | case 0xee: /* INC abcd */ | 1253 | case 0xee: /* INC abcd */ |
1254 | ABSOLUTE; | 1254 | ABSOLUTE; |
1255 | INC; | 1255 | INC; |
1256 | break; | 1256 | break; |
1257 | case 0xf0: /* BEQ */ | 1257 | case 0xf0: /* BEQ */ |
1258 | BRANCH((nz & 0xff) == 0); | 1258 | BRANCH((nz & 0xff) == 0); |
1259 | case 0xf1: /* SBC (ab),y */ | 1259 | case 0xf1: /* SBC (ab),y */ |
1260 | INDIRECT_Y; | 1260 | INDIRECT_Y; |
1261 | NCYCLES_Y; | 1261 | NCYCLES_Y; |
1262 | SBC; | 1262 | SBC; |
1263 | break; | 1263 | break; |
1264 | case 0xf5: /* SBC ab,x */ | 1264 | case 0xf5: /* SBC ab,x */ |
1265 | ZPAGE_X; | 1265 | ZPAGE_X; |
1266 | SBC_ZP; | 1266 | SBC_ZP; |
1267 | break; | 1267 | break; |
1268 | case 0xf6: /* INC ab,x */ | 1268 | case 0xf6: /* INC ab,x */ |
1269 | ZPAGE_X; | 1269 | ZPAGE_X; |
1270 | INC_ZP; | 1270 | INC_ZP; |
1271 | break; | 1271 | break; |
1272 | case 0xf8: /* SED */ | 1272 | case 0xf8: /* SED */ |
1273 | vdi |= D_FLAG; | 1273 | vdi |= D_FLAG; |
1274 | break; | 1274 | break; |
1275 | case 0xf9: /* SBC abcd,y */ | 1275 | case 0xf9: /* SBC abcd,y */ |
1276 | ABSOLUTE_Y; | 1276 | ABSOLUTE_Y; |
1277 | NCYCLES_Y; | 1277 | NCYCLES_Y; |
1278 | SBC; | 1278 | SBC; |
1279 | break; | 1279 | break; |
1280 | case 0xfd: /* SBC abcd,x */ | 1280 | case 0xfd: /* SBC abcd,x */ |
1281 | ABSOLUTE_X; | 1281 | ABSOLUTE_X; |
1282 | NCYCLES_X; | 1282 | NCYCLES_X; |
1283 | SBC; | 1283 | SBC; |
1284 | break; | 1284 | break; |
1285 | case 0xfe: /* INC abcd,x */ | 1285 | case 0xfe: /* INC abcd,x */ |
1286 | ABSOLUTE_X; | 1286 | ABSOLUTE_X; |
1287 | INC; | 1287 | INC; |
1288 | break; | 1288 | break; |
1289 | } | 1289 | } |
1290 | } | 1290 | } |
1291 | ast _ cpu_pc = pc; | 1291 | ast _ cpu_pc = pc; |
1292 | ast _ cpu_nz = nz; | 1292 | ast _ cpu_nz = nz; |
1293 | ast _ cpu_a = a; | 1293 | ast _ cpu_a = a; |
1294 | ast _ cpu_x = x; | 1294 | ast _ cpu_x = x; |
1295 | ast _ cpu_y = y; | 1295 | ast _ cpu_y = y; |
1296 | ast _ cpu_c = c; | 1296 | ast _ cpu_c = c; |
1297 | ast _ cpu_s = s; | 1297 | ast _ cpu_s = s; |
1298 | ast _ cpu_vdi = vdi; | 1298 | ast _ cpu_vdi = vdi; |
1299 | ast _ cycle -= cycle_limit; | 1299 | ast _ cycle -= cycle_limit; |
1300 | if (ast _ timer1_cycle != NEVER) | 1300 | if (ast _ timer1_cycle != NEVER) |
1301 | ast _ timer1_cycle -= cycle_limit; | 1301 | ast _ timer1_cycle -= cycle_limit; |
1302 | if (ast _ timer2_cycle != NEVER) | 1302 | if (ast _ timer2_cycle != NEVER) |
1303 | ast _ timer2_cycle -= cycle_limit; | 1303 | ast _ timer2_cycle -= cycle_limit; |
1304 | if (ast _ timer4_cycle != NEVER) | 1304 | if (ast _ timer4_cycle != NEVER) |
1305 | ast _ timer4_cycle -= cycle_limit; | 1305 | ast _ timer4_cycle -= cycle_limit; |
1306 | } | 1306 | } |