7 u8int rA, rX, rY, rS, rP;
22 r |= memread(pc++) << 8;
29 memwrite(0x100 | rS--, v);
35 memwrite(0x100 | rS--, v >> 8);
36 memwrite(0x100 | rS--, v);
42 return memread(0x100 | ++rS);
50 v = memread(0x100 | ++rS);
51 v |= memread(0x100 | ++rS) << 8;
55 #define imm() fetch8()
56 #define zp() memread(fetch8())
57 #define zpX() memread((u8int)(fetch8()+rX))
58 #define zpY() memread((u8int)(fetch8()+rY))
59 #define abso() memread(fetch16())
60 #define absX() memread(a=fetch16()+rX)
61 #define absY() memread(a=fetch16()+rY)
62 #define indX() memread(aindX())
63 #define indY(c) memread(aindY(c))
84 a = memread(r++) + rY;
95 r = rA + d + (rP & FLAGC);
96 rP &= ~(FLAGN | FLAGZ | FLAGV | FLAGC);
97 if(r > 0xFF) rP |= FLAGC;
98 if(r & 0x80) rP |= FLAGN;
99 if((~(rA ^ d) & (rA ^ r)) & 0x80) rP |= FLAGV;
101 if(rA == 0) rP |= FLAGZ;
107 rP &= ~(FLAGN | FLAGZ);
108 if(d & 0x80) rP |= FLAGN;
109 if(d == 0) rP |= FLAGZ;
118 rP &= ~(FLAGN | FLAGZ | FLAGC);
120 if(v & 0x80) rP |= FLAGC;
122 if(v == 0) rP |= FLAGZ;
123 if(v & 0x80) rP |= FLAGN;
132 rP &= ~(FLAGN | FLAGZ | FLAGC);
136 if(v == 0) rP |= FLAGZ;
137 if(v & 0x80) rP |= FLAGN;
158 cmp(u8int a, u8int d)
160 rP &= ~(FLAGN | FLAGZ | FLAGC);
161 if(a == d) rP |= FLAGZ;
162 if(a >= d) rP |= FLAGC;
163 if((a - d) & 0x80) rP |= FLAGN;
169 memwrite(a, nz(memread(a) - 1));
180 if(!(map == 1 && a >= 0x8000))
191 rP &= ~(FLAGC | FLAGN | FLAGZ);
192 if(v & 0x80) rP |= FLAGC;
194 if(v & 0x80) rP |= FLAGN;
195 if(v == 0) rP |= FLAGZ;
206 rP &= ~(FLAGC | FLAGN | FLAGZ);
208 v = (v >> 1) | (b << 7);
209 if(v & 0x80) rP |= FLAGN;
210 if(v == 0) rP |= FLAGZ;
219 r = rA + (u8int)~d + (rP & FLAGC);
220 rP &= ~(FLAGZ | FLAGV | FLAGC | FLAGN);
221 if(r > 0xFF) rP |= FLAGC;
222 if(((rA ^ d) & (rA ^ r)) & 0x80) rP |= FLAGV;
224 if(rA == 0) rP |= FLAGZ;
225 if(rA & 0x80) rP |= FLAGN;
229 interrupt(int nmi, int brk)
232 push8(rP | 0x20 | (brk << 4));
233 pc = memread(0xFFFA | (!nmi << 2));
234 pc |= memread(0xFFFB | (!nmi << 2)) << 8;
252 if(irq && (rP & 4) == 0){
259 print("%x %x %x %x %x %x %x %x\n", curpc, op, rA, rX, rY, rS, rP, memread(0x2c));
261 case 0x00: pc++; interrupt(0, 1); return 7;
262 case 0x01: nz(rA |= indX()); return 6;
263 case 0x05: nz(rA |= zp()); return 3;
264 case 0x06: asl(fetch8()); return 5;
265 case 0x08: push8(rP | 0x30); return 3;
266 case 0x09: nz(rA |= imm()); return 2;
268 rP &= ~(FLAGN | FLAGZ | FLAGC);
269 if(rA & 0x80) rP |= FLAGC;
271 if(rA == 0) rP |= FLAGZ;
272 if(rA & 0x80) rP |= FLAGN;
274 case 0x0D: nz(rA |= abso()); return 4;
275 case 0x0E: asl(fetch16()); return 6;
276 case 0x10: if((rP & FLAGN) == 0) return branch(); pc++; return 2;
277 case 0x11: nz(rA |= indY(&c)); return 5+c;
278 case 0x15: nz(rA |= zpX()); return 4;
279 case 0x16: asl((u8int)(fetch8() + rX)); return 6;
280 case 0x18: rP &= ~FLAGC; return 2;
281 case 0x19: nz(rA |= absY()); return 4 + ((u8int)a < rY);
282 case 0x1D: nz(rA |= absX()); return 4 + ((u8int)a < rX);
283 case 0x1E: asl(fetch16() + rX); return 7;
284 case 0x20: push16(pc+1); pc = fetch16(); return 6;
285 case 0x21: nz(rA &= indX()); return 6;
287 a = memread(fetch8());
288 rP &= ~(FLAGN | FLAGZ | FLAGV);
290 if((a & rA) == 0) rP |= FLAGZ;
292 case 0x25: nz(rA &= zp()); return 3;
293 case 0x26: rol(fetch8()); return 5;
294 case 0x28: rP = pop8() & 0xcf; return 4;
295 case 0x29: nz(rA &= imm()); return 2;
298 rP &= ~(FLAGC | FLAGZ | FLAGN);
299 if(rA & 0x80) rP |= FLAGC;
301 if(rA & 0x80) rP |= FLAGN;
302 if(rA == 0) rP |= FLAGZ;
305 a = memread(fetch16());
306 rP &= ~(FLAGN | FLAGZ | FLAGV);
308 if((a & rA) == 0) rP |= FLAGZ;
310 case 0x2D: nz(rA &= abso()); return 4;
311 case 0x2E: rol(fetch16()); return 6;
312 case 0x30: if((rP & FLAGN) != 0) return branch(); pc++; return 3;
313 case 0x31: nz(rA &= indY(&c)); return 5+c;
314 case 0x35: nz(rA &= zpX()); return 4;
315 case 0x36: rol((u8int)(fetch8() + rX)); return 6;
316 case 0x38: rP |= FLAGC; return 2;
317 case 0x39: nz(rA &= absY()); return 4 + ((u8int)a < rY);
318 case 0x3E: rol(fetch16() + rX); return 7;
319 case 0x3D: nz(rA &= absX()); return 4 + ((u8int)a < rX);
320 case 0x40: rP = pop8() & 0xcf; pc = pop16(); return 6;
321 case 0x41: nz(rA ^= indX()); return 6;
322 case 0x45: nz(rA ^= zp()); return 3;
323 case 0x46: lsr(fetch8()); return 5;
324 case 0x48: push8(rA); return 3;
325 case 0x49: nz(rA ^= imm()); return 2;
327 rP &= ~(FLAGN | FLAGZ | FLAGC);
330 if(rA == 0) rP |= FLAGZ;
331 if(rA & 0x80) rP |= FLAGN;
333 case 0x4C: pc = fetch16(); return 3;
334 case 0x4D: nz(rA ^= abso()); return 4;
335 case 0x4E: lsr(fetch16()); return 6;
336 case 0x51: nz(rA ^= indY(&c)); return 5+c;
337 case 0x56: lsr((u8int)(fetch8() + rX)); return 6;
338 case 0x58: rP &= ~FLAGI; return 2;
339 case 0x50: if((rP & FLAGV) == 0) return branch(); pc++; return 3;
340 case 0x55: nz(rA ^= zpX()); return 4;
341 case 0x59: nz(rA ^= absY()); return 4 + ((u8int)a < rX);
342 case 0x5D: nz(rA ^= absX()); return 4 + ((u8int)a < rX);
343 case 0x5E: lsr(fetch16() + rX); return 7;
344 case 0x60: pc = pop16() + 1; return 6;
345 case 0x61: adc(indX()); return 6;
346 case 0x65: adc(zp()); return 3;
347 case 0x66: ror(fetch8()); return 5;
348 case 0x68: nz(rA = pop8()); return 4;
349 case 0x69: adc(imm()); return 2;
352 rP &= ~(FLAGC | FLAGN | FLAGZ);
354 rA = (rA >> 1) | (a << 7);
355 if(rA & 0x80) rP |= FLAGN;
356 if(rA == 0) rP |= FLAGZ;
358 case 0x6C: v = fetch16(); pc = memread(v) | (memread((v & 0xFF00) | (u8int)(v+1)) << 8); return 5;
359 case 0x6D: adc(abso()); return 4;
360 case 0x6E: ror(fetch16()); return 6;
361 case 0x70: if((rP & FLAGV) != 0) return branch(); pc++; return 3;
362 case 0x71: adc(indY(&c)); return 5+c;
363 case 0x75: adc(zpX()); return 4;
364 case 0x76: ror((u8int)(fetch8() + rX)); return 6;
365 case 0x78: rP |= FLAGI; return 2;
366 case 0x79: adc(absY()); return 4 + ((u8int)a < rY);
367 case 0x7D: adc(absX()); return 4 + ((u8int)a < rX);
368 case 0x7E: ror(fetch16() + rX); return 7;
369 case 0x81: memwrite(aindX(), rA); return 6;
370 case 0x84: memwrite(fetch8(), rY); return 3;
371 case 0x85: memwrite(fetch8(), rA); return 3;
372 case 0x86: memwrite(fetch8(), rX); return 3;
373 case 0x88: nz(--rY); return 2;
374 case 0x8A: nz(rA = rX); return 2;
375 case 0x8C: memwrite(fetch16(), rY); return 4;
376 case 0x8D: memwrite(fetch16(), rA); return 4;
377 case 0x8E: memwrite(fetch16(), rX); return 4;
378 case 0x90: if((rP & FLAGC) == 0) return branch(); pc++; return 3;
379 case 0x91: memwrite(aindY(&c), rA); return 6;
380 case 0x94: memwrite((u8int)(fetch8() + rX), rY); return 4;
381 case 0x95: memwrite((u8int)(fetch8() + rX), rA); return 4;
382 case 0x96: memwrite((u8int)(fetch8() + rY), rX); return 4;
383 case 0x98: nz(rA = rY); return 2;
384 case 0x99: memwrite(fetch16() + rY, rA); return 5;
385 case 0x9A: rS = rX; return 2;
386 case 0x9D: memwrite(fetch16() + rX, rA); return 5;
387 case 0xA0: nz(rY = imm()); return 2;
388 case 0xA1: nz(rA = indX()); return 6;
389 case 0xA2: nz(rX = imm()); return 2;
390 case 0xA4: nz(rY = zp()); return 3;
391 case 0xA5: nz(rA = zp()); return 3;
392 case 0xA6: nz(rX = zp()); return 3;
393 case 0xA8: nz(rY = rA); return 2;
394 case 0xA9: nz(rA = imm()); return 2;
395 case 0xAA: nz(rX = rA); return 2;
396 case 0xAC: nz(rY = abso()); return 4;
397 case 0xAE: nz(rX = abso()); return 4;
398 case 0xAD: nz(rA = abso()); return 4;
399 case 0xB0: if((rP & FLAGC) != 0) return branch(); pc++; return 3;
400 case 0xB1: nz(rA = indY(&c)); return 5+c;
401 case 0xB4: nz(rY = zpX()); return 4;
402 case 0xB5: nz(rA = zpX()); return 4;
403 case 0xB6: nz(rX = zpY()); return 4;
404 case 0xB8: rP &= ~FLAGV; return 2;
405 case 0xB9: nz(rA = absY()); return 4 + ((u8int)a < rY);
406 case 0xBA: nz(rX = rS); return 2;
407 case 0xBC: nz(rY = absX()); return 4 + ((u8int)a < rX);
408 case 0xBD: nz(rA = absX()); return 4 + ((u8int)a < rX);
409 case 0xBE: nz(rX = absY()); return 4 + ((u8int)a < rY);
410 case 0xC1: cmp(rA, indX()); return 6;
411 case 0xC5: cmp(rA, zp()); return 3;
412 case 0xC9: cmp(rA, imm()); return 2;
413 case 0xCD: cmp(rA, abso()); return 4;
414 case 0xD0: if((rP & FLAGZ) == 0) return branch(); pc++; return 3;
415 case 0xD1: cmp(rA, indY(&c)); return 5 + c;
416 case 0xD5: cmp(rA, zpX()); return 4;
417 case 0xD8: rP &= ~FLAGD; return 2;
418 case 0xD9: cmp(rA, absY()); return 4 + ((u8int)a < rY);
419 case 0xDD: cmp(rA, absX()); return 4 + ((u8int)a < rX);
420 case 0xC0: cmp(rY, imm()); return 2;
421 case 0xC4: cmp(rY, zp()); return 3;
422 case 0xC6: dec(fetch8()); return 5;
423 case 0xC8: nz(++rY); return 2;
424 case 0xCA: nz(--rX); return 2;
425 case 0xCC: cmp(rY, abso()); return 4;
426 case 0xCE: dec(fetch16()); return 6;
427 case 0xD6: dec((u8int)(fetch8() + rX)); return 6;
428 case 0xDE: dec(fetch16() + rX); return 7;
429 case 0xE0: cmp(rX, imm()); return 2;
430 case 0xE1: sbc(indX()); return 6;
431 case 0xE4: cmp(rX, zp()); return 3;
432 case 0xE5: sbc(zp()); return 3;
433 case 0xE6: inc(fetch8()); return 5;
434 case 0xE8: nz(++rX); return 2;
435 case 0xE9: sbc(imm()); return 2;
437 case 0xEC: cmp(rX, abso()); return 4;
438 case 0xED: sbc(abso()); return 4;
439 case 0xEE: inc(fetch16()); return 6;
440 case 0xF0: if((rP & FLAGZ) != 0) return branch(); pc++; return 3;
441 case 0xF1: sbc(indY(&c)); return 5+c;
442 case 0xF5: sbc(zpX()); return 4;
443 case 0xF6: inc((u8int)(fetch8() + rX)); return 6;
444 case 0xF8: rP |= FLAGD; return 2;
445 case 0xF9: sbc(absY()); return 4 + ((u8int)a < rY);
446 case 0xFD: sbc(absX()); return 4 + ((u8int)a < rX);
447 case 0xFE: inc(fetch16() + rX); return 7;
449 print("undefined %#x (pc %#x)\n", op, curpc);