Mercurial > repos > blastem
diff 68kinst.c @ 184:ebcbdd1c4cc8
Fix a bunch of bugs in the CPU core, add a 68K debugger
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 13 Jan 2013 13:01:13 -0800 |
parents | 2f08d9e90a4c |
children | 7c227a8ec53d |
line wrap: on
line diff
--- a/68kinst.c Wed Jan 09 22:31:07 2013 -0800 +++ b/68kinst.c Sun Jan 13 13:01:13 2013 -0800 @@ -479,13 +479,13 @@ break; #endif } + decoded->dst.addr_mode = MODE_REG; + decoded->dst.addr_mode = m68k_reg_quick_field(*istream); istream = m68k_decode_op(istream, decoded->extra.size, &(decoded->src)); if (!istream) { decoded->op = M68K_INVALID; return start+1; } - decoded->dst.addr_mode = MODE_REG; - decoded->dst.addr_mode = m68k_reg_quick_field(*istream); } else { opmode = (*istream >> 3) & 0x7; if ((*istream & 0xB80) == 0x880 && opmode != MODE_REG && opmode != MODE_AREG) { @@ -959,13 +959,13 @@ //SUBX decoded->op = M68K_SUBX; decoded->extra.size = size; - istream = m68k_decode_op(istream, size, &(decoded->src)); - if (!istream) { - decoded->op = M68K_INVALID; - return start+1; + decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); + decoded->src.params.regs.pri = *istream & 0x7; + if (*istream & 0x8) { + decoded->dst.addr_mode = decoded->src.addr_mode = MODE_AREG_PREDEC; + } else { + decoded->dst.addr_mode = decoded->src.addr_mode = MODE_REG; } - decoded->dst.addr_mode = decoded->src.addr_mode; - decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); } } else { if (size == OPSIZE_INVALID) { @@ -1001,6 +1001,7 @@ return start+1; } } else { + reg = m68k_reg_quick_field(*istream); istream = m68k_decode_op(istream, size, &(decoded->dst)); if (!istream) { decoded->op = M68K_INVALID; @@ -1011,12 +1012,12 @@ //CMPM decoded->src.addr_mode = decoded->dst.addr_mode = MODE_AREG_POSTINC; decoded->src.params.regs.pri = decoded->dst.params.regs.pri; - decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); + decoded->dst.params.regs.pri = reg; } else { //EOR decoded->op = M68K_EOR; decoded->src.addr_mode = MODE_REG; - decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); + decoded->src.params.regs.pri = reg; } } } else { @@ -1142,15 +1143,14 @@ } else { //ADDX decoded->op = M68K_ADDX; - //FIXME: Size is not technically correct decoded->extra.size = size; - istream = m68k_decode_op(istream, size, &(decoded->src)); - if (!istream) { - decoded->op = M68K_INVALID; - return start+1; + decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); + decoded->src.params.regs.pri = *istream & 0x7; + if (*istream & 0x8) { + decoded->dst.addr_mode = decoded->src.addr_mode = MODE_AREG_PREDEC; + } else { + decoded->dst.addr_mode = decoded->src.addr_mode = MODE_REG; } - decoded->dst.addr_mode = decoded->src.addr_mode; - decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); } } else { if (size == OPSIZE_INVALID) {