int load_state_tmp(byte *buf) { if (!buf) return 0; gb_restore_state(0,buf); if(rom_get_info()->gb_type == 1) lcd_set_mpal(0); else if(rom_get_info()->gb_type == 2 && sgb_mode) lcd_set_mpal(PAL_SGB); else lcd_set_mpal(setting.gb_palette); if(rom_get_info()->gb_type>=3 && org_gbtype==3) now_gb_mode = 3; else if(rom_get_info()->gb_type==2 && sgb_mode) now_gb_mode = 2; else now_gb_mode = 1; border_uploaded = 2; return 1; }
int state_load(char* path) { /*FILE * fd = fopen(path,"rb"); if (!fd){ strcat(path,".gz"); fd = fopen(path,"rb"); if (!fd) return 0; } gb_restore_state(fd,NULL); fclose(fd);*/ byte * buf; jfile fd = jfopen(env_game_thread, path, JF_MODE_READ, NULL, 0); gb_restore_state(fd, NULL); jfclose(env_game_thread, fd); if(rom_get_info()->gb_type == 1) lcd_set_mpal(0); else if(rom_get_info()->gb_type == 2 && sgb_mode) lcd_set_mpal(PAL_SGB); else lcd_set_mpal(setting.gb_palette); if(rom_get_info()->gb_type>=3 && org_gbtype==3) now_gb_mode = 3; else if(rom_get_info()->gb_type==2 && sgb_mode) now_gb_mode = 2; else now_gb_mode = 1; border_uploaded = 2; free_rewind_states(); allocate_rewind_states(); return 1; }
void set_gb_type() { if (rom_get_loaded()){ switch(setting.gb_type){ case 0: if(org_gbtype==1){ rom_get_info()->gb_type = 2; lcd_set_mpal(setting.gb_palette); }else if(org_gbtype == 2){ rom_get_info()->gb_type = 2; lcd_set_mpal(PAL_SGB); }else if(org_gbtype == 3){ rom_get_info()->gb_type = 3; lcd_set_mpal(PAL_SGB); } break; case 1: rom_get_info()->gb_type = 1; lcd_set_mpal(PAL_MONOCHROME); break; case 2: rom_get_info()->gb_type = 2; if(sgb_mode) lcd_set_mpal(PAL_SGB); else lcd_set_mpal(setting.gb_palette); break; case 3: rom_get_info()->gb_type = 3; lcd_set_mpal(setting.gb_palette); break; case 4: rom_get_info()->gb_type = 4; lcd_set_mpal(setting.gb_palette); break; } if(rom_get_info()->gb_type>=3 && org_gbtype==3) now_gb_mode = 3; else if(rom_get_info()->gb_type==2 && sgb_mode) now_gb_mode = 2; else now_gb_mode = 1; } }
void cpu_reset(void) { c_regs_AF=(rom_get_info()->gb_type>=3)?0x11b0:0x01b0; c_regs_BC=(rom_get_info()->gb_type>=4)?0x0113:0x0013; c_regs_DE=0x00D8; c_regs_HL=0x014D; c_regs_I=0; c_regs_SP=0xFFFE; c_regs_PC=0x100; vram_bank=vram; ram_bank=ram+0x1000; rest_clock=0; total_clock=sys_clock=div_clock=0; seri_occer=0x7fffffff; halt=false; speed=false; speed_change=false; dma_executing=false; b_dma_first=false; gdma_rest=0; last_int=0; int_disable_next=false; int_invoke_next=false; memset(ram,0,sizeof(ram)); memset(vram,0,sizeof(vram)); memset(stack,0,sizeof(stack)); memset(oam,0,sizeof(oam)); memset(spare_oam,0,sizeof(spare_oam)); /* if(rp_fd >= 0){ sceIoClose(rp_fd); rp_fd = -1; }*/ rp_time = 0; }
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; }
void gb_restore_state(FILE * fd, const byte *buf) { const int tbl_ram[]={1,1,1,4,16,8}; // 0と1は保険 const int has_bat[]={0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,1,1,0}; // 0x20以下 int gb_type,dmy; read_state(fd, &gb_type, sizeof(int)); rom_get_info()->gb_type=gb_type; if (gb_type<=2){ read_state(fd, cpu_get_ram(),0x2000); // ram read_state(fd, cpu_get_vram(),0x2000); // vram read_state(fd, get_sram(),tbl_ram[rom_get_info()->ram_size]*0x2000); // sram read_state(fd, cpu_get_oam(),0xA0); read_state(fd, cpu_get_stack(),0x80); int page,ram_page; read_state(fd, &page, sizeof(int)); // rom_page read_state(fd, &ram_page, sizeof(int)); // ram_page mbc_set_page(page,ram_page); read_state(fd, cpu_get_c_regs(),sizeof(struct cpu_regs)); // cpu_reg cpu_set_c_regs(); read_state(fd, (void *)&g_regs,sizeof(struct gb_regs)); // sys_reg int halt; read_state(fd, &halt,sizeof(int)); *cpu_get_halt()=((halt)?true:false); read_state(fd, &dmy,sizeof(int)); int mbc_dat; read_state(fd, &mbc_dat,sizeof(int)); // MBC mbc_set_state(mbc_dat); int ext_is; read_state(fd, &ext_is,sizeof(int)); mbc_set_ext_is(ext_is?true:false); // ver 1.1 追加 byte tmp[256],tester[100]; // read_state(fd, tmp, 100); // とりあえず調べてみる // _memset(tester,0,100); // if (_memcmp(tmp,tester,100)!=0){ // apu 部分 // sceIoLseek(fd, -100, 1); read_state(fd, apu_get_stat_cpu(),sizeof(struct apu_stat)); read_state(fd, apu_get_mem(),0x30); read_state(fd, apu_get_stat_gen(),sizeof(struct apu_stat)); // } byte resurved[256]; read_state(fd, resurved, 256);//将来のために確保 // RIN拡張 if(gb_type==2 && sgb_mode){ int dmy; read_state(fd, &dmy, sizeof(int)); read_state(fd, &bit_received, sizeof(int)); read_state(fd, &bits_received, sizeof(int)); read_state(fd, &packets_received, sizeof(int)); read_state(fd, &sgb_state, sizeof(int)); read_state(fd, &sgb_index, sizeof(int)); read_state(fd, &sgb_multiplayer, sizeof(int)); read_state(fd, &sgb_fourplayers, sizeof(int)); read_state(fd, &sgb_nextcontrol, sizeof(int)); read_state(fd, &sgb_readingcontrol, sizeof(int)); read_state(fd, &sgb_mask, sizeof(int)); read_state(fd, sgb_palette, sizeof(unsigned short)*8*16); read_state(fd, sgb_palette_memory, sizeof(unsigned short)*512*4); read_state(fd, sgb_buffer, 7*16); read_state(fd, sgb_ATF, 18*20); read_state(fd, sgb_ATF_list, 45*20*18); /* read_state(fd, sgb_border, 2048); read_state(fd, sgb_borderchar, 32*256); read_state(fd, border_tmp, sizeof(border_tmp)); int i, j, n=0; for (i=0; i<224; i++){ for (j=0; j<256; j++){ if (i>=40 && i<=183 && j==48) j=208; sgb_border_buffer[i*256+j] = border_tmp[n++]; } } */ } } else if (gb_type>=3){ // GB Colour / GBA read_state(fd, cpu_get_ram(),0x2000*4); // ram read_state(fd, cpu_get_vram(),0x2000*2); // vram read_state(fd, get_sram(),tbl_ram[rom_get_info()->ram_size]*0x2000); // sram read_state(fd, cpu_get_oam(),0xA0); read_state(fd, cpu_get_stack(),0x80); int cpu_dat[16]; int page,ram_page; read_state(fd, &page, sizeof(int)); // rom_page read_state(fd, &ram_page, sizeof(int)); // ram_page mbc_set_page(page,ram_page); page=(mbc_get_rom()-get_rom())/0x4000; ram_page=(mbc_get_sram()-get_sram())/0x2000; read_state(fd, cpu_dat+0,sizeof(int));//int_page read_state(fd, cpu_dat+1,sizeof(int));//vram_page int dmy; read_state(fd, cpu_get_c_regs(),sizeof(struct cpu_regs)); // cpu_reg cpu_set_c_regs(); read_state(fd, &g_regs,sizeof(struct gb_regs));//sys_reg read_state(fd, &cg_regs,sizeof(struct gbc_regs));//col_reg read_state(fd, lcd_get_pal_addr(),sizeof(word)*(8*4*2));//palette int halt; read_state(fd, &halt,sizeof(int)); *cpu_get_halt()=(halt?true:false); read_state(fd, &dmy,sizeof(int)); // 元の版ではシリアル通信通信満了までのクロック数 int mbc_dat; read_state(fd, &mbc_dat,sizeof(int)); // MBC mbc_set_state(mbc_dat); int ext_is; read_state(fd, &ext_is,sizeof(int)); mbc_set_ext_is(ext_is?true:false); //その他諸々 read_state(fd, cpu_dat+2,sizeof(int)); read_state(fd, cpu_dat+3,sizeof(int)); read_state(fd, cpu_dat+4,sizeof(int)); read_state(fd, cpu_dat+5,sizeof(int)); read_state(fd, cpu_dat+6,sizeof(int)); read_state(fd, cpu_dat+7,sizeof(int)); cpu_restore_state(cpu_dat); // ver 1.1 追加 byte tmp[256],tester[100]; read_state(fd, apu_get_stat_cpu(),sizeof(struct apu_stat)); read_state(fd, apu_get_mem(),0x30); read_state(fd, apu_get_stat_gen(),sizeof(struct apu_stat)); read_state(fd, tmp,1); // } byte resurved[256]; read_state(fd, resurved,256);//将来のために確保 } cheat_create_cheat_map(); }
size_t gb_save_state(byte *out) { const int tbl_ram[]={1,1,1,4,16,8}; // 0と1は保険 const int has_bat[]={0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,1,1,0}; // 0x20以下 byte *outbak = out; if (outbak) cheat_decreate_cheat_map(); write_state(&rom_get_info()->gb_type,sizeof(int),out,outbak); if (rom_get_info()->gb_type<=2){ // normal gb & sgb write_state(cpu_get_ram(),0x2000,out,outbak); // ram write_state(cpu_get_vram(),0x2000,out,outbak); // vram write_state(get_sram(),tbl_ram[rom_get_info()->ram_size]*0x2000,out,outbak); // sram write_state(cpu_get_oam(),0xA0,out,outbak); write_state(cpu_get_stack(),0x80,out,outbak); int page,ram_page; page=(mbc_get_rom()-get_rom())/0x4000; ram_page=(mbc_get_sram()-get_sram())/0x2000; write_state(&page,sizeof(int),out,outbak); // rom_page write_state(&ram_page,sizeof(int),out,outbak); // ram_page int dmy=0; write_state(cpu_get_c_regs(),sizeof(struct cpu_regs),out,outbak); // cpu_reg write_state(&g_regs,sizeof(struct gb_regs),out,outbak);//sys_reg int halt=((*cpu_get_halt())?1:0); write_state(&halt,sizeof(int),out,outbak); write_state(&dmy,sizeof(int),out,outbak); // 元の版ではシリアル通信通信満了までのクロック数 // (通信の仕様が大幅に変わったためダミーで埋めている) int mbc_dat=mbc_get_state(); write_state(&mbc_dat,sizeof(int),out,outbak);//MBC int ext_is=mbc_is_ext_ram()?1:0; write_state(&ext_is,sizeof(int),out,outbak); // ver 1.1 追加 write_state(apu_get_stat_cpu(),sizeof(struct apu_stat),out,outbak); write_state(apu_get_mem(),0x30,out,outbak); write_state(apu_get_stat_gen(),sizeof(struct apu_stat),out,outbak); byte resurved[256]; memset(resurved,0,256); write_state(resurved,256,out,outbak);//将来のために確保 // RIN拡張 if(now_gb_mode==2){ write_state(&sgb_mode, sizeof(int),out,outbak); write_state(&bit_received, sizeof(int),out,outbak); write_state(&bits_received, sizeof(int),out,outbak); write_state(&packets_received, sizeof(int),out,outbak); write_state(&sgb_state, sizeof(int),out,outbak); write_state(&sgb_index, sizeof(int),out,outbak); write_state(&sgb_multiplayer, sizeof(int),out,outbak); write_state(&sgb_fourplayers, sizeof(int),out,outbak); write_state(&sgb_nextcontrol, sizeof(int),out,outbak); write_state(&sgb_readingcontrol, sizeof(int),out,outbak); write_state(&sgb_mask, sizeof(int),out,outbak); write_state(sgb_palette, sizeof(unsigned short)*8*16,out,outbak); write_state(sgb_palette_memory, sizeof(unsigned short)*512*4,out,outbak); write_state(sgb_buffer, 7*16,out,outbak); write_state(sgb_ATF, 18*20,out,outbak); write_state(sgb_ATF_list, 45*20*18,out,outbak); } } else if (rom_get_info()->gb_type>=3){ // GB Colour / GBA write_state(cpu_get_ram(),0x2000*4,out,outbak); // ram write_state(cpu_get_vram(),0x2000*2,out,outbak); // vram write_state(get_sram(),tbl_ram[rom_get_info()->ram_size]*0x2000,out,outbak); // sram write_state(cpu_get_oam(),0xA0,out,outbak); write_state(cpu_get_stack(),0x80,out,outbak); int cpu_dat[16]; cpu_save_state(cpu_dat); int page,ram_page; page=(mbc_get_rom()-get_rom())/0x4000; ram_page=(mbc_get_sram()-get_sram())/0x2000; write_state(&page,sizeof(int),out,outbak); // rom_page write_state(&ram_page,sizeof(int),out,outbak); // ram_page write_state(cpu_dat+0,sizeof(int),out,outbak);//int_page //color write_state(cpu_dat+1,sizeof(int),out,outbak);//vram_page //color int dmy=0; write_state(cpu_get_c_regs(),sizeof(struct cpu_regs),out,outbak); // cpu_reg write_state(&g_regs,sizeof(struct gb_regs),out,outbak);//sys_reg write_state(&cg_regs,sizeof(struct gbc_regs),out,outbak);//col_reg //color //save the gbc palette write_state(lcd_get_pal_addr(),sizeof(word)*(8*4*2),out,outbak);//palette //color int halt=((*cpu_get_halt())?1:0); write_state(&halt,sizeof(int),out,outbak); write_state(&dmy,sizeof(int),out,outbak); // 元の版ではシリアル通信通信満了までのクロック数 int mbc_dat=mbc_get_state(); write_state(&mbc_dat,sizeof(int),out,outbak);//MBC int ext_is=mbc_is_ext_ram()?1:0; write_state(&ext_is,sizeof(int),out,outbak); //その他諸々 write_state(cpu_dat+2,sizeof(int),out,outbak); //color write_state(cpu_dat+3,sizeof(int),out,outbak); //color write_state(cpu_dat+4,sizeof(int),out,outbak); //color write_state(cpu_dat+5,sizeof(int),out,outbak); //color write_state(cpu_dat+6,sizeof(int),out,outbak); //color write_state(cpu_dat+7,sizeof(int),out,outbak); //color // ver 1.1 追加 write_state(apu_get_stat_cpu(),sizeof(struct apu_stat),out,outbak); write_state(apu_get_mem(),0x30,out,outbak); write_state(apu_get_stat_gen(),sizeof(struct apu_stat),out,outbak); byte resurved[256],reload=1; memset(resurved,0,256); // resurved[0]=1; write_state(&reload,1,out,outbak); write_state(resurved,256,out,outbak);//将来のために確保 } if(outbak) cheat_create_cheat_map(); return out-outbak; }
void gb_save_state(VIRTUAL_FILE *fd, byte *buf) { const int tbl_ram[]={1,1,1,4,16,8}; // 0と1は保険 #ifdef CHEAT_SUPPORT if (buf || fd) cheat_decreate_cheat_map(); #endif write_state(fd, &rom_get_info()->gb_type,sizeof(int)); if (rom_get_info()->gb_type<=2){ // normal gb & sgb write_state(fd, cpu_get_ram(),0x2000); // ram write_state(fd, cpu_get_vram(),0x2000); // vram write_state(fd, get_sram(),tbl_ram[rom_get_info()->ram_size]*0x2000); // sram write_state(fd, cpu_get_oam(),0xA0); write_state(fd, cpu_get_stack(),0x80); int page,ram_page; page=(mbc_get_rom()-get_rom())/0x4000; ram_page=(mbc_get_sram()-get_sram())/0x2000; write_state(fd, &page,sizeof(int)); // rom_page write_state(fd, &ram_page,sizeof(int)); // ram_page int dmy=0; write_state(fd, cpu_get_c_regs(),sizeof(struct cpu_regs)); // cpu_reg write_state(fd, &g_regs,sizeof(struct gb_regs));//sys_reg int halt=((*cpu_get_halt())?1:0); write_state(fd, &halt,sizeof(int)); write_state(fd, &dmy,sizeof(int)); // 元の版ではシリアル通信通信満了までのクロック数 // (通信の仕様が大幅に変わったためダミーで埋めている) int mbc_dat=mbc_get_state(); write_state(fd, &mbc_dat,sizeof(int));//MBC int ext_is=mbc_is_ext_ram()?1:0; write_state(fd, &ext_is,sizeof(int)); // ver 1.1 追加 write_state(fd, apu_get_stat_cpu(),sizeof(struct apu_stat)); write_state(fd, apu_get_mem(),0x30); write_state(fd, apu_get_stat_gen(),sizeof(struct apu_stat)); byte resurved[256]; memset(resurved,0,256); write_state(fd, resurved,256);//将来のために確保 // RIN拡張 if(now_gb_mode==2){ write_state(fd, &sgb_mode, sizeof(int)); write_state(fd, &bit_received, sizeof(int)); write_state(fd, &bits_received, sizeof(int)); write_state(fd, &packets_received, sizeof(int)); write_state(fd, &sgb_state, sizeof(int)); write_state(fd, &sgb_index, sizeof(int)); write_state(fd, &sgb_multiplayer, sizeof(int)); write_state(fd, &sgb_fourplayers, sizeof(int)); write_state(fd, &sgb_nextcontrol, sizeof(int)); write_state(fd, &sgb_readingcontrol, sizeof(int)); write_state(fd, &sgb_mask, sizeof(int)); write_state(fd, sgb_palette, sizeof(unsigned short)*8*16); write_state(fd, sgb_palette_memory, sizeof(unsigned short)*512*4); write_state(fd, sgb_buffer, 7*16); write_state(fd, sgb_ATF, 18*20); write_state(fd, sgb_ATF_list, 45*20*18); /* sceIoWrite(fd, sgb_border, 2048); sceIoWrite(fd, sgb_borderchar, 32*256); int i, j, n=0; for (i=0; i<224; i++){ for (j=0; j<256; j++){ if (i>=40 && i<=183 && j==48) j=208; border_tmp[n++] = sgb_border_buffer[i*256+j]; } } sceIoWrite(fd, border_tmp, sizeof(border_tmp)); */ } } else if (rom_get_info()->gb_type>=3){ // GB Colour / GBA write_state(fd, cpu_get_ram(),0x2000*4); // ram write_state(fd, cpu_get_vram(),0x2000*2); // vram write_state(fd, get_sram(),tbl_ram[rom_get_info()->ram_size]*0x2000); // sram write_state(fd, cpu_get_oam(),0xA0); write_state(fd, cpu_get_stack(),0x80); int cpu_dat[16]; cpu_save_state(cpu_dat); int page,ram_page; page=(mbc_get_rom()-get_rom())/0x4000; ram_page=(mbc_get_sram()-get_sram())/0x2000; write_state(fd, &page,sizeof(int)); // rom_page write_state(fd, &ram_page,sizeof(int)); // ram_page write_state(fd, cpu_dat+0,sizeof(int));//int_page //color write_state(fd, cpu_dat+1,sizeof(int));//vram_page //color int dmy=0; write_state(fd, cpu_get_c_regs(),sizeof(struct cpu_regs)); // cpu_reg write_state(fd, &g_regs,sizeof(struct gb_regs));//sys_reg write_state(fd, &cg_regs,sizeof(struct gbc_regs));//col_reg //color write_state(fd, lcd_get_pal(0),sizeof(word)*(8*4*2));//palette //color int halt=((*cpu_get_halt())?1:0); write_state(fd, &halt,sizeof(int)); write_state(fd, &dmy,sizeof(int)); // 元の版ではシリアル通信通信満了までのクロック数 int mbc_dat=mbc_get_state(); write_state(fd, &mbc_dat,sizeof(int));//MBC int ext_is=mbc_is_ext_ram()?1:0; write_state(fd, &ext_is,sizeof(int)); //その他諸々 write_state(fd, cpu_dat+2,sizeof(int)); //color write_state(fd, cpu_dat+3,sizeof(int)); //color write_state(fd, cpu_dat+4,sizeof(int)); //color write_state(fd, cpu_dat+5,sizeof(int)); //color write_state(fd, cpu_dat+6,sizeof(int)); //color write_state(fd, cpu_dat+7,sizeof(int)); //color // ver 1.1 追加 write_state(fd, apu_get_stat_cpu(),sizeof(struct apu_stat)); write_state(fd, apu_get_mem(),0x30); write_state(fd, apu_get_stat_gen(),sizeof(struct apu_stat)); byte resurved[256],reload=1; memset(resurved,0,256); // resurved[0]=1; write_state(fd, &reload,1); write_state(fd, resurved,256);//将来のために確保 } #ifdef CHEAT_SUPPORT if (buf || fd) cheat_create_cheat_map(); #endif return; }
int save_sram(byte *buf,int size, char * path) { const int sram_tbl[]={1,1,1,4,16,8}; /*char *p = strrchr(SavePath, '.'); if (!strcmp(p,".gz")){ if(!setting.compress) remove_file(SavePath); }else{ if(setting.compress)*/ //remove_file(path); /*} sprintf(SavePath, "%sSAVE/%s.sav", RinPath, RomName); if (setting.compress) { strcat(SavePath, ".gz"); FILE * fd = fopen(SavePath, "w"); if (!fd) return 0; int sram_size = 0x2000 * sram_tbl[size]; if ((rom_get_info()->cart_type>=0x0f) && (rom_get_info()->cart_type<=0x13)) { int tmp = renderer_get_timer_state(); memcpy(buf+sram_size, &tmp, sizeof(int)); sram_size += sizeof(int); } cheat_decreate_cheat_map(); gzCreate(fd, buf, sram_size); fclose(fd); cheat_create_cheat_map(); }else { FILE * fd = fopen(path, "w"); if(!fd) { return 0; } cheat_decreate_cheat_map(); fwrite(buf, 0x2000*sram_tbl[size],1,fd); if ((rom_get_info()->cart_type>=0x0f) && (rom_get_info()->cart_type<=0x13)){ int tmp = renderer_get_timer_state(); fwrite( &tmp, sizeof(int),1,fd); } fclose(fd); cheat_create_cheat_map(); }*/ cheat_decreate_cheat_map(); int tmp; jfile fd = jfopen(env_game_thread, path, JF_MODE_OVERWRITE | JF_MODE_NEW | JF_MODE_WRITE, NULL, 0); cheat_decreate_cheat_map(); jfwrite(env_game_thread,fd, buf, 0x2000*sram_tbl[size]); if ((rom_get_info()->cart_type>=0x0f) && (rom_get_info()->cart_type<=0x13)){ int tmp = renderer_get_timer_state(); jfwrite( env_game_thread, fd, &tmp, sizeof(int)); } jfclose(env_game_thread, fd); cheat_create_cheat_map(); return 1; }
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; }