⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spc7110.cpp

📁 SFC游戏模拟器 snes9x 1.43 的原代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		{			char binname[PATH_MAX];#ifndef _XBOX			sprintf(binname,"%06X.bin",decompack->tableEnts[i].table);#else			sprintf(binname,"%s%06X.bin",filename,decompack->tableEnts[i].table);#endif			struct stat buf;			if(-1!=stat(binname, &buf))				decompack->binfiles[i]=new uint8[buf.st_size];			FILE* fp=fopen(binname, "rb");			if(fp)			{				fread(decompack->binfiles[i],buf.st_size,1,fp);				fclose(fp);			}		}	}#ifndef _XBOX		chdir(temp_path);#endif	Copy7110=&MovePackData;	CleanUp7110=&Del7110Gfx;#ifdef __WIN32__	#ifndef _XBOX		EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_ENABLED);	#endif#endif}//Cache 2 load functionvoid SPC7110Open(char* dirname){	char temp_path[PATH_MAX];	int i=0;	decompack=new Pack7110;#ifndef _XBOX	getcwd(temp_path,PATH_MAX);#endif	ZeroMemory(decompack, sizeof(Pack7110));	#ifndef _XBOX		if(-1==chdir(dirname))		{						S9xMessage(0,0,"Graphics Pack not found!");		}#endif#ifndef _XBOX	Load7110Index("index.bin");#else		// D:\\ is always app.path in Xbox	Load7110Index("d:\\index.bin");#endif	for (i=0; i<MAX_TABLES; i++)		decompack->binfiles[i]=NULL;	ReadPackData();#ifndef _XBOX	chdir(temp_path);#endif	Copy7110=&ReadPackData;	CleanUp7110=&Close7110Gfx;#ifdef __WIN32__	#ifndef _XBOX		EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_ENABLED);	#endif#endif}//Cache 3's load functionvoid SPC7110Grab(char* dirname){	char temp_path[PATH_MAX];	int i=0;	decompack=new Pack7110;#ifndef _XBOX	getcwd(temp_path,PATH_MAX);#endif	int32 buffer_size=1024*1024*cacheMegs;//*some setting	ZeroMemory(decompack, sizeof(Pack7110));#ifndef _XBOX  		if(-1==chdir(dirname))		{			S9xMessage(0,0,"Graphics Pack not found!");		}#endif#ifndef _XBOX	Load7110Index("index.bin");#else	// D:\\ is always app.path in Xbox	Load7110Index("d:\\index.bin");#endif	for(i=0;i<MAX_TABLES;i++)	{		if(decompack->tableEnts[i].table!=0)		{			char binname[PATH_MAX];#ifndef _XBOX			sprintf(binname,"%06X.bin",decompack->tableEnts[i].table);#else			sprintf(binname,"%s%06X.bin",filename,decompack->tableEnts[i].table);#endif			struct stat buf;//add load/no load calculations here			if(-1!=stat(binname, &buf))			{				if(buf.st_size<buffer_size)					decompack->binfiles[i]=new uint8[buf.st_size];				FILE* fp=fopen(binname, "rb");				//use them here				if(fp)				{					if(buf.st_size<buffer_size)					{						fread(decompack->binfiles[i],buf.st_size,1,fp);						fclose(fp);						buffer_size-=buf.st_size;						decompack->tableEnts[i].is_file=false;					}					else					{						decompack->binfiles[i]=(uint8*)fp;						decompack->tableEnts[i].is_file=true;					}				}			}		}	}#ifndef _XBOX	chdir(temp_path);#endif	Copy7110=&GetPackData;	CleanUp7110=&Drop7110Gfx;#ifdef __WIN32__	#ifndef _XBOX		EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_ENABLED);	#endif#endif}//Cache 1 clean up functionvoid Del7110Gfx(){	int i;	if(Settings.SPC7110)	{#ifdef __WIN32__	#ifndef _XBOX		EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_GRAYED);	#endif#endif		Do7110Logging();	}	for(i=0;i<MAX_TABLES;i++)	{		if(decompack->binfiles[i]!=NULL)		{			delete []decompack->binfiles[i];			decompack->binfiles[i]=NULL;		}	}	Settings.SPC7110=false;	Settings.SPC7110RTC=false;	if(NULL!=decompack)		delete decompack;	decompack=NULL;	CleanUp7110=NULL;	Copy7110=NULL;}//Cache2 cleanup functionvoid Close7110Gfx(){	int i;	if(Settings.SPC7110)	{#ifdef __WIN32__	#ifndef _XBOX		EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_GRAYED);	#endif#endif		Do7110Logging();	}	for(i=0;i<MAX_TABLES;i++)	{		if(decompack->binfiles[i]!=NULL)		{			fclose((FILE*)decompack->binfiles[i]);			decompack->binfiles[i]=NULL;		}	}	Settings.SPC7110=false;	Settings.SPC7110RTC=false;	if(NULL!=decompack)		delete decompack;	decompack=NULL;	CleanUp7110=NULL;	Copy7110=NULL;}//cache 3's clean-up codevoid Drop7110Gfx(){	int i;	if(Settings.SPC7110)	{#ifdef __WIN32__	#ifndef _XBOX		EnableMenuItem(GUI.hMenu, IDM_LOG_7110, MF_GRAYED);	#endif#endif		Do7110Logging();	}	for(i=0;i<MAX_TABLES;i++)	{		if(decompack->binfiles[i]!=NULL)		{			if(decompack->tableEnts[i].is_file)			{				fclose((FILE*)decompack->binfiles[i]);				decompack->binfiles[i]=NULL;			}			else			{				delete []decompack->binfiles[i];				decompack->binfiles[i]=NULL;			}		}	}	Settings.SPC7110=false;	Settings.SPC7110RTC=false;	if(NULL!=decompack)		delete decompack;	decompack=NULL;	CleanUp7110=NULL;	Copy7110=NULL;}//emulate a reset.void S9xSpc7110Reset(){	s7r.reg4800=0;	s7r.reg4801=0;	s7r.reg4802=0;	s7r.reg4803=0;	s7r.reg4804=0;	s7r.reg4805=0;	s7r.reg4806=0;	s7r.reg4807=0;	s7r.reg4808=0;	s7r.reg4809=0;	s7r.reg480A=0;	s7r.reg480B=0;	s7r.reg480C=0;	s7r.reg4811=0;	s7r.reg4812=0;	s7r.reg4813=0;	s7r.reg4814=0;	s7r.reg4815=0;	s7r.reg4816=0;	s7r.reg4817=0;	s7r.reg4818=0;	s7r.reg4820=0;	s7r.reg4821=0;	s7r.reg4822=0;	s7r.reg4823=0;	s7r.reg4824=0;	s7r.reg4825=0;	s7r.reg4826=0;	s7r.reg4827=0;	s7r.reg4828=0;	s7r.reg4829=0;	s7r.reg482A=0;	s7r.reg482B=0;	s7r.reg482C=0;	s7r.reg482D=0;	s7r.reg482E=0;	s7r.reg482F=0;	s7r.reg4830=0;	s7r.reg4831=0;	s7r.reg4832=1;	s7r.reg4833=2;	s7r.reg4834=0;	s7r.reg4840=0;	s7r.reg4841=0;	s7r.reg4842=0;	s7r.written=0;	s7r.offset_add=0;	s7r.AlignBy=1;	s7r.bank50Internal=0;	memset(s7r.bank50,0x00,DECOMP_BUFFER_SIZE);}//outputs a cumulative log for the game.//there's nothing really weird here, just//reading the old log, and writing a new one.//note the logs are explicitly little-endian, not host byte order.void Do7110Logging(){	uint8 ent_temp;	FILE* flog;	int entries=0;		if(Settings.SPC7110)	{		//flush last read into logging		(*Copy7110)();		// zones: mac specific begin		char name[PATH_MAX + 1];				strcpy(name, S9xGetFilename(".dat"));		flog = fopen(name, "rb");/*		if(!strncmp((char*)&Memory.ROM [0xffc0], "SUPER POWER LEAG 4   ", 21))		{#ifdef _XBOX			flog=fopen("T:\\spl4-sp7.dat","rb");#else			flog=fopen("spl4-sp7.dat","rb");#endif		}		else if(!strncmp((char*)&Memory.ROM [0xffc0], "MOMOTETSU HAPPY      ",21))		{#ifdef _XBOX			flog=fopen("T:\\smht-sp7.dat","rb");#else			flog=fopen("smht-sp7.dat","rb");#endif		}		else if(!strncmp((char*)&Memory.ROM [0xffc0], "HU TENGAI MAKYO ZERO ", 21))		{#ifdef _XBOX			flog=fopen("T:\\feoezsp7.dat","rb");#else			flog=fopen("feoezsp7.dat","rb");#endif		}		else if(!strncmp((char*)&Memory.ROM [0xffc0], "JUMP TENGAIMAKYO ZERO",21))		{#ifdef _XBOX			flog=fopen("T:\\sjumpsp7.dat","rb");#else			flog=fopen("sjumpsp7.dat","rb");#endif		}		else		{#ifdef _XBOX			flog=fopen("T:\\misc-sp7.dat","rb");#else			flog=fopen("misc-sp7.dat","rb");#endif		}*/// zones: end		if(flog)		{			uint8 buffer[8];			int table=0;			uint16 offset=0;			uint16 length=0;			fseek(flog, 35,0);			do			{				int i=0;				Data7110 *log=NULL;				fread(buffer, 1, 8, flog);				table=buffer[0]|(buffer[1]<<8)|(buffer[2]<<16);				offset=buffer[6]|(buffer[7]<<8);				length=buffer[4]|(buffer[5]<<8);				while(i<MAX_TABLES&&log==NULL)				{					if(decompack->tableEnts[i].table==table)					{						log=&(decompack->tableEnts[i].location[(buffer[3])]);						if((log->used_offset+log->used_len)<(offset+length))						{							log->used_offset=offset;							log->used_len=length;						}					}					i++;				}			}			while(!feof(flog));			fclose(flog);		}// zones: mac specific begin		flog = fopen(name, "wb");/*			if(!strncmp((char*)&Memory.ROM [0xffc0], "SUPER POWER LEAG 4   ", 21))		{#ifdef _XBOX	// cwd could be the dvd-rom, so write to T:\\ which is storage region for each title			flog=fopen("T:\\spl4-sp7.dat","wb");#else			flog=fopen("spl4-sp7.dat","wb");#endif		}		else if(!strncmp((char*)&Memory.ROM [0xffc0], "MOMOTETSU HAPPY      ",21))		{#ifdef _XBOX			flog=fopen("T:\\smht-sp7.dat","wb");#else			flog=fopen("smht-sp7.dat","wb");#endif		}		else if(!strncmp((char*)&Memory.ROM [0xffc0], "HU TENGAI MAKYO ZERO ", 21))		{#ifdef _XBOX			flog=fopen("T:\\feoezsp7.dat","wb");#else			flog=fopen("feoezsp7.dat","wb");#endif		}		else if(!strncmp((char*)&Memory.ROM [0xffc0], "JUMP TENGAIMAKYO ZERO",21))		{#ifdef _XBOX			flog=fopen("T:\\sjumpsp7.dat","wb");#else			flog=fopen("sjumpsp7.dat","wb");#endif		}		else		{#ifdef _XBOX			flog=fopen("T:\\misc-sp7.dat","wb");#else			flog=fopen("misc-sp7.dat","wb");#endif		}*/// zones: end		//count entries		if(flog)		{			int j=0;			int temp=0;			for(j=0;j<MAX_TABLES;j++)			{				for(int k=0;k<256;k++)				{					if(decompack->tableEnts[j].location[k].used_len!=0)						entries++;				}			}			ent_temp=entries&0xFF;			fwrite(&ent_temp,1,1,flog);			ent_temp=(entries>>8)&0xFF;			fwrite(&ent_temp,1,1,flog);			ent_temp=(entries>>16)&0xFF;			fwrite(&ent_temp,1,1,flog);			ent_temp=(entries>>24)&0xFF;			fwrite(&ent_temp,1,1,flog);			fwrite(&temp,1,4,flog);			fwrite(&temp,1,4,flog);			fwrite(&temp,1,4,flog);			fwrite(&temp,1,4,flog);			fwrite(&temp,1,4,flog);			fwrite(&temp,1,4,flog);			fwrite(&temp,1,4,flog);						ent_temp=0;			fwrite(&ent_temp,1,1,flog);			ent_temp=0;			fwrite(&ent_temp,1,1,flog);			ent_temp=0;			fwrite(&ent_temp,1,1,flog);						for(j=0;j<MAX_TABLES;j++)			{				for(int k=0;k<256;k++)				{					if(decompack->tableEnts[j].location[k].used_len!=0)					{						ent_temp=decompack->tableEnts[j].table&0xFF;						fwrite(&ent_temp,1,1,flog);//801						ent_temp=(decompack->tableEnts[j].table>>8)&0xFF;;						fwrite(&ent_temp,1,1,flog);//802						ent_temp=(decompack->tableEnts[j].table>>16)&0xFF;;						fwrite(&ent_temp,1,1,flog);//803						ent_temp=k&0xFF;						fwrite(&ent_temp,1,1,flog);//804						ent_temp=decompack->tableEnts[j].location[k].used_len&0xFF;						fwrite(&ent_temp,1,1,flog);//lsb of 						ent_temp=(decompack->tableEnts[j].location[k].used_len>>8)&0xFF;						fwrite(&ent_temp,1,1,flog);//msb of						ent_temp=(decompack->tableEnts[j].location[k].used_offset)&0xFF;						fwrite(&ent_temp,1,1,flog);//lsb of						ent_temp=(decompack->tableEnts[j].location[k].used_offset>>8)&0xFF;						fwrite(&ent_temp,1,1,flog);//msb of					}				}			}			fwrite(&temp,1,4,flog);			fwrite(&temp,1,4,flog);			fclose(flog);		}	}}bool8 S9xSaveSPC7110RTC (S7RTC *rtc_f9){    FILE* fp;    if((fp=fopen(S9xGetFilename(".rtc"), "wb"))==NULL)        return (FALSE);	int i=0;	uint8 temp=0;	for (i=0;i<16;i++)		fwrite(&rtc_f9->reg[i],1,1,fp);	temp=rtc_f9->index&0x00FF;	fwrite(&temp,1,1,fp);	temp=(rtc_f9->index)>>8;	fwrite(&temp,1,1,fp);	temp=(uint8)rtc_f9->control;	fwrite(&temp,1,1,fp);	temp=(uint8)rtc_f9->init;	fwrite(&temp,1,1,fp);	temp=rtc_f9->last_used&0x00FF;	fwrite(&temp,1,1,fp);	temp=(rtc_f9->last_used>>8)&0x00FF;	fwrite(&temp,1,1,fp);	temp=(rtc_f9->last_used>>16)&0x00FF;	fwrite(&temp,1,1,fp);	temp=(rtc_f9->last_used>>24)&0x00FF;;	fwrite(&temp,1,1,fp);	fclose(fp);    return (TRUE);}bool8 S9xLoadSPC7110RTC (S7RTC *rtc_f9){    FILE* fp;    if((fp=fopen(S9xGetFilename(".rtc"), "rb"))==NULL)        return (FALSE);	for (int i=0; i<16;i++)	{		fread(&(rtc_f9->reg[i]),1,1,fp);	}	uint8 temp=0;	fread(&temp,1,1,fp);	rtc_f9->index=temp;	fread(&temp,1,1,fp);	rtc_f9->index|=(temp<<8);	fread(&rtc_f9->control,1,1,fp);	fread(&rtc_f9->init,1,1,fp);		fread(&temp,1,1,fp);	rtc_f9->last_used=temp;	fread(&temp,1,1,fp);	rtc_f9->last_used|=(temp<<8);	fread(&temp,1,1,fp);	rtc_f9->last_used|=(temp<<16);	fread(&temp,1,1,fp);	rtc_f9->last_used|=(temp<<24);    fclose(fp);    return (TRUE);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -