comparison blastem.c @ 955:229c23b3ab73

Switch to storing SRAM/EEPROM and save states in a per-game directory rather than next to the ROM (for SRAM/EEPROM) or in the current working directory (for save states)
author Michael Pavone <pavone@retrodev.com>
date Fri, 15 Apr 2016 18:29:39 -0700
parents 08346262990b
children f5550cdffe49
comparison
equal deleted inserted replaced
954:cbc5b39e5518 955:229c23b3ab73
190 v_context->regs[REG_MODE_2] & 0x20, v_context->regs[REG_MODE_1] & 0x10, v_context->hint_counter, v_context->regs[REG_HINT], v_context->cycles / MCLKS_LINE);*/ 190 v_context->regs[REG_MODE_2] & 0x20, v_context->regs[REG_MODE_1] & 0x10, v_context->hint_counter, v_context->regs[REG_HINT], v_context->cycles / MCLKS_LINE);*/
191 } 191 }
192 192
193 int break_on_sync = 0; 193 int break_on_sync = 0;
194 int save_state = 0; 194 int save_state = 0;
195 char *save_state_path;
195 196
196 //#define DO_DEBUG_PRINT 197 //#define DO_DEBUG_PRINT
197 #ifdef DO_DEBUG_PRINT 198 #ifdef DO_DEBUG_PRINT
198 #define dprintf printf 199 #define dprintf printf
199 #define dputs puts 200 #define dputs puts
307 //advance Z80 core to the start of an instruction 308 //advance Z80 core to the start of an instruction
308 while (!z_context->pc) 309 while (!z_context->pc)
309 { 310 {
310 sync_z80(z_context, z_context->current_cycle + MCLKS_PER_Z80); 311 sync_z80(z_context, z_context->current_cycle + MCLKS_PER_Z80);
311 } 312 }
312 save_gst(gen, "savestate.gst", address); 313 save_gst(gen, save_state_path, address);
313 puts("Saved state to savestate.gst"); 314 printf("Saved state to %s\n", save_state_path);
314 } else if(save_state) { 315 } else if(save_state) {
315 context->sync_cycle = context->current_cycle + 1; 316 context->sync_cycle = context->current_cycle + 1;
316 } 317 }
317 } 318 }
318 last_sync_cycle = context->current_cycle; 319 last_sync_cycle = context->current_cycle;
972 } else { 973 } else {
973 version_reg = NO_DISK | USA; 974 version_reg = NO_DISK | USA;
974 } 975 }
975 } 976 }
976 977
978 void setup_saves(char *fname, rom_info *info)
979 {
980 char * barename = basename_no_extension(fname);
981 char const * parts[3] = {get_save_dir(), "/", barename};
982 char *save_dir = alloc_concat_m(3, parts);
983 if (!ensure_dir_exists(save_dir)) {
984 warning("Failed to create save directory %s\n", save_dir);
985 }
986 parts[0] = save_dir;
987 parts[2] = info->save_type == SAVE_I2C ? "save.eeprom" : "save.sram";
988 free(save_filename);
989 save_filename = alloc_concat_m(3, parts);
990 parts[2] = "quicksave.gst";
991 free(save_state_path);
992 save_state_path = alloc_concat_m(3, parts);
993 info->save_dir = save_dir;
994 free(barename);
995 }
996
977 int main(int argc, char ** argv) 997 int main(int argc, char ** argv)
978 { 998 {
979 set_exe_str(argv[0]); 999 set_exe_str(argv[0]);
980 config = load_config(); 1000 config = load_config();
981 int width = -1; 1001 int width = -1;
1148 fps = 50; 1168 fps = 50;
1149 } 1169 }
1150 if (!headless) { 1170 if (!headless) {
1151 render_init(width, height, title, fps, fullscreen); 1171 render_init(width, height, title, fps, fullscreen);
1152 } 1172 }
1153 int fname_size = strlen(romfname); 1173 setup_saves(romfname, &info);
1154 char * ext = info.save_type == SAVE_I2C ? "eeprom" : "sram";
1155 save_filename = malloc(fname_size+strlen(ext) + 2);
1156 memcpy(save_filename, romfname, fname_size);
1157 int i;
1158 for (i = fname_size-1; fname_size >= 0; --i) {
1159 if (save_filename[i] == '.') {
1160 strcpy(save_filename + i + 1, ext);
1161 break;
1162 }
1163 }
1164 if (i < 0) {
1165 save_filename[fname_size] = '.';
1166 strcpy(save_filename + fname_size + 1, ext);
1167 }
1168 1174
1169 genesis = alloc_init_genesis(&info, fps, (ym_log && !menu) ? YM_OPT_WAVE_LOG : 0); 1175 genesis = alloc_init_genesis(&info, fps, (ym_log && !menu) ? YM_OPT_WAVE_LOG : 0);
1170 if (menu) { 1176 if (menu) {
1171 menu_context = genesis; 1177 menu_context = genesis;
1172 } else { 1178 } else {
1187 genesis = game_context; 1193 genesis = game_context;
1188 persist_save(); 1194 persist_save();
1189 genesis = menu_context; 1195 genesis = menu_context;
1190 } 1196 }
1191 free(game_context->cart); 1197 free(game_context->cart);
1192 free(save_filename); 1198 free(info.save_dir);
1193 base_map[0].buffer = ram = game_context->work_ram; 1199 base_map[0].buffer = ram = game_context->work_ram;
1194 } else { 1200 } else {
1195 base_map[0].buffer = ram = malloc(RAM_WORDS * sizeof(uint16_t)); 1201 base_map[0].buffer = ram = malloc(RAM_WORDS * sizeof(uint16_t));
1196 } 1202 }
1197 memset(ram, 0, RAM_WORDS * sizeof(uint16_t)); 1203 memset(ram, 0, RAM_WORDS * sizeof(uint16_t));
1200 } 1206 }
1201 info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0])); 1207 info = configure_rom(rom_db, cart, rom_size, base_map, sizeof(base_map)/sizeof(base_map[0]));
1202 byteswap_rom(rom_size); 1208 byteswap_rom(rom_size);
1203 set_region(&info, force_version); 1209 set_region(&info, force_version);
1204 update_title(info.name); 1210 update_title(info.name);
1205 fname_size = strlen(menu_context->next_rom); 1211 setup_saves(menu_context->next_rom, &info);
1206 ext = info.save_type == SAVE_I2C ? "eeprom" : "sram";
1207 save_filename = malloc(fname_size+strlen(ext) + 2);
1208 memcpy(save_filename, menu_context->next_rom, fname_size);
1209 for (i = fname_size-1; fname_size >= 0; --i) {
1210 if (save_filename[i] == '.') {
1211 strcpy(save_filename + i + 1, ext);
1212 break;
1213 }
1214 }
1215 if (i < 0) {
1216 save_filename[fname_size] = '.';
1217 strcpy(save_filename + fname_size + 1, ext);
1218 }
1219 if (!game_context) { 1212 if (!game_context) {
1220 //start a new arena and save old one in suspended genesis context 1213 //start a new arena and save old one in suspended genesis context
1221 genesis->arena = start_new_arena(); 1214 genesis->arena = start_new_arena();
1222 } else { 1215 } else {
1223 genesis->arena = set_current_arena(game_context->arena); 1216 genesis->arena = set_current_arena(game_context->arena);