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 };