summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2015-12-08 19:33:58 -0800
committerMichael Pavone <pavone@retrodev.com>2015-12-08 19:33:58 -0800
commitff238c672d2f623363169f7ea6a3f292bbb24543 (patch)
tree4e868afca564f77e1202e02d905f15cac22ab8d0
parent0da12ea007ff827acf74c489d2f3a95fcf17e6af (diff)
Allow IO device config to be overriden by ROM DB
-rw-r--r--blastem.c2
-rw-r--r--io.c16
-rw-r--r--io.h3
-rw-r--r--rom.db5
-rw-r--r--romdb.c10
-rw-r--r--romdb.h3
6 files changed, 29 insertions, 10 deletions
diff --git a/blastem.c b/blastem.c
index 8e37b22..3f1bffd 100644
--- a/blastem.c
+++ b/blastem.c
@@ -860,7 +860,7 @@ genesis_context *alloc_init_genesis(rom_info *rom, int fps, uint32_t ym_opts)
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;
diff --git a/io.c b/io.c
index 4243a2e..b64da46 100644
--- a/io.c
+++ b/io.c
@@ -645,12 +645,12 @@ static void cleanup_sockfile()
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 @@ void process_mouse_button(char *buttonstr, tern_val value, void *data)
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 @@ void process_mouse(char *mousenum, tern_val value, void *data)
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 @@ void set_keybindings(io_port *ports)
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 @@ uint8_t io_data_read(io_port * port, uint32_t current_cycle)
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)
diff --git a/io.h b/io.h
index 2786477..9ec1b4f 100644
--- a/io.h
+++ b/io.h
@@ -7,6 +7,7 @@
#define IO_H_
#include <stdint.h>
#include "tern.h"
+#include "romdb.h"
enum {
IO_GAMEPAD3,
@@ -69,7 +70,7 @@ enum {
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);
diff --git a/rom.db b/rom.db
index 4e010d4..bfc41ec 100644
--- a/rom.db
+++ b/rom.db
@@ -370,4 +370,9 @@ BlstMenu {
last 1FFFFF
}
}
+ device_overrides {
+ 1 gamepad3.1
+ 2 mouse.1
+ ext none
+ }
}
diff --git a/romdb.c b/romdb.c
index b34c232..fe70eda 100644
--- a/romdb.c
+++ b/romdb.c
@@ -551,6 +551,7 @@ rom_info configure_rom_heuristics(uint8_t *rom, uint32_t rom_size, memmap_chunk
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 @@ rom_info configure_rom(tern_node *rom_db, void *vrom, uint32_t rom_size, memmap_
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;
}
diff --git a/romdb.h b/romdb.h
index e2af1de..e7e484d 100644
--- a/romdb.h
+++ b/romdb.h
@@ -40,6 +40,9 @@ typedef struct {
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;