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