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