Mercurial > repos > blastem
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 } |