Mercurial > repos > blastem
comparison romdb.c @ 1425:49d3c572b3f2
Ignore SRAM in cart header if it is in the upper 8MB of the address space
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 07 Jul 2017 21:01:45 -0700 |
parents | 11ac0b511cff |
children | 14a2834d010c |
comparison
equal
deleted
inserted
replaced
1424:4f96103b4b47 | 1425:49d3c572b3f2 |
---|---|
171 uint32_t ram_start = get_u32be(rom + RAM_START); | 171 uint32_t ram_start = get_u32be(rom + RAM_START); |
172 uint32_t ram_end = get_u32be(rom + RAM_END); | 172 uint32_t ram_end = get_u32be(rom + RAM_END); |
173 uint32_t ram_flags = info->save_type = rom[RAM_FLAGS] & RAM_FLAG_MASK; | 173 uint32_t ram_flags = info->save_type = rom[RAM_FLAGS] & RAM_FLAG_MASK; |
174 ram_start &= 0xFFFFFE; | 174 ram_start &= 0xFFFFFE; |
175 ram_end |= 1; | 175 ram_end |= 1; |
176 if (ram_start >= 0x800000) { | |
177 info->save_buffer = NULL; | |
178 return ram_start; | |
179 } | |
176 info->save_mask = ram_end - ram_start; | 180 info->save_mask = ram_end - ram_start; |
177 uint32_t save_size = info->save_mask + 1; | 181 uint32_t save_size = info->save_mask + 1; |
178 if (ram_flags != RAM_FLAG_BOTH) { | 182 if (ram_flags != RAM_FLAG_BOTH) { |
179 save_size /= 2; | 183 save_size /= 2; |
180 } | 184 } |
226 info->map[8].start = 0xA13000; | 230 info->map[8].start = 0xA13000; |
227 info->map[8].end = 0xA13100; | 231 info->map[8].end = 0xA13100; |
228 info->map[8].mask = 0xFF; | 232 info->map[8].mask = 0xFF; |
229 info->map[8].write_16 = (write_16_fun)write_bank_reg_w; | 233 info->map[8].write_16 = (write_16_fun)write_bank_reg_w; |
230 info->map[8].write_8 = (write_8_fun)write_bank_reg_b; | 234 info->map[8].write_8 = (write_8_fun)write_bank_reg_b; |
235 return; | |
231 } else if (has_ram_header(rom, size)) { | 236 } else if (has_ram_header(rom, size)) { |
232 uint32_t ram_start = read_ram_header(info, rom); | 237 uint32_t ram_start = read_ram_header(info, rom); |
233 | 238 |
234 info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3); | 239 if (info->save_buffer) { |
235 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); | 240 info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3); |
236 memset(info->map, 0, sizeof(memmap_chunk)*2); | 241 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); |
237 memcpy(info->map+2, base_map, sizeof(memmap_chunk) * base_chunks); | 242 memset(info->map, 0, sizeof(memmap_chunk)*2); |
238 | 243 memcpy(info->map+2, base_map, sizeof(memmap_chunk) * base_chunks); |
239 if (ram_start >= rom_end) { | 244 |
240 info->map[0].end = rom_end < 0x400000 ? nearest_pow2(rom_end) - 1 : 0xFFFFFF; | 245 if (ram_start >= rom_end) { |
241 if (info->map[0].end > ram_start) { | 246 info->map[0].end = rom_end < 0x400000 ? nearest_pow2(rom_end) - 1 : 0xFFFFFF; |
242 info->map[0].end = ram_start; | 247 if (info->map[0].end > ram_start) { |
248 info->map[0].end = ram_start; | |
249 } | |
250 //TODO: ROM mirroring | |
251 info->map[0].mask = 0xFFFFFF; | |
252 info->map[0].flags = MMAP_READ; | |
253 info->map[0].buffer = rom; | |
254 | |
255 info->map[1].start = ram_start; | |
256 info->map[1].mask = info->save_mask; | |
257 info->map[1].end = ram_start + info->save_mask + 1; | |
258 info->map[1].flags = MMAP_READ | MMAP_WRITE; | |
259 | |
260 if (info->save_type == RAM_FLAG_ODD) { | |
261 info->map[1].flags |= MMAP_ONLY_ODD; | |
262 } else if (info->save_type == RAM_FLAG_EVEN) { | |
263 info->map[1].flags |= MMAP_ONLY_EVEN; | |
264 } | |
265 info->map[1].buffer = info->save_buffer; | |
266 } else { | |
267 //Assume the standard Sega mapper | |
268 info->map[0].end = 0x200000; | |
269 info->map[0].mask = 0xFFFFFF; | |
270 info->map[0].flags = MMAP_READ; | |
271 info->map[0].buffer = rom; | |
272 | |
273 info->map[1].start = 0x200000; | |
274 info->map[1].end = 0x400000; | |
275 info->map[1].mask = 0x1FFFFF; | |
276 info->map[1].flags = MMAP_READ | MMAP_PTR_IDX | MMAP_FUNC_NULL; | |
277 info->map[1].ptr_index = info->mapper_start_index = 0; | |
278 info->map[1].read_16 = (read_16_fun)read_sram_w;//these will only be called when mem_pointers[2] == NULL | |
279 info->map[1].read_8 = (read_8_fun)read_sram_b; | |
280 info->map[1].write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area | |
281 info->map[1].write_8 = (write_8_fun)write_sram_area_b; | |
282 info->map[1].buffer = rom + 0x200000; | |
283 | |
284 memmap_chunk *last = info->map + info->map_chunks - 1; | |
285 memset(last, 0, sizeof(memmap_chunk)); | |
286 last->start = 0xA13000; | |
287 last->end = 0xA13100; | |
288 last->mask = 0xFF; | |
289 last->write_16 = (write_16_fun)write_bank_reg_w; | |
290 last->write_8 = (write_8_fun)write_bank_reg_b; | |
243 } | 291 } |
244 //TODO: ROM mirroring | 292 return; |
245 info->map[0].mask = 0xFFFFFF; | 293 } |
246 info->map[0].flags = MMAP_READ; | 294 } |
247 info->map[0].buffer = rom; | 295 |
248 | 296 info->map_chunks = base_chunks + 1; |
249 info->map[1].start = ram_start; | 297 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); |
250 info->map[1].mask = info->save_mask; | 298 memset(info->map, 0, sizeof(memmap_chunk)); |
251 info->map[1].end = ram_start + info->save_mask + 1; | 299 memcpy(info->map+1, base_map, sizeof(memmap_chunk) * base_chunks); |
252 info->map[1].flags = MMAP_READ | MMAP_WRITE; | 300 |
253 | 301 info->map[0].end = rom_end > 0x400000 ? rom_end : 0x400000; |
254 if (info->save_type == RAM_FLAG_ODD) { | 302 info->map[0].mask = rom_end < 0x400000 ? nearest_pow2(rom_end) - 1 : 0xFFFFFF; |
255 info->map[1].flags |= MMAP_ONLY_ODD; | 303 info->map[0].flags = MMAP_READ; |
256 } else if (info->save_type == RAM_FLAG_EVEN) { | 304 info->map[0].buffer = rom; |
257 info->map[1].flags |= MMAP_ONLY_EVEN; | 305 info->save_type = SAVE_NONE; |
258 } | |
259 info->map[1].buffer = info->save_buffer; | |
260 } else { | |
261 //Assume the standard Sega mapper | |
262 info->map[0].end = 0x200000; | |
263 info->map[0].mask = 0xFFFFFF; | |
264 info->map[0].flags = MMAP_READ; | |
265 info->map[0].buffer = rom; | |
266 | |
267 info->map[1].start = 0x200000; | |
268 info->map[1].end = 0x400000; | |
269 info->map[1].mask = 0x1FFFFF; | |
270 info->map[1].flags = MMAP_READ | MMAP_PTR_IDX | MMAP_FUNC_NULL; | |
271 info->map[1].ptr_index = info->mapper_start_index = 0; | |
272 info->map[1].read_16 = (read_16_fun)read_sram_w;//these will only be called when mem_pointers[2] == NULL | |
273 info->map[1].read_8 = (read_8_fun)read_sram_b; | |
274 info->map[1].write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area | |
275 info->map[1].write_8 = (write_8_fun)write_sram_area_b; | |
276 info->map[1].buffer = rom + 0x200000; | |
277 | |
278 memmap_chunk *last = info->map + info->map_chunks - 1; | |
279 memset(last, 0, sizeof(memmap_chunk)); | |
280 last->start = 0xA13000; | |
281 last->end = 0xA13100; | |
282 last->mask = 0xFF; | |
283 last->write_16 = (write_16_fun)write_bank_reg_w; | |
284 last->write_8 = (write_8_fun)write_bank_reg_b; | |
285 } | |
286 } else { | |
287 info->map_chunks = base_chunks + 1; | |
288 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); | |
289 memset(info->map, 0, sizeof(memmap_chunk)); | |
290 memcpy(info->map+1, base_map, sizeof(memmap_chunk) * base_chunks); | |
291 | |
292 info->map[0].end = rom_end > 0x400000 ? rom_end : 0x400000; | |
293 info->map[0].mask = rom_end < 0x400000 ? nearest_pow2(rom_end) - 1 : 0xFFFFFF; | |
294 info->map[0].flags = MMAP_READ; | |
295 info->map[0].buffer = rom; | |
296 info->save_type = SAVE_NONE; | |
297 } | |
298 } | 306 } |
299 | 307 |
300 rom_info configure_rom_heuristics(uint8_t *rom, uint32_t rom_size, memmap_chunk const *base_map, uint32_t base_chunks) | 308 rom_info configure_rom_heuristics(uint8_t *rom, uint32_t rom_size, memmap_chunk const *base_map, uint32_t base_chunks) |
301 { | 309 { |
302 rom_info info; | 310 rom_info info; |