comparison romdb.c @ 1519:1f745318f10a

Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
author Michael Pavone <pavone@retrodev.com>
date Wed, 31 Jan 2018 22:05:10 -0800
parents 8f3b6a64b658
children 94ba407a5ec1
comparison
equal deleted inserted replaced
1518:713b504dc577 1519:1f745318f10a
55 free(info->map); 55 free(info->map);
56 free(info->port1_override); 56 free(info->port1_override);
57 free(info->port2_override); 57 free(info->port2_override);
58 free(info->ext_override); 58 free(info->ext_override);
59 free(info->mouse_mode); 59 free(info->mouse_mode);
60 free(info->nor);
60 } 61 }
61 62
62 void cart_serialize(system_header *sys, serialize_buffer *buf) 63 void cart_serialize(system_header *sys, serialize_buffer *buf)
63 { 64 {
64 if (sys->type != SYSTEM_GENESIS) { 65 if (sys->type != SYSTEM_GENESIS) {
498 } 499 }
499 char *page_size = tern_find_path(state->root, "NOR\0page_size\0", TVAL_PTR).ptrval; 500 char *page_size = tern_find_path(state->root, "NOR\0page_size\0", TVAL_PTR).ptrval;
500 if (!page_size) { 501 if (!page_size) {
501 fatal_error("ROM DB map entry %d with address %s has device type NOR, but the NOR page size is not defined\n", state->index, key); 502 fatal_error("ROM DB map entry %d with address %s has device type NOR, but the NOR page size is not defined\n", state->index, key);
502 } 503 }
503 state->info->save_page_size = atoi(size); 504 uint32_t save_page_size = atoi(page_size);
504 if (!state->info->save_page_size) { 505 if (!save_page_size) {
505 fatal_error("NOR page size %s is invalid\n", size); 506 fatal_error("NOR page size %s is invalid\n", page_size);
506 } 507 }
507 char *product_id = tern_find_path(state->root, "NOR\0product_id\0", TVAL_PTR).ptrval; 508 char *product_id = tern_find_path(state->root, "NOR\0product_id\0", TVAL_PTR).ptrval;
508 if (!product_id) { 509 if (!product_id) {
509 fatal_error("ROM DB map entry %d with address %s has device type NOR, but the NOR product ID is not defined\n", state->index, key); 510 fatal_error("ROM DB map entry %d with address %s has device type NOR, but the NOR product ID is not defined\n", state->index, key);
510 } 511 }
511 state->info->save_product_id = strtol(product_id, NULL, 16); 512 uint16_t save_product_id = strtol(product_id, NULL, 16);
512 char *bus = tern_find_path(state->root, "NOR\0bus\0", TVAL_PTR).ptrval; 513 char *bus = tern_find_path(state->root, "NOR\0bus\0", TVAL_PTR).ptrval;
513 if (!strcmp(bus, "odd")) { 514 if (!strcmp(bus, "odd")) {
514 state->info->save_bus = RAM_FLAG_ODD; 515 state->info->save_bus = RAM_FLAG_ODD;
515 } else if(!strcmp(bus, "even")) { 516 } else if(!strcmp(bus, "even")) {
516 state->info->save_bus = RAM_FLAG_EVEN; 517 state->info->save_bus = RAM_FLAG_EVEN;
517 } else { 518 } else {
518 state->info->save_bus = RAM_FLAG_BOTH; 519 state->info->save_bus = RAM_FLAG_BOTH;
519 } 520 }
520 state->info->save_type = SAVE_NOR; 521 state->info->save_type = SAVE_NOR;
521 state->info->save_buffer = malloc(state->info->save_size); 522 state->info->save_buffer = malloc(state->info->save_size);
522 memset(state->info->save_buffer, 0xFF, state->info->save_size); 523 char *init = tern_find_path_default(state->root, "NOR\0init\0", (tern_val){.ptrval="FF"}, TVAL_PTR).ptrval;
524 if (!strcmp(init, "ROM")) {
525 uint32_t init_size = state->rom_size > state->info->save_size ? state->info->save_size : state->rom_size;
526 memcpy(state->info->save_buffer, state->rom, init_size);
527 if (state->info->save_bus == RAM_FLAG_BOTH) {
528 byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer);
529 }
530 } else {
531 memset(state->info->save_buffer, strtol(init, NULL, 16), state->info->save_size);
532 }
533 state->info->nor = calloc(1, sizeof(nor_state));
534 nor_flash_init(state->info->nor, state->info->save_buffer, state->info->save_size, save_page_size, save_product_id, state->info->save_bus);
535 char *cmd1 = tern_find_path(state->root, "NOR\0cmd_address1\0", TVAL_PTR).ptrval;
536 if (cmd1) {
537 state->info->nor->cmd_address1 = strtol(cmd1, NULL, 16);
538 }
539 char *cmd2 = tern_find_path(state->root, "NOR\0cmd_address2\0", TVAL_PTR).ptrval;
540 if (cmd2) {
541 state->info->nor->cmd_address2 = strtol(cmd2, NULL, 16);
542 }
523 } 543 }
524 } 544 }
525 545
526 void add_eeprom_map(tern_node *node, uint32_t start, uint32_t end, map_iter_state *state) 546 void add_eeprom_map(tern_node *node, uint32_t start, uint32_t end, map_iter_state *state)
527 { 547 {
614 state->info->is_save_lock_on = 1; 634 state->info->is_save_lock_on = 1;
615 } 635 }
616 state->info->save_buffer = lock_info.save_buffer; 636 state->info->save_buffer = lock_info.save_buffer;
617 state->info->save_size = lock_info.save_size; 637 state->info->save_size = lock_info.save_size;
618 state->info->save_mask = lock_info.save_mask; 638 state->info->save_mask = lock_info.save_mask;
619 state->info->save_page_size = lock_info.save_page_size; 639 state->info->nor = lock_info.nor;
620 state->info->save_product_id = lock_info.save_product_id;
621 state->info->save_type = lock_info.save_type; 640 state->info->save_type = lock_info.save_type;
622 state->info->save_bus = lock_info.save_bus; 641 state->info->save_bus = lock_info.save_bus;
623 lock_info.save_buffer = NULL; 642 lock_info.save_buffer = NULL;
624 lock_info.save_type = SAVE_NONE; 643 lock_info.save_type = SAVE_NONE;
625 } 644 }
665 684
666 map->write_16 = nor_flash_write_w; 685 map->write_16 = nor_flash_write_w;
667 map->write_8 = nor_flash_write_b; 686 map->write_8 = nor_flash_write_b;
668 map->read_16 = nor_flash_read_w; 687 map->read_16 = nor_flash_read_w;
669 map->read_8 = nor_flash_read_b; 688 map->read_8 = nor_flash_read_b;
689 if (state->info->save_bus == RAM_FLAG_BOTH) {
690 map->flags |= MMAP_READ_CODE | MMAP_CODE;
691 map->buffer = state->info->save_buffer;
692 }
670 map->mask = 0xFFFFFF; 693 map->mask = 0xFFFFFF;
671 } else if (!strcmp(dtype, "Sega mapper")) { 694 } else if (!strcmp(dtype, "Sega mapper")) {
672 state->info->mapper_type = MAPPER_SEGA; 695 state->info->mapper_type = MAPPER_SEGA;
673 state->info->mapper_start_index = state->ptr_index++; 696 state->info->mapper_start_index = state->ptr_index++;
674 char *variant = tern_find_ptr_default(node, "variant", "full"); 697 char *variant = tern_find_ptr_default(node, "variant", "full");