📄 memmap.cpp
字号:
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 + -