Mercurial > repos > blastem
comparison 68kinst.c @ 68:1c9a4052a2c0
Fix decoding and disassembly of MOVEM
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 20 Dec 2012 09:08:13 -0800 |
parents | b37cb596bc21 |
children | 36f1133837d0 |
comparison
equal
deleted
inserted
replaced
67:534eb4976423 | 68:1c9a4052a2c0 |
---|---|
416 if ((*istream & 0xB80) == 0x880 && opmode != MODE_REG && opmode != MODE_AREG) { | 416 if ((*istream & 0xB80) == 0x880 && opmode != MODE_REG && opmode != MODE_AREG) { |
417 //TODO: Check for invalid modes that are dependent on direction | 417 //TODO: Check for invalid modes that are dependent on direction |
418 decoded->op = M68K_MOVEM; | 418 decoded->op = M68K_MOVEM; |
419 decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD; | 419 decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD; |
420 reg = *istream & 0x7; | 420 reg = *istream & 0x7; |
421 immed = *(++istream); | |
422 if(*istream & 0x400) { | 421 if(*istream & 0x400) { |
423 decoded->dst.addr_mode = MODE_REG; | 422 decoded->dst.addr_mode = MODE_REG; |
424 decoded->dst.params.immed = immed; | 423 decoded->dst.params.immed = *(++istream); |
425 istream = m68k_decode_op_ex(istream, opmode, reg, decoded->extra.size, &(decoded->src)); | 424 istream = m68k_decode_op_ex(istream, opmode, reg, decoded->extra.size, &(decoded->src)); |
426 } else { | 425 } else { |
427 decoded->src.addr_mode = MODE_REG; | 426 decoded->src.addr_mode = MODE_REG; |
428 decoded->src.params.immed = immed; | 427 decoded->src.params.immed = *(++istream); |
429 istream = m68k_decode_op_ex(istream, opmode, reg, decoded->extra.size, &(decoded->dst)); | 428 istream = m68k_decode_op_ex(istream, opmode, reg, decoded->extra.size, &(decoded->dst)); |
430 } | 429 } |
431 } else { | 430 } else { |
432 optype = (*istream >> 9) & 0x7; | 431 optype = (*istream >> 9) & 0x7; |
433 size = (*istream >> 6) & 0x3; | 432 size = (*istream >> 6) & 0x3; |
1174 dir = -1; | 1173 dir = -1; |
1175 } else { | 1174 } else { |
1176 reg = 0; | 1175 reg = 0; |
1177 bit = 1; | 1176 bit = 1; |
1178 } | 1177 } |
1179 strcat(dst, " "); | 1178 if (need_comma) { |
1180 for (oplen = 1, reg=0; bit < 16 && bit > -1; bit += dir, reg++) { | 1179 strcat(dst, ", "); |
1180 oplen = 2; | |
1181 } else { | |
1182 strcat(dst, " "); | |
1183 oplen = 1; | |
1184 } | |
1185 for (reg=0; bit < 16 && bit > -1; bit += dir, reg++) { | |
1181 if (decoded->params.immed & (1 << bit)) { | 1186 if (decoded->params.immed & (1 << bit)) { |
1182 if (reg > 7) { | 1187 if (reg > 7) { |
1183 rtype = "a"; | 1188 rtype = "a"; |
1184 regnum = reg - 8; | 1189 regnum = reg - 8; |
1185 } else { | 1190 } else { |