Mercurial > repos > blastem
diff romdb.c @ 1931:374a5ae694e8 mame_interp
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 18 Apr 2020 11:42:53 -0700 |
parents | 6ece1e2c7a15 |
children | 42c12d141f6e |
line wrap: on
line diff
--- a/romdb.c Thu Apr 18 22:06:47 2019 -0700 +++ b/romdb.c Sat Apr 18 11:42:53 2020 -0700 @@ -77,6 +77,7 @@ switch(gen->mapper_type) { case MAPPER_SEGA: + case MAPPER_SEGA_SRAM: sega_mapper_serialize(gen, buf); break; case MAPPER_REALTEC: @@ -96,13 +97,14 @@ { genesis_context *gen = vcontext; uint8_t mapper_type = load_int8(buf); - if (mapper_type != gen->mapper_type) { - warning("Mapper type mismatch, skipping load of mapper state"); + if (mapper_type != gen->mapper_type && (mapper_type != MAPPER_SEGA || gen->mapper_type != MAPPER_SEGA_SRAM)) { + warning("Mapper type mismatch, skipping load of mapper state\n"); return; } switch(gen->mapper_type) { case MAPPER_SEGA: + case MAPPER_SEGA_SRAM: sega_mapper_deserialize(buf, gen); break; case MAPPER_REALTEC: @@ -242,7 +244,7 @@ save_size /= 2; } info->save_size = save_size; - info->save_buffer = malloc(save_size); + info->save_buffer = calloc(save_size, 1); return ram_start; } @@ -254,6 +256,7 @@ } else if (rom_end > nearest_pow2(size)) { rom_end = nearest_pow2(size); } + info->save_type = SAVE_NONE; if (size >= 0x80000 && !memcmp("SEGA SSF", rom + 0x100, 8)) { info->mapper_start_index = 0; info->mapper_type = MAPPER_SEGA; @@ -310,7 +313,7 @@ info->map[0].read_16 = nor_flash_read_w; info->map[0].read_8 = nor_flash_read_b; info->map[0].flags = MMAP_READ_CODE | MMAP_CODE; - info->map[0].buffer = info->save_buffer = malloc(info->save_size); + info->map[0].buffer = info->save_buffer = calloc(info->save_size, 1); uint32_t init_size = size < info->save_size ? size : info->save_size; memcpy(info->save_buffer, rom, init_size); byteswap_rom(info->save_size, (uint16_t *)info->save_buffer); @@ -365,7 +368,7 @@ info->map[1].buffer = info->save_buffer; } else { //Assume the standard Sega mapper - info->mapper_type = MAPPER_SEGA; + info->mapper_type = MAPPER_SEGA_SRAM; info->map[0].end = 0x200000; info->map[0].mask = 0xFFFFFF; info->map[0].flags = MMAP_READ; @@ -381,8 +384,13 @@ info->map[1].write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area info->map[1].write_8 = (write_8_fun)write_sram_area_b; info->map[1].buffer = rom + 0x200000; - + + //Last entry in the base map is a catch all one that needs to be + //after all the other entries + memmap_chunk *unused = info->map + info->map_chunks - 2; memmap_chunk *last = info->map + info->map_chunks - 1; + *last = *unused; + last = unused; memset(last, 0, sizeof(memmap_chunk)); last->start = 0xA13000; last->end = 0xA13100; @@ -489,8 +497,7 @@ fatal_error("SRAM size %s is invalid\n", size); } state->info->save_mask = nearest_pow2(state->info->save_size)-1; - state->info->save_buffer = malloc(state->info->save_size); - memset(state->info->save_buffer, 0, state->info->save_size); + state->info->save_buffer = calloc(state->info->save_size, 1); char *bus = tern_find_path(state->root, "SRAM\0bus\0", TVAL_PTR).ptrval; if (!strcmp(bus, "odd")) { state->info->save_type = RAM_FLAG_ODD; @@ -567,6 +574,9 @@ if (!strcmp(init, "ROM")) { uint32_t init_size = state->rom_size > state->info->save_size ? state->info->save_size : state->rom_size; memcpy(state->info->save_buffer, state->rom, init_size); + if (init_size < state->info->save_size) { + memset(state->info->save_buffer + init_size, 0xFF, state->info->save_size - init_size); + } if (state->info->save_bus == RAM_FLAG_BOTH) { byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer); } @@ -712,7 +722,7 @@ if (!size || size > map->end - map->start) { size = map->end - map->start; } - map->buffer = malloc(size); + map->buffer = calloc(size, 1); map->mask = calc_mask(size, start, end); map->flags = MMAP_READ | MMAP_WRITE; char *bus = tern_find_ptr_default(node, "bus", "both");