Mercurial > repos > blastem
diff 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 |
line wrap: on
line diff
--- a/m68k_to_x86.c Sun Apr 21 11:42:45 2013 -0700 +++ b/m68k_to_x86.c Sun Apr 21 13:00:34 2013 -0700 @@ -3084,8 +3084,46 @@ dst = m68k_save_result(inst, dst, opts); } break; - /*case M68K_CHK: - break;*/ + case M68K_CHK: + { + dst = cycles(dst, 6); + if (dst_op.mode == MODE_REG_DIRECT) { + dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size); + } else { + dst = cmp_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size); + } + uint8_t * passed = dst+1; + dst = jcc(dst, CC_GE, dst+2); + dst = mov_ir(dst, 1, FLAG_N, SZ_B); + dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); + dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); + dst = jmp(dst, (uint8_t *)m68k_trap); + *passed = dst - (passed+1); + if (dst_op.mode == MODE_REG_DIRECT) { + if (src_op.mode == MODE_REG_DIRECT) { + dst = cmp_rr(dst, src_op.base, dst_op.base, inst->extra.size); + } else if(src_op.mode == MODE_REG_DISPLACE8) { + dst = cmp_rdisp8r(dst, src_op.base, src_op.disp, dst_op.base, inst->extra.size); + } else { + dst = cmp_ir(dst, src_op.disp, dst_op.base, inst->extra.size); + } + } else if(dst_op.mode == MODE_REG_DISPLACE8) { + if (src_op.mode == MODE_REG_DIRECT) { + dst = cmp_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, inst->extra.size); + } else { + dst = cmp_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, inst->extra.size); + } + } + passed = dst+1; + dst = jcc(dst, CC_LE, dst+2); + dst = mov_ir(dst, 0, FLAG_N, SZ_B); + dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); + dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); + dst = jmp(dst, (uint8_t *)m68k_trap); + *passed = dst - (passed+1); + dst = cycles(dst, 4); + break; + } case M68K_DIVS: case M68K_DIVU: //TODO: Trap on division by zero @@ -3802,7 +3840,7 @@ break; //case M68K_TAS: case M68K_TRAP: - dst = mov_ir(dst, src_op.disp, SCRATCH2, SZ_D); + dst = mov_ir(dst, src_op.disp + VECTOR_TRAP_0, SCRATCH2, SZ_D); dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); dst = jmp(dst, (uint8_t *)m68k_trap); break;