changeset 692:e11e68918691

Fix bug in map_native_address that was breaking some self-modifying code in Gunstar Heroes
author Michael Pavone <pavone@retrodev.com>
date Tue, 28 Apr 2015 19:04:36 -0700
parents 74d636e85bf8
children 318ebe078315
files backend_x86.c gen_x86.c m68k_core.c
diffstat 3 files changed, 12 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/backend_x86.c	Sat Mar 14 12:05:03 2015 -0700
+++ b/backend_x86.c	Tue Apr 28 19:04:36 2015 -0700
@@ -175,6 +175,7 @@
 				mov_rr(code, opts->scratch2, opts->scratch1, opts->address_size);
 				shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size);
 				bt_rrdisp(code, opts->scratch1, opts->context_reg, ram_flags_off, opts->address_size);
+				//FIXME: These adjustments to ram_flags_off need to take into account bits vs bytes and ram_flags_shift
 				if (memmap[chunk].mask == opts->address_mask) {
 					ram_flags_off += memmap[chunk].end - memmap[chunk].start;
 				} else {
--- a/gen_x86.c	Sat Mar 14 12:05:03 2015 -0700
+++ b/gen_x86.c	Tue Apr 28 19:04:36 2015 -0700
@@ -2135,9 +2135,15 @@
 	if (has_modrm(prefix, main_op)) {
 		uint8_t mod_rm = *(code++);
 		if (has_sib(mod_rm)) {
-			uint8_t sib = *(code++);
-		} else {
-
+			//sib takes up a byte, but can't add any additional ones beyond that
+			code++;
+		}
+		uint8_t mode = mod_rm & 0xC0;
+		uint8_t rm = mod_rm & 3;
+		if (mode == MODE_REG_DISPLACE8) {
+			code++;
+		} else if (mode == MODE_REG_DISPLACE32 || (mode == MODE_REG_INDIRECT && rm == RBP)) {
+			code += 4;
 		}
 	} else {
 	}
--- a/m68k_core.c	Sat Mar 14 12:05:03 2015 -0700
+++ b/m68k_core.c	Tue Apr 28 19:04:36 2015 -0700
@@ -606,7 +606,7 @@
 				uint32_t masked = (address & opts->gen.memmap[i].mask);
 				uint32_t final_off = masked + meta_off;
 				uint32_t ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3);
-				context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 3);
+				context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 7);
 
 				uint32_t slot = final_off / 1024;
 				if (!opts->gen.ram_inst_sizes[slot]) {
@@ -618,7 +618,7 @@
 				masked = (address + size - 1) & opts->gen.memmap[i].mask;
 				final_off = masked + meta_off;
 				ram_flags_off = final_off >> (opts->gen.ram_flags_shift + 3);
-				context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 3);
+				context->ram_code_flags[ram_flags_off] |= 1 << ((final_off >> opts->gen.ram_flags_shift) & 7);
 			}
 			break;
 		} else if ((opts->gen.memmap[i].flags & (MMAP_WRITE | MMAP_CODE)) == (MMAP_WRITE | MMAP_CODE)) {