summaryrefslogtreecommitdiff
path: root/m68k_to_x86.c
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2013-05-21 22:08:59 -0700
committerMike Pavone <pavone@retrodev.com>2013-05-21 22:08:59 -0700
commit1be852cfe9649570dd059c54387a53cdc8515ad1 (patch)
tree3085c7d7ec3d17151d3d1fbe2cb7f3815cf0de35 /m68k_to_x86.c
parent5c27155c0a9fe7805bc611bfb16edf9fe7fe6c87 (diff)
Support for SRAM with SEGA mapper. Half-finished support for SRAM without SEGA mapper.
Diffstat (limited to 'm68k_to_x86.c')
-rw-r--r--m68k_to_x86.c100
1 files changed, 68 insertions, 32 deletions
diff --git a/m68k_to_x86.c b/m68k_to_x86.c
index 4ff1dec..8ff3d8b 100644
--- a/m68k_to_x86.c
+++ b/m68k_to_x86.c
@@ -4192,43 +4192,62 @@ uint8_t * gen_mem_fun(x86_68k_options * opts, memmap_chunk * memmap, uint32_t nu
default:
cfun = NULL;
}
- if (cfun) {
- 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);
- } 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(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_rrdisp32(dst, SCRATCH1, SCRATCH2, (int64_t)memmap[chunk].buffer, size);
+ dst = mov_rrind(dst, SCRATCH1, SCRATCH2, size);
+
} else {
- dst = mov_rdisp32r(dst, SCRATCH1, (int64_t)memmap[chunk].buffer, SCRATCH1, size);
+ dst = mov_rindr(dst, SCRATCH1, 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);
+ 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 {
- dst = mov_ir(dst, (int64_t)memmap[chunk].buffer, SCRATCH2, SZ_Q);
- dst = mov_rindexr(dst, SCRATCH2, SCRATCH1, 1, SCRATCH1, size);
+ 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)) {
@@ -4244,6 +4263,23 @@ uint8_t * gen_mem_fun(x86_68k_options * opts, memmap_chunk * memmap, uint32_t nu
*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
+ 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);
} else {
//Not sure the best course of action here
if (!is_write) {