comparison 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
comparison
equal deleted inserted replaced
1843:13abdc98379e 1931:374a5ae694e8
75 start_section(buf, SECTION_MAPPER); 75 start_section(buf, SECTION_MAPPER);
76 save_int8(buf, gen->mapper_type); 76 save_int8(buf, gen->mapper_type);
77 switch(gen->mapper_type) 77 switch(gen->mapper_type)
78 { 78 {
79 case MAPPER_SEGA: 79 case MAPPER_SEGA:
80 case MAPPER_SEGA_SRAM:
80 sega_mapper_serialize(gen, buf); 81 sega_mapper_serialize(gen, buf);
81 break; 82 break;
82 case MAPPER_REALTEC: 83 case MAPPER_REALTEC:
83 realtec_serialize(gen, buf); 84 realtec_serialize(gen, buf);
84 break; 85 break;
94 95
95 void cart_deserialize(deserialize_buffer *buf, void *vcontext) 96 void cart_deserialize(deserialize_buffer *buf, void *vcontext)
96 { 97 {
97 genesis_context *gen = vcontext; 98 genesis_context *gen = vcontext;
98 uint8_t mapper_type = load_int8(buf); 99 uint8_t mapper_type = load_int8(buf);
99 if (mapper_type != gen->mapper_type) { 100 if (mapper_type != gen->mapper_type && (mapper_type != MAPPER_SEGA || gen->mapper_type != MAPPER_SEGA_SRAM)) {
100 warning("Mapper type mismatch, skipping load of mapper state"); 101 warning("Mapper type mismatch, skipping load of mapper state\n");
101 return; 102 return;
102 } 103 }
103 switch(gen->mapper_type) 104 switch(gen->mapper_type)
104 { 105 {
105 case MAPPER_SEGA: 106 case MAPPER_SEGA:
107 case MAPPER_SEGA_SRAM:
106 sega_mapper_deserialize(buf, gen); 108 sega_mapper_deserialize(buf, gen);
107 break; 109 break;
108 case MAPPER_REALTEC: 110 case MAPPER_REALTEC:
109 realtec_deserialize(buf, gen); 111 realtec_deserialize(buf, gen);
110 break; 112 break;
240 uint32_t save_size = info->save_mask + 1; 242 uint32_t save_size = info->save_mask + 1;
241 if (ram_flags != RAM_FLAG_BOTH) { 243 if (ram_flags != RAM_FLAG_BOTH) {
242 save_size /= 2; 244 save_size /= 2;
243 } 245 }
244 info->save_size = save_size; 246 info->save_size = save_size;
245 info->save_buffer = malloc(save_size); 247 info->save_buffer = calloc(save_size, 1);
246 return ram_start; 248 return ram_start;
247 } 249 }
248 250
249 void add_memmap_header(rom_info *info, uint8_t *rom, uint32_t size, memmap_chunk const *base_map, int base_chunks) 251 void add_memmap_header(rom_info *info, uint8_t *rom, uint32_t size, memmap_chunk const *base_map, int base_chunks)
250 { 252 {
252 if (size > rom_end) { 254 if (size > rom_end) {
253 rom_end = size; 255 rom_end = size;
254 } else if (rom_end > nearest_pow2(size)) { 256 } else if (rom_end > nearest_pow2(size)) {
255 rom_end = nearest_pow2(size); 257 rom_end = nearest_pow2(size);
256 } 258 }
259 info->save_type = SAVE_NONE;
257 if (size >= 0x80000 && !memcmp("SEGA SSF", rom + 0x100, 8)) { 260 if (size >= 0x80000 && !memcmp("SEGA SSF", rom + 0x100, 8)) {
258 info->mapper_start_index = 0; 261 info->mapper_start_index = 0;
259 info->mapper_type = MAPPER_SEGA; 262 info->mapper_type = MAPPER_SEGA;
260 info->map_chunks = base_chunks + 9; 263 info->map_chunks = base_chunks + 9;
261 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks); 264 info->map = malloc(sizeof(memmap_chunk) * info->map_chunks);
308 info->map[0].write_16 = nor_flash_write_w; 311 info->map[0].write_16 = nor_flash_write_w;
309 info->map[0].write_8 = nor_flash_write_b; 312 info->map[0].write_8 = nor_flash_write_b;
310 info->map[0].read_16 = nor_flash_read_w; 313 info->map[0].read_16 = nor_flash_read_w;
311 info->map[0].read_8 = nor_flash_read_b; 314 info->map[0].read_8 = nor_flash_read_b;
312 info->map[0].flags = MMAP_READ_CODE | MMAP_CODE; 315 info->map[0].flags = MMAP_READ_CODE | MMAP_CODE;
313 info->map[0].buffer = info->save_buffer = malloc(info->save_size); 316 info->map[0].buffer = info->save_buffer = calloc(info->save_size, 1);
314 uint32_t init_size = size < info->save_size ? size : info->save_size; 317 uint32_t init_size = size < info->save_size ? size : info->save_size;
315 memcpy(info->save_buffer, rom, init_size); 318 memcpy(info->save_buffer, rom, init_size);
316 byteswap_rom(info->save_size, (uint16_t *)info->save_buffer); 319 byteswap_rom(info->save_size, (uint16_t *)info->save_buffer);
317 info->nor = calloc(1, sizeof(nor_state)); 320 info->nor = calloc(1, sizeof(nor_state));
318 nor_flash_init(info->nor, info->save_buffer, info->save_size, 128, 0xDA45, RAM_FLAG_BOTH); 321 nor_flash_init(info->nor, info->save_buffer, info->save_size, 128, 0xDA45, RAM_FLAG_BOTH);
363 info->map[1].flags |= MMAP_ONLY_EVEN; 366 info->map[1].flags |= MMAP_ONLY_EVEN;
364 } 367 }
365 info->map[1].buffer = info->save_buffer; 368 info->map[1].buffer = info->save_buffer;
366 } else { 369 } else {
367 //Assume the standard Sega mapper 370 //Assume the standard Sega mapper
368 info->mapper_type = MAPPER_SEGA; 371 info->mapper_type = MAPPER_SEGA_SRAM;
369 info->map[0].end = 0x200000; 372 info->map[0].end = 0x200000;
370 info->map[0].mask = 0xFFFFFF; 373 info->map[0].mask = 0xFFFFFF;
371 info->map[0].flags = MMAP_READ; 374 info->map[0].flags = MMAP_READ;
372 info->map[0].buffer = rom; 375 info->map[0].buffer = rom;
373 376
379 info->map[1].read_16 = (read_16_fun)read_sram_w;//these will only be called when mem_pointers[2] == NULL 382 info->map[1].read_16 = (read_16_fun)read_sram_w;//these will only be called when mem_pointers[2] == NULL
380 info->map[1].read_8 = (read_8_fun)read_sram_b; 383 info->map[1].read_8 = (read_8_fun)read_sram_b;
381 info->map[1].write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area 384 info->map[1].write_16 = (write_16_fun)write_sram_area_w;//these will be called all writes to the area
382 info->map[1].write_8 = (write_8_fun)write_sram_area_b; 385 info->map[1].write_8 = (write_8_fun)write_sram_area_b;
383 info->map[1].buffer = rom + 0x200000; 386 info->map[1].buffer = rom + 0x200000;
384 387
388 //Last entry in the base map is a catch all one that needs to be
389 //after all the other entries
390 memmap_chunk *unused = info->map + info->map_chunks - 2;
385 memmap_chunk *last = info->map + info->map_chunks - 1; 391 memmap_chunk *last = info->map + info->map_chunks - 1;
392 *last = *unused;
393 last = unused;
386 memset(last, 0, sizeof(memmap_chunk)); 394 memset(last, 0, sizeof(memmap_chunk));
387 last->start = 0xA13000; 395 last->start = 0xA13000;
388 last->end = 0xA13100; 396 last->end = 0xA13100;
389 last->mask = 0xFF; 397 last->mask = 0xFF;
390 last->write_16 = (write_16_fun)write_bank_reg_w; 398 last->write_16 = (write_16_fun)write_bank_reg_w;
487 state->info->save_size = atoi(size); 495 state->info->save_size = atoi(size);
488 if (!state->info->save_size) { 496 if (!state->info->save_size) {
489 fatal_error("SRAM size %s is invalid\n", size); 497 fatal_error("SRAM size %s is invalid\n", size);
490 } 498 }
491 state->info->save_mask = nearest_pow2(state->info->save_size)-1; 499 state->info->save_mask = nearest_pow2(state->info->save_size)-1;
492 state->info->save_buffer = malloc(state->info->save_size); 500 state->info->save_buffer = calloc(state->info->save_size, 1);
493 memset(state->info->save_buffer, 0, state->info->save_size);
494 char *bus = tern_find_path(state->root, "SRAM\0bus\0", TVAL_PTR).ptrval; 501 char *bus = tern_find_path(state->root, "SRAM\0bus\0", TVAL_PTR).ptrval;
495 if (!strcmp(bus, "odd")) { 502 if (!strcmp(bus, "odd")) {
496 state->info->save_type = RAM_FLAG_ODD; 503 state->info->save_type = RAM_FLAG_ODD;
497 } else if(!strcmp(bus, "even")) { 504 } else if(!strcmp(bus, "even")) {
498 state->info->save_type = RAM_FLAG_EVEN; 505 state->info->save_type = RAM_FLAG_EVEN;
565 state->info->save_buffer = malloc(state->info->save_size); 572 state->info->save_buffer = malloc(state->info->save_size);
566 char *init = tern_find_path_default(state->root, "NOR\0init\0", (tern_val){.ptrval="FF"}, TVAL_PTR).ptrval; 573 char *init = tern_find_path_default(state->root, "NOR\0init\0", (tern_val){.ptrval="FF"}, TVAL_PTR).ptrval;
567 if (!strcmp(init, "ROM")) { 574 if (!strcmp(init, "ROM")) {
568 uint32_t init_size = state->rom_size > state->info->save_size ? state->info->save_size : state->rom_size; 575 uint32_t init_size = state->rom_size > state->info->save_size ? state->info->save_size : state->rom_size;
569 memcpy(state->info->save_buffer, state->rom, init_size); 576 memcpy(state->info->save_buffer, state->rom, init_size);
577 if (init_size < state->info->save_size) {
578 memset(state->info->save_buffer + init_size, 0xFF, state->info->save_size - init_size);
579 }
570 if (state->info->save_bus == RAM_FLAG_BOTH) { 580 if (state->info->save_bus == RAM_FLAG_BOTH) {
571 byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer); 581 byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer);
572 } 582 }
573 } else { 583 } else {
574 memset(state->info->save_buffer, strtol(init, NULL, 16), state->info->save_size); 584 memset(state->info->save_buffer, strtol(init, NULL, 16), state->info->save_size);
710 } else if (!strcmp(dtype, "RAM")) { 720 } else if (!strcmp(dtype, "RAM")) {
711 uint32_t size = strtol(tern_find_ptr_default(node, "size", "0"), NULL, 16); 721 uint32_t size = strtol(tern_find_ptr_default(node, "size", "0"), NULL, 16);
712 if (!size || size > map->end - map->start) { 722 if (!size || size > map->end - map->start) {
713 size = map->end - map->start; 723 size = map->end - map->start;
714 } 724 }
715 map->buffer = malloc(size); 725 map->buffer = calloc(size, 1);
716 map->mask = calc_mask(size, start, end); 726 map->mask = calc_mask(size, start, end);
717 map->flags = MMAP_READ | MMAP_WRITE; 727 map->flags = MMAP_READ | MMAP_WRITE;
718 char *bus = tern_find_ptr_default(node, "bus", "both"); 728 char *bus = tern_find_ptr_default(node, "bus", "both");
719 if (!strcmp(bus, "odd")) { 729 if (!strcmp(bus, "odd")) {
720 map->flags |= MMAP_ONLY_ODD; 730 map->flags |= MMAP_ONLY_ODD;