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