comparison romdb.c @ 1692:5dacaef602a7 segacd

Merge from default
author Michael Pavone <pavone@retrodev.com>
date Sat, 05 Jan 2019 00:58:08 -0800
parents a763523dadf4 c206a422d466
children 3414a4423de1
comparison
equal deleted inserted replaced
1504:95b3a1a8b26c 1692:5dacaef602a7
9 #include "xband.h" 9 #include "xband.h"
10 #include "realtec.h" 10 #include "realtec.h"
11 #include "nor.h" 11 #include "nor.h"
12 #include "sega_mapper.h" 12 #include "sega_mapper.h"
13 #include "multi_game.h" 13 #include "multi_game.h"
14 #include "megawifi.h"
15 #include "jcart.h"
16 #include "blastem.h"
14 17
15 #define DOM_TITLE_START 0x120 18 #define DOM_TITLE_START 0x120
16 #define DOM_TITLE_END 0x150 19 #define DOM_TITLE_END 0x150
17 #define TITLE_START DOM_TITLE_END 20 #define TITLE_START DOM_TITLE_END
18 #define TITLE_END (TITLE_START+48) 21 #define TITLE_END (TITLE_START+48)
50 free(info->name); 53 free(info->name);
51 if (info->save_type != SAVE_NONE) { 54 if (info->save_type != SAVE_NONE) {
52 free(info->save_buffer); 55 free(info->save_buffer);
53 if (info->save_type == SAVE_I2C) { 56 if (info->save_type == SAVE_I2C) {
54 free(info->eeprom_map); 57 free(info->eeprom_map);
58 } else if (info->save_type == SAVE_NOR) {
59 free(info->nor);
55 } 60 }
56 } 61 }
57 free(info->map); 62 free(info->map);
58 free(info->port1_override); 63 free(info->port1_override);
59 free(info->port2_override); 64 free(info->port2_override);
500 } 505 }
501 char *page_size = tern_find_path(state->root, "NOR\0page_size\0", TVAL_PTR).ptrval; 506 char *page_size = tern_find_path(state->root, "NOR\0page_size\0", TVAL_PTR).ptrval;
502 if (!page_size) { 507 if (!page_size) {
503 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); 508 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);
504 } 509 }
505 state->info->save_page_size = atoi(size); 510 uint32_t save_page_size = atoi(page_size);
506 if (!state->info->save_page_size) { 511 if (!save_page_size) {
507 fatal_error("NOR page size %s is invalid\n", size); 512 fatal_error("NOR page size %s is invalid\n", page_size);
508 } 513 }
509 char *product_id = tern_find_path(state->root, "NOR\0product_id\0", TVAL_PTR).ptrval; 514 char *product_id = tern_find_path(state->root, "NOR\0product_id\0", TVAL_PTR).ptrval;
510 if (!product_id) { 515 if (!product_id) {
511 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); 516 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);
512 } 517 }
513 state->info->save_product_id = strtol(product_id, NULL, 16); 518 uint16_t save_product_id = strtol(product_id, NULL, 16);
514 char *bus = tern_find_path(state->root, "NOR\0bus\0", TVAL_PTR).ptrval; 519 char *bus = tern_find_path(state->root, "NOR\0bus\0", TVAL_PTR).ptrval;
515 if (!strcmp(bus, "odd")) { 520 if (!strcmp(bus, "odd")) {
516 state->info->save_bus = RAM_FLAG_ODD; 521 state->info->save_bus = RAM_FLAG_ODD;
517 } else if(!strcmp(bus, "even")) { 522 } else if(!strcmp(bus, "even")) {
518 state->info->save_bus = RAM_FLAG_EVEN; 523 state->info->save_bus = RAM_FLAG_EVEN;
519 } else { 524 } else {
520 state->info->save_bus = RAM_FLAG_BOTH; 525 state->info->save_bus = RAM_FLAG_BOTH;
521 } 526 }
522 state->info->save_type = SAVE_NOR; 527 state->info->save_type = SAVE_NOR;
523 state->info->save_buffer = malloc(state->info->save_size); 528 state->info->save_buffer = malloc(state->info->save_size);
524 memset(state->info->save_buffer, 0xFF, state->info->save_size); 529 char *init = tern_find_path_default(state->root, "NOR\0init\0", (tern_val){.ptrval="FF"}, TVAL_PTR).ptrval;
530 if (!strcmp(init, "ROM")) {
531 uint32_t init_size = state->rom_size > state->info->save_size ? state->info->save_size : state->rom_size;
532 memcpy(state->info->save_buffer, state->rom, init_size);
533 if (state->info->save_bus == RAM_FLAG_BOTH) {
534 byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer);
535 }
536 } else {
537 memset(state->info->save_buffer, strtol(init, NULL, 16), state->info->save_size);
538 }
539 state->info->nor = calloc(1, sizeof(nor_state));
540 nor_flash_init(state->info->nor, state->info->save_buffer, state->info->save_size, save_page_size, save_product_id, state->info->save_bus);
541 char *cmd1 = tern_find_path(state->root, "NOR\0cmd_address1\0", TVAL_PTR).ptrval;
542 if (cmd1) {
543 state->info->nor->cmd_address1 = strtol(cmd1, NULL, 16);
544 }
545 char *cmd2 = tern_find_path(state->root, "NOR\0cmd_address2\0", TVAL_PTR).ptrval;
546 if (cmd2) {
547 state->info->nor->cmd_address2 = strtol(cmd2, NULL, 16);
548 }
525 } 549 }
526 } 550 }
527 551
528 void add_eeprom_map(tern_node *node, uint32_t start, uint32_t end, map_iter_state *state) 552 void add_eeprom_map(tern_node *node, uint32_t start, uint32_t end, map_iter_state *state)
529 { 553 {
560 memmap_chunk *map = state->info->map + state->index; 584 memmap_chunk *map = state->info->map + state->index;
561 map->start = start; 585 map->start = start;
562 map->end = end + 1; 586 map->end = end + 1;
563 if (!strcmp(dtype, "ROM")) { 587 if (!strcmp(dtype, "ROM")) {
564 map->buffer = state->rom + offset; 588 map->buffer = state->rom + offset;
565 map->flags = MMAP_READ;
566 map->mask = calc_mask(state->rom_size - offset, start, end); 589 map->mask = calc_mask(state->rom_size - offset, start, end);
590 if (strcmp(tern_find_ptr_default(node, "writeable", "no"), "yes")) {
591 map->flags = MMAP_READ;
592 } else {
593 map->flags = MMAP_READ | MMAP_WRITE | MMAP_CODE;
594 }
567 } else if (!strcmp(dtype, "LOCK-ON")) { 595 } else if (!strcmp(dtype, "LOCK-ON")) {
568 rom_info lock_info; 596 rom_info lock_info;
569 if (state->lock_on) { 597 if (state->lock_on) {
570 lock_info = configure_rom(state->rom_db, state->lock_on, state->lock_on_size, NULL, 0, NULL, 0); 598 lock_info = configure_rom(state->rom_db, state->lock_on, state->lock_on_size, NULL, 0, NULL, 0);
571 } else if (state->rom_size > start) { 599 } else if (state->rom_size > start) {
582 matching_chunks++; 610 matching_chunks++;
583 } 611 }
584 } 612 }
585 if (matching_chunks == 0) { 613 if (matching_chunks == 0) {
586 //Nothing mapped in the relevant range for the lock-on cart, ignore this mapping 614 //Nothing mapped in the relevant range for the lock-on cart, ignore this mapping
615 free_rom_info(&lock_info);
587 return; 616 return;
588 } else if (matching_chunks > 1) { 617 } else if (matching_chunks > 1) {
589 state->info->map_chunks += matching_chunks - 1; 618 state->info->map_chunks += matching_chunks - 1;
590 state->info->map = realloc(state->info->map, sizeof(memmap_chunk) * state->info->map_chunks); 619 state->info->map = realloc(state->info->map, sizeof(memmap_chunk) * state->info->map_chunks);
591 memset(state->info->map + state->info->map_chunks - (matching_chunks - 1), 0, sizeof(memmap_chunk) * (matching_chunks - 1)); 620 memset(state->info->map + state->info->map_chunks - (matching_chunks - 1), 0, sizeof(memmap_chunk) * (matching_chunks - 1));
612 state->info->is_save_lock_on = 1; 641 state->info->is_save_lock_on = 1;
613 } 642 }
614 state->info->save_buffer = lock_info.save_buffer; 643 state->info->save_buffer = lock_info.save_buffer;
615 state->info->save_size = lock_info.save_size; 644 state->info->save_size = lock_info.save_size;
616 state->info->save_mask = lock_info.save_mask; 645 state->info->save_mask = lock_info.save_mask;
617 state->info->save_page_size = lock_info.save_page_size; 646 state->info->nor = lock_info.nor;
618 state->info->save_product_id = lock_info.save_product_id;
619 state->info->save_type = lock_info.save_type; 647 state->info->save_type = lock_info.save_type;
620 state->info->save_bus = lock_info.save_bus; 648 state->info->save_bus = lock_info.save_bus;
621 lock_info.save_buffer = NULL; 649 lock_info.save_buffer = NULL;
622 lock_info.save_type = SAVE_NONE; 650 lock_info.save_type = SAVE_NONE;
623 } 651 }
663 691
664 map->write_16 = nor_flash_write_w; 692 map->write_16 = nor_flash_write_w;
665 map->write_8 = nor_flash_write_b; 693 map->write_8 = nor_flash_write_b;
666 map->read_16 = nor_flash_read_w; 694 map->read_16 = nor_flash_read_w;
667 map->read_8 = nor_flash_read_b; 695 map->read_8 = nor_flash_read_b;
696 if (state->info->save_bus == RAM_FLAG_BOTH) {
697 map->flags |= MMAP_READ_CODE | MMAP_CODE;
698 map->buffer = state->info->save_buffer;
699 }
668 map->mask = 0xFFFFFF; 700 map->mask = 0xFFFFFF;
669 } else if (!strcmp(dtype, "Sega mapper")) { 701 } else if (!strcmp(dtype, "Sega mapper")) {
670 state->info->mapper_type = MAPPER_SEGA; 702 state->info->mapper_type = MAPPER_SEGA;
671 state->info->mapper_start_index = state->ptr_index++; 703 state->info->mapper_start_index = state->ptr_index++;
672 char *variant = tern_find_ptr_default(node, "variant", "full"); 704 char *variant = tern_find_ptr_default(node, "variant", "full");
775 map->start = 0xA13000; 807 map->start = 0xA13000;
776 map->end = 0xA13100; 808 map->end = 0xA13100;
777 map->mask = 0xFF; 809 map->mask = 0xFF;
778 map->write_16 = write_multi_game_w; 810 map->write_16 = write_multi_game_w;
779 map->write_8 = write_multi_game_b; 811 map->write_8 = write_multi_game_b;
812 } else if (!strcmp(dtype, "megawifi")) {
813 if (!strcmp(
814 "on",
815 tern_find_path_default(config, "system\0megawifi\0", (tern_val){.ptrval="off"}, TVAL_PTR).ptrval)
816 ) {
817 map->write_16 = megawifi_write_w;
818 map->write_8 = megawifi_write_b;
819 map->read_16 = megawifi_read_w;
820 map->read_8 = megawifi_read_b;
821 map->mask = 0xFFFFFF;
822 } else {
823 warning("ROM uses MegaWiFi, but it is disabled\n");
824 return;
825 }
826 } else if (!strcmp(dtype, "jcart")) {
827 state->info->mapper_type = MAPPER_JCART;
828 map->write_16 = jcart_write_w;
829 map->write_8 = jcart_write_b;
830 map->read_16 = jcart_read_w;
831 map->read_8 = jcart_read_b;
832 map->mask = 0xFFFFFF;
780 } else { 833 } else {
781 fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key); 834 fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key);
782 } 835 }
783 state->index++; 836 state->index++;
784 } 837 }