comparison romdb.c @ 1016:5fb64487b6e1

Very basic support for S&K lock-on. Needs more work for full functionality.
author Michael Pavone <pavone@retrodev.com>
date Mon, 02 May 2016 21:06:12 -0700
parents 9ab35686a025
children 219de1d64aa1
comparison
equal deleted inserted replaced
1015:6c54d5a5c7c0 1016:5fb64487b6e1
578 } 578 }
579 579
580 typedef struct { 580 typedef struct {
581 rom_info *info; 581 rom_info *info;
582 uint8_t *rom; 582 uint8_t *rom;
583 uint8_t *lock_on;
583 tern_node *root; 584 tern_node *root;
584 uint32_t rom_size; 585 uint32_t rom_size;
586 uint32_t lock_on_size;
585 int index; 587 int index;
586 int num_els; 588 int num_els;
587 uint16_t ptr_index; 589 uint16_t ptr_index;
588 } map_iter_state; 590 } map_iter_state;
589 591
712 map->end = end + 1; 714 map->end = end + 1;
713 if (!strcmp(dtype, "ROM")) { 715 if (!strcmp(dtype, "ROM")) {
714 map->buffer = state->rom + offset; 716 map->buffer = state->rom + offset;
715 map->flags = MMAP_READ; 717 map->flags = MMAP_READ;
716 map->mask = calc_mask(state->rom_size - offset, start, end); 718 map->mask = calc_mask(state->rom_size - offset, start, end);
719 } else if (!strcmp(dtype, "LOCK-ON")) {
720 if (!state->lock_on) {
721 //skip this entry if there is no lock on cartridge attached
722 return;
723 }
724 map->buffer = state->lock_on + offset;
725 map->flags = MMAP_READ;
726 map->mask = calc_mask(state->lock_on_size - offset, start, end);
717 } else if (!strcmp(dtype, "EEPROM")) { 727 } else if (!strcmp(dtype, "EEPROM")) {
718 process_eeprom_def(key, state); 728 process_eeprom_def(key, state);
719 add_eeprom_map(node, start, end, state); 729 add_eeprom_map(node, start, end, state);
720 730
721 map->write_16 = write_eeprom_i2c_w; 731 map->write_16 = write_eeprom_i2c_w;
795 map->buffer = NULL; 805 map->buffer = NULL;
796 map->mask = 0xFF; 806 map->mask = 0xFF;
797 map->write_16 = menu_write_w; 807 map->write_16 = menu_write_w;
798 map->read_16 = menu_read_w; 808 map->read_16 = menu_read_w;
799 } else { 809 } else {
800 fatal_error("Invalid device type for ROM DB map entry %d with address %s\n", state->index, key); 810 fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key);
801 } 811 }
802 state->index++; 812 state->index++;
803 } 813 }
804 814
805 rom_info configure_rom(tern_node *rom_db, void *vrom, uint32_t rom_size, memmap_chunk const *base_map, uint32_t base_chunks) 815 rom_info configure_rom(tern_node *rom_db, void *vrom, uint32_t rom_size, void *lock_on, uint32_t lock_on_size, memmap_chunk const *base_map, uint32_t base_chunks)
806 { 816 {
807 uint8_t product_id[GAME_ID_LEN+1]; 817 uint8_t product_id[GAME_ID_LEN+1];
808 uint8_t *rom = vrom; 818 uint8_t *rom = vrom;
809 product_id[GAME_ID_LEN] = 0; 819 product_id[GAME_ID_LEN] = 0;
810 for (int i = 0; i < GAME_ID_LEN; i++) 820 for (int i = 0; i < GAME_ID_LEN; i++)
853 info.save_size = 0; 863 info.save_size = 0;
854 info.map = malloc(sizeof(memmap_chunk) * info.map_chunks); 864 info.map = malloc(sizeof(memmap_chunk) * info.map_chunks);
855 info.eeprom_map = NULL; 865 info.eeprom_map = NULL;
856 info.num_eeprom = 0; 866 info.num_eeprom = 0;
857 memset(info.map, 0, sizeof(memmap_chunk) * info.map_chunks); 867 memset(info.map, 0, sizeof(memmap_chunk) * info.map_chunks);
858 map_iter_state state = {&info, rom, entry, rom_size, 0, info.map_chunks - base_chunks, 0}; 868 map_iter_state state = {
869 .info = &info,
870 .rom = rom,
871 .lock_on = lock_on,
872 .root = entry,
873 .rom_size = rom_size,
874 .lock_on_size = lock_on_size,
875 .index = 0,
876 .num_els = info.map_chunks - base_chunks,
877 .ptr_index = 0
878 };
859 tern_foreach(map, map_iter_fun, &state); 879 tern_foreach(map, map_iter_fun, &state);
860 memcpy(info.map + state.index, base_map, sizeof(memmap_chunk) * base_chunks); 880 memcpy(info.map + state.index, base_map, sizeof(memmap_chunk) * base_chunks);
861 } else { 881 } else {
862 add_memmap_header(&info, rom, rom_size, base_map, base_chunks); 882 add_memmap_header(&info, rom, rom_size, base_map, base_chunks);
863 } 883 }