Esempio n. 1
0
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;
}
Esempio n. 2
0
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;

}
Esempio n. 3
0
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;
	}
}
Esempio n. 4
0
File: cpu.c Progetto: BelmonduS/rin
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;
}
Esempio n. 5
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;
}
Esempio n. 6
0
File: gb.c Progetto: BelmonduS/rin
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();
}
Esempio n. 7
0
File: gb.c Progetto: BelmonduS/rin
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;
}
Esempio n. 8
0
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;
}
Esempio n. 9
0
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;
}
Esempio n. 10
0
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;
	}*/
}
Esempio n. 11
0
File: SMS.c Progetto: wally4000/code
//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;
}