comparison blastem.c @ 1412:909c72c4e5a1

Load SRAM/EEPROM from lock-on cart directory if the lock-on cart is the one with the save device
author Michael Pavone <pavone@retrodev.com>
date Thu, 22 Jun 2017 19:36:51 -0700
parents 458df351af06
children 9a3e003bdcb3
comparison
equal deleted inserted replaced
1411:780fbe0b97be 1412:909c72c4e5a1
135 } 135 }
136 title = alloc_concat(rom_name, " - BlastEm"); 136 title = alloc_concat(rom_name, " - BlastEm");
137 render_update_caption(title); 137 render_update_caption(title);
138 } 138 }
139 139
140 void setup_saves(char *fname, rom_info *info, system_header *context) 140 static char *get_save_dir(system_media *media)
141 { 141 {
142 static uint8_t persist_save_registered;
143 char *savedir_template = tern_find_path(config, "ui\0save_path\0", TVAL_PTR).ptrval; 142 char *savedir_template = tern_find_path(config, "ui\0save_path\0", TVAL_PTR).ptrval;
144 if (!savedir_template) { 143 if (!savedir_template) {
145 savedir_template = "$USERDATA/blastem/$ROMNAME"; 144 savedir_template = "$USERDATA/blastem/$ROMNAME";
146 } 145 }
147 char * barename = basename_no_extension(fname); 146 tern_node *vars = tern_insert_ptr(NULL, "ROMNAME", media->name);
148 tern_node *vars = tern_insert_ptr(NULL, "ROMNAME", barename);
149 vars = tern_insert_ptr(vars, "HOME", get_home_dir()); 147 vars = tern_insert_ptr(vars, "HOME", get_home_dir());
150 vars = tern_insert_ptr(vars, "EXEDIR", get_exe_dir()); 148 vars = tern_insert_ptr(vars, "EXEDIR", get_exe_dir());
151 vars = tern_insert_ptr(vars, "USERDATA", (char *)get_userdata_dir()); 149 vars = tern_insert_ptr(vars, "USERDATA", (char *)get_userdata_dir());
152 char *save_dir = replace_vars(savedir_template, vars, 1); 150 char *save_dir = replace_vars(savedir_template, vars, 1);
153 tern_free(vars); 151 tern_free(vars);
154 if (!ensure_dir_exists(save_dir)) { 152 if (!ensure_dir_exists(save_dir)) {
155 warning("Failed to create save directory %s\n", save_dir); 153 warning("Failed to create save directory %s\n", save_dir);
156 } 154 }
155 return save_dir;
156 }
157
158 void setup_saves(system_media *media, rom_info *info, system_header *context)
159 {
160 static uint8_t persist_save_registered;
161 char *save_dir = get_save_dir(info->is_save_lock_on ? media->chain : media);
157 char const *parts[] = {save_dir, PATH_SEP, info->save_type == SAVE_I2C ? "save.eeprom" : info->save_type == SAVE_NOR ? "save.nor" : "save.sram"}; 162 char const *parts[] = {save_dir, PATH_SEP, info->save_type == SAVE_I2C ? "save.eeprom" : info->save_type == SAVE_NOR ? "save.nor" : "save.sram"};
158 free(save_filename); 163 free(save_filename);
159 save_filename = alloc_concat_m(3, parts); 164 save_filename = alloc_concat_m(3, parts);
165 if (info->is_save_lock_on) {
166 //initial save dir was calculated based on lock-on cartridge because that's where the save device is
167 //save directory used for save states should still be located in the normal place
168 free(save_dir);
169 save_dir = get_save_dir(media);
170 }
160 //TODO: make quick save filename dependent on system type 171 //TODO: make quick save filename dependent on system type
161 parts[2] = "quicksave.gst"; 172 parts[2] = "quicksave.gst";
162 free(save_state_path); 173 free(save_state_path);
163 save_state_path = alloc_concat_m(3, parts); 174 save_state_path = alloc_concat_m(3, parts);
164 context->save_dir = save_dir; 175 context->save_dir = save_dir;
165 free(barename);
166 if (info->save_type != SAVE_NONE) { 176 if (info->save_type != SAVE_NONE) {
167 context->load_save(context); 177 context->load_save(context);
168 if (!persist_save_registered) { 178 if (!persist_save_registered) {
169 atexit(persist_save); 179 atexit(persist_save);
170 persist_save_registered = 1; 180 persist_save_registered = 1;
393 rom_info info; 403 rom_info info;
394 current_system = alloc_config_system(stype, &cart, menu ? 0 : opts, force_region, &info); 404 current_system = alloc_config_system(stype, &cart, menu ? 0 : opts, force_region, &info);
395 if (!current_system) { 405 if (!current_system) {
396 fatal_error("Failed to configure emulated machine for %s\n", romfname); 406 fatal_error("Failed to configure emulated machine for %s\n", romfname);
397 } 407 }
398 setup_saves(romfname, &info, current_system); 408 setup_saves(&cart, &info, current_system);
399 update_title(info.name); 409 update_title(info.name);
400 if (menu) { 410 if (menu) {
401 menu_context = current_system; 411 menu_context = current_system;
402 } else { 412 } else {
403 game_context = current_system; 413 game_context = current_system;
443 if (!game_context) { 453 if (!game_context) {
444 fatal_error("Failed to configure emulated machine for %s\n", next_rom); 454 fatal_error("Failed to configure emulated machine for %s\n", next_rom);
445 } 455 }
446 menu_context->next_context = game_context; 456 menu_context->next_context = game_context;
447 game_context->next_context = menu_context; 457 game_context->next_context = menu_context;
448 setup_saves(next_rom, &info, game_context); 458 setup_saves(&cart, &info, game_context);
449 update_title(info.name); 459 update_title(info.name);
450 free(next_rom); 460 free(next_rom);
451 menu = 0; 461 menu = 0;
452 current_system = game_context; 462 current_system = game_context;
453 current_system->debugger_type = dtype; 463 current_system->debugger_type = dtype;