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;