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 {