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);
 		}