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

📄 memmap.cpp

📁 SFC游戏模拟器 snes9x 1.43 的原代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	for(offset=0; offset<TotalFileSize; offset+=0x100000);	//insert base type test here.		if(slot1name[0]!='\0')	{				TotalFileSize = FileLoader(ROM+offset, slot1name, MAX_ROM_SIZE);				if(0== TotalFileSize)			return FALSE;		else CheckForIPSPatch (slot1name, HeaderCount != 0, TotalFileSize);		ROMOffset1=&ROM[offset];		Slot1Size=TotalFileSize;	}	int32 temp=offset;	for(; offset<temp+TotalFileSize; offset+=0x100000);	if(slot2name[0]!='\0')	{		TotalFileSize = FileLoader(ROM+offset, slot2name, MAX_ROM_SIZE);				if(0== TotalFileSize)			return FALSE;		else CheckForIPSPatch (slot2name, HeaderCount != 0, TotalFileSize);		ROMOffset2=&ROM[offset];		Slot2Size=TotalFileSize;	}    InitROM (FALSE);    S9xLoadCheatFile (S9xGetFilename(".cht"));    S9xInitCheatData ();    S9xApplyCheats ();	    S9xReset ();	    return (TRUE);}bool8 SufamiTurboBIOSSig(uint8* file, int32 size){	if(!strcmp((char*)file, "BANDAI SFC-ADX")&&!strcmp((char*)(file+0x10), "SFC-ADX BACKUP"))	{		//possible match.		//check size		if(size!=0x40000)			return FALSE;		//and CRC32		if(0x9B4CA911==caCRC32(file, size))		{			return TRUE;		}	}	return FALSE;}bool8 SufamiTurboCartSig(uint8* file, int32 size){	//test not a BIOS	if(!strcmp((char*)file, "BANDAI SFC-ADX")&&strcmp((char*)(file+0x10), "SFC-ADX BACKUP"))	{		//possible match.		//check size		if(size>0x100000||size <0x80000)			return FALSE;		//probably a minicart		return TRUE;	}	return FALSE;}bool8 SameGameSig(uint8* file, int32 size){	//preheader sig	if(strcmp((char*)(file+0xFFA0),"1995/12/16 10:2018ZS5J"))		return FALSE;	if(size!=0x100000)		return FALSE;	if(0x133E1C5B==caCRC32(file, size))		return TRUE;	return FALSE;}bool8 GNextSig(uint8* file, int32 size){	//preheader sig	if(strcmp((char*)(file+0xFFAA),"GNEXT B2ZX3J"))		return FALSE;	if(size!=0x180000)		return FALSE;	if(0x845E420D==caCRC32(file, size))		return TRUE;	return FALSE;}int MultiType(uint8* file, int32 size){	//check for ST signiture	if(SufamiTurboBIOSSig(file, size))		return 1;	//check for Same Game signiture	if(SameGameSig(file, size))		return 2;	//check for G-Next signiture	if(GNextSig(file, size))		return 3;	return 0;}#endif//compatibility wrappervoid S9xDeinterleaveMode2 (){	S9xDeinterleaveType2();}void S9xDeinterleaveType2 (bool8 reset){	if(Settings.DisplayColor==0xffff||Settings.DisplayColor==BUILD_PIXEL(0,31,0))	{		Settings.DisplayColor=BUILD_PIXEL(31,14,6);		SET_UI_COLOR(255,119,25);		  	}    S9xMessage (S9X_INFO, S9X_ROM_INTERLEAVED_INFO,		"ROM image is in interleaved format - converting...");	    int nblocks = Memory.CalculatedSize >> 16;    int step = 64;	    while (nblocks <= step)		step >>= 1;	    nblocks = step;    uint8 blocks [256];    int i;	    for (i = 0; i < nblocks * 2; i++)    {		blocks [i] = (i & ~0xF) | ((i & 3) << 2) |			((i & 12) >> 2);    }	    uint8 *tmp = (uint8 *) malloc (0x10000);	    if (tmp)    {		for (i = 0; i < nblocks * 2; i++)		{			for (int j = i; j < nblocks * 2; j++)			{				if (blocks [j] == i)				{					memmove (tmp, &Memory.ROM [blocks [j] * 0x10000], 0x10000);					memmove (&Memory.ROM [blocks [j] * 0x10000], 						&Memory.ROM [blocks [i] * 0x10000], 0x10000);					memmove (&Memory.ROM [blocks [i] * 0x10000], tmp, 0x10000);					uint8 b = blocks [j];					blocks [j] = blocks [i];					blocks [i] = b;					break;				}			}		}		free ((char *) tmp);		tmp=NULL;    }	if(reset)	{	    Memory.InitROM (FALSE);		S9xReset ();	}}//CRC32 for char arraysinline uint32 caCRC32(uint8 *array, uint32 size, register uint32 crc32){  for (register uint32 i = 0; i < size; i++)  {    crc32 = ((crc32 >> 8) & 0x00FFFFFF) ^ crc32Table[(crc32 ^ array[i]) & 0xFF];  }  return ~crc32;}void CMemory::InitROM (bool8 Interleaved){#ifndef ZSNES_FX    SuperFX.nRomBanks = CalculatedSize >> 15;#endif    Settings.MultiPlayer5Master = Settings.MultiPlayer5;    Settings.MouseMaster = Settings.Mouse;    Settings.SuperScopeMaster = Settings.SuperScope;    Settings.DSP1Master = Settings.ForceDSP1;    Settings.SuperFX = FALSE;    Settings.SA1 = FALSE;    Settings.C4 = FALSE;    Settings.SDD1 = FALSE;    Settings.SRTC = FALSE;	Settings.SPC7110=FALSE;	Settings.SPC7110RTC=FALSE;	Settings.BS=FALSE;	Settings.OBC1=FALSE;	Settings.SETA=FALSE;	s7r.DataRomSize = 0;	CalculatedChecksum=0;	uint8* RomHeader;	RomHeader=ROM+0x7FB0;	if(ExtendedFormat==BIGFIRST)		RomHeader+=0x400000;	if(HiROM)		RomHeader+=0x8000;	if(!Settings.BS)	{		Settings.BS=(-1!=is_bsx(ROM+0x7FC0));			if(Settings.BS)		{			Memory.LoROM=TRUE;			Memory.HiROM=FALSE;		}		else		{			Settings.BS=(-1!=is_bsx(ROM+0xFFC0));			if(Settings.BS)			{				Memory.HiROM=TRUE;				Memory.LoROM=FALSE;			}		}	}    ZeroMemory (BlockIsRAM, MEMMAP_NUM_BLOCKS);    ZeroMemory (BlockIsROM, MEMMAP_NUM_BLOCKS);    ::SRAM = SRAM;    memset (ROMId, 0, 5);    memset (CompanyId, 0, 3);	ParseSNESHeader(RomHeader);		// Try to auto-detect the DSP1 chip	if (!Settings.ForceNoDSP1 &&			(ROMType & 0xf) >= 3 && (ROMType & 0xf0) == 0)			Settings.DSP1Master = TRUE;		if (Memory.HiROM)    {	    // Enable S-RTC (Real Time Clock) emulation for Dai Kaijyu Monogatari 2	    Settings.SRTC = ((ROMType & 0xf0) >> 4) == 5;		if(((ROMSpeed&0x0F)==0x0A)&&((ROMType&0xF0)==0xF0))		{			Settings.SPC7110=true;			if((ROMType&0x0F)==0x09)				Settings.SPC7110RTC=true;		}				if (Settings.BS)			BSHiROMMap ();		else if(Settings.SPC7110)		{			SPC7110HiROMMap();		}		else if ((ROMSpeed & ~0x10) == 0x25)		{			TalesROMMap (Interleaved);		}		else HiROMMap ();    }    else    {		Settings.SuperFX = Settings.ForceSuperFX;				if(ROMType==0x25)		{			Settings.OBC1=TRUE;		}		//BS-X BIOS		if(ROMType==0xE5)		{			Settings.BS=TRUE;		}		if ((ROMType & 0xf0) == 0x10)			Settings.SuperFX = !Settings.ForceNoSuperFX;				Settings.SDD1 = Settings.ForceSDD1;		if ((ROMType & 0xf0) == 0x40)			Settings.SDD1 = !Settings.ForceNoSDD1;				if (Settings.SDD1)			S9xLoadSDD1Data ();				if(((ROMType &0xF0) == 0xF0)&((ROMSpeed&0x0F)!=5))		{			SRAMSize=2;			SNESGameFixes.SRAMInitialValue = 0x00;			if((ROMType &0x0F)==6)			{				if(ROM[0x7FD7]==0x09)				{					Settings.SETA=ST_011;					SetSETA=&S9xSetST011;					GetSETA=&S9xGetST011;				}				else				{					Settings.SETA=ST_010;					SetSETA=&S9xSetST010;					GetSETA=&S9xGetST010;				}			}			else			{				Settings.SETA=ST_018;				SRAMSize=2;			}		}		Settings.C4 = Settings.ForceC4;		if ((ROMType & 0xf0) == 0xf0 &&            (strncmp (ROMName, "MEGAMAN X", 9) == 0 ||			strncmp (ROMName, "ROCKMAN X", 9) == 0))		{			Settings.C4 = !Settings.ForceNoC4;		}				if(Settings.SETA&&Settings.SETA!=ST_018)		{			SetaDSPMap();		}		else if (Settings.SuperFX)		{			//::SRAM = ROM + 1024 * 1024 * 4;			SuperFXROMMap ();			Settings.MultiPlayer5Master = FALSE;			//Settings.MouseMaster = FALSE;			//Settings.SuperScopeMaster = FALSE;			Settings.DSP1Master = FALSE;			Settings.SA1 = FALSE;			Settings.C4 = FALSE;			Settings.SDD1 = FALSE;		}		else if (Settings.ForceSA1 ||			(!Settings.ForceNoSA1 && (ROMSpeed & ~0x10) == 0x23 && 			(ROMType & 0xf) > 3 && (ROMType & 0xf0) == 0x30))		{			Settings.SA1 = TRUE;//			Settings.MultiPlayer5Master = FALSE;			//Settings.MouseMaster = FALSE;			//Settings.SuperScopeMaster = FALSE;			Settings.DSP1Master = FALSE;			Settings.C4 = FALSE;			Settings.SDD1 = FALSE;			SA1ROMMap ();		}		else if ((ROMSpeed & ~0x10) == 0x25)			TalesROMMap (Interleaved);		else if(ExtendedFormat!=NOPE)			JumboLoROMMap(Interleaved);		else if (strncmp ((char *) &Memory.ROM [0x7fc0], "SOUND NOVEL-TCOOL", 17) == 0 ||			strncmp ((char *) &Memory.ROM [0x7fc0], "DERBY STALLION 96", 17) == 0)		{			LoROM24MBSMap ();			Settings.DSP1Master = FALSE;		}		else if (strncmp ((char *) &Memory.ROM [0x7fc0], "THOROUGHBRED BREEDER3", 21) == 0 ||			strncmp ((char *) &Memory.ROM [0x7fc0], "RPG-TCOOL 2", 11) == 0)		{			SRAM512KLoROMMap ();			Settings.DSP1Master = FALSE;		}		else if (strncmp ((char *) &Memory.ROM [0x7fc0], "ADD-ON BASE CASSETE", 19) == 0)		{			Settings.MultiPlayer5Master = FALSE;			Settings.MouseMaster = FALSE;			Settings.SuperScopeMaster = FALSE;			Settings.DSP1Master = FALSE;			SufamiTurboLoROMMap(); 			Memory.SRAMSize = 3;		}		else if ((ROMSpeed & ~0x10) == 0x22 &&			strncmp (ROMName, "Super Street Fighter", 20) != 0)		{			AlphaROMMap ();		}		else if (Settings.BS)			BSLoROMMap();		else LoROMMap ();    }	if(Settings.BS)	{		ROMRegion=0;	}	uint32 sum1 = 0;	uint32 sum2 = 0;	if(0==CalculatedChecksum)	{		int power2 = 0;		int size = CalculatedSize;				while (size >>= 1)			power2++;			size = 1 << power2;		uint32 remainder = CalculatedSize - size;				int i;			for (i = 0; i < size; i++)			sum1 += ROM [i];			for (i = 0; i < (int) remainder; i++)			sum2 += ROM [size + i];			int sub = 0;		if (Settings.BS&& ROMType!=0xE5)		{			if (Memory.HiROM)			{				for (i = 0; i < 48; i++)					sub += ROM[0xffb0 + i];			}			else if (Memory.LoROM)			{				for (i = 0; i < 48; i++)					sub += ROM[0x7fb0 + i];			}			sum1 -= sub;		}	    if (remainder)    		{				sum1 += sum2 * (size / remainder);    		}		    sum1 &= 0xffff;    Memory.CalculatedChecksum=sum1;	}    //now take a CRC32    ROMCRC32 = caCRC32(ROM, CalculatedSize);	if (Settings.ForceNTSC)		Settings.PAL = FALSE;    else if (Settings.ForcePAL)		Settings.PAL = TRUE;	else	{		//Korea refers to South Korea, which uses NTSC		switch(ROMRegion)		{			case 13:			case 1:			case 0:				Settings.PAL=FALSE;				break;			default: Settings.PAL=TRUE;				break;		}	}	if (Settings.PAL)	{		Settings.FrameTime = Settings.FrameTimePAL;		Memory.ROMFramesPerSecond = 50;	}	else	{		Settings.FrameTime = Settings.FrameTimeNTSC;		Memory.ROMFramesPerSecond = 60;	}		ROMName[ROM_NAME_LEN - 1] = 0;	if (strlen (ROMName))	{		char *p = ROMName + strlen (ROMName) - 1;				while (p > ROMName && *(p - 1) == ' ')			p--;		*p = 0;	}		{		SRAMMask = Memory.SRAMSize ?			((1 << (Memory.SRAMSize + 3)) * 128) - 1 : 0;	}	if((ROMChecksum + ROMComplementChecksum != 0xffff) || ROMChecksum != CalculatedChecksum || ((uint32)CalculatedSize > (uint32)(((1<<(ROMSize-7))*128)*1024)))	{		if(Settings.DisplayColor==0xffff || Settings.DisplayColor!=BUILD_PIXEL(31,0,0))		{			Settings.DisplayColor=BUILD_PIXEL(31,31,0);			SET_UI_COLOR(255,255,0);		}	}		IAPU.OneCycle = ONE_APU_CYCLE;	Settings.Shutdown = Settings.ShutdownMaster;		SetDSP=&DSP1SetByte;	GetDSP=&DSP1GetByte;	ResetSpeedMap();	ApplyROMFixes ();	// zones: mac specific begin	extern char	gMacRomName[ROM_NAME_LEN];	strcpy(gMacRomName, ROMName);	// zones: end	sprintf (ROMName, "%s", Safe (ROMName));	sprintf (ROMId, "%s", Safe (ROMId));	sprintf (CompanyId, "%s", Safe (CompanyId));			sprintf (String, "\"%s\" [%s] %s, %s, Type: %s, Mode: %s, TV: %s, S-RAM: %s, ROMId: %s Company: %2.2s CRC32: %08X",		ROMName,		(ROMChecksum + ROMComplementChecksum != 0xffff ||		ROMChecksum != CalculatedChecksum) ? "bad checksum" : "checksum ok",		MapType (),		Size (),		KartContents (),		MapMode (),		TVStandard (),		StaticRAMSize (),		ROMId,		CompanyId,		ROMCRC32);		S9xMessage (S9X_INFO, S9X_ROM_INFO, String);#ifdef __WIN32__	#ifndef _XBOX		EnableMenuItem(GUI.hMenu, IDM_ROM_INFO, MF_ENABLED);	#endif	#ifdef RTC_DEBUGGER		if(Settings.SPC7110RTC)

⌨️ 快捷键说明

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