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;