# HG changeset patch # User Michael Pavone # Date 1648707345 25200 # Node ID a418fa599b2e6398df8fc6c0b87eb5c01cfee7d2 # Parent 9209858b2f74dd41e8f3ca6ee5cce356005b27d9 Add ROM DB entry to fix SRAM on Triple Play: Gold Edition and make some code changes so that 3MB dumps will work too diff -r 9209858b2f74 -r a418fa599b2e genesis.c --- a/genesis.c Sat Mar 26 23:05:08 2022 -0700 +++ b/genesis.c Wed Mar 30 23:15:45 2022 -0700 @@ -1943,9 +1943,9 @@ rom = info.rom; rom_size = info.rom_size; #ifndef BLASTEM_BIG_ENDIAN - byteswap_rom(rom_size, rom); + byteswap_rom(nearest_pow2(rom_size), rom); if (lock_on) { - byteswap_rom(lock_on_size, lock_on); + byteswap_rom(nearest_pow2(lock_on_size), lock_on); } #endif char *m68k_divider = tern_find_path(config, "clocks\0m68k_divider\0", TVAL_PTR).ptrval; diff -r 9209858b2f74 -r a418fa599b2e rom.db --- a/rom.db Sat Mar 26 23:05:08 2022 -0700 +++ b/rom.db Wed Mar 30 23:15:45 2022 -0700 @@ -1421,3 +1421,26 @@ 2 gamepad3.2 } } +T-172116 { + name Triple Play: Gold Edition + SRAM { + size 32768 + bus odd + } + map { + 0 { + device ROM + last 1FFFFF + } + 200000 { + device SRAM + last 2FFFFF + mask FFFF + } + 300000 { + device ROM + last 3FFFFF + offset 300000 + } + } +} diff -r 9209858b2f74 -r a418fa599b2e romdb.c --- a/romdb.c Sat Mar 26 23:05:08 2022 -0700 +++ b/romdb.c Wed Mar 30 23:15:45 2022 -0700 @@ -695,8 +695,12 @@ map->start = start; map->end = end + 1; if (!strcmp(dtype, "ROM")) { + uint32_t expanded_size = nearest_pow2(state->rom_size); + if (offset >= expanded_size) { + 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); + } map->buffer = state->rom + offset; - map->mask = calc_mask(state->rom_size - offset, start, end); + map->mask = calc_mask(nearest_pow2(state->rom_size) - offset, start, end); if (strcmp(tern_find_ptr_default(node, "writeable", "no"), "yes")) { map->flags = MMAP_READ; } else { @@ -956,6 +960,16 @@ { uint8_t product_id[GAME_ID_LEN+1]; uint8_t *rom = vrom; + uint32_t expanded_size = nearest_pow2(rom_size); + if (expanded_size > rom_size) { + //generally carts with odd-sized ROMs have 2 power of 2 sized ROMs with the larger one first + //TODO: Handle cases in which the 2nd ROM/part is a maller power of 2 than just half the first one + uint32_t mirror_start = expanded_size >> 1; + uint32_t mirror_size = expanded_size >> 2; + if (mirror_start + mirror_size >= rom_size) { + memcpy(rom + mirror_start + mirror_size, rom + mirror_start, mirror_size); + } + } product_id[GAME_ID_LEN] = 0; for (int i = 0; i < GAME_ID_LEN; i++) {