From a5283a500dba676b3573048ffa4fafb9b139621a Mon Sep 17 00:00:00 2001 From: Stephane Carrez Date: Thu, 1 Nov 2001 09:49:31 +0000 Subject: * m68hc11-dis.c (print_insn): Fix disassembly of movb with a constant as source. --- opcodes/ChangeLog | 5 +++++ opcodes/m68hc11-dis.c | 44 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index ad0dc07d603..8b4af67cef2 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2001-11-01 Stephane Carrez + + * m68hc11-dis.c (print_insn): Fix disassembly of movb with a + constant as source. + 2001-10-24 Richard Henderson * ia64-asmtab.c: Regenerate. diff --git a/opcodes/m68hc11-dis.c b/opcodes/m68hc11-dis.c index 97c90fb44ad..156aaf9dde2 100644 --- a/opcodes/m68hc11-dis.c +++ b/opcodes/m68hc11-dis.c @@ -1,5 +1,5 @@ /* m68hc11-dis.c -- Motorola 68HC11 & 68HC12 disassembly - Copyright 1999, 2000 Free Software Foundation, Inc. + Copyright 1999, 2000, 2001 Free Software Foundation, Inc. Written by Stephane Carrez (stcarrez@worldnet.fr) This program is free software; you can redistribute it and/or modify @@ -358,14 +358,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. */ @@ -379,7 +400,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]); -- cgit v1.2.1