void firq(void) { if (!ccf) { cce = 0; do_psh(&rs, &ru, 0x81); cci = ccf = 1; rpc = get_memw(0xfff6); nbcycle = 12; } }
void irq(void) { if (!cci) { cce = 1; do_psh(&rs, &ru, 0xff); cci = 1; rpc = get_memw(0xfff8); nbcycle = 21; } }
void swi3() { cce = 1; do_psh(&rs, &ru, 0xff); rpc = get_memw(0xfff2); }
void rts() { rpc = get_memw(rs); rs += 2; }
unsigned int disassemble(unsigned int addr) { int d = get_memb(addr); int s, i; tt_u8 pb; char reg; const unsigned char *map = NULL; // Default for most undefined opcodes unsigned char sm = 0x10; // size_mode byte unsigned char oi = OP_XX; // opcode index FILE *stream = &ser0stream; if (d == 0x10) { d = get_memb(addr + 1); map = map1; } if (d == 0x11) { d = get_memb(addr + 1); map = map2; } if (map) { // Search for the opcode in map1 or map2 map -= 3; do { map += 3; if (pgm_read_byte(map) == d) { oi = pgm_read_byte(++map); sm = pgm_read_byte(++map); break; } } while (*map < 255); } else { // Lookup directly in map0 map = map0 + 2 * d; oi = pgm_read_byte(map++); sm = pgm_read_byte(map++); } s = sm >> 4; fprintf(stream, "%04X ", addr); for (i = 0; i < s; i++) { fputs(hex8str(get_memb(addr + i)), stream); fputc(' ', stream); } for (i = s; i < 4; i++) { fputs(" ", stream); } const char *ip = inst + oi * 4; for (i = 0; i < 4; i++) fputc(pgm_read_byte(ip++), stream); fputs(" ", stream); switch(sm & 15) { case 1: /* immediate */ fputs("#$", stream); if (s == 2) fputs(hex8str(get_memb(addr + 1)), stream); else fputs(hex16str(get_memw(addr + s - 2)), stream); break; case 2: /* direct */ fputs("$", stream); fputs(hex8str(get_memb(addr + s - 1)), stream); break; case 3: /* indexed */ pb = get_memb(addr + s - 1); reg = regi[(pb >> 5) & 0x03]; if (!(pb & 0x80)) { /* n4,R */ if (pb & 0x10) fprintf(stream, "-$%s,%c", hex8str(((pb & 0x0f) ^ 0x0f) + 1), reg); else fprintf(stream, "$%s,%c", hex8str(pb & 0x0f), reg); } else { if (pb & 0x10) fputc('[', stream); switch (pb & 0x0f) { case 0: /* ,R+ */ fprintf(stream, ",%c+", reg); break; case 1: /* ,R++ */ fprintf(stream, ",%c++", reg); break; case 2: /* ,-R */ fprintf(stream, ",-%c", reg); break; case 3: /* ,--R */ fprintf(stream, ",--%c", reg); break; case 4: /* ,R */ fprintf(stream, ",%c", reg); break; case 5: /* B,R */ fprintf(stream, "B,%c", reg); break; case 6: /* A,R */ fprintf(stream, "A,%c", reg); break; case 8: /* n7,R */ s += 1; fprintf(stream, "$%s,%c", hex8str(get_memb(addr + s - 1)), reg); break; case 9: /* n15,R */ s += 2; fprintf(stream, "$%s,%c", hex16str(get_memw(addr + s - 2)), reg); break; case 11: /* D,R */ fprintf(stream, "D,%c", reg); break; case 12: /* n7,PCR */ s += 1; fprintf(stream, "$%s,PCR", hex8str(get_memb(addr + s - 1))); break; case 13: /* n15,PCR */ s += 2; fprintf(stream, "$%s,PCR", hex16str(get_memw(addr + s - 2))); break; case 15: /* [n] */ s += 2; fprintf(stream, "$%s", hex16str(get_memw(addr + s - 2))); break; default: fputs("??", stream); break; } if (pb & 0x10) fputc(']', stream); } break; case 4: /* extended */ fprintf(stream, "$%s", hex16str(get_memw(addr + s - 2))); break; case 5: /* inherent */ pb = get_memb(addr + 1); switch (d) { case 0x1e: case 0x1f: /* exg tfr */ fprintf(stream, "%s,%s", exgi[(pb >> 4) & 0x0f], exgi[pb & 0x0f]); break; case 0x1a: case 0x1c: case 0x3c: /* orcc andcc cwai */ fprintf(stream, "#$%s=%s", hex8str(pb), ccstr(pb)); break; case 0x34: /* pshs */ { int p = 0; for (i = 0; i < 8; i++) { if (pb & 0x80) { if (p) fputc(',', stream); fputs(pshsregi[i], stream); p = 1; } pb <<= 1; } } break; case 0x35: /* puls */ { int p = 0; for (i = 7; i >= 0; i--) { if (pb & 0x01) { if (p) fputc(',', stream); fputs(pshsregi[i], stream); p = 1; } pb >>= 1; } } break; case 0x36: /* pshu */ { int p = 0; for (i = 0; i < 8; i++) { if (pb & 0x80) { if (p) fputc(',', stream); fputs(pshuregi[i], stream); p = 1; } pb <<= 1; } } break; case 0x37: /* pulu */ { int p = 0; for (i = 7; i >= 0; i--) { if (pb & 0x01) { if (p) fputc(',', stream); fputs(pshuregi[i], stream); p = 1; } pb >>= 1; } } break; } break; case 6: /* relative */ { tt_s16 v; if (s == 2) v = (tt_s16)(tt_s8)get_memb(addr + 1); else v = (tt_s16)get_memw(addr + s - 2); fprintf(stream, "$%s", hex16str(addr + (tt_u16)s + v)); break; } } fputc('\n', stream); return addr + s; }
void reset(void) { rdp = 0; ccf = cci = 0; rpc = get_memw(0xfffe); }