comparison m68k_to_x86.c @ 446:1e828ed04a7c

Implement 68K stop instruction
author Mike Pavone <pavone@retrodev.com>
date Fri, 19 Jul 2013 22:44:00 -0700
parents 9ac3828ea560
children e730fc040169
comparison
equal deleted inserted replaced
445:80a9527c812c 446:1e828ed04a7c
3779 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_B); 3779 dst = mov_rrdisp8(dst, SCRATCH1, dst_op.base, dst_op.disp, SZ_B);
3780 } 3780 }
3781 } 3781 }
3782 dst = m68k_save_result(inst, dst, opts); 3782 dst = m68k_save_result(inst, dst, opts);
3783 break; 3783 break;
3784 /*case M68K_STOP: 3784 case M68K_STOP: {
3785 break;*/ 3785 //TODO: Trap if not in system mode
3786 //manual says 4 cycles, but it has to be at least 8 since it's a 2-word instruction
3787 //possibly even 12 since that's how long MOVE to SR takes
3788 dst = cycles(dst, BUS*2);
3789 dst = mov_ir(dst, src_op.disp & 0x1, FLAG_C, SZ_B);
3790 dst = mov_ir(dst, (src_op.disp >> 1) & 0x1, FLAG_V, SZ_B);
3791 dst = mov_ir(dst, (src_op.disp >> 2) & 0x1, FLAG_Z, SZ_B);
3792 dst = mov_ir(dst, (src_op.disp >> 3) & 0x1, FLAG_N, SZ_B);
3793 dst = mov_irind(dst, (src_op.disp >> 4) & 0x1, CONTEXT, SZ_B);
3794 dst = mov_irdisp8(dst, (src_op.disp >> 8), CONTEXT, offsetof(m68k_context, status), SZ_B);
3795 if (!((inst->src.params.immed >> 8) & (1 << BIT_SUPERVISOR))) {
3796 //leave supervisor mode
3797 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
3798 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, opts->aregs[7], SZ_D);
3799 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D);
3800 }
3801 uint8_t * loop_top = dst;
3802 dst = call(dst, (uint8_t *)do_sync);
3803 dst = mov_rr(dst, LIMIT, CYCLES, SZ_D);
3804 dst = cmp_rdisp8r(dst, CONTEXT, offsetof(m68k_context, int_cycle), CYCLES, SZ_D);
3805 dst = jcc(dst, CC_C, loop_top);
3806 break;
3807 }
3786 case M68K_SUB: 3808 case M68K_SUB:
3787 size = inst->dst.addr_mode == MODE_AREG ? OPSIZE_LONG : inst->extra.size; 3809 size = inst->dst.addr_mode == MODE_AREG ? OPSIZE_LONG : inst->extra.size;
3788 dst = cycles(dst, BUS); 3810 dst = cycles(dst, BUS);
3789 if (src_op.mode == MODE_REG_DIRECT) { 3811 if (src_op.mode == MODE_REG_DIRECT) {
3790 if (dst_op.mode == MODE_REG_DIRECT) { 3812 if (dst_op.mode == MODE_REG_DIRECT) {