Mercurial > repos > blastem
diff m68k_to_x86.c @ 351:2f264d2a60c2
Support for SRAM with SEGA mapper. Half-finished support for SRAM without SEGA mapper.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 21 May 2013 22:08:59 -0700 |
parents | 91aa2aa05e68 |
children | 8c3409585130 |
line wrap: on
line diff
--- a/m68k_to_x86.c Tue May 21 19:26:20 2013 -0700 +++ b/m68k_to_x86.c Tue May 21 22:08:59 2013 -0700 @@ -4192,7 +4192,78 @@ default: cfun = NULL; } - if (cfun) { + if(memmap[chunk].buffer && memmap[chunk].flags & access_flag) { + if (memmap[chunk].flags & MMAP_PTR_IDX) { + if (memmap[chunk].flags & MMAP_FUNC_NULL) { + dst = cmp_irdisp8(dst, 0, CONTEXT, offsetof(m68k_context, mem_pointers) + sizeof(void*) * memmap[chunk].ptr_index, SZ_Q); + uint8_t * not_null = dst+1; + dst = jcc(dst, CC_NZ, dst+2); + dst = call(dst, (uint8_t *)m68k_save_context); + if (is_write) { + //SCRATCH2 is RDI, so no need to move it there + dst = mov_rr(dst, SCRATCH1, RDX, size); + } else { + dst = push_r(dst, CONTEXT); + dst = mov_rr(dst, SCRATCH1, RDI, SZ_D); + } + dst = call(dst, cfun); + if (is_write) { + dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); + } else { + dst = pop_r(dst, CONTEXT); + dst = mov_rr(dst, RAX, SCRATCH1, size); + } + dst = jmp(dst, (uint8_t *)m68k_load_context); + + *not_null = dst - (not_null + 1); + } + if (size == SZ_B) { + dst = xor_ir(dst, 1, adr_reg, SZ_D); + } + dst = add_rdisp8r(dst, CONTEXT, offsetof(m68k_context, mem_pointers) + sizeof(void*) * memmap[chunk].ptr_index, adr_reg, SZ_Q); + if (is_write) { + dst = mov_rrind(dst, SCRATCH1, SCRATCH2, size); + + } else { + dst = mov_rindr(dst, SCRATCH1, SCRATCH1, size); + } + } else { + if (size == SZ_B) { + dst = xor_ir(dst, 1, adr_reg, SZ_D); + } + if ((int64_t)memmap[chunk].buffer <= 0x7FFFFFFF && (int64_t)memmap[chunk].buffer >= -2147483648) { + if (is_write) { + dst = mov_rrdisp32(dst, SCRATCH1, SCRATCH2, (int64_t)memmap[chunk].buffer, size); + } else { + dst = mov_rdisp32r(dst, SCRATCH1, (int64_t)memmap[chunk].buffer, SCRATCH1, size); + } + } else { + if (is_write) { + dst = push_r(dst, SCRATCH1); + dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH1, SZ_Q); + dst = add_rr(dst, SCRATCH1, SCRATCH2, SZ_Q); + dst = pop_r(dst, SCRATCH1); + dst = mov_rrind(dst, SCRATCH1, SCRATCH2, size); + } else { + dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH2, SZ_Q); + dst = mov_rindexr(dst, SCRATCH2, SCRATCH1, 1, SCRATCH1, size); + } + } + } + if (is_write && (memmap[chunk].flags & MMAP_CODE)) { + dst = mov_rr(dst, SCRATCH2, SCRATCH1, SZ_D); + dst = shr_ir(dst, 11, SCRATCH1, SZ_D); + dst = bt_rrdisp32(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, ram_code_flags), SZ_D); + uint8_t * not_code = dst+1; + dst = jcc(dst, CC_NC, dst+2); + dst = call(dst, (uint8_t *)m68k_save_context); + dst = call(dst, (uint8_t *)m68k_handle_code_write); + dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); + dst = call(dst, (uint8_t *)m68k_load_context); + *not_code = dst - (not_code+1); + } + dst = retn(dst); + } else if (cfun) { dst = call(dst, (uint8_t *)m68k_save_context); if (is_write) { //SCRATCH2 is RDI, so no need to move it there @@ -4209,41 +4280,6 @@ dst = mov_rr(dst, RAX, SCRATCH1, size); } dst = jmp(dst, (uint8_t *)m68k_load_context); - } else if(memmap[chunk].buffer && memmap[chunk].flags & access_flag) { - if (size == SZ_B) { - dst = xor_ir(dst, 1, adr_reg, SZ_D); - } - if ((int64_t)memmap[chunk].buffer <= 0x7FFFFFFF && (int64_t)memmap[chunk].buffer >= -2147483648) { - if (is_write) { - dst = mov_rrdisp32(dst, SCRATCH1, SCRATCH2, (int64_t)memmap[chunk].buffer, size); - } else { - dst = mov_rdisp32r(dst, SCRATCH1, (int64_t)memmap[chunk].buffer, SCRATCH1, size); - } - } else { - if (is_write) { - dst = push_r(dst, SCRATCH1); - dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH1, SZ_Q); - dst = add_rr(dst, SCRATCH1, SCRATCH2, SZ_Q); - dst = pop_r(dst, SCRATCH1); - dst = mov_rrind(dst, SCRATCH1, SCRATCH2, size); - } else { - dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH2, SZ_Q); - dst = mov_rindexr(dst, SCRATCH2, SCRATCH1, 1, SCRATCH1, size); - } - } - if (is_write && (memmap[chunk].flags & MMAP_CODE)) { - dst = mov_rr(dst, SCRATCH2, SCRATCH1, SZ_D); - dst = shr_ir(dst, 11, SCRATCH1, SZ_D); - dst = bt_rrdisp32(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, ram_code_flags), SZ_D); - uint8_t * not_code = dst+1; - dst = jcc(dst, CC_NC, dst+2); - dst = call(dst, (uint8_t *)m68k_save_context); - dst = call(dst, (uint8_t *)m68k_handle_code_write); - dst = mov_rr(dst, RAX, CONTEXT, SZ_Q); - dst = call(dst, (uint8_t *)m68k_load_context); - *not_code = dst - (not_code+1); - } - dst = retn(dst); } else { //Not sure the best course of action here if (!is_write) {