diff options
author | Mike Pavone <pavone@retrodev.com> | 2013-01-13 13:01:13 -0800 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2013-01-13 13:01:13 -0800 |
commit | e8f10d79de7c5c3cb59b73b2e0eb326fd4e1085e (patch) | |
tree | c4183d6e2f889159e32e735f6a70078b3503958d /68kinst.c | |
parent | c9f76989d03409e5323871979d34053fc771c86d (diff) |
Fix a bunch of bugs in the CPU core, add a 68K debugger
Diffstat (limited to '68kinst.c')
-rw-r--r-- | 68kinst.c | 34 |
1 files changed, 17 insertions, 17 deletions
@@ -479,13 +479,13 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address) 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 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address) //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.addr_mode = decoded->src.addr_mode; 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; + } } } else { if (size == OPSIZE_INVALID) { @@ -1001,6 +1001,7 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address) 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 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address) //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 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address) } 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.addr_mode = decoded->src.addr_mode; 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; + } } } else { if (size == OPSIZE_INVALID) { |