Mercurial > repos > blastem
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); |