summaryrefslogtreecommitdiff
path: root/68kinst.c
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2013-01-05 02:46:55 -0800
committerMike Pavone <pavone@retrodev.com>2013-01-05 02:46:55 -0800
commit759e4b200a882d3be397195748493f8454feebf2 (patch)
tree883f5a68c2621d0a50f024f8945757900f0c26b9 /68kinst.c
parent1d885dfef99deb7c7e308bc8c19eb37c15cbafb9 (diff)
Fix decoding of movep
Diffstat (limited to '68kinst.c')
-rw-r--r--68kinst.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/68kinst.c b/68kinst.c
index a767e09..5821044 100644
--- a/68kinst.c
+++ b/68kinst.c
@@ -122,7 +122,26 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
switch(optype)
{
case BIT_MOVEP_IMMED:
- if (*istream & 0x100) {
+ if ((*istream & 0x138) == 0x108) {
+ //MOVEP
+ decoded->op = M68K_MOVEP;
+ decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD;
+ if (*istream & 0x80) {
+ //memory dest
+ decoded->src.addr_mode = MODE_REG;
+ decoded->src.params.regs.pri = m68k_reg_quick_field(*istream);
+ decoded->dst.addr_mode = MODE_AREG_DISPLACE;
+ decoded->dst.params.regs.pri = *istream & 0x7;
+ decoded->dst.params.regs.displacement = *(++istream);
+ } else {
+ //memory source
+ decoded->dst.addr_mode = MODE_REG;
+ decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
+ decoded->src.addr_mode = MODE_AREG_DISPLACE;
+ decoded->src.params.regs.pri = *istream & 0x7;
+ decoded->src.params.regs.displacement = *(++istream);
+ }
+ } else if (*istream & 0x100) {
//BTST, BCHG, BCLR, BSET
switch ((*istream >> 6) & 0x3)
{
@@ -371,23 +390,7 @@ uint16_t * m68k_decode(uint16_t * istream, m68kinst * decoded, uint32_t address)
istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst));
break;
case 7:
- //MOVEP
- decoded->op = M68K_MOVEP;
- decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD;
- if (*istream & 0x80) {
- //memory dest
- decoded->src.addr_mode = MODE_REG;
- decoded->src.params.regs.pri = m68k_reg_quick_field(*istream);
- decoded->dst.addr_mode = MODE_AREG_DISPLACE;
- decoded->dst.params.regs.pri = *istream & 0x7;
- } else {
- //memory source
- decoded->dst.addr_mode = MODE_REG;
- decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream);
- decoded->src.addr_mode = MODE_AREG_DISPLACE;
- decoded->src.params.regs.pri = *istream & 0x7;
- }
- immed = *(++istream);
+
break;
}