comparison m68k_to_x86.c @ 194:811163790e6c

Implement ABCD an SBCD. Fix BTEST with register source.
author Mike Pavone <pavone@retrodev.com>
date Wed, 16 Jan 2013 22:40:56 -0800
parents c66e4636f991
children f8955d33486d
comparison
equal deleted inserted replaced
193:c66e4636f991 194:811163790e6c
47 void m68k_retrans_stub(); 47 void m68k_retrans_stub();
48 void set_sr(); 48 void set_sr();
49 void set_ccr(); 49 void set_ccr();
50 void get_sr(); 50 void get_sr();
51 void do_sync(); 51 void do_sync();
52 void bcd_add();
53 void bcd_sub();
52 void m68k_start_context(uint8_t * addr, m68k_context * context); 54 void m68k_start_context(uint8_t * addr, m68k_context * context);
53 55
54 uint8_t * cycles(uint8_t * dst, uint32_t num) 56 uint8_t * cycles(uint8_t * dst, uint32_t num)
55 { 57 {
56 dst = add_ir(dst, num, CYCLES, SZ_D); 58 dst = add_ir(dst, num, CYCLES, SZ_D);
2690 dst = translate_m68k_dst(inst, &dst_op, dst, opts, 0); 2692 dst = translate_m68k_dst(inst, &dst_op, dst, opts, 0);
2691 } 2693 }
2692 uint8_t size; 2694 uint8_t size;
2693 switch(inst->op) 2695 switch(inst->op)
2694 { 2696 {
2695 //case M68K_ABCD: 2697 case M68K_ABCD:
2696 // break; 2698 if (src_op.base != SCRATCH2) {
2699 if (src_op.mode == MODE_REG_DIRECT) {
2700 dst = mov_rr(dst, src_op.base, SCRATCH2, SZ_B);
2701 } else {
2702 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, SCRATCH2, SZ_B);
2703 }
2704 }
2705 if (dst_op.base != SCRATCH1) {
2706 if (dst_op.mode == MODE_REG_DIRECT) {
2707 dst = mov_rr(dst, dst_op.base, SCRATCH1, SZ_B);
2708 } else {
2709 dst = mov_rdisp8r(dst, dst_op.base, dst_op.disp, SCRATCH1, SZ_B);
2710 }
2711 }
2712 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
2713 dst = jcc(dst, CC_NC, dst+5);
2714 dst = add_ir(dst, 1, SCRATCH1, SZ_B);
2715 dst = call(dst, (uint8_t *)bcd_add);
2716 dst = mov_rr(dst, CH, FLAG_C, SZ_B);
2717 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
2718 dst = cmp_ir(dst, 0, SCRATCH1, SZ_B);
2719 dst = jcc(dst, CC_Z, dst+4);
2720 dst = mov_ir(dst, 0, FLAG_Z, SZ_B);
2721 if (dst_op.base != SCRATCH1) {
2722 if (dst_op.mode == MODE_REG_DIRECT) {
2723 dst = mov_rr(dst, SCRATCH1, dst_op.base, SZ_B);
2724 } else {
2725 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_B);
2726 }
2727 }
2728 dst = m68k_save_result(inst, dst, opts);
2729 break;
2697 case M68K_ADD: 2730 case M68K_ADD:
2698 dst = cycles(dst, BUS); 2731 dst = cycles(dst, BUS);
2699 size = inst->dst.addr_mode == MODE_AREG ? OPSIZE_LONG : inst->extra.size; 2732 size = inst->dst.addr_mode == MODE_AREG ? OPSIZE_LONG : inst->extra.size;
2700 if (src_op.mode == MODE_REG_DIRECT) { 2733 if (src_op.mode == MODE_REG_DIRECT) {
2701 if (dst_op.mode == MODE_REG_DIRECT) { 2734 if (dst_op.mode == MODE_REG_DIRECT) {
3513 dst = add_ir(dst, 4, opts->aregs[7], SZ_D); 3546 dst = add_ir(dst, 4, opts->aregs[7], SZ_D);
3514 //Get native address and jump to it 3547 //Get native address and jump to it
3515 dst = call(dst, (uint8_t *)m68k_native_addr); 3548 dst = call(dst, (uint8_t *)m68k_native_addr);
3516 dst = jmp_r(dst, SCRATCH1); 3549 dst = jmp_r(dst, SCRATCH1);
3517 break; 3550 break;
3518 /*case M68K_SBCD: 3551 case M68K_SBCD:
3519 case M68K_STOP: 3552 if (src_op.base != SCRATCH2) {
3553 if (src_op.mode == MODE_REG_DIRECT) {
3554 dst = mov_rr(dst, src_op.base, SCRATCH2, SZ_B);
3555 } else {
3556 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, SCRATCH2, SZ_B);
3557 }
3558 }
3559 if (dst_op.base != SCRATCH1) {
3560 if (dst_op.mode == MODE_REG_DIRECT) {
3561 dst = mov_rr(dst, dst_op.base, SCRATCH1, SZ_B);
3562 } else {
3563 dst = mov_rdisp8r(dst, dst_op.base, dst_op.disp, SCRATCH1, SZ_B);
3564 }
3565 }
3566 dst = bt_irdisp8(dst, 0, CONTEXT, 0, SZ_B);
3567 dst = jcc(dst, CC_NC, dst+5);
3568 dst = sub_ir(dst, 1, SCRATCH1, SZ_B);
3569 dst = call(dst, (uint8_t *)bcd_sub);
3570 dst = mov_rr(dst, CH, FLAG_C, SZ_B);
3571 dst = mov_rrind(dst, FLAG_C, CONTEXT, SZ_B);
3572 dst = cmp_ir(dst, 0, SCRATCH1, SZ_B);
3573 dst = jcc(dst, CC_Z, dst+4);
3574 dst = mov_ir(dst, 0, FLAG_Z, SZ_B);
3575 if (dst_op.base != SCRATCH1) {
3576 if (dst_op.mode == MODE_REG_DIRECT) {
3577 dst = mov_rr(dst, SCRATCH1, dst_op.base, SZ_B);
3578 } else {
3579 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_B);
3580 }
3581 }
3582 dst = m68k_save_result(inst, dst, opts);
3583 break;
3584 /*case M68K_STOP:
3520 break;*/ 3585 break;*/
3521 case M68K_SUB: 3586 case M68K_SUB:
3522 size = inst->dst.addr_mode == MODE_AREG ? OPSIZE_LONG : inst->extra.size; 3587 size = inst->dst.addr_mode == MODE_AREG ? OPSIZE_LONG : inst->extra.size;
3523 dst = cycles(dst, BUS); 3588 dst = cycles(dst, BUS);
3524 if (src_op.mode == MODE_REG_DIRECT) { 3589 if (src_op.mode == MODE_REG_DIRECT) {