Mercurial > repos > blastem
comparison romdb.c @ 2150:a418fa599b2e
Add ROM DB entry to fix SRAM on Triple Play: Gold Edition and make some code changes so that 3MB dumps will work too
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 30 Mar 2022 23:15:45 -0700 |
parents | 5d575c42fff5 |
children | 2b7847bed4bb da7890445962 |
comparison
equal
deleted
inserted
replaced
2149:9209858b2f74 | 2150:a418fa599b2e |
---|---|
693 uint32_t offset = strtol(tern_find_ptr_default(node, "offset", "0"), NULL, 16); | 693 uint32_t offset = strtol(tern_find_ptr_default(node, "offset", "0"), NULL, 16); |
694 memmap_chunk *map = state->info->map + state->index; | 694 memmap_chunk *map = state->info->map + state->index; |
695 map->start = start; | 695 map->start = start; |
696 map->end = end + 1; | 696 map->end = end + 1; |
697 if (!strcmp(dtype, "ROM")) { | 697 if (!strcmp(dtype, "ROM")) { |
698 uint32_t expanded_size = nearest_pow2(state->rom_size); | |
699 if (offset >= expanded_size) { | |
700 fatal_error("offset of %X is invalid for ROM size of %X in map entry %d with addess %s\n", offset, state->rom_size, state->index, key); | |
701 } | |
698 map->buffer = state->rom + offset; | 702 map->buffer = state->rom + offset; |
699 map->mask = calc_mask(state->rom_size - offset, start, end); | 703 map->mask = calc_mask(nearest_pow2(state->rom_size) - offset, start, end); |
700 if (strcmp(tern_find_ptr_default(node, "writeable", "no"), "yes")) { | 704 if (strcmp(tern_find_ptr_default(node, "writeable", "no"), "yes")) { |
701 map->flags = MMAP_READ; | 705 map->flags = MMAP_READ; |
702 } else { | 706 } else { |
703 map->flags = MMAP_READ | MMAP_WRITE | MMAP_CODE; | 707 map->flags = MMAP_READ | MMAP_WRITE | MMAP_CODE; |
704 } | 708 } |
954 | 958 |
955 rom_info configure_rom(tern_node *rom_db, void *vrom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, memmap_chunk const *base_map, uint32_t base_chunks) | 959 rom_info configure_rom(tern_node *rom_db, void *vrom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, memmap_chunk const *base_map, uint32_t base_chunks) |
956 { | 960 { |
957 uint8_t product_id[GAME_ID_LEN+1]; | 961 uint8_t product_id[GAME_ID_LEN+1]; |
958 uint8_t *rom = vrom; | 962 uint8_t *rom = vrom; |
963 uint32_t expanded_size = nearest_pow2(rom_size); | |
964 if (expanded_size > rom_size) { | |
965 //generally carts with odd-sized ROMs have 2 power of 2 sized ROMs with the larger one first | |
966 //TODO: Handle cases in which the 2nd ROM/part is a maller power of 2 than just half the first one | |
967 uint32_t mirror_start = expanded_size >> 1; | |
968 uint32_t mirror_size = expanded_size >> 2; | |
969 if (mirror_start + mirror_size >= rom_size) { | |
970 memcpy(rom + mirror_start + mirror_size, rom + mirror_start, mirror_size); | |
971 } | |
972 } | |
959 product_id[GAME_ID_LEN] = 0; | 973 product_id[GAME_ID_LEN] = 0; |
960 for (int i = 0; i < GAME_ID_LEN; i++) | 974 for (int i = 0; i < GAME_ID_LEN; i++) |
961 { | 975 { |
962 if (rom[GAME_ID_OFF + i] <= ' ') { | 976 if (rom[GAME_ID_OFF + i] <= ' ') { |
963 product_id[i] = 0; | 977 product_id[i] = 0; |