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;