diff --git a/Core/BaseLoader.h b/Core/BaseLoader.h
new file mode 100644
index 00000000..7adae777
--- /dev/null
+++ b/Core/BaseLoader.h
@@ -0,0 +1,22 @@
+#pragma once
+#include "stdafx.h"
+#include "MessageManager.h"
+
+class BaseLoader
+{
+protected:
+ bool _checkOnly;
+
+ void Log(string message)
+ {
+ if(!_checkOnly) {
+ MessageManager::Log(message);
+ }
+ }
+
+public:
+ BaseLoader(bool checkOnly = false)
+ {
+ _checkOnly = checkOnly;
+ }
+};
\ No newline at end of file
diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index 0888e1f6..f83f98d5 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -513,6 +513,7 @@
+
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index b1881104..536bcb4e 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -1360,6 +1360,9 @@
HdPacks
+
+ Nes\RomLoader
+
diff --git a/Core/FdsLoader.h b/Core/FdsLoader.h
index 08302744..d9872b00 100644
--- a/Core/FdsLoader.h
+++ b/Core/FdsLoader.h
@@ -8,8 +8,9 @@
#include "MessageManager.h"
#include "MapperFactory.h"
#include "GameDatabase.h"
+#include "BaseLoader.h"
-class FdsLoader
+class FdsLoader : public BaseLoader
{
private:
const size_t FdsDiskSideCapacity = 65500;
@@ -62,13 +63,17 @@ private:
if(biosFile) {
return vector(std::istreambuf_iterator(biosFile), {});
} else {
- MessageManager::SendNotification(ConsoleNotificationType::FdsBiosNotFound);
+ if(!_checkOnly) {
+ MessageManager::SendNotification(ConsoleNotificationType::FdsBiosNotFound);
+ }
}
}
return {};
}
public:
+ using BaseLoader::BaseLoader;
+
vector RebuildFdsFile(vector> diskData, bool needHeader)
{
vector output;
@@ -159,7 +164,7 @@ public:
}
//Setup default controllers
- if(EmulationSettings::CheckFlag(EmulationFlags::AutoConfigureInput)) {
+ if(!_checkOnly && EmulationSettings::CheckFlag(EmulationFlags::AutoConfigureInput)) {
GameDatabase::InitializeInputDevices("", GameSystem::FDS);
}
diff --git a/Core/NsfLoader.h b/Core/NsfLoader.h
index b5b864c8..1478460e 100644
--- a/Core/NsfLoader.h
+++ b/Core/NsfLoader.h
@@ -1,8 +1,9 @@
#pragma once
#include "stdafx.h"
#include "RomData.h"
+#include "BaseLoader.h"
-class NsfLoader
+class NsfLoader : public BaseLoader
{
private:
void Read(uint8_t* &data, uint8_t& dest)
@@ -51,27 +52,27 @@ protected:
}
//Log window output
- MessageManager::Log("[NSF] Region: " + string(header.Flags == 0x00 ? "NTSC" : (header.Flags == 0x01 ? "PAL" : "NTSC & PAL")));
+ Log("[NSF] Region: " + string(header.Flags == 0x00 ? "NTSC" : (header.Flags == 0x01 ? "PAL" : "NTSC & PAL")));
if(header.PlaySpeedNtsc > 0) {
- MessageManager::Log("[NSF] Play speed (NTSC): " + std::to_string(1000000.0 / (double)header.PlaySpeedNtsc) + " Hz");
+ Log("[NSF] Play speed (NTSC): " + std::to_string(1000000.0 / (double)header.PlaySpeedNtsc) + " Hz");
}
if(header.PlaySpeedPal > 0) {
- MessageManager::Log("[NSF] Play speed (PAL): " + std::to_string(1000000.0 / (double)header.PlaySpeedPal) + " Hz");
+ Log("[NSF] Play speed (PAL): " + std::to_string(1000000.0 / (double)header.PlaySpeedPal) + " Hz");
}
- MessageManager::Log("[NSF] Title: " + string(header.SongName));
- MessageManager::Log("[NSF] Artist: " + string(header.ArtistName));
- MessageManager::Log("[NSF] Copyright: " + string(header.CopyrightHolder));
- MessageManager::Log("[NSF] Ripper: " + string(header.RipperName));
+ Log("[NSF] Title: " + string(header.SongName));
+ Log("[NSF] Artist: " + string(header.ArtistName));
+ Log("[NSF] Copyright: " + string(header.CopyrightHolder));
+ Log("[NSF] Ripper: " + string(header.RipperName));
stringstream ss;
ss << "[NSF] Load Address: 0x" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << header.LoadAddress;
- MessageManager::Log(ss.str());
+ Log(ss.str());
ss = stringstream();
ss << "[NSF] Init Address: 0x" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << header.InitAddress;
- MessageManager::Log(ss.str());
+ Log(ss.str());
ss = stringstream();
ss << "[NSF] Play Address: 0x" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << header.PlayAddress;
- MessageManager::Log(ss.str());
+ Log(ss.str());
vector chips;
if(header.SoundChips & 0x01) {
@@ -104,8 +105,8 @@ protected:
ss << chips[i];
}
- MessageManager::Log("[NSF] Sound Chips: " + ss.str());
- MessageManager::Log("[NSF] ROM size: " + std::to_string(romData.PrgRom.size() / 1024) + " KB");
+ Log("[NSF] Sound Chips: " + ss.str());
+ Log("[NSF] ROM size: " + std::to_string(romData.PrgRom.size() / 1024) + " KB");
}
void InitHeader(NsfHeader& header)
@@ -119,6 +120,8 @@ protected:
}
public:
+ using BaseLoader::BaseLoader;
+
RomData LoadRom(vector& romFile)
{
RomData romData;
diff --git a/Core/NsfeLoader.h b/Core/NsfeLoader.h
index 43404cdd..2b577273 100644
--- a/Core/NsfeLoader.h
+++ b/Core/NsfeLoader.h
@@ -178,6 +178,8 @@ private:
}
public:
+ using NsfLoader::NsfLoader;
+
RomData LoadRom(vector& romFile)
{
RomData romData;
diff --git a/Core/RomLoader.cpp b/Core/RomLoader.cpp
index 30b7cff8..233fd0ec 100644
--- a/Core/RomLoader.cpp
+++ b/Core/RomLoader.cpp
@@ -35,35 +35,35 @@ bool RomLoader::LoadFile(string filename, vector &fileData)
string romName = FolderUtilities::GetFilename(filename, true);
uint32_t crc = CRC32::GetCRC(fileData.data(), fileData.size());
- MessageManager::Log("");
- MessageManager::Log("Loading rom: " + romName);
+ Log("");
+ Log("Loading rom: " + romName);
stringstream crcHex;
crcHex << std::hex << std::uppercase << std::setfill('0') << std::setw(8) << crc;
- MessageManager::Log("File CRC32: 0x" + crcHex.str());
+ Log("File CRC32: 0x" + crcHex.str());
if(memcmp(fileData.data(), "NES\x1a", 4) == 0) {
- iNesLoader loader;
+ iNesLoader loader(_checkOnly);
_romData = loader.LoadRom(fileData, nullptr);
} else if(memcmp(fileData.data(), "FDS\x1a", 4) == 0 || memcmp(fileData.data(), "\x1*NINTENDO-HVC*", 15) == 0) {
- FdsLoader loader;
+ FdsLoader loader(_checkOnly);
_romData = loader.LoadRom(fileData, _filename);
} else if(memcmp(fileData.data(), "NESM\x1a", 5) == 0) {
- NsfLoader loader;
+ NsfLoader loader(_checkOnly);
_romData = loader.LoadRom(fileData);
} else if(memcmp(fileData.data(), "NSFE", 4) == 0) {
- NsfeLoader loader;
+ NsfeLoader loader(_checkOnly);
_romData = loader.LoadRom(fileData);
} else if(memcmp(fileData.data(), "UNIF", 4) == 0) {
- UnifLoader loader;
+ UnifLoader loader(_checkOnly);
_romData = loader.LoadRom(fileData);
} else {
NESHeader header = {};
if(GameDatabase::GetiNesHeader(crc, header)) {
- MessageManager::Log("[DB] Headerless ROM file found - using game database data.");
+ Log("[DB] Headerless ROM file found - using game database data.");
iNesLoader loader;
_romData = loader.LoadRom(fileData, &header);
} else {
- MessageManager::Log("Invalid rom file.");
+ Log("Invalid rom file.");
_romData.Error = true;
}
}
@@ -100,7 +100,7 @@ string RomLoader::FindMatchingRomInFile(string filePath, HashInfo hashInfo)
shared_ptr reader = ArchiveReader::GetReader(filePath);
if(reader) {
for(string file : reader->GetFileList(VirtualFile::RomExtensions)) {
- RomLoader loader;
+ RomLoader loader(true);
vector fileData;
if(loader.LoadFile(filePath)) {
if(hashInfo.Crc32Hash == loader._romData.Crc32 || hashInfo.Sha1Hash.compare(loader._romData.Sha1) == 0) {
@@ -109,7 +109,7 @@ string RomLoader::FindMatchingRomInFile(string filePath, HashInfo hashInfo)
}
}
} else {
- RomLoader loader;
+ RomLoader loader(true);
vector fileData;
if(loader.LoadFile(filePath)) {
if(hashInfo.Crc32Hash == loader._romData.Crc32 || hashInfo.Sha1Hash.compare(loader._romData.Sha1) == 0) {
diff --git a/Core/RomLoader.h b/Core/RomLoader.h
index 04547409..fb96c657 100644
--- a/Core/RomLoader.h
+++ b/Core/RomLoader.h
@@ -2,17 +2,20 @@
#include "stdafx.h"
#include "VirtualFile.h"
#include "RomData.h"
+#include "BaseLoader.h"
class ArchiveReader;
-class RomLoader
+class RomLoader : public BaseLoader
{
private:
RomData _romData;
string _filename;
static string FindMatchingRomInFile(string filePath, HashInfo hashInfo);
-
+
public:
+ using BaseLoader::BaseLoader;
+
bool LoadFile(VirtualFile romFile);
bool LoadFile(string filename, vector &fileData);
diff --git a/Core/UnifLoader.h b/Core/UnifLoader.h
index b9330654..a7e53471 100644
--- a/Core/UnifLoader.h
+++ b/Core/UnifLoader.h
@@ -1,5 +1,6 @@
#pragma once
#include "stdafx.h"
+#include
#include "../Utilities/CRC32.h"
#include "../Utilities/md5.h"
#include "../Utilities/HexUtilities.h"
@@ -8,9 +9,9 @@
#include "UnifBoards.h"
#include "MessageManager.h"
#include "EmulationSettings.h"
-#include
+#include "BaseLoader.h"
-class UnifLoader
+class UnifLoader : public BaseLoader
{
private:
static std::unordered_map _boardMappings;
@@ -85,7 +86,7 @@ private:
if(_mapperName.size() > 0) {
romData.MapperID = GetMapperID(_mapperName);
if(romData.MapperID == UnifBoards::UnknownBoard) {
- MessageManager::Log("[UNIF] Error: Unknown board");
+ Log("[UNIF] Error: Unknown board");
}
} else {
romData.Error = true;
@@ -139,6 +140,8 @@ private:
}
public:
+ using BaseLoader::BaseLoader;
+
static int32_t GetMapperID(string mapperName)
{
string prefix = mapperName.substr(0, 4);
@@ -183,12 +186,12 @@ public:
romData.PrgChrCrc32 = CRC32::GetCRC(fullRom.data(), fullRom.size());
romData.PrgChrMd5 = GetMd5Sum(fullRom.data(), fullRom.size());
- MessageManager::Log("PRG+CHR CRC32: 0x" + HexUtilities::ToHex(romData.PrgChrCrc32));
- MessageManager::Log("[UNIF] Board Name: " + _mapperName);
- MessageManager::Log("[UNIF] PRG ROM: " + std::to_string(romData.PrgRom.size() / 1024) + " KB");
- MessageManager::Log("[UNIF] CHR ROM: " + std::to_string(romData.ChrRom.size() / 1024) + " KB");
+ Log("PRG+CHR CRC32: 0x" + HexUtilities::ToHex(romData.PrgChrCrc32));
+ Log("[UNIF] Board Name: " + _mapperName);
+ Log("[UNIF] PRG ROM: " + std::to_string(romData.PrgRom.size() / 1024) + " KB");
+ Log("[UNIF] CHR ROM: " + std::to_string(romData.ChrRom.size() / 1024) + " KB");
if(romData.ChrRom.size() == 0) {
- MessageManager::Log("[UNIF] CHR RAM: 8 KB");
+ Log("[UNIF] CHR RAM: 8 KB");
}
string mirroringType;
@@ -200,13 +203,17 @@ public:
case MirroringType::FourScreens: mirroringType = "Four Screens"; break;
}
- MessageManager::Log("[UNIF] Mirroring: " + mirroringType);
- MessageManager::Log("[UNIF] Battery: " + string(romData.HasBattery ? "Yes" : "No"));
+ Log("[UNIF] Mirroring: " + mirroringType);
+ Log("[UNIF] Battery: " + string(romData.HasBattery ? "Yes" : "No"));
- GameDatabase::SetGameInfo(romData.PrgChrCrc32, romData, !EmulationSettings::CheckFlag(EmulationFlags::DisableGameDatabase));
+ if(!_checkOnly) {
+ GameDatabase::SetGameInfo(romData.PrgChrCrc32, romData, !EmulationSettings::CheckFlag(EmulationFlags::DisableGameDatabase));
+ }
if(romData.MapperID == UnifBoards::UnknownBoard) {
- MessageManager::DisplayMessage("Error", "UnsupportedMapper", "UNIF: " + _mapperName);
+ if(!_checkOnly) {
+ MessageManager::DisplayMessage("Error", "UnsupportedMapper", "UNIF: " + _mapperName);
+ }
romData.Error = true;
}
}
diff --git a/Core/iNesLoader.cpp b/Core/iNesLoader.cpp
index e99b8386..4d695b4d 100644
--- a/Core/iNesLoader.cpp
+++ b/Core/iNesLoader.cpp
@@ -77,33 +77,35 @@ RomData iNesLoader::LoadRom(vector& romFile, NESHeader *preloadedHeader
romData.PrgCrc32 = CRC32::GetCRC(romData.PrgRom.data(), romData.PrgRom.size());
- MessageManager::Log("PRG+CHR CRC32: 0x" + HexUtilities::ToHex(romData.PrgChrCrc32));
+ Log("PRG+CHR CRC32: 0x" + HexUtilities::ToHex(romData.PrgChrCrc32));
if(romData.IsNes20Header) {
- MessageManager::Log("[iNes] NES 2.0 file: Yes");
+ Log("[iNes] NES 2.0 file: Yes");
}
- MessageManager::Log("[iNes] Mapper: " + std::to_string(romData.MapperID) + " Sub:" + std::to_string(romData.SubMapperID));
- MessageManager::Log("[iNes] PRG ROM: " + std::to_string(romData.PrgRom.size()/1024) + " KB");
- MessageManager::Log("[iNes] CHR ROM: " + std::to_string(romData.ChrRom.size()/1024) + " KB");
+ Log("[iNes] Mapper: " + std::to_string(romData.MapperID) + " Sub:" + std::to_string(romData.SubMapperID));
+ Log("[iNes] PRG ROM: " + std::to_string(romData.PrgRom.size()/1024) + " KB");
+ Log("[iNes] CHR ROM: " + std::to_string(romData.ChrRom.size()/1024) + " KB");
if(romData.ChrRamSize > 0 || romData.IsNes20Header) {
- MessageManager::Log("[iNes] CHR RAM: " + std::to_string(romData.ChrRamSize / 1024) + " KB");
+ Log("[iNes] CHR RAM: " + std::to_string(romData.ChrRamSize / 1024) + " KB");
} else if(romData.ChrRom.size() == 0) {
- MessageManager::Log("[iNes] CHR RAM: 8 KB");
+ Log("[iNes] CHR RAM: 8 KB");
}
if(romData.WorkRamSize > 0 || romData.IsNes20Header) {
- MessageManager::Log("[iNes] Work RAM: " + std::to_string(romData.WorkRamSize / 1024) + " KB");
+ Log("[iNes] Work RAM: " + std::to_string(romData.WorkRamSize / 1024) + " KB");
}
if(romData.SaveRamSize > 0 || romData.IsNes20Header) {
- MessageManager::Log("[iNes] Save RAM: " + std::to_string(romData.SaveRamSize / 1024) + " KB");
+ Log("[iNes] Save RAM: " + std::to_string(romData.SaveRamSize / 1024) + " KB");
}
- MessageManager::Log("[iNes] Mirroring: " + string(romData.Mirroring == MirroringType::Horizontal ? "Horizontal" : romData.Mirroring == MirroringType::Vertical ? "Vertical" : "Four Screens"));
- MessageManager::Log("[iNes] Battery: " + string(romData.HasBattery ? "Yes" : "No"));
+ Log("[iNes] Mirroring: " + string(romData.Mirroring == MirroringType::Horizontal ? "Horizontal" : romData.Mirroring == MirroringType::Vertical ? "Vertical" : "Four Screens"));
+ Log("[iNes] Battery: " + string(romData.HasBattery ? "Yes" : "No"));
if(romData.HasTrainer) {
- MessageManager::Log("[iNes] Trainer: Yes");
+ Log("[iNes] Trainer: Yes");
}
- GameDatabase::SetGameInfo(romData.PrgChrCrc32, romData, !EmulationSettings::CheckFlag(EmulationFlags::DisableGameDatabase) && header.GetRomHeaderVersion() != RomHeaderVersion::Nes2_0);
+ if(!_checkOnly) {
+ GameDatabase::SetGameInfo(romData.PrgChrCrc32, romData, !EmulationSettings::CheckFlag(EmulationFlags::DisableGameDatabase) && header.GetRomHeaderVersion() != RomHeaderVersion::Nes2_0);
+ }
return romData;
}
diff --git a/Core/iNesLoader.h b/Core/iNesLoader.h
index 68f8be81..89421b99 100644
--- a/Core/iNesLoader.h
+++ b/Core/iNesLoader.h
@@ -1,9 +1,12 @@
#pragma once
#include "stdafx.h"
#include "RomData.h"
+#include "BaseLoader.h"
-class iNesLoader
+class iNesLoader : public BaseLoader
{
public:
+ using BaseLoader::BaseLoader;
+
RomData LoadRom(vector& romFile, NESHeader *preloadedHeader);
};
\ No newline at end of file
diff --git a/InteropDLL/ConsoleWrapper.cpp b/InteropDLL/ConsoleWrapper.cpp
index 8edd99ab..ed437364 100644
--- a/InteropDLL/ConsoleWrapper.cpp
+++ b/InteropDLL/ConsoleWrapper.cpp
@@ -231,7 +231,7 @@ namespace InteropEmu {
romInfo.Format = Console::GetRomFormat();
romInfo.IsChrRam = Console::IsChrRam();
} else {
- RomLoader romLoader;
+ RomLoader romLoader(true);
if(romLoader.LoadFile(romPath)) {
RomData romData = romLoader.GetRomData();