changeset 2335:c05b7c5e6f11

Automatically format Sega CD backup RAM
author Michael Pavone <pavone@retrodev.com>
date Sat, 26 Aug 2023 20:32:53 -0700
parents 57ebbc1ade30
children 83f5529086c5
files genesis.c segacd.c segacd.h
diffstat 3 files changed, 34 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/genesis.c	Sat Aug 26 19:59:44 2023 -0700
+++ b/genesis.c	Sat Aug 26 20:32:53 2023 -0700
@@ -1607,16 +1607,18 @@
 			if (read > 0) {
 				printf("Loaded internal BRAM from %s\n", bram_name);
 			}
+		} else {
+			segacd_format_bram(cd->bram, 8 * 1024);
 		}
 		free(bram_name);
 		bram_name = path_append(system->save_dir, "cart.bram");
 		f = fopen(bram_name, "rb");
+		long configured_size = 0x2000 << cd->bram_cart_id;
 		if (f) {
 			long existing_size = nearest_pow2(file_size(f));
 			if (existing_size > 1 * 1024 * 1024) {
 				existing_size = 1 * 1024 * 1024;
 			}
-			long configured_size = 0x2000 << cd->bram_cart_id;
 			if (existing_size != configured_size) {
 				if (existing_size > configured_size) {
 					free(cd->bram_cart);
@@ -1632,6 +1634,8 @@
 			if (read > 0) {
 				printf("Loaded BRAM cart from %s\n", bram_name);
 			}
+		} else {
+			segacd_format_bram(cd->bram_cart, configured_size);
 		}
 		free(bram_name);
 	}
--- a/segacd.c	Sat Aug 26 19:59:44 2023 -0700
+++ b/segacd.c	Sat Aug 26 20:32:53 2023 -0700
@@ -1801,3 +1801,31 @@
 	rf5c164_adjust_master_clock(&cd->pcm, new_clock);
 	cdd_fader_set_speed_percent(&cd->fader, percent);
 }
+
+static uint8_t *copy_chars(uint8_t *dst, uint8_t *str)
+{
+	size_t len = strlen(str);
+	memcpy(dst, str, len);
+	return dst + len;
+}
+
+void segacd_format_bram(uint8_t *buffer, size_t size)
+{
+	memset(buffer, 0, size);
+	uint16_t free_blocks = (size / 64) - 3;
+	uint8_t *cur = buffer + size - 0x40;
+	cur = copy_chars(cur, "___________");
+	cur += 4;
+	*(cur++) = 0x40;
+	for (int i = 0; i < 4; i++)
+	{
+		*(cur++) = free_blocks >> 8;
+		*(cur++) = free_blocks;
+	}
+	cur += 8;
+	cur = copy_chars(cur, "SEGA_CD_ROM");
+	++cur;
+	*(cur++) = 1;
+	cur += 3;
+	copy_chars(cur, "RAM_CARTRIDGE___");
+}
--- a/segacd.h	Sat Aug 26 19:59:44 2023 -0700
+++ b/segacd.h	Sat Aug 26 20:32:53 2023 -0700
@@ -66,5 +66,6 @@
 void segacd_set_speed_percent(segacd_context *cd, uint32_t percent);
 void segacd_serialize(segacd_context *cd, serialize_buffer *buf, uint8_t all);
 void segacd_register_section_handlers(segacd_context *cd, deserialize_buffer *buf);
+void segacd_format_bram(uint8_t *buffer, size_t size);
 
 #endif //SEGACD_H_