// license:BSD-3-Clause // copyright-holders:Ville Linde /* Motorola M68HC11 disassembler Written by Ville Linde */ #include "emu.h" #include "hc11dasm.h" const hc11_disassembler::M68HC11_OPCODE hc11_disassembler::opcode_table[256] = { /* 0x00 - 0x0f */ { "test", 0, }, { "nop", 0, }, { "idiv", 0, }, { "fdiv", 0, }, { "lsrd", 0, }, { "asld", 0, }, { "tap", 0, }, { "tpa", 0, }, { "inx", 0, }, { "dex", 0, }, { "clv", 0, }, { "sev", 0, }, { "clc", 0, }, { "sec", 0, }, { "cli", 0, }, { "sei", 0, }, /* 0x10 - 0x1f */ { "sba", 0, }, { "cba", 0, }, { "brset", EA_DIRECT_IMM8_REL, }, { "brclr", EA_DIRECT_IMM8_REL, }, { "bset", EA_DIRECT_IMM8, }, { "bclr", EA_DIRECT_IMM8, }, { "tab", 0, }, { "tba", 0, }, { "page2", PAGE2, }, { "daa", 0, }, { "page3", PAGE3, }, { "aba", 0, }, { "bset", EA_IND_X_IMM8, }, { "bclr", EA_IND_X_IMM8, }, { "brset", EA_IND_X_IMM8_REL, }, { "brclr", EA_IND_X_IMM8_REL, }, /* 0x20 - 0x2f */ { "bra", EA_REL, }, { "brn", EA_REL, }, { "bhi", EA_REL, }, { "bls", EA_REL, }, { "bcc", EA_REL, }, { "bcs", EA_REL, }, { "bne", EA_REL, }, { "beq", EA_REL, }, { "bvc", EA_REL, }, { "bvs", EA_REL, }, { "bpl", EA_REL, }, { "bmi", EA_REL, }, { "bge", EA_REL, }, { "blt", EA_REL, }, { "bgt", EA_REL, }, { "ble", EA_REL, }, /* 0x30 - 0x3f */ { "tsx", 0, }, { "ins", 0, }, { "pula", 0, }, { "pulb", 0, }, { "des", 0, }, { "txs", 0, }, { "psha", 0, }, { "pshb", 0, }, { "pulx", 0, }, { "rts", 0, }, { "abx", 0, }, { "rti", 0, }, { "pshx", 0, }, { "mul", 0, }, { "wai", 0, }, { "swi", 0, }, /* 0x40 - 0x4f */ { "nega", 0, }, { "?", 0, }, { "?", 0, }, { "coma", 0, }, { "lsra", 0, }, { "?", 0, }, { "rora", 0, }, { "asra", 0, }, { "asla", 0, }, { "rola", 0, }, { "deca", 0, }, { "?", 0, }, { "inca", 0, }, { "tsta", 0, }, { "?", 0, }, { "clra", 0, }, /* 0x50 - 0x5f */ { "negb", 0, }, { "?", 0, }, { "?", 0, }, { "comb", 0, }, { "lsrb", 0, }, { "?", 0, }, { "rorb", 0, }, { "asrb", 0, }, { "aslb", 0, }, { "rolb", 0, }, { "decb", 0, }, { "?", 0, }, { "incb", 0, }, { "tstb", 0, }, { "?", 0, }, { "clrb", 0, }, /* 0x60 - 0x6f */ { "neg", EA_IND_X, }, { "?", 0, }, { "?", 0, }, { "com", EA_IND_X, }, { "lsr", EA_IND_X, }, { "?", 0, }, { "ror", EA_IND_X, }, { "asr", EA_IND_X, }, { "asl", EA_IND_X, }, { "rol", EA_IND_X, }, { "dec", EA_IND_X, }, { "?", 0, }, { "inc", EA_IND_X, }, { "tst", EA_IND_X, }, { "jmp", EA_IND_X, }, { "clr", EA_IND_X, }, /* 0x70 - 0x7f */ { "neg", EA_EXT, }, { "?", 0, }, { "?", 0, }, { "com", EA_EXT, }, { "lsr", EA_EXT, }, { "?", 0, }, { "ror", EA_EXT, }, { "asr", EA_EXT, }, { "asl", EA_EXT, }, { "rol", EA_EXT, }, { "dec", EA_EXT, }, { "?", 0, }, { "inc", EA_EXT, }, { "tst", EA_EXT, }, { "jmp", EA_EXT, }, { "clr", EA_EXT, }, /* 0x80 - 0x8f */ { "suba", EA_IMM8, }, { "cmpa", EA_IMM8, }, { "sbca", EA_IMM8, }, { "subd", EA_IMM16, }, { "anda", EA_IMM8, }, { "bita", EA_IMM8, }, { "ldaa", EA_IMM8, }, { "?", 0, }, { "eora", EA_IMM8, }, { "adca", EA_IMM8, }, { "oraa", EA_IMM8, }, { "adda", EA_IMM8, }, { "cpx", EA_IMM16, }, { "bsr", EA_REL, }, { "lds", EA_IMM16, }, { "xgdx", 0, }, /* 0x90 - 0x9f */ { "suba", EA_DIRECT, }, { "cmpa", EA_DIRECT, }, { "sbca", EA_DIRECT, }, { "subd", EA_DIRECT, }, { "anda", EA_DIRECT, }, { "bita", EA_DIRECT, }, { "ldaa", EA_DIRECT, }, { "staa", EA_DIRECT, }, { "eora", EA_DIRECT, }, { "adca", EA_DIRECT, }, { "oraa", EA_DIRECT, }, { "adda", EA_DIRECT, }, { "cpx", EA_DIRECT, }, { "jsr", EA_DIRECT, }, { "lds", EA_DIRECT, }, { "sts", EA_DIRECT, }, /* 0xa0 - 0xaf */ { "suba", EA_IND_X, }, { "cmpa", EA_IND_X, }, { "sbca", EA_IND_X, }, { "subd", EA_IND_X, }, { "anda", EA_IND_X, }, { "bita", EA_IND_X, }, { "ldaa", EA_IND_X, }, { "staa", EA_IND_X, }, { "eora", EA_IND_X, }, { "adca", EA_IND_X, }, { "oraa", EA_IND_X, }, { "adda", EA_IND_X, }, { "cpx", EA_IND_X, }, { "jsr", EA_IND_X, }, { "lds", EA_IND_X, }, { "sts", EA_IND_X, }, /* 0xb0 - 0xbf */ { "suba", EA_EXT, }, { "cmpa", EA_EXT, }, { "sbca", EA_EXT, }, { "subd", EA_EXT, }, { "anda", EA_EXT, }, { "bita", EA_EXT, }, { "ldaa", EA_EXT, }, { "staa", EA_EXT, }, { "eora", EA_EXT, }, { "adca", EA_EXT, }, { "oraa", EA_EXT, }, { "adda", EA_EXT, }, { "cpx", EA_EXT, }, { "jsr", EA_EXT, }, { "lds", EA_EXT, }, { "sts", EA_EXT, }, /* 0xc0 - 0xcf */ { "subb", EA_IMM8, }, { "cmpb", EA_IMM8, }, { "sbcb", EA_IMM8, }, { "addd", EA_IMM16, }, { "andb", EA_IMM8, }, { "bitb", EA_IMM8, }, { "ldab", EA_IMM8, }, { "?", 0, }, { "eorb", EA_IMM8, }, { "adcb", EA_IMM8, }, { "orab", EA_IMM8, }, { "addb", EA_IMM8, }, { "ldd", EA_IMM16, }, { "page4", PAGE4, }, { "ldx", EA_IMM16, }, { "stop", 0, }, /* 0xd0 - 0xdf */ { "subb", EA_DIRECT, }, { "cmpb", EA_DIRECT, }, { "sbcb", EA_DIRECT, }, { "addd", EA_DIRECT, }, { "andb", EA_DIRECT, }, { "bitb", EA_DIRECT, }, { "ldab", EA_DIRECT, }, { "stab", EA_DIRECT, }, { "eorb", EA_DIRECT, }, { "adcb", EA_DIRECT, }, { "orab", EA_DIRECT, }, { "addb", EA_DIRECT, }, { "ldd", EA_DIRECT, }, { "std", EA_DIRECT, }, { "ldx", EA_DIRECT, }, { "stx", EA_DIRECT, }, /* 0xe0 - 0xef */ { "subb", EA_IND_X, }, { "cmpb", EA_IND_X, }, { "sbcb", EA_IND_X, }, { "addd", EA_IND_X, }, { "andb", EA_IND_X, }, { "bitb", EA_IND_X, }, { "ldab", EA_IND_X, }, { "stab", EA_IND_X, }, { "eorb", EA_IND_X, }, { "adcb", EA_IND_X, }, { "orab", EA_IND_X, }, { "addb", EA_IND_X, }, { "ldd", EA_IND_X, }, { "std", EA_IND_X, }, { "ldx", EA_IND_X, }, { "stx", EA_IND_X, }, /* 0xf0 - 0xff */ { "subb", EA_EXT, }, { "cmpb", EA_EXT, }, { "sbcb", EA_EXT, }, { "addd", EA_EXT, }, { "andb", EA_EXT, }, { "bitb", EA_EXT, }, { "ldab", EA_EXT, }, { "stab", EA_EXT, }, { "eorb", EA_EXT, }, { "adcb", EA_EXT, }, { "orab", EA_EXT, }, { "addb", EA_EXT, }, { "ldd", EA_EXT, }, { "std", EA_EXT, }, { "ldx", EA_EXT, }, { "stx", EA_EXT, }, }; /*****************************************************************************/ const hc11_disassembler::M68HC11_OPCODE hc11_disassembler::opcode_table_page2[256] = { /* 0x00 - 0x0f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "iny", 0, }, { "dey", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x10 - 0x1f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "bset", EA_IND_Y_IMM8, }, { "bclr", EA_IND_Y_IMM8, }, { "brset", EA_IND_Y_IMM8_REL, }, { "brlcr", EA_IND_Y_IMM8_REL, }, /* 0x20 - 0x2f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x30 - 0x3f */ { "tsy", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "tys", 0, }, { "?", 0, }, { "?", 0, }, { "puly", 0, }, { "?", 0, }, { "aby", 0, }, { "?", 0, }, { "pshy", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x40 - 0x4f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x50 - 0x5f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x60 - 0x6f */ { "neg", EA_IND_Y, }, { "?", 0, }, { "?", 0, }, { "com", EA_IND_Y, }, { "lsr", EA_IND_Y, }, { "?", 0, }, { "ror", EA_IND_Y, }, { "asr", EA_IND_Y, }, { "asl", EA_IND_Y, }, { "rol", EA_IND_Y, }, { "dec", EA_IND_Y, }, { "?", 0, }, { "inc", EA_IND_Y, }, { "tst", EA_IND_Y, }, { "jmp", EA_IND_Y, }, { "clr", EA_IND_Y, }, /* 0x70 - 0x7f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x80 - 0x8f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpy", EA_IMM16, }, { "?", 0, }, { "?", 0, }, { "xgdy", 0, }, /* 0x90 - 0x9f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpy", EA_DIRECT, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xa0 - 0xaf */ { "suba", EA_IND_Y, }, { "cmpa", EA_IND_Y, }, { "sbca", EA_IND_Y, }, { "subd", EA_IND_Y, }, { "anda", EA_IND_Y, }, { "bita", EA_IND_Y, }, { "ldaa", EA_IND_Y, }, { "staa", EA_IND_Y, }, { "eora", EA_IND_Y, }, { "adca", EA_IND_Y, }, { "oraa", EA_IND_Y, }, { "adda", EA_IND_Y, }, { "cpy", EA_IND_Y, }, { "jsr", EA_IND_Y, }, { "lds", EA_IND_Y, }, { "sts", EA_IND_Y, }, /* 0xb0 - 0xbf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpy", EA_EXT, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xc0 - 0xcf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "ldy", EA_IMM16, }, { "?", 0, }, /* 0xd0 - 0xdf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "ldy", EA_DIRECT, }, { "sty", EA_DIRECT, }, /* 0xe0 - 0xef */ { "subb", EA_IND_Y, }, { "cmpb", EA_IND_Y, }, { "sbcb", EA_IND_Y, }, { "addd", EA_IND_Y, }, { "andb", EA_IND_Y, }, { "bitb", EA_IND_Y, }, { "ldab", EA_IND_Y, }, { "stab", EA_IND_Y, }, { "eorb", EA_IND_Y, }, { "adcb", EA_IND_Y, }, { "orab", EA_IND_Y, }, { "addb", EA_IND_Y, }, { "ldd", EA_IND_Y, }, { "std", EA_IND_Y, }, { "ldy", EA_IND_Y, }, { "sty", EA_IND_Y, }, /* 0xf0 - 0xff */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "ldy", EA_EXT, }, { "sty", EA_EXT, }, }; /*****************************************************************************/ const hc11_disassembler::M68HC11_OPCODE hc11_disassembler::opcode_table_page3[256] = { /* 0x00 - 0x0f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x10 - 0x1f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x20 - 0x2f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x30 - 0x3f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x40 - 0x4f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x50 - 0x5f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x60 - 0x6f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x70 - 0x7f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x80 - 0x8f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpd", EA_IMM16, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x90 - 0x9f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpd", EA_DIRECT, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xa0 - 0xaf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpd", EA_IND_X, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpy", EA_IND_X, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xb0 - 0xbf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpd", EA_EXT, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xc0 - 0xcf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xd0 - 0xdf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xe0 - 0xef */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "ldy", EA_IND_X, }, { "sty", EA_IND_X, }, /* 0xf0 - 0xff */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, }; /*****************************************************************************/ const hc11_disassembler::M68HC11_OPCODE hc11_disassembler::opcode_table_page4[256] = { /* 0x00 - 0x0f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x10 - 0x1f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x20 - 0x2f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x30 - 0x3f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x40 - 0x4f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x50 - 0x5f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x60 - 0x6f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x70 - 0x7f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x80 - 0x8f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0x90 - 0x9f */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xa0 - 0xaf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpd", EA_IND_Y, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "cpx", EA_IND_Y, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xb0 - 0xbf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xc0 - 0xcf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xd0 - 0xdf */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, /* 0xe0 - 0xef */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "ldx", EA_IND_Y, }, { "stx", EA_IND_Y, }, /* 0xf0 - 0xff */ { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, { "?", 0, }, }; /*****************************************************************************/ u32 hc11_disassembler::opcode_alignment() const { return 1; } offs_t hc11_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { offs_t cpc = pc; uint8_t opcode = opcodes.r8(cpc++); const M68HC11_OPCODE *op_table = &opcode_table[opcode]; uint8_t imm8, mask; int8_t rel8; uint16_t imm16; uint8_t op2; uint32_t flags = 0; loop: if (!strcmp(op_table->mnemonic, "jsr") || !strcmp(op_table->mnemonic, "bsr")) flags = STEP_OVER; else if (!strcmp(op_table->mnemonic, "rts") || !strcmp(op_table->mnemonic, "rti")) flags = STEP_OUT; else if ((opcode >= 0x22 && opcode < 0x30) || !strcmp(op_table->mnemonic, "brset") || !strcmp(op_table->mnemonic, "brclr")) flags = STEP_COND; switch(op_table->address_mode) { case EA_IMM8: imm8 = opcodes.r8(cpc++); util::stream_format(stream, "%s 0x%02X", op_table->mnemonic, imm8); break; case EA_IMM16: imm16 = opcodes.r16(cpc); cpc += 2; util::stream_format(stream, "%s 0x%04X", op_table->mnemonic, imm16); break; case EA_DIRECT: imm8 = opcodes.r8(cpc++); util::stream_format(stream, "%s (0x%04X)", op_table->mnemonic, imm8); break; case EA_EXT: imm16 = opcodes.r16(cpc); cpc += 2; util::stream_format(stream, "%s (0x%04X)", op_table->mnemonic, imm16); break; case EA_IND_X: imm8 = opcodes.r8(cpc++); util::stream_format(stream, "%s (X+0x%02X)", op_table->mnemonic, imm8); break; case EA_REL: rel8 = opcodes.r8(cpc++); util::stream_format(stream, "%s [0x%04X]", op_table->mnemonic, pc+2+rel8); break; case EA_DIRECT_IMM8: imm8 = opcodes.r8(cpc++); mask = opcodes.r8(cpc++); util::stream_format(stream, "%s (0x%04X), 0x%02X", op_table->mnemonic, imm8, mask); break; case EA_IND_X_IMM8: imm8 = opcodes.r8(cpc++); mask = opcodes.r8(cpc++); util::stream_format(stream, "%s (X+0x%02X), 0x%02X", op_table->mnemonic, imm8, mask); break; case EA_DIRECT_IMM8_REL: imm8 = opcodes.r8(cpc++); mask = opcodes.r8(cpc++); rel8 = opcodes.r8(cpc++); util::stream_format(stream, "%s (0x%04X), 0x%02X, [0x%04X]", op_table->mnemonic, imm8, mask, pc+4+rel8); break; case EA_IND_X_IMM8_REL: imm8 = opcodes.r8(cpc++); mask = opcodes.r8(cpc++); rel8 = opcodes.r8(cpc++); util::stream_format(stream, "%s (X+0x%02X), 0x%02X, [0x%04X]", op_table->mnemonic, imm8, mask, pc+4+rel8); break; case EA_IND_Y: imm8 = opcodes.r8(cpc++); util::stream_format(stream, "%s (Y+0x%02X)", op_table->mnemonic, imm8); break; case EA_IND_Y_IMM8: imm8 = opcodes.r8(cpc++); mask = opcodes.r8(cpc++); util::stream_format(stream, "%s (Y+0x%02X), 0x%02X", op_table->mnemonic, imm8, mask); break; case EA_IND_Y_IMM8_REL: imm8 = opcodes.r8(cpc++); mask = opcodes.r8(cpc++); rel8 = opcodes.r8(cpc++); util::stream_format(stream, "%s (Y+0x%02X), 0x%02X, [0x%04X]", op_table->mnemonic, imm8, mask, pc+5+rel8); break; case PAGE2: op2 = opcodes.r8(cpc++); op_table = &opcode_table_page2[op2]; goto loop; case PAGE3: op2 = opcodes.r8(cpc++); op_table = &opcode_table_page3[op2]; goto loop; case PAGE4: op2 = opcodes.r8(cpc++); op_table = &opcode_table_page4[op2]; goto loop; default: util::stream_format(stream, "%s", op_table->mnemonic); } return (cpc - pc) | flags | SUPPORTED; }