changeset 1772:75172d440900 mame_interp

Wrote a version of m68k_invalidate_code_range for interpreter build so that MMAP_PTR_IDX regions can safely get "fast" pointers
author Michael Pavone <pavone@retrodev.com>
date Tue, 12 Mar 2019 21:58:53 -0700
parents e59045f781ce
children 0a26f3657295
files m68k_core.c m68k_core.h sega_mapper.c
diffstat 3 files changed, 28 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/m68k_core.c	Tue Mar 12 21:57:35 2019 -0700
+++ b/m68k_core.c	Tue Mar 12 21:58:53 2019 -0700
@@ -1342,3 +1342,29 @@
 	context->int_pending = load_int8(buf);
 	context->trace_pending = load_int8(buf);
 }
+
+#ifndef USE_NATIVE
+void m68k_invalidate_code_range(m68k_context *context, uint32_t start, uint32_t end)
+{
+	m68000_base_device *device = (m68000_base_device *)context;
+	for(uint32_t address = start; address < end; address += 0x10000)
+	{
+		device->read_pointers[address >> 16] = NULL;
+		device->write_pointers[address >> 16] = NULL;
+		memmap_chunk const *chunk = find_map_chunk(address, &context->options->gen, 0, NULL);
+		if (!chunk || chunk->end < (address + 64*1024) || (chunk->flags & (MMAP_ONLY_ODD | MMAP_ONLY_EVEN)) || !chunk->buffer) {
+			continue;
+		}
+		void *ptr = get_native_pointer(address, (void **)context->mem_pointers, &context->options->gen);
+		if (!ptr) {
+			continue;
+		}
+		if (chunk->flags & MMAP_READ) {
+			device->read_pointers[address >> 16] = ptr;
+		}
+		if (chunk->flags & MMAP_WRITE) {
+			device->write_pointers[address >> 16] = ptr;
+		}
+	}
+}
+#endif
--- a/m68k_core.h	Tue Mar 12 21:57:35 2019 -0700
+++ b/m68k_core.h	Tue Mar 12 21:58:53 2019 -0700
@@ -118,12 +118,11 @@
 uint32_t get_instruction_start(m68k_options *opts, uint32_t address);
 uint16_t m68k_get_ir(m68k_context *context);
 void m68k_print_regs(m68k_context * context);
+void m68k_invalidate_code_range(m68k_context *context, uint32_t start, uint32_t end);
 #ifdef USE_NATIVE
 m68k_context * m68k_handle_code_write(uint32_t address, m68k_context * context);
-void m68k_invalidate_code_range(m68k_context *context, uint32_t start, uint32_t end);
 #else
 #define m68k_handle_code_write(A, M)
-#define m68k_invalidate_code_range(M, S, E)
 #endif
 void m68k_serialize(m68k_context *context, uint32_t pc, serialize_buffer *buf);
 void m68k_deserialize(deserialize_buffer *buf, void *vcontext);
--- a/sega_mapper.c	Tue Mar 12 21:57:35 2019 -0700
+++ b/sega_mapper.c	Tue Mar 12 21:58:53 2019 -0700
@@ -119,8 +119,8 @@
 	} else {
 		void *new_ptr = gen->cart + 0x40000*value;
 		if (context->mem_pointers[gen->mapper_start_index + address] != new_ptr) {
-			m68k_invalidate_code_range(gen->m68k, address * 0x80000, (address + 1) * 0x80000);
 			context->mem_pointers[gen->mapper_start_index + address] = new_ptr;
+			m68k_invalidate_code_range(gen->m68k, address * 0x80000, (address + 1) * 0x80000);			
 		}
 	}
 	return context;