Mercurial > repos > blastem
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 } |