diff segacd.c @ 2138:b6338e18787e

Fix some dynarec code invalidation issues
author Michael Pavone <pavone@retrodev.com>
date Sat, 19 Mar 2022 15:50:45 -0700
parents 3ef9456b76cf
children 10e4439d8f13
line wrap: on
line diff
--- a/segacd.c	Sat Mar 19 00:42:05 2022 -0700
+++ b/segacd.c	Sat Mar 19 15:50:45 2022 -0700
@@ -157,6 +157,7 @@
 	m68k_context *m68k = vcontext;
 	segacd_context *cd = m68k->system;
 	if (!(cd->gate_array[GA_MEM_MODE] & BIT_MEM_MODE)) {
+		//TODO: Confirm this first write goes through (seemed like it in initial testing)
 		if (address & 1) {
 			address >>= 1;
 			cd->word_ram[address] &= 0xFF00;
@@ -166,6 +167,7 @@
 			cd->word_ram[address] &= 0x00FF;
 			cd->word_ram[address] |= value << 8;
 		}
+		m68k_invalidate_code_range(cd->genesis->m68k, cd->base + 0x200000 + (address & ~1), cd->base + 0x200000 + (address & ~1) + 1);
 		cd->sub_paused_wordram = 1;
 		m68k->sync_cycle = m68k->target_cycle = m68k->current_cycle;
 		m68k->should_return = 1;
@@ -207,6 +209,7 @@
 
 static uint16_t word_ram_1M_read16(uint32_t address, void *vcontext)
 {
+	//TODO: check behavior for these on hardware
 	return 0;
 }
 
@@ -300,7 +303,7 @@
 			cd->word_ram[address + cd->bank_toggle] &= 0xFF;
 			cd->word_ram[address + cd->bank_toggle] |= value << 8;
 		}
-		m68k_invalidate_code_range(m68k, cd->base + 0x200000 + (address & ~1), cd->base + 0x200000 + address + 1);
+		m68k_invalidate_code_range(m68k, cd->base + 0x200000 + (address & ~1), cd->base + 0x200000 + (address & ~1) + 1);
 	}
 	return vcontext;
 }
@@ -362,6 +365,7 @@
 	if (cd->gate_array[GA_MEM_MODE] & BIT_MEM_MODE) {
 		address = cell_image_translate_address(address);
 		cd->word_ram[address + cd->bank_toggle] = value;
+		m68k_invalidate_code_range(m68k, cd->base + 0x200000 + address, cd->base + 0x200000 + address + 1);
 	}
 	return vcontext;
 }
@@ -381,6 +385,7 @@
 			cd->word_ram[address + cd->bank_toggle] &= 0x00FF;
 			cd->word_ram[address + cd->bank_toggle] |= value << 8;
 		}
+		m68k_invalidate_code_range(m68k, cd->base + 0x200000 + address, cd->base + 0x200000 + address + 1);
 	}
 	return vcontext;
 }