X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fm68hc11-dis.c;h=bb0cc207d4d3cddac65d95d12ca70faaca0fdaae;hb=ff3a6ee3fde2983018891ca1fd5af50a89393528;hp=31fbf27eaae6c739ac027a519e26c2212ce7b65e;hpb=b849bb422365dfac58b782c70bf29445e6f71d27;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/m68hc11-dis.c b/opcodes/m68hc11-dis.c index 31fbf27eaa..bb0cc207d4 100644 --- a/opcodes/m68hc11-dis.c +++ b/opcodes/m68hc11-dis.c @@ -366,14 +366,35 @@ print_insn (memaddr, info, arch) (*info->fprintf_func) (info->stream, "\t"); } - /* The movb and movw must be handled in a special way... */ - offset = 0; - if (format & (M6812_OP_IDX_P2 | M6812_OP_IND16_P2)) - { - if ((format & M6812_OP_IDX_P2) - && (format & (M6811_OP_IMM8 | M6811_OP_IMM16 | M6811_OP_IND16))) - offset = 1; - } + /* The movb and movw must be handled in a special way... + The source constant 'ii' is not always at the same place. + This is the same for the destination for the post-indexed byte. + The 'offset' is used to do the appropriate correction. + + offset offset + for constant for destination + movb 18 OB ii hh ll 0 0 + 18 08 xb ii 1 -1 + 18 0C hh ll hh ll 0 0 + 18 09 xb hh ll 1 -1 + 18 0D xb hh ll 0 0 + 18 0A xb xb 0 0 + + movw 18 03 jj kk hh ll 0 0 + 18 00 xb jj kk 1 -1 + 18 04 hh ll hh ll 0 0 + 18 01 xb hh ll 1 -1 + 18 05 xb hh ll 0 0 + 18 02 xb xb 0 0 + + After the source operand is read, the position 'pos' is incremented + this explains the negative offset for destination. + + movb/movw above are the only instructions with this matching + format. */ + offset = ((format & M6812_OP_IDX_P2) + && (format & (M6811_OP_IMM8 | M6811_OP_IMM16 | + M6811_OP_IND16))); /* Operand with one more byte: - immediate, offset, direct-low address. */ @@ -387,7 +408,10 @@ print_insn (memaddr, info, arch) } pos++; - offset = -1; + + /* This movb/movw is special (see above). */ + offset = -offset; + if (format & M6811_OP_IMM8) { (*info->fprintf_func) (info->stream, "#%d", (int) buffer[0]);