Mercurial > repos > blastem
comparison 68kinst.c @ 163:5559616e6bd8
Fix decoding of movep
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 05 Jan 2013 02:46:55 -0800 |
parents | 4791c0204410 |
children | e2918b5208eb |
comparison
equal
deleted
inserted
replaced
162:eba78ad49a11 | 163:5559616e6bd8 |
---|---|
120 decoded->variant = VAR_NORMAL; | 120 decoded->variant = VAR_NORMAL; |
121 decoded->address = address; | 121 decoded->address = address; |
122 switch(optype) | 122 switch(optype) |
123 { | 123 { |
124 case BIT_MOVEP_IMMED: | 124 case BIT_MOVEP_IMMED: |
125 if (*istream & 0x100) { | 125 if ((*istream & 0x138) == 0x108) { |
126 //MOVEP | |
127 decoded->op = M68K_MOVEP; | |
128 decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD; | |
129 if (*istream & 0x80) { | |
130 //memory dest | |
131 decoded->src.addr_mode = MODE_REG; | |
132 decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); | |
133 decoded->dst.addr_mode = MODE_AREG_DISPLACE; | |
134 decoded->dst.params.regs.pri = *istream & 0x7; | |
135 decoded->dst.params.regs.displacement = *(++istream); | |
136 } else { | |
137 //memory source | |
138 decoded->dst.addr_mode = MODE_REG; | |
139 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); | |
140 decoded->src.addr_mode = MODE_AREG_DISPLACE; | |
141 decoded->src.params.regs.pri = *istream & 0x7; | |
142 decoded->src.params.regs.displacement = *(++istream); | |
143 } | |
144 } else if (*istream & 0x100) { | |
126 //BTST, BCHG, BCLR, BSET | 145 //BTST, BCHG, BCLR, BSET |
127 switch ((*istream >> 6) & 0x3) | 146 switch ((*istream >> 6) & 0x3) |
128 { | 147 { |
129 case 0: | 148 case 0: |
130 decoded->op = M68K_BTST; | 149 decoded->op = M68K_BTST; |
369 break; | 388 break; |
370 } | 389 } |
371 istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); | 390 istream = m68k_decode_op_ex(istream, opmode, reg, size, &(decoded->dst)); |
372 break; | 391 break; |
373 case 7: | 392 case 7: |
374 //MOVEP | 393 |
375 decoded->op = M68K_MOVEP; | |
376 decoded->extra.size = *istream & 0x40 ? OPSIZE_LONG : OPSIZE_WORD; | |
377 if (*istream & 0x80) { | |
378 //memory dest | |
379 decoded->src.addr_mode = MODE_REG; | |
380 decoded->src.params.regs.pri = m68k_reg_quick_field(*istream); | |
381 decoded->dst.addr_mode = MODE_AREG_DISPLACE; | |
382 decoded->dst.params.regs.pri = *istream & 0x7; | |
383 } else { | |
384 //memory source | |
385 decoded->dst.addr_mode = MODE_REG; | |
386 decoded->dst.params.regs.pri = m68k_reg_quick_field(*istream); | |
387 decoded->src.addr_mode = MODE_AREG_DISPLACE; | |
388 decoded->src.params.regs.pri = *istream & 0x7; | |
389 } | |
390 immed = *(++istream); | |
391 | 394 |
392 break; | 395 break; |
393 } | 396 } |
394 } | 397 } |
395 break; | 398 break; |