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

📄 memmap.cpp

📁 SFC游戏模拟器 snes9x 1.43 的原代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}void CMemory::FreeSDD1Data (){    if (SDD1Index)    {		free ((char *) SDD1Index);		SDD1Index = NULL;    }    if (SDD1Data)    {		free ((char *) SDD1Data);		SDD1Data = NULL;    }}/**********************************************************************************************//* LoadROM()                                                                                  *//* This function loads a Snes-Backup image                                                    *//**********************************************************************************************/bool8 CMemory::LoadROM (const char *filename){    int32 TotalFileSize = 0;    bool8 Interleaved = FALSE;    bool8 Tales = FALSE; 	uint8* RomHeader=ROM;		ExtendedFormat=NOPE; 	if(CleanUp7110!=NULL)		(*CleanUp7110)();	    memset (&SNESGameFixes, 0, sizeof(SNESGameFixes));    SNESGameFixes.SRAMInitialValue = 0x60;	    memset (bytes0x2000, 0, 0x2000);    CPU.TriedInterleavedMode2 = FALSE;	    CalculatedSize = 0;	retry_count =0;again:	Settings.DisplayColor=0xffff;	SET_UI_COLOR(255,255,255);	TotalFileSize = FileLoader(ROM, filename, MAX_ROM_SIZE);	if (!TotalFileSize)		return FALSE;		// it ends here	else if(!Settings.NoPatch)		CheckForIPSPatch (filename, HeaderCount != 0, TotalFileSize);	//fix hacked games here.	if((strncmp("HONKAKUHA IGO GOSEI", (char*)&ROM[0x7FC0],19)==0)&&(ROM[0x7FD5]!=0x31))	{		ROM[0x7FD5]=0x31;		ROM[0x7FD6]=0x02;		Settings.DisplayColor=BUILD_PIXEL(31,0,0);		SET_UI_COLOR(255,0,0);		S9xMessage(S9X_ERROR,S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!");	}	if((strncmp("HONKAKUHA IGO GOSEI", (char*)&ROM[0xFFC0],19)==0)&&(ROM[0xFFD5]!=0x31))	{		ROM[0xFFD5]=0x31;		ROM[0xFFD6]=0x02;		Settings.DisplayColor=BUILD_PIXEL(31,0,0);		SET_UI_COLOR(255,0,0);		S9xMessage(S9X_ERROR,S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!");	}	if((ROM[0x7FD5]==0x42)&&(ROM[0x7FD6]==0x13)&&(strncmp("METAL COMBAT",(char*)&ROM[0x7FC0],12)==0))	{		Settings.DisplayColor=BUILD_PIXEL(31,0,0);		SET_UI_COLOR(255,0,0);		S9xMessage(S9X_ERROR,S9X_ROM_CONFUSING_FORMAT_INFO, "Warning! Hacked Dump!");	}    int orig_hi_score, orig_lo_score;    int hi_score, lo_score;	    orig_hi_score = hi_score = ScoreHiROM (FALSE);    orig_lo_score = lo_score = ScoreLoROM (FALSE);        if (HeaderCount == 0 && !Settings.ForceNoHeader &&		((hi_score > lo_score && ScoreHiROM (TRUE) > hi_score) ||		(hi_score <= lo_score && ScoreLoROM (TRUE) > lo_score)))    {		memmove (Memory.ROM, Memory.ROM + 512, TotalFileSize - 512);		TotalFileSize -= 512;		S9xMessage (S9X_INFO, S9X_HEADER_WARNING, 			"Try specifying the -nhd command line option if the game doesn't work\n");		//modifying ROM, so we need to rescore		orig_hi_score = hi_score = ScoreHiROM (FALSE);		orig_lo_score = lo_score = ScoreLoROM (FALSE);    }	    CalculatedSize = (TotalFileSize / 0x2000) * 0x2000;    ZeroMemory (ROM + CalculatedSize, MAX_ROM_SIZE - CalculatedSize);		if(CalculatedSize >0x400000&&		!(ROM[0x7FD5]==0x32&&((ROM[0x7FD6]&0xF0)==0x40)) && //exclude S-DD1		!(ROM[0xFFD5]==0x3A&&((ROM[0xFFD6]&0xF0)==0xF0))) //exclude SPC7110	{		//you might be a Jumbo!		ExtendedFormat=YEAH;	}	//If both vectors are invalid, it's type 1 LoROM	if(ExtendedFormat==NOPE&&((ROM[0x7FFC]|(ROM[0x7FFD]<<8))<0x8000)&&((ROM[0xFFFC]|(ROM[0xFFFD]<<8)) <0x8000))	{		if(Settings.DisplayColor==0xffff)		{			Settings.DisplayColor=BUILD_PIXEL(0,31,0);			SET_UI_COLOR(0,255,0);		}		if(!Settings.ForceInterleaved)			S9xDeinterleaveType1(TotalFileSize, ROM);	}	//CalculatedSize is now set, so rescore	orig_hi_score = hi_score = ScoreHiROM (FALSE);	orig_lo_score = lo_score = ScoreLoROM (FALSE);	if(NOPE!=ExtendedFormat)	{		int loromscore, hiromscore, swappedlorom, swappedhirom;		loromscore=ScoreLoROM(FALSE);		hiromscore=ScoreHiROM(FALSE);		swappedlorom=ScoreLoROM(FALSE, 0x400000);		swappedhirom=ScoreHiROM(FALSE, 0x400000);		//set swapped here.		if(max(swappedlorom, swappedhirom) >= max(loromscore, hiromscore))		{			ExtendedFormat = BIGFIRST;			hi_score=swappedhirom;			lo_score=swappedlorom;			RomHeader=ROM+0x400000;		}		else		{			ExtendedFormat = SMALLFIRST;			lo_score=loromscore;			hi_score=hiromscore;			RomHeader=ROM;		}	}    Interleaved = Settings.ForceInterleaved || Settings.ForceInterleaved2;    if (Settings.ForceLoROM || (!Settings.ForceHiROM && lo_score >= hi_score))    {		LoROM = TRUE;		HiROM = FALSE;				// Ignore map type byte if not 0x2x or 0x3x		if ((RomHeader [0x7fd5] & 0xf0) == 0x20 || (RomHeader [0x7fd5] & 0xf0) == 0x30)		{			switch (RomHeader [0x7fd5] & 0xf)			{			case 1:				Interleaved = TRUE;				break;			case 5:				Interleaved = TRUE;				Tales = TRUE;				break;			}		}    }    else    {		if ((RomHeader [0xffd5] & 0xf0) == 0x20 || (RomHeader [0xffd5] & 0xf0) == 0x30)		{			switch (RomHeader [0xffd5] & 0xf)			{			case 0:			case 3:				Interleaved = TRUE;				break;			}		}		LoROM = FALSE;		HiROM = TRUE;    }	    // More     if (!Settings.ForceHiROM && !Settings.ForceLoROM &&		!Settings.ForceInterleaved && !Settings.ForceInterleaved2 &&		!Settings.ForceNotInterleaved && !Settings.ForcePAL &&		!Settings.ForceSuperFX && !Settings.ForceDSP1 &&		!Settings.ForceSA1 && !Settings.ForceC4 &&		!Settings.ForceSDD1)    {#ifdef DETECT_NASTY_FX_INTERLEAVE//MK: Damn. YI trips a BRK currently. Maybe even on a real cart.#ifdef LSB_FIRST 		if(strncmp((char *) &ROM [0x7fc0], "YOSHI'S ISLAND", 14) == 0&&(*(uint16*)&ROM[0x7FDE])==57611&&ROM[0x10002]==0xA9)#else			if(strncmp((char *) &ROM [0x7fc0], "YOSHI'S ISLAND", 14) == 0&&(ROM[0x7FDE]+(ROM[0x7FDF]<<8))==57611&&ROM[0x10002]==0xA9)#endif		{			Interleaved=true;			Settings.ForceInterleaved2=true;		}#endif		if (strncmp ((char *) &ROM [0x7fc0], "YUYU NO QUIZ DE GO!GO!", 22) == 0)		{			LoROM = TRUE;			HiROM = FALSE;			Interleaved = FALSE;		}    }	    if (!Settings.ForceNotInterleaved && Interleaved)    {		CPU.TriedInterleavedMode2 = TRUE;		S9xMessage (S9X_INFO, S9X_ROM_INTERLEAVED_INFO,			"ROM image is in interleaved format - converting...");				if (Tales)		{			if(Memory.ExtendedFormat==BIGFIRST)			{				S9xDeinterleaveType1(0x400000, ROM);				S9xDeinterleaveType1(CalculatedSize-0x400000, ROM+0x400000);			}			else			{				S9xDeinterleaveType1(CalculatedSize-0x400000, ROM);				S9xDeinterleaveType1(0x400000, ROM+CalculatedSize-0x400000);							}						LoROM = FALSE;			HiROM = TRUE;								}		else if (Settings.ForceInterleaved2)		{			S9xDeinterleaveType2(FALSE);		}		else if (Settings.ForceInterleaveGD24 && CalculatedSize ==0x300000)		{			bool8 t = LoROM;						LoROM = HiROM;			HiROM = t;			S9xDeinterleaveGD24(CalculatedSize, ROM);		}		else		{			if(Settings.DisplayColor==0xffff)			{				Settings.DisplayColor=BUILD_PIXEL(0,31,0);				SET_UI_COLOR(0,255,0);			}			bool8 t = LoROM;						LoROM = HiROM;			HiROM = t;						S9xDeinterleaveType1(CalculatedSize, ROM);		}		hi_score = ScoreHiROM (FALSE);		lo_score = ScoreLoROM (FALSE);				if ((HiROM &&			(lo_score >= hi_score || hi_score < 0)) ||			(LoROM && 			(hi_score > lo_score || lo_score < 0)))		{			if (retry_count == 0)			{				S9xMessage (S9X_INFO, S9X_ROM_CONFUSING_FORMAT_INFO,					"ROM lied about its type! Trying again.");				Settings.ForceNotInterleaved = TRUE;				Settings.ForceInterleaved = FALSE;				retry_count++;				goto again;			}		}    }	if(ExtendedFormat==SMALLFIRST)		Tales=true;    FreeSDD1Data ();    InitROM (Tales);    S9xLoadCheatFile (S9xGetFilename(".cht"));    S9xInitCheatData ();	S9xApplyCheats ();	    S9xReset ();	    return (TRUE);}uint32 CMemory::FileLoader (uint8* buffer, const char* filename, int32 maxsize){ 	STREAM ROMFile;	int32 TotalFileSize = 0;	int len = 0;	int nFormat=FILE_DEFAULT; 	char dir [_MAX_DIR + 1];    char drive [_MAX_DRIVE + 1];    char name [_MAX_FNAME + 1];    char ext [_MAX_EXT + 1];    char fname [_MAX_PATH + 1];	unsigned long FileSize = 0;#ifdef UNZIP_SUPPORT	unzFile file=NULL;#endif    	_splitpath (filename, drive, dir, name, ext);    _makepath (fname, drive, dir, name, ext);	#if defined(__WIN32__) || defined(__MACOSX__)    memmove (&ext [0], &ext[1], 4);#endif	if (strcasecmp (ext, "zip") == 0)		nFormat = FILE_ZIP;	else if (strcasecmp (ext, "rar") == 0)		nFormat = FILE_RAR;	else if (strcasecmp (ext, "jma") == 0)		nFormat = FILE_JMA;		else		nFormat = FILE_DEFAULT;	switch( nFormat )	{	case FILE_ZIP:#ifdef UNZIP_SUPPORT		file = unzOpen(fname);		if(file != NULL)			{						// its a valid ZIP, close it and let LoadZIP handle it.			unzClose(file);					if (!LoadZip (fname, &TotalFileSize, &HeaderCount, ROM))				return (0);					strcpy (ROMFilename, fname);		}		else		{			// its a bad zip file. Walk away		 	S9xMessage (S9X_ERROR, S9X_ROM_INFO, "Invalid Zip Archive.");			return (0);		}#else		S9xMessage (S9X_ERROR, S9X_ROM_INFO, "This binary was not created with Zip support.");		return (0);#endif		break;	case FILE_JMA:        {#ifdef JMA_SUPPORT                size_t FileSize = load_jma_file(fname, ROM);				if (!FileSize)		{		 	S9xMessage (S9X_ERROR, S9X_ROM_INFO, "Invalid JMA.");			return (0);		}				TotalFileSize = FileSize;		HeaderCount = 0;				size_t calc_size = (FileSize / 0x2000) * 0x2000;						if ((FileSize - calc_size == 512 && !Settings.ForceNoHeader) ||			Settings.ForceHeader)		{			memmove (ROM, ROM + 512, calc_size);			HeaderCount = 1;			FileSize -= 512;		}		strcpy (ROMFilename, fname);#else		S9xMessage (S9X_ERROR, S9X_ROM_INFO, "This binary was not created with JMA support.");		return (0);#endif		break;	}				case FILE_RAR:		// non existant rar loading		S9xMessage (S9X_ERROR, S9X_ROM_INFO, "Rar Archives are not currently supported.");		return (0);		break;	case FILE_DEFAULT:	default:		// any other roms go here		if ((ROMFile = OPEN_STREAM (fname, "rb")) == NULL)			return (0);				strcpy (ROMFilename, fname);				HeaderCount = 0;		uint8 *ptr = buffer;		bool8 more = FALSE;				do		{			FileSize = READ_STREAM (ptr, maxsize + 0x200 - (ptr - ROM), ROMFile);			CLOSE_STREAM (ROMFile);						int calc_size = (FileSize / 0x2000) * 0x2000;					if ((FileSize - calc_size == 512 && !Settings.ForceNoHeader) ||				Settings.ForceHeader)			{				memmove (ptr, ptr + 512, calc_size);				HeaderCount++;				FileSize -= 512;			}						ptr += FileSize;			TotalFileSize += FileSize;					// check for multi file roms			if (ptr - ROM < maxsize + 0x200 &&				(isdigit (ext [0]) && ext [1] == 0 && ext [0] < '9'))			{				more = TRUE;				ext [0]++;#if defined(__WIN32__) || defined(__MACOSX__)		        memmove (&ext [1], &ext [0], 4);			    ext [0] = '.';#endif				_makepath (fname, drive, dir, name, ext);			}			else if (ptr - ROM < maxsize + 0x200 &&					(((len = strlen (name)) == 7 || len == 8) &&					strncasecmp (name, "sf", 2) == 0 &&					isdigit (name [2]) && isdigit (name [3]) && isdigit (name [4]) &&					isdigit (name [5]) && isalpha (name [len - 1])))			{				more = TRUE;				name [len - 1]++;#if defined(__WIN32__) || defined(__MACOSX__)				memmove (&ext [1], &ext [0], 4);				ext [0] = '.';#endif				_makepath (fname, drive, dir, name, ext);			}			else				more = FALSE;		} while (more && (ROMFile = OPEN_STREAM (fname, "rb")) != NULL);    		break;	}     if (HeaderCount == 0)		S9xMessage (S9X_INFO, S9X_HEADERS_INFO, "No ROM file header found.");    else    {		if (HeaderCount == 1)			S9xMessage (S9X_INFO, S9X_HEADERS_INFO,			"Found ROM file header (and ignored it).");		else			S9xMessage (S9X_INFO, S9X_HEADERS_INFO,			"Found multiple ROM file headers (and ignored them).");    }			return TotalFileSize;}#if 0/**********************************************************************************************//* LoadMulti()                                                                                *//* This function loads a Slotted SNES-Backup image and fills the slot.                        *//**********************************************************************************************/bool8 CMemory::LoadMulti (const char *basename, const char *slot1name, const char *slot2name){    unsigned long FileSize = 0;		if(*basename=='\0')		return FALSE;		SufamiTurbo=TRUE;		int32 offset;    memset (&SNESGameFixes, 0, sizeof(SNESGameFixes));    SNESGameFixes.SRAMInitialValue = 0x60;	    memset (bytes0x2000, 0, 0x2000);	    CalculatedSize = 0;		Settings.DisplayColor=0xffff;	SET_UI_COLOR(255,255,255);	    int32 TotalFileSize = FileLoader(ROM, basename, MAX_ROM_SIZE);		if(0== TotalFileSize)		return FALSE;	else CheckForIPSPatch (basename, HeaderCount != 0, TotalFileSize);		CalculatedSize=TotalFileSize;

⌨️ 快捷键说明

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