comparison romdb.c @ 777:79b10b421d3c

Support large flat-mapped ROMs like Bad Apple or that Mortal Kombat hack
author Michael Pavone <pavone@retrodev.com>
date Mon, 20 Jul 2015 21:43:17 -0700
parents cbf97d335444
children ba38e36559b0
comparison
equal deleted inserted replaced
776:cbf97d335444 777:79b10b421d3c
476 } 476 }
477 } 477 }
478 478
479 void add_memmap_header(rom_info *info, uint8_t *rom, uint32_t size, memmap_chunk const *base_map, int base_chunks) 479 void add_memmap_header(rom_info *info, uint8_t *rom, uint32_t size, memmap_chunk const *base_map, int base_chunks)
480 { 480 {
481 uint32_t rom_end = get_u32be(rom + ROM_END) + 1;
482 if (size > rom_end) {
483 rom_end = size;
484 } else if (rom_end > nearest_pow2(size)) {
485 rom_end = nearest_pow2(size);
486 }
481 if (rom[RAM_ID] == 'R' && rom[RAM_ID+1] == 'A') { 487 if (rom[RAM_ID] == 'R' && rom[RAM_ID+1] == 'A') {
482 uint32_t rom_end = get_u32be(rom + ROM_END) + 1;
483 uint32_t ram_start = get_u32be(rom + RAM_START); 488 uint32_t ram_start = get_u32be(rom + RAM_START);
484 uint32_t ram_end = get_u32be(rom + RAM_END); 489 uint32_t ram_end = get_u32be(rom + RAM_END);
485 uint32_t ram_flags = info->save_type = rom[RAM_FLAGS] & RAM_FLAG_MASK; 490 uint32_t ram_flags = info->save_type = rom[RAM_FLAGS] & RAM_FLAG_MASK;
486 ram_start &= 0xFFFFFE; 491 ram_start &= 0xFFFFFE;
487 ram_end |= 1; 492 ram_end |= 1;
488 info->save_mask = ram_end - ram_start; 493 info->save_mask = ram_end - ram_start;
489 uint32_t size = info->save_mask + 1; 494 uint32_t save_size = info->save_mask + 1;
490 if (ram_flags != RAM_FLAG_BOTH) { 495 if (ram_flags != RAM_FLAG_BOTH) {
491 size /= 2; 496 save_size /= 2;
492 } 497 }
493 info->save_size = size; 498 info->save_size = save_size;
494 info->save_buffer = malloc(size); 499 info->save_buffer = malloc(save_size);
495 500
496 info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3); 501 info->map_chunks = base_chunks + (ram_start >= rom_end ? 2 : 3);
497 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); 502 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks);
498 memset(info->map, 0, sizeof(memmap_chunk)*2); 503 memset(info->map, 0, sizeof(memmap_chunk)*2);
499 memcpy(info->map+2, base_map, sizeof(memmap_chunk) * base_chunks); 504 memcpy(info->map+2, base_map, sizeof(memmap_chunk) * base_chunks);
500 505
501 if (ram_start >= rom_end) { 506 if (ram_start >= rom_end) {
502 info->map[0].end = rom_end; 507 info->map[0].end = rom_end > 0x400000 ? rom_end : 0x400000;
503 //TODO: ROM mirroring 508 //TODO: ROM mirroring
504 info->map[0].mask = 0xFFFFFF; 509 info->map[0].mask = 0xFFFFFF;
505 info->map[0].flags = MMAP_READ; 510 info->map[0].flags = MMAP_READ;
506 info->map[0].buffer = rom; 511 info->map[0].buffer = rom;
507 512
546 info->map_chunks = base_chunks + 1; 551 info->map_chunks = base_chunks + 1;
547 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); 552 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks);
548 memset(info->map, 0, sizeof(memmap_chunk)); 553 memset(info->map, 0, sizeof(memmap_chunk));
549 memcpy(info->map+1, base_map, sizeof(memmap_chunk) * base_chunks); 554 memcpy(info->map+1, base_map, sizeof(memmap_chunk) * base_chunks);
550 555
551 info->map[0].end = 0x400000; 556 info->map[0].end =rom_end > 0x400000 ? rom_end : 0x400000;
552 info->map[0].mask = 0xFFFFFF; 557 info->map[0].mask = 0xFFFFFF;
553 info->map[0].flags = MMAP_READ; 558 info->map[0].flags = MMAP_READ;
554 info->map[0].buffer = rom; 559 info->map[0].buffer = rom;
555 info->save_type = SAVE_NONE; 560 info->save_type = SAVE_NONE;
556 } 561 }