Mercurial > repos > blastem
comparison m68k_to_x86.c @ 348:3923dbc2dcc4
m68k_trap is now replaced with a generated one so it can call the generated memory acccess functions. The old static memory access functions have been removed from runtime.S
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 21 May 2013 01:10:04 -0700 |
parents | b24556b45d1e |
children | 91aa2aa05e68 |
comparison
equal
deleted
inserted
replaced
347:b24556b45d1e | 348:3923dbc2dcc4 |
---|---|
29 void m68k_save_context(); | 29 void m68k_save_context(); |
30 void m68k_load_context(); | 30 void m68k_load_context(); |
31 void m68k_modified_ret_addr(); | 31 void m68k_modified_ret_addr(); |
32 void m68k_native_addr(); | 32 void m68k_native_addr(); |
33 void m68k_native_addr_and_sync(); | 33 void m68k_native_addr_and_sync(); |
34 void m68k_trap(); | |
35 void m68k_invalid(); | 34 void m68k_invalid(); |
36 void m68k_retrans_stub(); | 35 void m68k_retrans_stub(); |
37 void set_sr(); | 36 void set_sr(); |
38 void set_ccr(); | 37 void set_ccr(); |
39 void get_sr(); | 38 void get_sr(); |
3088 uint8_t * passed = dst+1; | 3087 uint8_t * passed = dst+1; |
3089 dst = jcc(dst, CC_GE, dst+2); | 3088 dst = jcc(dst, CC_GE, dst+2); |
3090 dst = mov_ir(dst, 1, FLAG_N, SZ_B); | 3089 dst = mov_ir(dst, 1, FLAG_N, SZ_B); |
3091 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); | 3090 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); |
3092 dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D); | 3091 dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D); |
3093 dst = jmp(dst, (uint8_t *)m68k_trap); | 3092 dst = jmp(dst, opts->trap); |
3094 *passed = dst - (passed+1); | 3093 *passed = dst - (passed+1); |
3095 if (dst_op.mode == MODE_REG_DIRECT) { | 3094 if (dst_op.mode == MODE_REG_DIRECT) { |
3096 if (src_op.mode == MODE_REG_DIRECT) { | 3095 if (src_op.mode == MODE_REG_DIRECT) { |
3097 dst = cmp_rr(dst, src_op.base, dst_op.base, inst->extra.size); | 3096 dst = cmp_rr(dst, src_op.base, dst_op.base, inst->extra.size); |
3098 } else if(src_op.mode == MODE_REG_DISPLACE8) { | 3097 } else if(src_op.mode == MODE_REG_DISPLACE8) { |
3110 passed = dst+1; | 3109 passed = dst+1; |
3111 dst = jcc(dst, CC_LE, dst+2); | 3110 dst = jcc(dst, CC_LE, dst+2); |
3112 dst = mov_ir(dst, 0, FLAG_N, SZ_B); | 3111 dst = mov_ir(dst, 0, FLAG_N, SZ_B); |
3113 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); | 3112 dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D); |
3114 dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D); | 3113 dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D); |
3115 dst = jmp(dst, (uint8_t *)m68k_trap); | 3114 dst = jmp(dst, opts->trap); |
3116 *passed = dst - (passed+1); | 3115 *passed = dst - (passed+1); |
3117 dst = cycles(dst, 4); | 3116 dst = cycles(dst, 4); |
3118 break; | 3117 break; |
3119 } | 3118 } |
3120 case M68K_DIVS: | 3119 case M68K_DIVS: |
3150 dst = jcc(dst, CC_NZ, dst+2); | 3149 dst = jcc(dst, CC_NZ, dst+2); |
3151 dst = pop_r(dst, RAX); | 3150 dst = pop_r(dst, RAX); |
3152 dst = pop_r(dst, RDX); | 3151 dst = pop_r(dst, RDX); |
3153 dst = mov_ir(dst, VECTOR_INT_DIV_ZERO, SCRATCH2, SZ_D); | 3152 dst = mov_ir(dst, VECTOR_INT_DIV_ZERO, SCRATCH2, SZ_D); |
3154 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); | 3153 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); |
3155 dst = jmp(dst, (uint8_t *)m68k_trap); | 3154 dst = jmp(dst, opts->trap); |
3156 *not_zero = dst - (not_zero+1); | 3155 *not_zero = dst - (not_zero+1); |
3157 if (inst->op == M68K_DIVS) { | 3156 if (inst->op == M68K_DIVS) { |
3158 dst = cdq(dst); | 3157 dst = cdq(dst); |
3159 } else { | 3158 } else { |
3160 dst = xor_rr(dst, RDX, RDX, SZ_D); | 3159 dst = xor_rr(dst, RDX, RDX, SZ_D); |
3851 break; | 3850 break; |
3852 //case M68K_TAS: | 3851 //case M68K_TAS: |
3853 case M68K_TRAP: | 3852 case M68K_TRAP: |
3854 dst = mov_ir(dst, src_op.disp + VECTOR_TRAP_0, SCRATCH2, SZ_D); | 3853 dst = mov_ir(dst, src_op.disp + VECTOR_TRAP_0, SCRATCH2, SZ_D); |
3855 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); | 3854 dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D); |
3856 dst = jmp(dst, (uint8_t *)m68k_trap); | 3855 dst = jmp(dst, opts->trap); |
3857 break; | 3856 break; |
3858 //case M68K_TRAPV: | 3857 //case M68K_TRAPV: |
3859 case M68K_TST: | 3858 case M68K_TST: |
3860 dst = cycles(dst, BUS); | 3859 dst = cycles(dst, BUS); |
3861 if (src_op.mode == MODE_REG_DIRECT) { | 3860 if (src_op.mode == MODE_REG_DIRECT) { |
4519 dst = cycles(dst, 24); | 4518 dst = cycles(dst, 24); |
4520 //discard function return address | 4519 //discard function return address |
4521 dst = pop_r(dst, SCRATCH2); | 4520 dst = pop_r(dst, SCRATCH2); |
4522 dst = jmp_r(dst, SCRATCH1); | 4521 dst = jmp_r(dst, SCRATCH1); |
4523 | 4522 |
4523 opts->trap = dst; | |
4524 dst = push_r(dst, SCRATCH2); | |
4525 //swap USP and SSP if not already in supervisor mode | |
4526 dst = bt_irdisp8(dst, 5, CONTEXT, offsetof(m68k_context, status), SZ_B); | |
4527 already_supervisor = dst+1; | |
4528 dst = jcc(dst, CC_C, dst+2); | |
4529 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SCRATCH2, SZ_D); | |
4530 dst = mov_rrdisp8(dst, opts->aregs[7], CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D); | |
4531 dst = mov_rr(dst, SCRATCH2, opts->aregs[7], SZ_D); | |
4532 *already_supervisor = dst - (already_supervisor+1); | |
4533 //save PC | |
4534 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); | |
4535 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | |
4536 dst = call(dst, opts->write_32_lowfirst); | |
4537 //save status register | |
4538 dst = sub_ir(dst, 2, opts->aregs[7], SZ_D); | |
4539 dst = call(dst, (uint8_t *)get_sr); | |
4540 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | |
4541 dst = call(dst, opts->write_16); | |
4542 //set supervisor bit | |
4543 dst = or_irdisp8(dst, 0x20, CONTEXT, offsetof(m68k_context, status), SZ_B); | |
4544 //calculate vector address | |
4545 dst = pop_r(dst, SCRATCH1); | |
4546 dst = shl_ir(dst, 2, SCRATCH1, SZ_D); | |
4547 dst = call(dst, opts->read_32); | |
4548 dst = call(dst, (uint8_t *)m68k_native_addr_and_sync); | |
4549 dst = cycles(dst, 18); | |
4550 dst = jmp_r(dst, SCRATCH1); | |
4551 | |
4524 opts->cur_code = dst; | 4552 opts->cur_code = dst; |
4525 } | 4553 } |
4526 | 4554 |
4527 void init_68k_context(m68k_context * context, native_map_slot * native_code_map, void * opts) | 4555 void init_68k_context(m68k_context * context, native_map_slot * native_code_map, void * opts) |
4528 { | 4556 { |