Mercurial > repos > blastem
diff genesis.c @ 2281:b9fed07f19e4
Implement BRAM cart support
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 08 Jan 2023 23:30:28 -0800 |
parents | 9ead0fe69d9b |
children | 5d3411f52d00 |
line wrap: on
line diff
--- a/genesis.c Sun Jan 08 14:42:24 2023 -0800 +++ b/genesis.c Sun Jan 08 23:30:28 2023 -0800 @@ -1542,6 +1542,17 @@ printf("Saved internal BRAM to %s\n", bram_name); } free(bram_name); + if (cd->bram_cart_id < 8) { + bram_name = path_append(system->save_dir, "cart.bram"); + f = fopen(bram_name, "wb"); + if (f) { + long configured_size = 0x2000 << cd->bram_cart_id; + fwrite(cd->bram_cart, 1, configured_size, f); + fclose(f); + printf("Saved BRAM cart to %s\n", bram_name); + } + free(bram_name); + } } if (gen->save_type == SAVE_NONE) { return; @@ -1588,6 +1599,31 @@ } } free(bram_name); + bram_name = path_append(system->save_dir, "cart.bram"); + f = fopen(bram_name, "rb"); + 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); + cd->bram_cart = calloc(existing_size, 1); + } + cd->bram_cart_id = 0; + while (existing_size > (0x2000 <<cd->bram_cart_id)) { + cd->bram_cart_id++; + } + } + uint32_t read = fread(cd->bram_cart, 1, existing_size, f); + fclose(f); + if (read > 0) { + printf("Loaded BRAM cart from %s\n", bram_name); + } + } + free(bram_name); } }