summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2012-12-20 09:08:13 -0800
committerMike Pavone <pavone@retrodev.com>2012-12-20 09:08:13 -0800
commit4b314e7e0cd5962141158ecd5ffcf01424a4ba79 (patch)
treeb9bdb9cd5fd6144e39bdd29bc37bbdcfd2d8af37
parent93805144d74675fcefcc21575ef08ba1404e3ec6 (diff)
Fix decoding and disassembly of MOVEM
-rw-r--r--68kinst.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/68kinst.c b/68kinst.c
index 102ff2c..8603259 100644
--- a/68kinst.c
+++ b/68kinst.c
@@ -418,14 +418,13 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
decoded->op = M68K_MOVEM;
decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD;
reg = *istream & 0x7;
- immed = *(++istream);
if(*istream & 0x400) {
decoded->dst.addr_mode = MODE_REG;
- decoded->dst.params.immed = immed;
+ decoded->dst.params.immed = *(++istream);
istream = m68k_decode_op_ex(istream, opmode, reg, decoded->extra.size, &(decoded->src));
} else {
decoded->src.addr_mode = MODE_REG;
- decoded->src.params.immed = immed;
+ decoded->src.params.immed = *(++istream);
istream = m68k_decode_op_ex(istream, opmode, reg, decoded->extra.size, &(decoded->dst));
}
} else {
@@ -1176,8 +1175,14 @@ int m68k_disasm_movem_op(m68k_op_info *decoded, m68k_op_info *other, char *dst,
reg = 0;
bit = 1;
}
- strcat(dst, " ");
- for (oplen = 1, reg=0; bit < 16 && bit > -1; bit += dir, reg++) {
+ if (need_comma) {
+ strcat(dst, ", ");
+ oplen = 2;
+ } else {
+ strcat(dst, " ");
+ oplen = 1;
+ }
+ for (reg=0; bit < 16 && bit > -1; bit += dir, reg++) {
if (decoded->params.immed & (1 << bit)) {
if (reg > 7) {
rtype = "a";