From ff238c672d2f623363169f7ea6a3f292bbb24543 Mon Sep 17 00:00:00 2001 From: Michael Pavone Date: Tue, 8 Dec 2015 19:33:58 -0800 Subject: Allow IO device config to be overriden by ROM DB --- blastem.c | 2 +- io.c | 16 ++++++++-------- io.h | 3 ++- rom.db | 5 +++++ romdb.c | 10 ++++++++++ romdb.h | 3 +++ 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 #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; -- cgit v1.2.3