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