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

📄 memmap.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    ZeroMemory (BlockIsROM, MEMMAP_NUM_BLOCKS);    ::SRAM = SRAM;    memset (ROMId, 0, 5);    memset (CompanyId, 0, 3);    if (Memory.HiROM)    {	Memory.SRAMSize = ROM [0xffd8];	strncpy (ROMName, (char *) &ROM[0xffc0], ROM_NAME_LEN - 1);	ROMSpeed = ROM [0xffd5];	ROMType = ROM [0xffd6];	ROMSize = ROM [0xffd7];	ROMChecksum = ROM [0xffde] + (ROM [0xffdf] << 8);	ROMComplementChecksum = ROM [0xffdc] + (ROM [0xffdd] << 8);		memmove (ROMId, &ROM [0xffb2], 4);	memmove (CompanyId, &ROM [0xffb0], 2);	// Try to auto-detect the DSP1 chip	if (!Settings.ForceNoDSP1 &&	    (ROMType & 0xf) >= 3 && (ROMType & 0xf0) == 0)	    Settings.DSP1Master = TRUE;	Settings.SDD1 = Settings.ForceSDD1;	if ((ROMType & 0xf0) == 0x40)	    Settings.SDD1 = !Settings.ForceNoSDD1;	if (Settings.BS)	    BSHiROMMap ();	else	if ((ROMSpeed & ~0x10) == 0x25)	    TalesROMMap (Interleaved);	else 	if ((ROMSpeed & ~0x10) == 0x22 &&	    strncmp (ROMName, "Super Street Fighter", 20) != 0)	{	    AlphaROMMap ();	}	else	    HiROMMap ();    }    else    {	Memory.HiROM = FALSE;	Memory.SRAMSize = ROM [0x7fd8];	ROMSpeed = ROM [0x7fd5];	ROMType = ROM [0x7fd6];	ROMSize = ROM [0x7fd7];	ROMChecksum = ROM [0x7fde] + (ROM [0x7fdf] << 8);	ROMComplementChecksum = ROM [0x7fdc] + (ROM [0x7fdd] << 8);	memmove (ROMId, &ROM [0x7fb2], 4);	memmove (CompanyId, &ROM [0x7fb0], 2);	strncpy (ROMName, (char *) &ROM[0x7fc0], ROM_NAME_LEN - 1);	Settings.SuperFX = Settings.ForceSuperFX;	if ((ROMType & 0xf0) == 0x10)	    Settings.SuperFX = !Settings.ForceNoSuperFX;	// Try to auto-detect the DSP1 chip	if (!Settings.ForceNoDSP1 &&	    (ROMType & 0xf) >= 3 && (ROMType & 0xf0) == 0)	    Settings.DSP1Master = TRUE;	Settings.SDD1 = Settings.ForceSDD1;	if ((ROMType & 0xf0) == 0x40)	    Settings.SDD1 = !Settings.ForceNoSDD1;	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.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 (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], "DEZAEMON  ", 10) == 0)	{	    Settings.DSP1Master = FALSE;	    SRAM1024KLoROMMap ();	}	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	    LoROMMap ();    }    int power2 = 0;    int size = CalculatedSize;    while (size >>= 1)	power2++;    size = 1 << power2;    uint32 remainder = CalculatedSize - size;    uint32 sum1 = 0;    uint32 sum2 = 0;    int i;    for (i = 0; i < size; i++)	sum1 += ROM [i];    for (i = 0; i < (int) remainder; i++)	sum2 += ROM [size + i];    if (remainder)	sum1 += sum2 * (size / remainder);    sum1 &= 0xffff;    if (Settings.ForceNTSC)	Settings.PAL = FALSE;    else    if (Settings.ForcePAL)	Settings.PAL = TRUE;    else    if (Memory.HiROM)	// Country code	Settings.PAL = ROM [0xffd9] >= 2;    else	Settings.PAL = ROM [0x7fd9] >= 2;        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;    }    if (Settings.SuperFX)    {	SRAMMask = 0xffff;	Memory.SRAMSize = 16;    }    else    {	SRAMMask = Memory.SRAMSize ?		    ((1 << (Memory.SRAMSize + 3)) * 128) - 1 : 0;    }    IAPU.OneCycle = ONE_APU_CYCLE;    Settings.Shutdown = Settings.ShutdownMaster;    ApplyROMFixes ();    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",	     ROMName,	     (ROMChecksum + ROMComplementChecksum != 0xffff ||	      ROMChecksum != sum1) ? "bad checksum" : "checksum ok",	     MapType (),	     Size (),	     KartContents (),	     MapMode (),	     TVStandard (),	     StaticRAMSize (),	     ROMId,	     CompanyId);    S9xMessage (S9X_INFO, S9X_ROM_INFO, String);}bool8 CMemory::LoadSRAM (const char *filename){    int size = Memory.SRAMSize ?	       (1 << (Memory.SRAMSize + 3)) * 128 : 0;    memset (SRAM, 0x60, 0x20000);    if (size > 0x20000)	size = 0x20000;        if (size)    {	FILE *file;	if ((file = fopen (filename, "rb")))	{	    int len = fread ((char*) ::SRAM, 1, 0x20000, file);	    fclose (file);	    if (len - size == 512)	    {		// S-RAM file has a header - remove it		memmove (::SRAM, ::SRAM + 512, size);	    }	    if (len == size + SRTC_SRAM_PAD)	    {		S9xSRTCPostLoadState ();		S9xResetSRTC ();		rtc.index = -1;		rtc.mode = MODE_READ;	    }	    else		S9xHardResetSRTC ();	    return (TRUE);	}	S9xHardResetSRTC ();	return (FALSE);    }    return (TRUE);}bool8 CMemory::SaveSRAM (const char *filename){    int size = Memory.SRAMSize ?	       (1 << (Memory.SRAMSize + 3)) * 128 : 0;    if (Settings.SRTC)    {	size += SRTC_SRAM_PAD;	S9xSRTCPreSaveState ();    }    if (size > 0x20000)	size = 0x20000;    if (size && *Memory.ROMFilename)    {	FILE *file;	if ((file = fopen (filename, "wb")))	{	    fwrite ((char *) ::SRAM, size, 1, file);	    fclose (file);#if defined(__linux)	    chown (filename, getuid (), getgid ());#endif	    return (TRUE);	}	return (FALSE);    }    return (TRUE);}void CMemory::FixROMSpeed (){    int c;    for (c = 0x800; c < 0x1000; c++)    {	if (BlockIsROM [c])	    MemorySpeed [c] = (uint8) CPU.FastROMSpeed;    }}void CMemory::WriteProtectROM (){    memmove ((void *) WriteMap, (void *) Map, sizeof (Map));    for (int c = 0; c < 0x1000; c++)    {	if (BlockIsROM [c])	    WriteMap [c] = (uint8 *) MAP_NONE;    }}void CMemory::MapRAM (){    int c;    // Banks 7e->7f, RAM    for (c = 0; c < 16; c++)    {	Map [c + 0x7e0] = RAM;	Map [c + 0x7f0] = RAM + 0x10000;	BlockIsRAM [c + 0x7e0] = TRUE;	BlockIsRAM [c + 0x7f0] = TRUE;	BlockIsROM [c + 0x7e0] = FALSE;	BlockIsROM [c + 0x7f0] = FALSE;    }    // Banks 70->77, S-RAM    for (c = 0; c < 0x80; c++)    {	Map [c + 0x700] = (uint8 *) MAP_LOROM_SRAM;	BlockIsRAM [c + 0x700] = TRUE;	BlockIsROM [c + 0x700] = FALSE;    }}void CMemory::MapExtraRAM (){    int c;    // Banks 7e->7f, RAM    for (c = 0; c < 16; c++)    {	Map [c + 0x7e0] = RAM;	Map [c + 0x7f0] = RAM + 0x10000;	BlockIsRAM [c + 0x7e0] = TRUE;	BlockIsRAM [c + 0x7f0] = TRUE;	BlockIsROM [c + 0x7e0] = FALSE;	BlockIsROM [c + 0x7f0] = FALSE;    }    // Banks 70->73, S-RAM    for (c = 0; c < 16; c++)    {	Map [c + 0x700] = ::SRAM;	Map [c + 0x710] = ::SRAM + 0x8000;	Map [c + 0x720] = ::SRAM + 0x10000;	Map [c + 0x730] = ::SRAM + 0x18000;	BlockIsRAM [c + 0x700] = TRUE;	BlockIsROM [c + 0x700] = FALSE;	BlockIsRAM [c + 0x710] = TRUE;	BlockIsROM [c + 0x710] = FALSE;	BlockIsRAM [c + 0x720] = TRUE;	BlockIsROM [c + 0x720] = FALSE;	BlockIsRAM [c + 0x730] = TRUE;	BlockIsROM [c + 0x730] = FALSE;    }}void CMemory::LoROMMap (){    int c;    int i;    // Banks 00->3f and 80->bf    for (c = 0; c < 0x400; c += 16)    {	Map [c + 0] = Map [c + 0x800] = RAM;	Map [c + 1] = Map [c + 0x801] = RAM;	BlockIsRAM [c + 0] = BlockIsRAM [c + 0x800] = TRUE;	BlockIsRAM [c + 1] = BlockIsRAM [c + 0x801] = TRUE;	Map [c + 2] = Map [c + 0x802] = (uint8 *) MAP_PPU;	Map [c + 3] = Map [c + 0x803] = (uint8 *) MAP_PPU;	Map [c + 4] = Map [c + 0x804] = (uint8 *) MAP_CPU;	Map [c + 5] = Map [c + 0x805] = (uint8 *) MAP_CPU;	if (Settings.DSP1Master)	{	    Map [c + 6] = Map [c + 0x806] = (uint8 *) MAP_DSP;	    Map [c + 7] = Map [c + 0x807] = (uint8 *) MAP_DSP;	}	else	if (Settings.C4)	{	    Map [c + 6] = Map [c + 0x806] = (uint8 *) MAP_C4;	    Map [c + 7] = Map [c + 0x807] = (uint8 *) MAP_C4;	}	else	{	    Map [c + 6] = Map [c + 0x806] = (uint8 *) bytes256 - 0x6000;	    Map [c + 7] = Map [c + 0x807] = (uint8 *) bytes256 - 0x7000;	}	for (i = c + 8; i < c + 16; i++)	{	    Map [i] = Map [i + 0x800] = &ROM [c << 11] - 0x8000;	    BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE;	}	for (i = c; i < c + 16; i++)	{	    int ppu = i & 15;	    	    MemorySpeed [i] = 		MemorySpeed [i + 0x800] = ppu >= 2 && ppu <= 3 ? ONE_CYCLE : 8;	}    }    if (Settings.DSP1Master)    {	// Banks 30->3f and b0->bf	for (c = 0x300; c < 0x400; c += 16)	{	    for (i = c + 8; i < c + 16; i++)	    {		Map [i] = Map [i + 0x800] = (uint8 *) MAP_DSP;		BlockIsROM [i] = BlockIsROM [i + 0x800] = FALSE;	    }	}    }    // Banks 40->7f and c0->ff    for (c = 0; c < 0x400; c += 16)    {	for (i = c; i < c + 8; i++)	    Map [i + 0x400] = Map [i + 0xc00] = &ROM [(c << 11) ];	for (i = c + 8; i < c + 16; i++)	    Map [i + 0x400] = Map [i + 0xc00] = &ROM [(c << 11) + 0x200000 - 0x8000];	for (i = c; i < c + 16; i++)	{	    MemorySpeed [i + 0x400] = MemorySpeed [i + 0xc00] = 8;	    BlockIsROM [i + 0x400] = BlockIsROM [i + 0xc00] = TRUE;	}    }    if (Settings.DSP1Master)    {	for (c = 0; c < 0x100; c++)	{	    Map [c + 0xe00] = (uint8 *) MAP_DSP;	    MemorySpeed [c + 0xe00] = 8;	    BlockIsROM [c + 0xe00] = FALSE;	}    }    MapRAM ();    WriteProtectROM ();}void CMemory::HiROMMap (){    int c;    int i;    // Banks 00->3f and 80->bf    for (c = 0; c < 0x400; c += 16)    {	Map [c + 0] = Map [c + 0x800] = RAM;	BlockIsRAM [c + 0] = BlockIsRAM [c + 0x800] = TRUE;	Map [c + 1] = Map [c + 0x801] = RAM;	BlockIsRAM [c + 1] = BlockIsRAM [c + 0x801] = TRUE;	Map [c + 2] = Map [c + 0x802] = (uint8 *) MAP_PPU;	Map [c + 3] = Map [c + 0x803] = (uint8 *) MAP_PPU;	Map [c + 4] = Map [c + 0x804] = (uint8 *) MAP_CPU;	Map [c + 5] = Map [c + 0x805] = (uint8 *) MAP_CPU;	if (Settings.DSP1Master)	{	    Map [c + 6] = Map [c + 0x806] = (uint8 *) MAP_DSP;	    Map [c + 7] = Map [c + 0x807] = (uint8 *) MAP_DSP;	}	else	{	    Map [c + 6] = Map [c + 0x806] = (uint8 *) MAP_NONE;	    Map [c + 7] = Map [c + 0x807] = (uint8 *) MAP_NONE;	}	    	for (i = c + 8; i < c + 16; i++)	{	    Map [i] = Map [i + 0x800] = &ROM [(c << 12) % CalculatedSize];	    BlockIsROM [i] = BlockIsROM [i + 0x800] = TRUE;	}	for (i = c; i < c + 16; i++)	{	    int ppu = i & 15;	    	    MemorySpeed [i] = 		MemorySpeed [i + 0x800] = ppu >= 2 && ppu <= 3 ? ONE_CYCLE : 8;	}    }    // Banks 30->3f and b0->bf, address ranges 6000->7fff is S-RAM.    for (c = 0; c < 16; c++)    {	Map [0x306 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM;	Map [0x307 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM;	Map [0xb06 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM;	Map [0xb07 + (c << 4)] = (uint8 *) MAP_HIROM_SRAM;	BlockIsRAM [0x306 + (c << 4)] = TRUE;	BlockIsRAM [0x307 + (c << 4)] = TRUE;	BlockIsRAM [0xb06 + (c << 4)] = TRUE;	BlockIsRAM [0xb07 + (c << 4)] = TRUE;    }    // Banks 40->7f and c0->ff    for (c = 0; c < 0x400; c += 16)    {	for (i = c; i < c + 16; i++)	{	    Map [i + 0x400] = Map [i + 0xc00] = &ROM [(c << 12) % CalculatedSize];	    MemorySpeed [i + 0x400] = MemorySpeed [i + 0xc00] = 8;	    BlockIsROM [i + 0x400] = BlockIsROM [i + 0xc00] = TRUE;	}    }    MapRAM ();    WriteProtectROM ();}void CMemory::TalesROMMap (bool8 Interleaved){    int c;    int i;    uint32 OFFSET0 = 0x400000;    uint32 OFFSET1 = 0x400000;    uint32 OFFSET2 = 0x000000;    if (Interleaved)    {	OFFSET0 = 0x000000;	OFFSET1 = 0x000000;	OFFSET2 = 0x200000;    }    // Banks 00->3f and 80->bf    for (c = 0; c < 0x400; c += 16)    {	Map [c + 0] = Map [c + 0x800] = RAM;	Map [c + 1] = Map [c + 0x801] = RAM;	BlockIsRAM [c + 0] = BlockIsRAM [c + 0x800] = TRUE;	BlockIsRAM [c + 1] = BlockIsRAM [c + 0x801] = TRUE;	Map [c + 2] = Map [c + 0x802] = (uint8 *) MAP_PPU;

⌨️ 快捷键说明

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