comparison m68k_core_x86.c @ 578:ec1365fb2954

Use translate_m68k_unary for SWAP in 68K core
author Michael Pavone <pavone@retrodev.com>
date Tue, 04 Mar 2014 22:24:08 -0800
parents 0f367276a80c
children 0031cd308a31
comparison
equal deleted inserted replaced
577:0f367276a80c 578:ec1365fb2954
1451 case M68K_NOT: not_r(code, dst, size); cmp_ir(code, 0, dst, size); break; 1451 case M68K_NOT: not_r(code, dst, size); cmp_ir(code, 0, dst, size); break;
1452 case M68K_ROL: rol_clr(code, dst, size); break; 1452 case M68K_ROL: rol_clr(code, dst, size); break;
1453 case M68K_ROR: ror_clr(code, dst, size); break; 1453 case M68K_ROR: ror_clr(code, dst, size); break;
1454 case M68K_ROXL: rcl_clr(code, dst, size); break; 1454 case M68K_ROXL: rcl_clr(code, dst, size); break;
1455 case M68K_ROXR: rcr_clr(code, dst, size); break; 1455 case M68K_ROXR: rcr_clr(code, dst, size); break;
1456 case M68K_SWAP: rol_ir(code, 16, dst, SZ_D); cmp_ir(code, 0, dst, SZ_D); break;
1456 case M68K_TST: cmp_ir(code, 0, dst, size); break; 1457 case M68K_TST: cmp_ir(code, 0, dst, size); break;
1457 } 1458 }
1458 } 1459 }
1459 1460
1460 void op_rdisp(code_info *code, m68kinst *inst, uint8_t dst, int32_t disp, uint8_t size) 1461 void op_rdisp(code_info *code, m68kinst *inst, uint8_t dst, int32_t disp, uint8_t size)
1465 case M68K_NOT: not_rdisp(code, dst, disp, size); cmp_irdisp(code, 0, dst, disp, size); break; 1466 case M68K_NOT: not_rdisp(code, dst, disp, size); cmp_irdisp(code, 0, dst, disp, size); break;
1466 case M68K_ROL: rol_clrdisp(code, dst, disp, size); break; 1467 case M68K_ROL: rol_clrdisp(code, dst, disp, size); break;
1467 case M68K_ROR: ror_clrdisp(code, dst, disp, size); break; 1468 case M68K_ROR: ror_clrdisp(code, dst, disp, size); break;
1468 case M68K_ROXL: rcl_clrdisp(code, dst, disp, size); break; 1469 case M68K_ROXL: rcl_clrdisp(code, dst, disp, size); break;
1469 case M68K_ROXR: rcr_clrdisp(code, dst, disp, size); break; 1470 case M68K_ROXR: rcr_clrdisp(code, dst, disp, size); break;
1471 case M68K_SWAP: rol_irdisp(code, 16, dst, disp, SZ_D); cmp_irdisp(code, 0, dst, disp, SZ_D); break;
1470 case M68K_TST: cmp_irdisp(code, 0, dst, disp, size); break; 1472 case M68K_TST: cmp_irdisp(code, 0, dst, disp, size); break;
1471 } 1473 }
1472 } 1474 }
1473 1475
1474 void translate_m68k_unary(m68k_options *opts, m68kinst *inst, uint32_t flag_mask, x86_ea *dst_op) 1476 void translate_m68k_unary(m68k_options *opts, m68kinst *inst, uint32_t flag_mask, x86_ea *dst_op)
2321 *after_cycle_up = code->cur - (after_cycle_up+1); 2323 *after_cycle_up = code->cur - (after_cycle_up+1);
2322 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, int_cycle), opts->gen.cycles, SZ_D); 2324 cmp_rdispr(code, opts->gen.context_reg, offsetof(m68k_context, int_cycle), opts->gen.cycles, SZ_D);
2323 jcc(code, CC_C, loop_top); 2325 jcc(code, CC_C, loop_top);
2324 break; 2326 break;
2325 } 2327 }
2326 case M68K_SWAP:
2327 cycles(&opts->gen, BUS);
2328 if (src_op.mode == MODE_REG_DIRECT) {
2329 rol_ir(code, 16, src_op.base, SZ_D);
2330 cmp_ir(code, 0, src_op.base, SZ_D);
2331 } else{
2332 rol_irdisp(code, 16, src_op.base, src_op.disp, SZ_D);
2333 cmp_irdisp(code, 0, src_op.base, src_op.disp, SZ_D);
2334 }
2335
2336 update_flags(opts, N|Z|V0|C0);
2337 break;
2338 //case M68K_TAS: 2328 //case M68K_TAS:
2339 case M68K_TRAP: 2329 case M68K_TRAP:
2340 translate_m68k_trap(opts, inst); 2330 translate_m68k_trap(opts, inst);
2341 break; 2331 break;
2342 //case M68K_TRAPV: 2332 //case M68K_TRAPV:
2343 case M68K_TST: 2333 case M68K_TST:
2334 case M68K_SWAP:
2344 translate_m68k_unary(opts, inst, N|Z|V0|C0, &src_op); 2335 translate_m68k_unary(opts, inst, N|Z|V0|C0, &src_op);
2345 break; 2336 break;
2346 default: 2337 default:
2347 m68k_disasm(inst, disasm_buf); 2338 m68k_disasm(inst, disasm_buf);
2348 printf("%X: %s\ninstruction %d not yet implemented\n", inst->address, disasm_buf, inst->op); 2339 printf("%X: %s\ninstruction %d not yet implemented\n", inst->address, disasm_buf, inst->op);