comparison romdb.c @ 1648:b7ecd0d6a77b mame_interp

Merge from default
author Michael Pavone <pavone@retrodev.com>
date Tue, 25 Dec 2018 11:12:26 -0800
parents c206a422d466
children 5dacaef602a7 52a47611a273
comparison
equal deleted inserted replaced
1509:36732f5c2281 1648:b7ecd0d6a77b
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)
47 free(info->name); 50 free(info->name);
48 if (info->save_type != SAVE_NONE) { 51 if (info->save_type != SAVE_NONE) {
49 free(info->save_buffer); 52 free(info->save_buffer);
50 if (info->save_type == SAVE_I2C) { 53 if (info->save_type == SAVE_I2C) {
51 free(info->eeprom_map); 54 free(info->eeprom_map);
55 } else if (info->save_type == SAVE_NOR) {
56 free(info->nor);
52 } 57 }
53 } 58 }
54 free(info->map); 59 free(info->map);
55 free(info->port1_override); 60 free(info->port1_override);
56 free(info->port2_override); 61 free(info->port2_override);
497 } 502 }
498 char *page_size = tern_find_path(state->root, "NOR\0page_size\0", TVAL_PTR).ptrval; 503 char *page_size = tern_find_path(state->root, "NOR\0page_size\0", TVAL_PTR).ptrval;
499 if (!page_size) { 504 if (!page_size) {
500 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); 505 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);
501 } 506 }
502 state->info->save_page_size = atoi(size); 507 uint32_t save_page_size = atoi(page_size);
503 if (!state->info->save_page_size) { 508 if (!save_page_size) {
504 fatal_error("NOR page size %s is invalid\n", size); 509 fatal_error("NOR page size %s is invalid\n", page_size);
505 } 510 }
506 char *product_id = tern_find_path(state->root, "NOR\0product_id\0", TVAL_PTR).ptrval; 511 char *product_id = tern_find_path(state->root, "NOR\0product_id\0", TVAL_PTR).ptrval;
507 if (!product_id) { 512 if (!product_id) {
508 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); 513 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);
509 } 514 }
510 state->info->save_product_id = strtol(product_id, NULL, 16); 515 uint16_t save_product_id = strtol(product_id, NULL, 16);
511 char *bus = tern_find_path(state->root, "NOR\0bus\0", TVAL_PTR).ptrval; 516 char *bus = tern_find_path(state->root, "NOR\0bus\0", TVAL_PTR).ptrval;
512 if (!strcmp(bus, "odd")) { 517 if (!strcmp(bus, "odd")) {
513 state->info->save_bus = RAM_FLAG_ODD; 518 state->info->save_bus = RAM_FLAG_ODD;
514 } else if(!strcmp(bus, "even")) { 519 } else if(!strcmp(bus, "even")) {
515 state->info->save_bus = RAM_FLAG_EVEN; 520 state->info->save_bus = RAM_FLAG_EVEN;
516 } else { 521 } else {
517 state->info->save_bus = RAM_FLAG_BOTH; 522 state->info->save_bus = RAM_FLAG_BOTH;
518 } 523 }
519 state->info->save_type = SAVE_NOR; 524 state->info->save_type = SAVE_NOR;
520 state->info->save_buffer = malloc(state->info->save_size); 525 state->info->save_buffer = malloc(state->info->save_size);
521 memset(state->info->save_buffer, 0xFF, state->info->save_size); 526 char *init = tern_find_path_default(state->root, "NOR\0init\0", (tern_val){.ptrval="FF"}, TVAL_PTR).ptrval;
527 if (!strcmp(init, "ROM")) {
528 uint32_t init_size = state->rom_size > state->info->save_size ? state->info->save_size : state->rom_size;
529 memcpy(state->info->save_buffer, state->rom, init_size);
530 if (state->info->save_bus == RAM_FLAG_BOTH) {
531 byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer);
532 }
533 } else {
534 memset(state->info->save_buffer, strtol(init, NULL, 16), state->info->save_size);
535 }
536 state->info->nor = calloc(1, sizeof(nor_state));
537 nor_flash_init(state->info->nor, state->info->save_buffer, state->info->save_size, save_page_size, save_product_id, state->info->save_bus);
538 char *cmd1 = tern_find_path(state->root, "NOR\0cmd_address1\0", TVAL_PTR).ptrval;
539 if (cmd1) {
540 state->info->nor->cmd_address1 = strtol(cmd1, NULL, 16);
541 }
542 char *cmd2 = tern_find_path(state->root, "NOR\0cmd_address2\0", TVAL_PTR).ptrval;
543 if (cmd2) {
544 state->info->nor->cmd_address2 = strtol(cmd2, NULL, 16);
545 }
522 } 546 }
523 } 547 }
524 548
525 void add_eeprom_map(tern_node *node, uint32_t start, uint32_t end, map_iter_state *state) 549 void add_eeprom_map(tern_node *node, uint32_t start, uint32_t end, map_iter_state *state)
526 { 550 {
583 matching_chunks++; 607 matching_chunks++;
584 } 608 }
585 } 609 }
586 if (matching_chunks == 0) { 610 if (matching_chunks == 0) {
587 //Nothing mapped in the relevant range for the lock-on cart, ignore this mapping 611 //Nothing mapped in the relevant range for the lock-on cart, ignore this mapping
612 free_rom_info(&lock_info);
588 return; 613 return;
589 } else if (matching_chunks > 1) { 614 } else if (matching_chunks > 1) {
590 state->info->map_chunks += matching_chunks - 1; 615 state->info->map_chunks += matching_chunks - 1;
591 state->info->map = realloc(state->info->map, sizeof(memmap_chunk) * state->info->map_chunks); 616 state->info->map = realloc(state->info->map, sizeof(memmap_chunk) * state->info->map_chunks);
592 memset(state->info->map + state->info->map_chunks - (matching_chunks - 1), 0, sizeof(memmap_chunk) * (matching_chunks - 1)); 617 memset(state->info->map + state->info->map_chunks - (matching_chunks - 1), 0, sizeof(memmap_chunk) * (matching_chunks - 1));
613 state->info->is_save_lock_on = 1; 638 state->info->is_save_lock_on = 1;
614 } 639 }
615 state->info->save_buffer = lock_info.save_buffer; 640 state->info->save_buffer = lock_info.save_buffer;
616 state->info->save_size = lock_info.save_size; 641 state->info->save_size = lock_info.save_size;
617 state->info->save_mask = lock_info.save_mask; 642 state->info->save_mask = lock_info.save_mask;
618 state->info->save_page_size = lock_info.save_page_size; 643 state->info->nor = lock_info.nor;
619 state->info->save_product_id = lock_info.save_product_id;
620 state->info->save_type = lock_info.save_type; 644 state->info->save_type = lock_info.save_type;
621 state->info->save_bus = lock_info.save_bus; 645 state->info->save_bus = lock_info.save_bus;
622 lock_info.save_buffer = NULL; 646 lock_info.save_buffer = NULL;
623 lock_info.save_type = SAVE_NONE; 647 lock_info.save_type = SAVE_NONE;
624 } 648 }
664 688
665 map->write_16 = nor_flash_write_w; 689 map->write_16 = nor_flash_write_w;
666 map->write_8 = nor_flash_write_b; 690 map->write_8 = nor_flash_write_b;
667 map->read_16 = nor_flash_read_w; 691 map->read_16 = nor_flash_read_w;
668 map->read_8 = nor_flash_read_b; 692 map->read_8 = nor_flash_read_b;
693 if (state->info->save_bus == RAM_FLAG_BOTH) {
694 map->flags |= MMAP_READ_CODE | MMAP_CODE;
695 map->buffer = state->info->save_buffer;
696 }
669 map->mask = 0xFFFFFF; 697 map->mask = 0xFFFFFF;
670 } else if (!strcmp(dtype, "Sega mapper")) { 698 } else if (!strcmp(dtype, "Sega mapper")) {
671 state->info->mapper_type = MAPPER_SEGA; 699 state->info->mapper_type = MAPPER_SEGA;
672 state->info->mapper_start_index = state->ptr_index++; 700 state->info->mapper_start_index = state->ptr_index++;
673 char *variant = tern_find_ptr_default(node, "variant", "full"); 701 char *variant = tern_find_ptr_default(node, "variant", "full");
776 map->start = 0xA13000; 804 map->start = 0xA13000;
777 map->end = 0xA13100; 805 map->end = 0xA13100;
778 map->mask = 0xFF; 806 map->mask = 0xFF;
779 map->write_16 = write_multi_game_w; 807 map->write_16 = write_multi_game_w;
780 map->write_8 = write_multi_game_b; 808 map->write_8 = write_multi_game_b;
809 } else if (!strcmp(dtype, "megawifi")) {
810 if (!strcmp(
811 "on",
812 tern_find_path_default(config, "system\0megawifi\0", (tern_val){.ptrval="off"}, TVAL_PTR).ptrval)
813 ) {
814 map->write_16 = megawifi_write_w;
815 map->write_8 = megawifi_write_b;
816 map->read_16 = megawifi_read_w;
817 map->read_8 = megawifi_read_b;
818 map->mask = 0xFFFFFF;
819 } else {
820 warning("ROM uses MegaWiFi, but it is disabled\n");
821 return;
822 }
823 } else if (!strcmp(dtype, "jcart")) {
824 state->info->mapper_type = MAPPER_JCART;
825 map->write_16 = jcart_write_w;
826 map->write_8 = jcart_write_b;
827 map->read_16 = jcart_read_w;
828 map->read_8 = jcart_read_b;
829 map->mask = 0xFFFFFF;
781 } else { 830 } else {
782 fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key); 831 fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key);
783 } 832 }
784 state->index++; 833 state->index++;
785 } 834 }