Mercurial > repos > blastem
diff sms.c @ 1142:5c8b1c33ca10
Invalidate translated code on a cartridge bank change in SMS mode. Fix handling of bank 0
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 02 Jan 2017 23:35:40 -0800 |
parents | 7e199bebde2f |
children | d4d770cfbc62 |
line wrap: on
line diff
--- a/sms.c Mon Jan 02 22:54:24 2017 -0800 +++ b/sms.c Mon Jan 02 23:35:40 2017 -0800 @@ -101,24 +101,19 @@ { z80_context *z80 = vcontext; sms_context *sms = z80->system; + void *old_value; sms->ram[location & (sizeof(sms->ram)-1)] = value; - switch (location & 3) - { - case 0: + location &= 3; + if (location) { + uint32_t idx = location - 1; + old_value = z80->mem_pointers[idx]; + z80->mem_pointers[idx] = sms->rom + (value << 14 & (sms->rom_size-1)); + if (old_value != z80->mem_pointers[idx]) { + //invalidate any code we translated for the relevant bank + z80_invalidate_code_range(z80, idx ? idx * 0x4000 : 0x400, idx * 0x4000 + 0x4000); + } + } else { //TODO: implement me - break; - case 1: - z80->mem_pointers[0] = sms->rom + (value << 14 & (sms->rom_size-1)) + 0x400; - //TODO: invalidate translated code in range 0x400-0x4000 - break; - case 2: - z80->mem_pointers[1] = sms->rom + (value << 14 & (sms->rom_size-1)); - //TODO: invalidate translated code in range 0x4000-0x8000 - break; - case 3: - z80->mem_pointers[2] = sms->rom + (value << 14 & (sms->rom_size-1)); - //TODO: invalidate translated code in range 0x8000-0xC000 - break; } return vcontext; } @@ -234,12 +229,12 @@ if (orig_size > 0xC000) { info_out->map_chunks = 6; uint8_t *ram_reg_overlap = sms->ram + sizeof(sms->ram) - 4; - memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; - memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX, NULL, NULL, NULL, NULL, NULL}; - memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX, NULL, NULL, NULL, NULL, NULL}; - memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX, NULL, NULL, NULL, NULL, NULL}; - memory_map[4] = (memmap_chunk){0xC000, 0xFFFC, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; - memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0xFFFF, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write}; + memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; + memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; + memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; + memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; + memory_map[4] = (memmap_chunk){0xC000, 0xFFFC, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; + memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0xFFFF, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write}; } else { info_out->map_chunks = 2; memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL};