Mercurial > repos > blastem
comparison m68k_to_x86.c @ 226:28a6697e847b
Implement CHK instruction (not fully tested).
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 21 Apr 2013 13:00:34 -0700 |
parents | 7348057e7a8c |
children | 1ed81ef2a3a2 |
comparison
equal
deleted
inserted
replaced
225:7348057e7a8c | 226:28a6697e847b |
---|---|
3082 dst = setcc_r(dst, CC_NC, FLAG_Z); | 3082 dst = setcc_r(dst, CC_NC, FLAG_Z); |
3083 if (inst->op != M68K_BTST) { | 3083 if (inst->op != M68K_BTST) { |
3084 dst = m68k_save_result(inst, dst, opts); | 3084 dst = m68k_save_result(inst, dst, opts); |
3085 } | 3085 } |
3086 break; | 3086 break; |
3087 /*case M68K_CHK: | 3087 case M68K_CHK: |
3088 break;*/ | 3088 { |
3089 dst = cycles(dst, 6); | |
3090 if (dst_op.mode == MODE_REG_DIRECT) { | |
3091 dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size); | |
3092 } else { | |
3093 dst = cmp_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size); | |
3094 } | |
3095 uint8_t * passed = dst+1; | |
3096 dst = jcc(dst, CC_GE, dst+2); | |
3097 dst = mov_ir(dst, 1, FLAG_N, SZ_B); | |
3098 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); | |
3099 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); | |
3100 dst = jmp(dst, (uint8_t *)m68k_trap); | |
3101 *passed = dst - (passed+1); | |
3102 if (dst_op.mode == MODE_REG_DIRECT) { | |
3103 if (src_op.mode == MODE_REG_DIRECT) { | |
3104 dst = cmp_rr(dst, src_op.base, dst_op.base, inst->extra.size); | |
3105 } else if(src_op.mode == MODE_REG_DISPLACE8) { | |
3106 dst = cmp_rdisp8r(dst, src_op.base, src_op.disp, dst_op.base, inst->extra.size); | |
3107 } else { | |
3108 dst = cmp_ir(dst, src_op.disp, dst_op.base, inst->extra.size); | |
3109 } | |
3110 } else if(dst_op.mode == MODE_REG_DISPLACE8) { | |
3111 if (src_op.mode == MODE_REG_DIRECT) { | |
3112 dst = cmp_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, inst->extra.size); | |
3113 } else { | |
3114 dst = cmp_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, inst->extra.size); | |
3115 } | |
3116 } | |
3117 passed = dst+1; | |
3118 dst = jcc(dst, CC_LE, dst+2); | |
3119 dst = mov_ir(dst, 0, FLAG_N, SZ_B); | |
3120 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); | |
3121 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); | |
3122 dst = jmp(dst, (uint8_t *)m68k_trap); | |
3123 *passed = dst - (passed+1); | |
3124 dst = cycles(dst, 4); | |
3125 break; | |
3126 } | |
3089 case M68K_DIVS: | 3127 case M68K_DIVS: |
3090 case M68K_DIVU: | 3128 case M68K_DIVU: |
3091 //TODO: Trap on division by zero | 3129 //TODO: Trap on division by zero |
3092 dst = cycles(dst, inst->op == M68K_DIVS ? 158 : 140); | 3130 dst = cycles(dst, inst->op == M68K_DIVS ? 158 : 140); |
3093 dst = push_r(dst, RDX); | 3131 dst = push_r(dst, RDX); |
3800 dst = setcc_r(dst, CC_S, FLAG_N); | 3838 dst = setcc_r(dst, CC_S, FLAG_N); |
3801 dst = mov_ir(dst, 0, FLAG_V, SZ_B); | 3839 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
3802 break; | 3840 break; |
3803 //case M68K_TAS: | 3841 //case M68K_TAS: |
3804 case M68K_TRAP: | 3842 case M68K_TRAP: |
3805 dst = mov_ir(dst, src_op.disp, SCRATCH2, SZ_D); | 3843 dst = mov_ir(dst, src_op.disp + VECTOR_TRAP_0, SCRATCH2, SZ_D); |
3806 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); | 3844 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); |
3807 dst = jmp(dst, (uint8_t *)m68k_trap); | 3845 dst = jmp(dst, (uint8_t *)m68k_trap); |
3808 break; | 3846 break; |
3809 //case M68K_TRAPV: | 3847 //case M68K_TRAPV: |
3810 case M68K_TST: | 3848 case M68K_TST: |