changeset 1472:d2d637dbacfb segacd

Change load_rom into load_media with some interface changes in preparation for CD support
author Michael Pavone <pavone@retrodev.com>
date Sat, 21 Oct 2017 11:51:24 -0700
parents d51230205405
children 2564b6ba2e12
files blastem.c system.h
diffstat 2 files changed, 31 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/blastem.c	Thu Sep 14 09:49:04 2017 -0700
+++ b/blastem.c	Sat Oct 21 11:51:24 2017 -0700
@@ -65,7 +65,7 @@
 	return rom_size;
 }
 
-uint32_t load_rom(char * filename, void **dst, system_type *stype)
+uint32_t load_media(char * filename, system_media *dst, system_type *stype)
 {
 	uint8_t header[10];
 	FILE * f = fopen(filename, "rb");
@@ -78,6 +78,7 @@
 	fseek(f, 0, SEEK_END);
 	long filesize = ftell(f);
 	fseek(f, 0, SEEK_SET);
+	uint32_t ret = 0;
 	if (header[1] == SMD_MAGIC1 && header[8] == SMD_MAGIC2 && header[9] == SMD_MAGIC3) {
 		int i;
 		for (i = 3; i < 8; i++) {
@@ -92,15 +93,22 @@
 			if (stype) {
 				*stype = SYSTEM_GENESIS;
 			}
-			return load_smd_rom(filesize, f, dst);
+			ret = load_smd_rom(filesize, f, &dst->buffer);
 		}
 	}
-	*dst = malloc(nearest_pow2(filesize));
-	if (filesize != fread(*dst, 1, filesize, f)) {
-		fatal_error("Error reading from %s\n", filename);
+	if (!ret) {
+		dst->buffer = malloc(nearest_pow2(filesize));
+		if (filesize != fread(dst->buffer, 1, filesize, f)) {
+			fatal_error("Error reading from %s\n", filename);
+		}
+		ret = filesize;
 	}
+	dst->dir = path_dirname(filename);
+	dst->name = basename_no_extension(filename);
+	dst->extension = path_extension(filename);
+	dst->size = ret;
 	fclose(f);
-	return filesize;
+	return ret;
 }
 
 
@@ -228,10 +236,7 @@
 	free(lock_on.dir);
 	free(lock_on.name);
 	free(lock_on.extension);
-	lock_on.dir = path_dirname(lock_on_path);
-	lock_on.name = basename_no_extension(lock_on_path);
-	lock_on.extension = path_extension(lock_on_path);
-	lock_on.size = load_rom(lock_on_path, &lock_on.buffer, NULL);
+	load_media(lock_on_path, &lock_on, NULL);
 }
 
 int main(int argc, char ** argv)
@@ -333,12 +338,9 @@
 				if (i >= argc) {
 					fatal_error("-o must be followed by a lock on cartridge filename\n");
 				}
-				lock_on.size = load_rom(argv[i], &lock_on.buffer, NULL);
-				if (!lock_on.size) {
+				if (!load_media(argv[i], &lock_on, NULL)) {
 					fatal_error("Failed to load lock on cartridge %s\n", argv[i]);
 				}
-				lock_on.name = basename_no_extension(argv[i]);
-				lock_on.extension = path_extension(argv[i]);
 				cart.chain = &lock_on;
 				break;
 			}
@@ -367,12 +369,9 @@
 				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))) {
+			if (!load_media(argv[i], &cart, 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]);
 			romfname = argv[i];
 			loaded = 1;
 		} else if (width < 0) {
@@ -389,7 +388,7 @@
 			romfname = "menu.bin";
 		}
 		if (is_absolute_path(romfname)) {
-			if (!(cart.size = load_rom(romfname, &cart.buffer, &stype))) {
+			if (!load_media(romfname, &cart, &stype)) {
 				fatal_error("Failed to open UI ROM %s for reading", romfname);
 			}
 		} else {
@@ -402,12 +401,12 @@
 				cart.buffer = realloc(cart.buffer, rom_size);
 				cart.size = rom_size;
 			}
+			cart.dir = path_dirname(romfname);
+			cart.name = basename_no_extension(romfname);
+			cart.extension = path_extension(romfname);
 		}
 		//force system detection, value on command line is only for games not the menu
 		stype = detect_system_type(&cart);
-		cart.dir = path_dirname(romfname);
-		cart.name = basename_no_extension(romfname);
-		cart.extension = path_extension(romfname);
 		loaded = 1;
 	}
 	
@@ -486,15 +485,12 @@
 				//start a new arena and save old one in suspended genesis context
 				current_system->arena = start_new_arena();
 			}
-			if (!(cart.size = load_rom(next_rom, &cart.buffer, &stype))) {
-				fatal_error("Failed to open %s for reading\n", next_rom);
-			}
 			free(cart.dir);
 			free(cart.name);
 			free(cart.extension);
-			cart.dir = path_dirname(next_rom);
-			cart.name = basename_no_extension(next_rom);
-			cart.extension = path_extension(next_rom);
+			if (!load_media(next_rom, &cart, &stype)) {
+				fatal_error("Failed to open %s for reading\n", next_rom);
+			}
 			stype = force_stype;
 			if (stype == SYSTEM_UNKNOWN) {
 				stype = detect_system_type(&cart);
--- a/system.h	Thu Sep 14 09:49:04 2017 -0700
+++ b/system.h	Sat Oct 21 11:51:24 2017 -0700
@@ -8,6 +8,7 @@
 typedef enum {
 	SYSTEM_UNKNOWN,
 	SYSTEM_GENESIS,
+	SYSTEM_SEGACD,
 	SYSTEM_SMS,
 	SYSTEM_JAGUAR
 } system_type;
@@ -51,6 +52,11 @@
 	system_type       type;
 };
 
+typedef enum {
+	MEDIA_CART,
+	MEDIA_CDROM
+} media_type;
+
 struct system_media {
 	void         *buffer;
 	char         *dir;
@@ -58,6 +64,7 @@
 	char         *extension;
 	system_media *chain;
 	uint32_t     size;
+	media_type   type;
 };
 
 #define OPT_ADDRESS_LOG (1U << 31U)