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: