void save_config(char * path) { char tmp[PATH_MAX]; if(!rom_get_loaded()) { return; } else { if(rom_has_battery()) { save_sram(get_sram(), rom_get_info()->ram_size,SramPath); } } memcpy(setting.custom_palette,m_pal16[PAL_CUSTOM_LOCAL], sizeof(word)*3*4); //__android_log_print(ANDROID_LOG_DEBUG, "org.rin", "path in save_config: %s",path); int i; for(i=0; i<sizeof(SETTING); i++){ if ( *((byte*)&setting+i) != *((byte*)&tmpsetting+i) ) break; } if (i>=sizeof(SETTING)) return; jfile fd = jfopen(env_game_thread, path, JF_MODE_NEW | JF_MODE_OVERWRITE | JF_MODE_WRITE, NULL, 0); if(!fd) { return; } jfwrite(env_game_thread, fd, &setting, sizeof(setting)); jfclose(env_game_thread, fd); tmpsetting = setting; }
int state_save(char* path) { size_t size = gb_save_state(NULL); byte *buf = (byte*)malloc(size); if (!buf) { return 0; } gb_save_state(buf); jfile fd = jfopen(env_game_thread, path, JF_MODE_WRITE | JF_MODE_OVERWRITE | JF_MODE_NEW, NULL, 0); if(fd) { jfwrite(env_game_thread, fd, buf, size); jfclose(env_game_thread, fd); } free(buf); char tmp[PATH_MAX]; if(rom_has_battery()) { sprintf(tmp, "%s.sram.gz", RomPath); save_sram(get_sram(), rom_get_info()->ram_size,tmp); } return size; //char temp[PATH_MAX]; //int ret; /* if (0)//setting.compress) { sprintf(temp,"%s.gz",path); FILE * fd = fopen(temp, "w"); if (fd<0){ free(buf); return 0; } ret = gzCreate(fd, buf, size); fclose(fd); free(buf); if (!ret) { remove(temp); return 0; } } else { FILE * fd = fopen(path, "w"); if (fd<0) { free(buf); return 0; } ret = fwrite(buf, size,1 ,fd); fclose(fd); free(buf); if (ret!=1){ remove(path); return 0; }else{ //strcat(path, ".gz"); //remove_file(path); } return ret; }*/ }
//force: 1 to always write, 0 to only if changed int machine_manage_sram(int mode, int force) { char name[MAX_PATH]; VIRTUAL_FILE *fd; int ramsize = 0; if(menuConfig.file.filename[0] == '\0') return; pspGetStateName(name, STATE_SRAM); switch(mode) { case SRAM_SAVE: if (gblMachineType == EM_SMS) { //Find out if something was written to the SRAM (which is zero initialized) /* int i, modified = 0; for (i=0;i<0x8000;i++) { if (((u8*)cart.sram)[i] != 0) modified = 1; } if (!modified) break;*/ //Determine if something has changed (using the CRC) uLong crc = crc32(0L, Z_NULL, 0); crc = crc32(crc, cart.sram, 0x8000); if (sram_crc == crc) break; sram_crc = crc; } else if (gblMachineType == EM_GBC) { if (!(rom_get_loaded() && rom_has_battery())) break; //Determine if something has changed (using the CRC) const int sram_tbl[]={1,1,1,4,16,8}; int sram_size = 0x2000 * sram_tbl[rom_get_info()->ram_size]; if (rom_get_info()->cart_type>=0x0f && rom_get_info()->cart_type<=0x13) { int tmp = renderer_get_timer_state(); memcpy(get_sram() + sram_size, &tmp, sizeof(int)); sram_size += sizeof(int); } uLong crc = crc32(0L, Z_NULL, 0); crc = crc32(crc, get_sram(), sram_size); if (sram_crc == crc) break; sram_crc = crc; } if (BatteryWarning("Your battery is low!\nDo you want to save the SRAM contents?\n(This might corrupt your Memory Stick if your PSP stops during this operation.)")) { fd = VirtualFileOpen(name, 0, VF_GZFILE, VF_O_WRITE); if (fd) { if (gblMachineType == EM_SMS) VirtualFileWrite(cart.sram, 0x8000, 1, fd); else if (gblMachineType == EM_GBC) gb_save_sram(fd, get_sram(), rom_get_info()->ram_size); VirtualFileClose(fd); } } break; case SRAM_LOAD: fd = VirtualFileOpen(name, 0, VF_GZFILE, VF_O_READ); if (gblMachineType == EM_SMS) { if(fd) { sms.save = 1; VirtualFileRead(cart.sram, 0x8000, 1, fd); ramsize = 0x8000; } else /* No SRAM file, so initialize memory */ memset(cart.sram, 0x00, 0x8000); sram_crc = crc32(0L, Z_NULL, 0); sram_crc = crc32(sram_crc, cart.sram, 0x8000); } else if (gblMachineType == EM_GBC) { if (fd) ramsize = gb_load_sram(fd, sram_space, sizeof(sram_space)); sram_crc = crc32(0L, Z_NULL, 0); sram_crc = crc32(sram_crc, sram_space, ramsize); } if (fd) VirtualFileClose(fd); break; } return ramsize; }