Mercurial > repos > blastem
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; |