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