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;