void ror() { uint16_t a = GET_EAB; uint8_t t = get_memb(a); ror8(t); set_memb(a, t); }
void lsr() { uint16_t a = GET_EAB; uint8_t v = get_memb(a); lsr8(v); set_memb(a, v); }
void neg() { uint16_t a = GET_EAB; uint8_t t = get_memb(a); neg8(t); set_memb(a, t); }
void inc() { uint16_t a = GET_EAB; uint8_t t = get_memb(a); inc8(t); set_memb(a, t); }
void dec() { uint16_t a = GET_EAB; uint8_t t = get_memb(a); dec8(t); set_memb(a, t); }
void com() { uint16_t a = GET_EAB; uint8_t t = get_memb(a); com8(t); set_memb(a, t); }
void asr() { uint16_t a = GET_EAB; uint8_t t = get_memb(a); asr8(t); set_memb(a, t); }
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; }