Mercurial > repos > blastem
diff musashi/m68kcpu.c @ 1508:2e57910fd641 mame_interp
More efficient memory access when using MAME interpreters
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 31 Dec 2017 10:03:25 -0800 |
parents | 2455662378ed |
children | a81db00e171a |
line wrap: on
line diff
--- a/musashi/m68kcpu.c Sat Dec 30 18:27:06 2017 -0800 +++ b/musashi/m68kcpu.c Sun Dec 31 10:03:25 2017 -0800 @@ -773,11 +773,24 @@ uint8_t m68ki_read_8(m68000_base_device *m68k, uint32_t address) { + address &= 0xFFFFFF; + uint32_t base = address >> 16; + if (m68k->read_pointers[base]) { + uint8_t *chunk = m68k->read_pointers[base]; + return chunk[(address ^ 1) & 0xFFFF]; + } return read_byte(address, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); } void m68ki_write_8(m68000_base_device *m68k, uint32_t address, uint8_t value) { + address &= 0xFFFFFF; + uint32_t base = address >> 16; + if (m68k->read_pointers[base]) { + uint8_t *chunk = m68k->read_pointers[base]; + chunk[(address ^ 1) & 0xFFFF] = value; + return; + } write_byte(address, value, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); } @@ -787,11 +800,24 @@ uint16_t m68ki_read_16(m68000_base_device *m68k, uint32_t address) { + address &= 0xFFFFFF; + uint32_t base = address >> 16; + if (m68k->read_pointers[base]) { + uint16_t *chunk = m68k->read_pointers[base]; + return chunk[address >> 1 & 0x7FFF]; + } return read_word(address, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); } void m68ki_write_16(m68000_base_device *m68k, uint32_t address, uint16_t value) { + address &= 0xFFFFFF; + uint32_t base = address >> 16; + if (m68k->write_pointers[base]) { + uint16_t *chunk = m68k->read_pointers[base]; + chunk[address >> 1 & 0x7FFF] = value; + return; + } write_word(address, value, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); } @@ -833,6 +859,25 @@ this->cyc_reset = 132 * this->c.options->gen.clock_divider; this->int_mask = 7 << 8; this->c.status = m68ki_get_sr(this) >> 8; + for (uint32_t address = 0; address < (24*1024*1024); address += 64*1024) + { + this->read_pointers[address >> 16] = NULL; + this->write_pointers[address >> 16] = NULL; + memmap_chunk const *chunk = find_map_chunk(address, &this->c.options->gen, 0, NULL); + if (!chunk || chunk->end < (address + 64*1024) || (chunk->flags & (MMAP_ONLY_ODD | MMAP_ONLY_EVEN | MMAP_PTR_IDX)) || !chunk->buffer) { + continue; + } + void *ptr = get_native_pointer(address, (void **)this->c.mem_pointers, &this->c.options->gen); + if (!ptr) { + continue; + } + if (chunk->flags & MMAP_READ) { + this->read_pointers[address >> 16] = ptr; + } + if (chunk->flags & MMAP_WRITE) { + this->write_pointers[address >> 16] = ptr; + } + } } /* Service an interrupt request and start exception processing */