# HG changeset patch # User Michael Pavone # Date 1552453133 25200 # Node ID 75172d44090060254ca3e7d1c35a8bd60206aa90 # Parent e59045f781ce425dd38b5d4f935214714de9c352 Wrote a version of m68k_invalidate_code_range for interpreter build so that MMAP_PTR_IDX regions can safely get "fast" pointers diff -r e59045f781ce -r 75172d440900 m68k_core.c --- 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 diff -r e59045f781ce -r 75172d440900 m68k_core.h --- 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); diff -r e59045f781ce -r 75172d440900 sega_mapper.c --- 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;