# HG changeset patch # User Michael Pavone # Date 1693107173 25200 # Node ID c05b7c5e6f111faa91ff73d76e57fafdbe6b2d4c # Parent 57ebbc1ade30008ef13be512112d2913e0ce01f0 Automatically format Sega CD backup RAM diff -r 57ebbc1ade30 -r c05b7c5e6f11 genesis.c --- 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); } diff -r 57ebbc1ade30 -r c05b7c5e6f11 segacd.c --- 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___"); +} diff -r 57ebbc1ade30 -r c05b7c5e6f11 segacd.h --- 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_