changeset 913:a5a51465f8b0

Allow IO device config to be overriden by ROM DB
author Michael Pavone <pavone@retrodev.com>
date Tue, 08 Dec 2015 19:33:58 -0800
parents 599e2861f484
children 28ec32e720b2
files blastem.c io.c io.h rom.db romdb.c romdb.h
diffstat 6 files changed, 29 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/blastem.c	Sun Dec 06 19:29:34 2015 -0800
+++ b/blastem.c	Tue Dec 08 19:33:58 2015 -0800
@@ -860,7 +860,7 @@
 	gen->cart = cart;
 	gen->work_ram = ram;
 	gen->zram = z80_ram;
-	setup_io_devices(config, gen->ports);
+	setup_io_devices(config, rom, gen->ports);
 
 	gen->save_type = rom->save_type;
 	gen->save_type = rom->save_type;
--- a/io.c	Sun Dec 06 19:29:34 2015 -0800
+++ b/io.c	Tue Dec 08 19:33:58 2015 -0800
@@ -645,12 +645,12 @@
 	unlink(sockfile_name);
 }
 
-void setup_io_devices(tern_node * config, io_port * ports)
+void setup_io_devices(tern_node * config, rom_info *rom, io_port * ports)
 {
 	tern_node *io_nodes = tern_get_node(tern_find_path(config, "io\0devices\0"));
-	char * io_1 = tern_find_ptr(io_nodes, "1");
-	char * io_2 = tern_find_ptr(io_nodes, "2");
-	char * io_ext = tern_find_ptr(io_nodes, "ext");
+	char * io_1 = rom->port1_override ? rom->port1_override : tern_find_ptr(io_nodes, "1");
+	char * io_2 = rom->port2_override ? rom->port2_override : tern_find_ptr(io_nodes, "2");
+	char * io_ext = rom->ext_override ? rom->ext_override : tern_find_ptr(io_nodes, "ext");
 
 	process_device(io_1, ports);
 	process_device(io_2, ports+1);
@@ -801,7 +801,7 @@
 		bindtype += devicenum-1;
 	}
 	mice[state->mouseidx].buttons[buttonnum].bind_type = bindtype;
-	
+
 }
 
 void process_mouse(char *mousenum, tern_val value, void *data)
@@ -810,7 +810,7 @@
 	tern_node *mousedef = tern_get_node(value);
 	tern_node *padbuttons = buttonmaps[0];
 	tern_node *mousebuttons = buttonmaps[1];
-	
+
 	if (!mousedef) {
 		warning("Binding for mouse %s is a scalar!\n", mousenum);
 		return;
@@ -867,7 +867,7 @@
 	padbuttons = tern_insert_int(padbuttons, ".z", BUTTON_Z);
 	padbuttons = tern_insert_int(padbuttons, ".start", BUTTON_START);
 	padbuttons = tern_insert_int(padbuttons, ".mode", BUTTON_MODE);
-	
+
 	tern_node *mousebuttons = tern_insert_int(NULL, ".left", MOUSE_LEFT);
 	mousebuttons = tern_insert_int(mousebuttons, ".middle", MOUSE_MIDDLE);
 	mousebuttons = tern_insert_int(mousebuttons, ".right", MOUSE_RIGHT);
@@ -1246,7 +1246,7 @@
 				input = 0;
 			}
 		} else {
-			
+
 			int16_t delta_x = port->device.mouse.latched_x - port->device.mouse.last_read_x;
 			int16_t delta_y = port->device.mouse.last_read_y - port->device.mouse.latched_y;
 			switch (port->device.mouse.tr_counter)
--- a/io.h	Sun Dec 06 19:29:34 2015 -0800
+++ b/io.h	Tue Dec 08 19:33:58 2015 -0800
@@ -7,6 +7,7 @@
 #define IO_H_
 #include <stdint.h>
 #include "tern.h"
+#include "romdb.h"
 
 enum {
 	IO_GAMEPAD3,
@@ -69,7 +70,7 @@
 
 void set_keybindings(io_port *ports);
 void map_all_bindings(io_port *ports);
-void setup_io_devices(tern_node * config, io_port * ports);
+void setup_io_devices(tern_node * config, rom_info *rom, io_port * ports);
 void io_adjust_cycles(io_port * pad, uint32_t current_cycle, uint32_t deduction);
 void io_data_write(io_port * pad, uint8_t value, uint32_t current_cycle);
 uint8_t io_data_read(io_port * pad, uint32_t current_cycle);
--- a/rom.db	Sun Dec 06 19:29:34 2015 -0800
+++ b/rom.db	Tue Dec 08 19:33:58 2015 -0800
@@ -370,4 +370,9 @@
 			last 1FFFFF
 		}
 	}
+	device_overrides {
+		1 gamepad3.1
+		2 mouse.1
+		ext none
+	}
 }
--- a/romdb.c	Sun Dec 06 19:29:34 2015 -0800
+++ b/romdb.c	Tue Dec 08 19:33:58 2015 -0800
@@ -551,6 +551,7 @@
 	info.name = get_header_name(rom);
 	info.regions = get_header_regions(rom);
 	add_memmap_header(&info, rom, rom_size, base_map, base_chunks);
+	info.port1_override = info.port2_override = info.ext_override = NULL;
 	return info;
 }
 
@@ -842,5 +843,14 @@
 		add_memmap_header(&info, rom, rom_size, base_map, base_chunks);
 	}
 
+	tern_node *device_overrides = tern_find_ptr(entry, "device_overrides");
+	if (device_overrides) {
+		info.port1_override = tern_find_ptr(device_overrides, "1");
+		info.port2_override = tern_find_ptr(device_overrides, "2");
+		info.ext_override = tern_find_ptr(device_overrides, "ext");
+	} else {
+		info.port1_override = info.port2_override = info.ext_override = NULL;
+	}
+
 	return info;
 }
--- a/romdb.h	Sun Dec 06 19:29:34 2015 -0800
+++ b/romdb.h	Tue Dec 08 19:33:58 2015 -0800
@@ -40,6 +40,9 @@
 	memmap_chunk  *map;
 	uint8_t       *save_buffer;
 	eeprom_map    *eeprom_map;
+	char          *port1_override;
+	char          *port2_override;
+	char          *ext_override;
 	uint32_t      num_eeprom;
 	uint32_t      map_chunks;
 	uint32_t      save_size;