Mercurial > repos > blastem
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; |