Mercurial > repos > blastem
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 } |