changeset 2083:372625dd9590

Persist BRAM to file. Load BIOS relative to blastem directory
author Michael Pavone <pavone@retrodev.com>
date Thu, 03 Feb 2022 23:41:53 -0800
parents 485834c0fea7
children c9d3b8e1ea56
files bindings.c blastem.c genesis.c segacd.c
diffstat 4 files changed, 45 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/bindings.c	Thu Feb 03 23:41:40 2022 -0800
+++ b/bindings.c	Thu Feb 03 23:41:53 2022 -0800
@@ -422,13 +422,13 @@
 			}
 #endif
 			break;
-		case UI_PLANE_DEBUG: 
-		case UI_VRAM_DEBUG: 
+		case UI_PLANE_DEBUG:
+		case UI_VRAM_DEBUG:
 		case UI_CRAM_DEBUG:
 		case UI_COMPOSITE_DEBUG:
 			if (allow_content_binds) {
 				vdp_context *vdp = NULL;
-				if (current_system->type == SYSTEM_GENESIS) {
+				if (current_system->type == SYSTEM_GENESIS || current_system->type == SYSTEM_SEGACD) {
 					genesis_context *gen = (genesis_context *)current_system;
 					vdp = gen->vdp;
 				} else if (current_system->type == SYSTEM_SMS) {
@@ -533,7 +533,7 @@
 				float scale_y = (render_emulated_height() * 2.0f) / ((float)render_height());
 				int32_t adj_x = x * scale_x + 2 * render_overscan_left() - 2 * BORDER_LEFT;
 				int32_t adj_y = y * scale_y + 2 * render_overscan_top() - 4;
-				
+
 				current_system->mouse_motion_absolute(current_system, target_mouse, adj_x, adj_y);
 			}
 			break;
@@ -1090,11 +1090,11 @@
 	tern_node *padbuttons = get_pad_buttons();
 
 	tern_node *mousebuttons = get_mouse_buttons();
-	
+
 	tern_node * keys = tern_find_path(config, "bindings\0keys\0", TVAL_NODE).ptrval;
 	process_keys(keys, special, padbuttons, mousebuttons, NULL);
 	tern_free(special);
-	
+
 	memset(mice, 0, sizeof(mice));
 	tern_node * mice = tern_find_path(config, "bindings\0mice\0", TVAL_NODE).ptrval;
 	if (mice) {
--- a/blastem.c	Thu Feb 03 23:41:40 2022 -0800
+++ b/blastem.c	Thu Feb 03 23:41:53 2022 -0800
@@ -332,7 +332,9 @@
 	free(save_state_path);
 	save_state_path = alloc_concat_m(3, parts);
 	context->save_dir = save_dir;
-	if (info->save_type != SAVE_NONE) {
+	if (info->save_type != SAVE_NONE || context->type == SYSTEM_SEGACD
+		|| (context->type == SYSTEM_GENESIS && info->wants_cd)
+	) {
 		context->load_save(context);
 		if (!persist_save_registered) {
 			atexit(persist_save);
--- a/genesis.c	Thu Feb 03 23:41:40 2022 -0800
+++ b/genesis.c	Thu Feb 03 23:41:53 2022 -0800
@@ -21,6 +21,7 @@
 #include "jcart.h"
 #include "config.h"
 #include "event_log.h"
+#include "paths.h"
 #define MCLKS_NTSC 53693175
 #define MCLKS_PAL  53203395
 
@@ -1473,10 +1474,22 @@
 static void persist_save(system_header *system)
 {
 	genesis_context *gen = (genesis_context *)system;
+	FILE *f;
+	if (gen->expansion) {
+		segacd_context *cd = gen->expansion;
+		char *bram_name = path_append(system->save_dir, "internal.bram");
+		f = fopen(bram_name, "wb");
+		if (f) {
+			fwrite(cd->bram, 1, 8 * 1024, f);
+			fclose(f);
+			printf("Saved internal BRAM to %s\n", bram_name);
+		}
+		free(bram_name);
+	}
 	if (gen->save_type == SAVE_NONE) {
 		return;
 	}
-	FILE * f = fopen(save_filename, "wb");
+	f = fopen(save_filename, "wb");
 	if (!f) {
 		fprintf(stderr, "Failed to open %s file %s for writing\n", save_type_name(gen->save_type), save_filename);
 		return;
@@ -1506,6 +1519,19 @@
 			printf("Loaded %s from %s\n", save_type_name(gen->save_type), save_filename);
 		}
 	}
+	if (gen->expansion) {
+		segacd_context *cd = gen->expansion;
+		char *bram_name = path_append(system->save_dir, "internal.bram");
+		f = fopen(bram_name, "rb");
+		if (f) {
+			uint32_t read = fread(cd->bram, 1, 8 * 1024, f);
+			fclose(f);
+			if (read > 0) {
+				printf("Loaded internal BRAM from %s\n", bram_name);
+			}
+		}
+		free(bram_name);
+	}
 }
 
 static void soft_reset(system_header *system)
@@ -2204,5 +2230,6 @@
 			gen->m68k->mem_pointers[map[i].ptr_index] = map[i].buffer;
 		}
 	}
+	gen->header.type = SYSTEM_SEGACD;
 	return gen;
 }
--- a/segacd.c	Thu Feb 03 23:41:40 2022 -0800
+++ b/segacd.c	Thu Feb 03 23:41:53 2022 -0800
@@ -1143,15 +1143,11 @@
 	};
 
 	segacd_context *cd = calloc(sizeof(segacd_context), 1);
-	FILE *f = fopen("cdbios.bin", "rb");
-	if (!f) {
-		fatal_error("Failed to open CD firmware for reading");
-	}
-	long firmware_size = file_size(f);
+	uint32_t firmware_size;
+	cd->rom = (uint16_t *)read_bundled_file("cdbios.bin", &firmware_size);
 	uint32_t adjusted_size = nearest_pow2(firmware_size);
-	cd->rom = malloc(adjusted_size);
-	if (firmware_size != fread(cd->rom, 1, firmware_size, f)) {
-		fatal_error("Failed to read CD firmware");
+	if (adjusted_size != firmware_size) {
+		cd->rom = realloc(cd->rom, adjusted_size);
 	}
 	cd->rom_mut = malloc(adjusted_size);
 	byteswap_rom(adjusted_size, cd->rom);
@@ -1162,11 +1158,11 @@
 	//tern_node *db = get_rom_db();
 	//*info = configure_rom(db, media->buffer, media->size, media->chain ? media->chain->buffer : NULL, media->chain ? media->chain->size : 0, NULL, 0);
 
-	cd->prog_ram = malloc(512*1024);
-	cd->word_ram = malloc(256*1024);
-	cd->pcm_ram = malloc(64*1024);
+	cd->prog_ram = calloc(512*1024, 1);
+	cd->word_ram = calloc(256*1024, 1);
+	cd->pcm_ram = calloc(64*1024, 1);
 	//TODO: Load state from file
-	cd->bram = malloc(8*1024);
+	cd->bram = calloc(8*1024, 1);
 
 
 	sub_cpu_map[0].buffer = sub_cpu_map[1].buffer = cd->prog_ram;