Mercurial > repos > blastem
comparison romdb.c @ 1847:882746581f17
Make sure on-cart memories are fully initialized in all cases
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 23 Apr 2019 08:47:52 -0700 |
parents | 8500bd987dda |
children | d60f2d7c02a5 |
comparison
equal
deleted
inserted
replaced
1846:6fc4afea5424 | 1847:882746581f17 |
---|---|
240 uint32_t save_size = info->save_mask + 1; | 240 uint32_t save_size = info->save_mask + 1; |
241 if (ram_flags != RAM_FLAG_BOTH) { | 241 if (ram_flags != RAM_FLAG_BOTH) { |
242 save_size /= 2; | 242 save_size /= 2; |
243 } | 243 } |
244 info->save_size = save_size; | 244 info->save_size = save_size; |
245 info->save_buffer = malloc(save_size); | 245 info->save_buffer = calloc(save_size, 1); |
246 return ram_start; | 246 return ram_start; |
247 } | 247 } |
248 | 248 |
249 void add_memmap_header(rom_info *info, uint8_t *rom, uint32_t size, memmap_chunk const *base_map, int base_chunks) | 249 void add_memmap_header(rom_info *info, uint8_t *rom, uint32_t size, memmap_chunk const *base_map, int base_chunks) |
250 { | 250 { |
308 info->map[0].write_16 = nor_flash_write_w; | 308 info->map[0].write_16 = nor_flash_write_w; |
309 info->map[0].write_8 = nor_flash_write_b; | 309 info->map[0].write_8 = nor_flash_write_b; |
310 info->map[0].read_16 = nor_flash_read_w; | 310 info->map[0].read_16 = nor_flash_read_w; |
311 info->map[0].read_8 = nor_flash_read_b; | 311 info->map[0].read_8 = nor_flash_read_b; |
312 info->map[0].flags = MMAP_READ_CODE | MMAP_CODE; | 312 info->map[0].flags = MMAP_READ_CODE | MMAP_CODE; |
313 info->map[0].buffer = info->save_buffer = malloc(info->save_size); | 313 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; | 314 uint32_t init_size = size < info->save_size ? size : info->save_size; |
315 memcpy(info->save_buffer, rom, init_size); | 315 memcpy(info->save_buffer, rom, init_size); |
316 byteswap_rom(info->save_size, (uint16_t *)info->save_buffer); | 316 byteswap_rom(info->save_size, (uint16_t *)info->save_buffer); |
317 info->nor = calloc(1, sizeof(nor_state)); | 317 info->nor = calloc(1, sizeof(nor_state)); |
318 nor_flash_init(info->nor, info->save_buffer, info->save_size, 128, 0xDA45, RAM_FLAG_BOTH); | 318 nor_flash_init(info->nor, info->save_buffer, info->save_size, 128, 0xDA45, RAM_FLAG_BOTH); |
487 state->info->save_size = atoi(size); | 487 state->info->save_size = atoi(size); |
488 if (!state->info->save_size) { | 488 if (!state->info->save_size) { |
489 fatal_error("SRAM size %s is invalid\n", size); | 489 fatal_error("SRAM size %s is invalid\n", size); |
490 } | 490 } |
491 state->info->save_mask = nearest_pow2(state->info->save_size)-1; | 491 state->info->save_mask = nearest_pow2(state->info->save_size)-1; |
492 state->info->save_buffer = malloc(state->info->save_size); | 492 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; | 493 char *bus = tern_find_path(state->root, "SRAM\0bus\0", TVAL_PTR).ptrval; |
495 if (!strcmp(bus, "odd")) { | 494 if (!strcmp(bus, "odd")) { |
496 state->info->save_type = RAM_FLAG_ODD; | 495 state->info->save_type = RAM_FLAG_ODD; |
497 } else if(!strcmp(bus, "even")) { | 496 } else if(!strcmp(bus, "even")) { |
498 state->info->save_type = RAM_FLAG_EVEN; | 497 state->info->save_type = RAM_FLAG_EVEN; |
565 state->info->save_buffer = malloc(state->info->save_size); | 564 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; | 565 char *init = tern_find_path_default(state->root, "NOR\0init\0", (tern_val){.ptrval="FF"}, TVAL_PTR).ptrval; |
567 if (!strcmp(init, "ROM")) { | 566 if (!strcmp(init, "ROM")) { |
568 uint32_t init_size = state->rom_size > state->info->save_size ? state->info->save_size : state->rom_size; | 567 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); | 568 memcpy(state->info->save_buffer, state->rom, init_size); |
569 if (init_size < state->info->save_size) { | |
570 memset(state->info->save_buffer + init_size, 0xFF, state->info->save_size - init_size); | |
571 } | |
570 if (state->info->save_bus == RAM_FLAG_BOTH) { | 572 if (state->info->save_bus == RAM_FLAG_BOTH) { |
571 byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer); | 573 byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer); |
572 } | 574 } |
573 } else { | 575 } else { |
574 memset(state->info->save_buffer, strtol(init, NULL, 16), state->info->save_size); | 576 memset(state->info->save_buffer, strtol(init, NULL, 16), state->info->save_size); |
710 } else if (!strcmp(dtype, "RAM")) { | 712 } else if (!strcmp(dtype, "RAM")) { |
711 uint32_t size = strtol(tern_find_ptr_default(node, "size", "0"), NULL, 16); | 713 uint32_t size = strtol(tern_find_ptr_default(node, "size", "0"), NULL, 16); |
712 if (!size || size > map->end - map->start) { | 714 if (!size || size > map->end - map->start) { |
713 size = map->end - map->start; | 715 size = map->end - map->start; |
714 } | 716 } |
715 map->buffer = malloc(size); | 717 map->buffer = calloc(size, 1); |
716 map->mask = calc_mask(size, start, end); | 718 map->mask = calc_mask(size, start, end); |
717 map->flags = MMAP_READ | MMAP_WRITE; | 719 map->flags = MMAP_READ | MMAP_WRITE; |
718 char *bus = tern_find_ptr_default(node, "bus", "both"); | 720 char *bus = tern_find_ptr_default(node, "bus", "both"); |
719 if (!strcmp(bus, "odd")) { | 721 if (!strcmp(bus, "odd")) { |
720 map->flags |= MMAP_ONLY_ODD; | 722 map->flags |= MMAP_ONLY_ODD; |