Mercurial > repos > blastem
comparison 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 |
comparison
equal
deleted
inserted
replaced
1141:7e199bebde2f | 1142:5c8b1c33ca10 |
---|---|
99 | 99 |
100 static void *mapper_write(uint32_t location, void *vcontext, uint8_t value) | 100 static void *mapper_write(uint32_t location, void *vcontext, uint8_t value) |
101 { | 101 { |
102 z80_context *z80 = vcontext; | 102 z80_context *z80 = vcontext; |
103 sms_context *sms = z80->system; | 103 sms_context *sms = z80->system; |
104 void *old_value; | |
104 sms->ram[location & (sizeof(sms->ram)-1)] = value; | 105 sms->ram[location & (sizeof(sms->ram)-1)] = value; |
105 switch (location & 3) | 106 location &= 3; |
106 { | 107 if (location) { |
107 case 0: | 108 uint32_t idx = location - 1; |
109 old_value = z80->mem_pointers[idx]; | |
110 z80->mem_pointers[idx] = sms->rom + (value << 14 & (sms->rom_size-1)); | |
111 if (old_value != z80->mem_pointers[idx]) { | |
112 //invalidate any code we translated for the relevant bank | |
113 z80_invalidate_code_range(z80, idx ? idx * 0x4000 : 0x400, idx * 0x4000 + 0x4000); | |
114 } | |
115 } else { | |
108 //TODO: implement me | 116 //TODO: implement me |
109 break; | |
110 case 1: | |
111 z80->mem_pointers[0] = sms->rom + (value << 14 & (sms->rom_size-1)) + 0x400; | |
112 //TODO: invalidate translated code in range 0x400-0x4000 | |
113 break; | |
114 case 2: | |
115 z80->mem_pointers[1] = sms->rom + (value << 14 & (sms->rom_size-1)); | |
116 //TODO: invalidate translated code in range 0x4000-0x8000 | |
117 break; | |
118 case 3: | |
119 z80->mem_pointers[2] = sms->rom + (value << 14 & (sms->rom_size-1)); | |
120 //TODO: invalidate translated code in range 0x8000-0xC000 | |
121 break; | |
122 } | 117 } |
123 return vcontext; | 118 return vcontext; |
124 } | 119 } |
125 | 120 |
126 static memmap_chunk io_map[] = { | 121 static memmap_chunk io_map[] = { |
232 rom_size = nearest_pow2(rom_size); | 227 rom_size = nearest_pow2(rom_size); |
233 memmap_chunk memory_map[6]; | 228 memmap_chunk memory_map[6]; |
234 if (orig_size > 0xC000) { | 229 if (orig_size > 0xC000) { |
235 info_out->map_chunks = 6; | 230 info_out->map_chunks = 6; |
236 uint8_t *ram_reg_overlap = sms->ram + sizeof(sms->ram) - 4; | 231 uint8_t *ram_reg_overlap = sms->ram + sizeof(sms->ram) - 4; |
237 memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; | 232 memory_map[0] = (memmap_chunk){0x0000, 0x0400, 0xFFFF, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; |
238 memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX, NULL, NULL, NULL, NULL, NULL}; | 233 memory_map[1] = (memmap_chunk){0x0400, 0x4000, 0xFFFF, 0, 0, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; |
239 memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX, NULL, NULL, NULL, NULL, NULL}; | 234 memory_map[2] = (memmap_chunk){0x4000, 0x8000, 0x3FFF, 0, 1, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; |
240 memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX, NULL, NULL, NULL, NULL, NULL}; | 235 memory_map[3] = (memmap_chunk){0x8000, 0xC000, 0x3FFF, 0, 2, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL, NULL, NULL, NULL, NULL}; |
241 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}; | 236 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}; |
242 memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0xFFFF, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write}; | 237 memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0xFFFF, 0, 0, MMAP_READ, ram_reg_overlap, NULL, NULL, NULL, mapper_write}; |
243 } else { | 238 } else { |
244 info_out->map_chunks = 2; | 239 info_out->map_chunks = 2; |
245 memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; | 240 memory_map[0] = (memmap_chunk){0x0000, 0xC000, rom_size-1, 0, 0, MMAP_READ, rom, NULL, NULL, NULL, NULL}; |
246 memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; | 241 memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL}; |
247 }; | 242 }; |