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