comparison m68k_to_x86.c @ 324:4f2711899866

Fix retrun address calculation for CHK exceptions
author Mike Pavone <pavone@retrodev.com>
date Sun, 12 May 2013 01:34:17 -0700
parents 146c87616b05
children 467bfa17004a
comparison
equal deleted inserted replaced
323:8c01b4154480 324:4f2711899866
3061 if (dst_op.mode == MODE_REG_DIRECT) { 3061 if (dst_op.mode == MODE_REG_DIRECT) {
3062 dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size); 3062 dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size);
3063 } else { 3063 } else {
3064 dst = cmp_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size); 3064 dst = cmp_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size);
3065 } 3065 }
3066 uint32_t isize;
3067 switch(inst->src.addr_mode)
3068 {
3069 case MODE_AREG_DISPLACE:
3070 case MODE_AREG_INDEX_DISP8:
3071 case MODE_ABSOLUTE_SHORT:
3072 case MODE_PC_INDEX_DISP8:
3073 case MODE_PC_DISPLACE:
3074 case MODE_IMMEDIATE:
3075 isize = 4;
3076 break;
3077 case MODE_ABSOLUTE:
3078 isize = 6;
3079 break;
3080 default:
3081 isize = 2;
3082 }
3066 uint8_t * passed = dst+1; 3083 uint8_t * passed = dst+1;
3067 dst = jcc(dst, CC_GE, dst+2); 3084 dst = jcc(dst, CC_GE, dst+2);
3068 dst = mov_ir(dst, 1, FLAG_N, SZ_B); 3085 dst = mov_ir(dst, 1, FLAG_N, SZ_B);
3069 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); 3086 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D);
3070 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); 3087 dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D);
3071 dst = jmp(dst, (uint8_t *)m68k_trap); 3088 dst = jmp(dst, (uint8_t *)m68k_trap);
3072 *passed = dst - (passed+1); 3089 *passed = dst - (passed+1);
3073 if (dst_op.mode == MODE_REG_DIRECT) { 3090 if (dst_op.mode == MODE_REG_DIRECT) {
3074 if (src_op.mode == MODE_REG_DIRECT) { 3091 if (src_op.mode == MODE_REG_DIRECT) {
3075 dst = cmp_rr(dst, src_op.base, dst_op.base, inst->extra.size); 3092 dst = cmp_rr(dst, src_op.base, dst_op.base, inst->extra.size);
3087 } 3104 }
3088 passed = dst+1; 3105 passed = dst+1;
3089 dst = jcc(dst, CC_LE, dst+2); 3106 dst = jcc(dst, CC_LE, dst+2);
3090 dst = mov_ir(dst, 0, FLAG_N, SZ_B); 3107 dst = mov_ir(dst, 0, FLAG_N, SZ_B);
3091 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); 3108 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D);
3092 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); 3109 dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D);
3093 dst = jmp(dst, (uint8_t *)m68k_trap); 3110 dst = jmp(dst, (uint8_t *)m68k_trap);
3094 *passed = dst - (passed+1); 3111 *passed = dst - (passed+1);
3095 dst = cycles(dst, 4); 3112 dst = cycles(dst, 4);
3096 break; 3113 break;
3097 } 3114 }