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 {