diff options
Diffstat (limited to 'src/emu/cpu/hmcs40/hmcs40d.c')
-rw-r--r-- | src/emu/cpu/hmcs40/hmcs40d.c | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/src/emu/cpu/hmcs40/hmcs40d.c b/src/emu/cpu/hmcs40/hmcs40d.c index 53b4ebd292d..08aecd78110 100644 --- a/src/emu/cpu/hmcs40/hmcs40d.c +++ b/src/emu/cpu/hmcs40/hmcs40d.c @@ -3,6 +3,8 @@ /* Hitachi HMCS40 MCU family disassembler + + NOTE: start offset(basepc) is $3F, not 0 */ @@ -41,19 +43,19 @@ static const char *const s_mnemonics[] = "NOP", "?" }; -// number of bits per opcode parameter, -3 means (XY) parameter +// number of bits per opcode parameter, 99 means (XY) parameter, negative means reversed bit-order static const INT8 s_bits[] = { 0, 0, 0, 0, 0, 4, - 0, 0, 4, 4, 0, 0, 0, 0, -3, - -3, -3, -3, -3, -3, -3, - 4, 4, 4, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 4, 0, 0, 4, 0, 0, + 0, 0, -4, -4, 0, 0, 0, 0, 99, + 99, 99, 99, 99, 99, 99, + -4, -4, -4, + -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, 0, -4, 0, 0, 2, 2, 2, 6, 6, 5, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 4, 4, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, -4, -4, 3, 3, 3, 3, 3, 0, 0 }; @@ -186,7 +188,7 @@ CPU_DISASSEMBLE(hmcs40) INT8 bits = s_bits[instr]; // special case for (XY) opcode - if (bits == -3) + if (bits == 99) { dst += sprintf(dst, "%s", s_mnemonics[instr]); @@ -196,17 +198,29 @@ CPU_DISASSEMBLE(hmcs40) dst += sprintf(dst, "Y"); } else + { dst += sprintf(dst, "%-6s ", s_mnemonics[instr]); - // opcode parameter - if (bits > 0) - { - UINT8 param = op & ((1 << bits) - 1); - - if (bits > 5) - dst += sprintf(dst, "$%02X", param); - else - dst += sprintf(dst, "%d", param); + // opcode parameter + if (bits != 0) + { + UINT8 param = op; + + // reverse bits + if (bits < 0) + { + param = BITSWAP8(param,0,1,2,3,4,5,6,7); + param >>= (8 + bits); + bits = -bits; + } + + param &= ((1 << bits) - 1); + + if (bits > 5) + dst += sprintf(dst, "$%02X", param); + else + dst += sprintf(dst, "%d", param); + } } int pos = s_next_pc[pc & 0x3f] & DASMFLAG_LENGTHMASK; |