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