Mercurial > repos > blastem
diff 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 |
line wrap: on
line diff
--- a/romdb.c Mon May 02 18:29:29 2016 -0700 +++ b/romdb.c Mon May 02 21:06:12 2016 -0700 @@ -580,8 +580,10 @@ typedef struct { rom_info *info; uint8_t *rom; + uint8_t *lock_on; tern_node *root; uint32_t rom_size; + uint32_t lock_on_size; int index; int num_els; uint16_t ptr_index; @@ -714,6 +716,14 @@ map->buffer = state->rom + offset; map->flags = MMAP_READ; map->mask = calc_mask(state->rom_size - offset, start, end); + } else if (!strcmp(dtype, "LOCK-ON")) { + if (!state->lock_on) { + //skip this entry if there is no lock on cartridge attached + return; + } + map->buffer = state->lock_on + offset; + map->flags = MMAP_READ; + map->mask = calc_mask(state->lock_on_size - offset, start, end); } else if (!strcmp(dtype, "EEPROM")) { process_eeprom_def(key, state); add_eeprom_map(node, start, end, state); @@ -797,12 +807,12 @@ map->write_16 = menu_write_w; map->read_16 = menu_read_w; } else { - fatal_error("Invalid device type for ROM DB map entry %d with address %s\n", state->index, key); + fatal_error("Invalid device type %s for ROM DB map entry %d with address %s\n", dtype, state->index, key); } state->index++; } -rom_info configure_rom(tern_node *rom_db, void *vrom, uint32_t rom_size, memmap_chunk const *base_map, uint32_t base_chunks) +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) { uint8_t product_id[GAME_ID_LEN+1]; uint8_t *rom = vrom; @@ -855,7 +865,17 @@ info.eeprom_map = NULL; info.num_eeprom = 0; memset(info.map, 0, sizeof(memmap_chunk) * info.map_chunks); - map_iter_state state = {&info, rom, entry, rom_size, 0, info.map_chunks - base_chunks, 0}; + map_iter_state state = { + .info = &info, + .rom = rom, + .lock_on = lock_on, + .root = entry, + .rom_size = rom_size, + .lock_on_size = lock_on_size, + .index = 0, + .num_els = info.map_chunks - base_chunks, + .ptr_index = 0 + }; tern_foreach(map, map_iter_fun, &state); memcpy(info.map + state.index, base_map, sizeof(memmap_chunk) * base_chunks); } else {