Mercurial > repos > blastem
diff blastem.c @ 1946:c3c62dbf1ceb
WIP netplay support
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 29 Apr 2020 01:00:57 -0700 |
parents | b387f1c5a1d0 |
children | 42c12d141f6e |
line wrap: on
line diff
--- a/blastem.c Wed Apr 29 01:00:15 2020 -0700 +++ b/blastem.c Wed Apr 29 01:00:57 2020 -0700 @@ -30,6 +30,7 @@ #include "bindings.h" #include "menu.h" #include "zip.h" +#include "event_log.h" #ifndef DISABLE_NUKLEAR #include "nuklear_ui/blastem_nuklear.h" #endif @@ -430,6 +431,23 @@ update_title(game_system->info.name); } +char *parse_addr_port(char *arg) +{ + while (*arg && *arg != ':') { + ++arg; + } + if (!*arg) { + return NULL; + } + char *end; + int port = strtol(arg + 1, &end, 10); + if (port && !*end) { + *arg = 0; + return arg + 1; + } + return NULL; +} + int main(int argc, char ** argv) { set_exe_str(argv[0]); @@ -441,10 +459,12 @@ system_type stype = SYSTEM_UNKNOWN, force_stype = SYSTEM_UNKNOWN; char * romfname = NULL; char * statefile = NULL; + event_reader reader = {0}; debugger_type dtype = DEBUGGER_NATIVE; uint8_t start_in_debugger = 0; uint8_t fullscreen = FULLSCREEN_DEFAULT, use_gl = 1; uint8_t debug_target = 0; + char *port; for (int i = 1; i < argc; i++) { if (argv[i][0] == '-') { switch(argv[i][1]) { @@ -468,6 +488,18 @@ dtype = DEBUGGER_GDB; start_in_debugger = 1; break; + case 'e': + i++; + if (i >= argc) { + fatal_error("-e must be followed by a file name\n"); + } + port = parse_addr_port(argv[i]); + if (port) { + event_log_tcp(argv[i], port); + } else { + event_log_file(argv[i]); + } + break; case 'f': fullscreen = !fullscreen; break; @@ -555,18 +587,24 @@ " -v Display version number and exit\n" " -l Log 68K code addresses (useful for assemblers)\n" " -y Log individual YM-2612 channels to WAVE files\n" + " -e FILE Write hardware event log to FILE\n" ); return 0; default: fatal_error("Unrecognized switch %s\n", argv[i]); } } else if (!loaded) { - if (!(cart.size = load_rom(argv[i], &cart.buffer, stype == SYSTEM_UNKNOWN ? &stype : NULL))) { - fatal_error("Failed to open %s for reading\n", argv[i]); + char *port = parse_addr_port(argv[i]); + if (port) { + init_event_reader_tcp(&reader, argv[i], port); + } else { + if (!(cart.size = load_rom(argv[i], &cart.buffer, stype == SYSTEM_UNKNOWN ? &stype : NULL))) { + fatal_error("Failed to open %s for reading\n", argv[i]); + } + cart.dir = path_dirname(argv[i]); + cart.name = basename_no_extension(argv[i]); + cart.extension = path_extension(argv[i]); } - cart.dir = path_dirname(argv[i]); - cart.name = basename_no_extension(argv[i]); - cart.extension = path_extension(argv[i]); romfname = argv[i]; loaded = 1; } else if (width < 0) { @@ -645,13 +683,22 @@ } if (loaded) { - if (stype == SYSTEM_UNKNOWN) { - stype = detect_system_type(&cart); + if (stype == SYSTEM_UNKNOWN || reader.socket) { + if (reader.socket) { + stype = reader_system_type(&reader); + } else { + stype = detect_system_type(&cart); + } } if (stype == SYSTEM_UNKNOWN) { fatal_error("Failed to detect system type for %s\n", romfname); } - current_system = alloc_config_system(stype, &cart, menu ? 0 : opts, force_region); + + if (reader.socket) { + current_system = alloc_config_player(stype, &reader); + } else { + current_system = alloc_config_system(stype, &cart, menu ? 0 : opts, force_region); + } if (!current_system) { fatal_error("Failed to configure emulated machine for %s\n", romfname); }