# HG changeset patch # User Michael Pavone # Date 1643960513 28800 # Node ID 372625dd9590c13818e6898cd9172811ece94482 # Parent 485834c0fea7920ba8e3f7f9a202bf2c4055568f Persist BRAM to file. Load BIOS relative to blastem directory diff -r 485834c0fea7 -r 372625dd9590 bindings.c --- 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) { diff -r 485834c0fea7 -r 372625dd9590 blastem.c --- 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); diff -r 485834c0fea7 -r 372625dd9590 genesis.c --- 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; } diff -r 485834c0fea7 -r 372625dd9590 segacd.c --- 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;