diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index e8c1dd96..04a114b7 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -636,6 +636,7 @@
+
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index d39e1c4d..882b7a16 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -892,6 +892,9 @@
Nes\Mappers\Sachen
+
+ Nes\RomLoader
+
diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp
index 02c73324..0b2145de 100644
--- a/Core/MapperFactory.cpp
+++ b/Core/MapperFactory.cpp
@@ -197,6 +197,7 @@ Supported mappers:
const uint16_t MapperFactory::FdsMapperID;
const uint16_t MapperFactory::NsfMapperID;
+const uint16_t MapperFactory::UnknownBoard;
BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
{
@@ -412,7 +413,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case MapperFactory::FdsMapperID: return new FDS();
}
- MessageManager::DisplayMessage("Error", "UnsupportedMapper");
+ MessageManager::DisplayMessage("Error", "UnsupportedMapper", "iNES #" + std::to_string(romData.MapperID));
return nullptr;
}
diff --git a/Core/MapperFactory.h b/Core/MapperFactory.h
index 914146a2..7fd0af3e 100644
--- a/Core/MapperFactory.h
+++ b/Core/MapperFactory.h
@@ -11,5 +11,6 @@ class MapperFactory
public:
static const uint16_t FdsMapperID = 65535;
static const uint16_t NsfMapperID = 65534;
+ static const uint16_t UnknownBoard = 65533;
static shared_ptr InitializeFromFile(string romFilename, stringstream *filestream, string ipsFilename, int32_t archiveFileIndex);
};
diff --git a/Core/MessageManager.cpp b/Core/MessageManager.cpp
index e7218ae0..ee5f7b52 100644
--- a/Core/MessageManager.cpp
+++ b/Core/MessageManager.cpp
@@ -57,7 +57,7 @@ std::unordered_map MessageManager::_enResources = {
{ "SoundRecorderStarted", u8"Recording to: %1" },
{ "SoundRecorderStopped", u8"Recording saved to: %1" },
{ "TestFileSavedTo", u8"Test file saved to: %1" },
- { "UnsupportedMapper", u8"Unsupported mapper, cannot load game." },
+ { "UnsupportedMapper", u8"Unsupported mapper (%1), cannot load game." },
{ "GoogleDrive", u8"Google Drive" },
{ "SynchronizationStarted", u8"Synchronization started." },
@@ -118,7 +118,7 @@ std::unordered_map MessageManager::_frResources = {
{ "SoundRecorderStarted", u8"En cours d'enregistrement : %1" },
{ "SoundRecorderStopped", u8"Enregistrement audio sauvegardé : %1" },
{ "TestFileSavedTo", u8"Test sauvegardé : %1" },
- { "UnsupportedMapper", u8"Ce mapper n'est pas encore supporté - le jeu ne peut pas être démarré." },
+ { "UnsupportedMapper", u8"Ce mapper (%1) n'est pas encore supporté - le jeu ne peut pas être démarré." },
{ "GoogleDrive", u8"Google Drive" },
{ "SynchronizationStarted", u8"Synchronisation en cours." },
@@ -179,7 +179,7 @@ std::unordered_map MessageManager::_jaResources = {
{ "SoundRecorderStarted", u8"%1に録音しています。" },
{ "SoundRecorderStopped", u8"録音を終了しました: %1" },
{ "TestFileSavedTo", u8"Test file saved to: %1" },
- { "UnsupportedMapper", u8"このMapperを使うゲームはロードできません。" },
+ { "UnsupportedMapper", u8"このMapper (%1)を使うゲームはロードできません。" },
{ "GoogleDrive", u8"Google Drive" },
{ "SynchronizationStarted", u8"同期中。" },
@@ -240,7 +240,7 @@ std::unordered_map MessageManager::_ruResources = {
{ "SoundRecorderStarted", u8"Запись начата to: %1" },
{ "SoundRecorderStopped", u8"Запись сохранена: %1" },
{ "TestFileSavedTo", u8"Тест сохранён: %1" },
- { "UnsupportedMapper", u8"Неподдерживаемый mapper, игра не загружена." },
+ { "UnsupportedMapper", u8"Неподдерживаемый mapper (%1), игра не загружена." },
{ "GoogleDrive", u8"Google Drive" },
{ "SynchronizationStarted", u8"Синхронизация начата." },
@@ -301,7 +301,7 @@ std::unordered_map MessageManager::_esResources = {
{ "SoundRecorderStarted", u8"Grabando en: %1" },
{ "SoundRecorderStopped", u8"Grabación guardada en: %1" },
{ "TestFileSavedTo", u8"Archivo test guardado en: %1" },
- { "UnsupportedMapper", u8"Mapa no soportado, no se puede cargar el juego." },
+ { "UnsupportedMapper", u8"Mapa (%1) no soportado, no se puede cargar el juego." },
{ "GoogleDrive", u8"Google Drive" },
{ "SynchronizationStarted", u8"Sincronización iniciada." },
diff --git a/Core/NsfeLoader.h b/Core/NsfeLoader.h
index cfb70297..692727c6 100644
--- a/Core/NsfeLoader.h
+++ b/Core/NsfeLoader.h
@@ -72,6 +72,10 @@ private:
bool ReadChunk(uint8_t* &data, uint8_t* dataEnd, RomData& romData)
{
+ if(data + 4 > dataEnd) {
+ return false;
+ }
+
NsfHeader& header = romData.NsfHeader;
uint32_t length;
@@ -176,6 +180,7 @@ public:
InitHeader(header);
uint8_t* data = romFile.data() + 4;
+ uint8_t* endOfData = romFile.data() + romFile.size();
memset(header.SongName, 0, sizeof(header.SongName));
memset(header.ArtistName, 0, sizeof(header.ArtistName));
@@ -183,7 +188,7 @@ public:
//Will be set to false when we read NEND block
romData.Error = true;
- while(ReadChunk(data, data + romFile.size(), romData)) {
+ while(ReadChunk(data, endOfData, romData)) {
//Read all chunks
}
diff --git a/Core/RomLoader.cpp b/Core/RomLoader.cpp
index 7e03d48f..eac248d3 100644
--- a/Core/RomLoader.cpp
+++ b/Core/RomLoader.cpp
@@ -7,6 +7,7 @@
#include "FdsLoader.h"
#include "NsfLoader.h"
#include "NsfeLoader.h"
+#include "UnifLoader.h"
vector RomLoader::GetArchiveRomList(string filename)
{
@@ -19,11 +20,11 @@ vector RomLoader::GetArchiveRomList(string filename)
if(memcmp(header, "PK", 2) == 0) {
ZipReader reader;
reader.LoadArchive(filename);
- return reader.GetFileList({ ".nes", ".fds", ".nsf", ".nsfe" });
+ return reader.GetFileList({ ".nes", ".fds", ".nsf", ".nsfe", "*.unf" });
} else if(memcmp(header, "7z", 2) == 0) {
SZReader reader;
reader.LoadArchive(filename);
- return reader.GetFileList({ ".nes", ".fds", ".nsf", ".nsfe" });
+ return reader.GetFileList({ ".nes", ".fds", ".nsf", ".nsfe", "*.unf" });
}
}
return{};
@@ -38,7 +39,7 @@ bool RomLoader::LoadFromArchive(istream &zipFile, ArchiveReader& reader, int32_t
reader.LoadArchive(buffer, fileSize);
- vector fileList = reader.GetFileList({ ".nes", ".fds", ".nsf", ".nsfe" });
+ vector fileList = reader.GetFileList({ ".nes", ".fds", ".nsf", ".nsfe", "*.unf" });
int32_t currentIndex = 0;
if(archiveFileIndex > (int32_t)fileList.size()) {
return false;
@@ -118,6 +119,9 @@ bool RomLoader::LoadFromMemory(uint8_t* buffer, size_t length, string romName)
} else if(memcmp(buffer, "NSFE", 4) == 0) {
NsfeLoader loader;
_romData = loader.LoadRom(fileData);
+ } else if(memcmp(buffer, "UNIF", 4) == 0) {
+ UnifLoader loader;
+ _romData = loader.LoadRom(fileData);
} else {
MessageManager::Log("Invalid rom file.");
_romData.Error = true;
@@ -167,7 +171,7 @@ bool RomLoader::LoadFile(string filename, istream *filestream, string ipsFilenam
} else if(memcmp(header, "7z", 2) == 0) {
SZReader reader;
return LoadFromArchive(*input, reader, archiveFileIndex);
- } else if(memcmp(header, "NES\x1a", 4) == 0 || memcmp(header, "NESM\x1a", 5) == 0 || memcmp(header, "NSFE", 4) == 0 || memcmp(header, "FDS\x1a", 4) == 0 || memcmp(header, "\x1*NINTENDO-HVC*", 15) == 0) {
+ } else if(memcmp(header, "NES\x1a", 4) == 0 || memcmp(header, "NESM\x1a", 5) == 0 || memcmp(header, "NSFE", 4) == 0 || memcmp(header, "FDS\x1a", 4) == 0 || memcmp(header, "\x1*NINTENDO-HVC*", 15) == 0 || memcmp(header, "UNIF", 4) == 0) {
if(archiveFileIndex > 0) {
return false;
}
diff --git a/Core/UnifLoader.h b/Core/UnifLoader.h
new file mode 100644
index 00000000..dfc2a13e
--- /dev/null
+++ b/Core/UnifLoader.h
@@ -0,0 +1,363 @@
+#pragma once
+#include "stdafx.h"
+#include "RomData.h"
+#include "GameDatabase.h"
+#include
+
+class UnifLoader
+{
+private:
+ std::unordered_map _boardMappings = {
+ { "11160", MapperFactory::UnknownBoard },
+ { "12-IN-1", MapperFactory::UnknownBoard },
+ { "13in1JY110", MapperFactory::UnknownBoard },
+ { "190in1", MapperFactory::UnknownBoard },
+ { "22211", 132 },
+ { "3D-BLOCK", MapperFactory::UnknownBoard },
+ { "411120-C", MapperFactory::UnknownBoard },
+ { "42in1ResetSwitch", 226 },
+ { "43272", MapperFactory::UnknownBoard },
+ { "603-5052", 238 },
+ { "64in1NoRepeat", MapperFactory::UnknownBoard },
+ { "70in1", MapperFactory::UnknownBoard },
+ { "70in1B", MapperFactory::UnknownBoard },
+ { "810544-C-A1", MapperFactory::UnknownBoard },
+ { "8157", MapperFactory::UnknownBoard },
+ { "8237", 215 },
+ { "8237A", MapperFactory::UnknownBoard },
+ { "830118C", MapperFactory::UnknownBoard },
+ { "A65AS", MapperFactory::UnknownBoard },
+ { "AC08", MapperFactory::UnknownBoard },
+ { "ANROM", 7 },
+ { "AX5705", MapperFactory::UnknownBoard },
+ { "BB", MapperFactory::UnknownBoard },
+ { "BS-5", MapperFactory::UnknownBoard },
+ { "CC-21", 27 },
+ { "CITYFIGHT", MapperFactory::UnknownBoard },
+ { "10-24-C-A1", MapperFactory::UnknownBoard },
+ { "CNROM", 3 },
+ { "CPROM", 13 },
+ { "D1038", 60 },
+ { "DANCE", MapperFactory::UnknownBoard }, // redundant
+ { "DANCE2000", MapperFactory::UnknownBoard },
+ { "DREAMTECH01", MapperFactory::UnknownBoard },
+ { "EDU2000", MapperFactory::UnknownBoard },
+ { "EKROM", 5 },
+ { "ELROM", 5 },
+ { "ETROM", 5 },
+ { "EWROM", 5 },
+ { "FK23C", MapperFactory::UnknownBoard },
+ { "FK23CA", MapperFactory::UnknownBoard },
+ { "FS304", 162 },
+ { "G-146", MapperFactory::UnknownBoard },
+ { "GK-192", 58 },
+ { "GS-2004", MapperFactory::UnknownBoard },
+ { "GS-2013", MapperFactory::UnknownBoard },
+ { "Ghostbusters63in1", MapperFactory::UnknownBoard },
+ { "H2288", 123 },
+ { "HKROM", MapperFactory::UnknownBoard },
+ { "KOF97", MapperFactory::UnknownBoard },
+ { "KONAMI-QTAI", MapperFactory::UnknownBoard },
+ { "KS7010", MapperFactory::UnknownBoard },
+ { "KS7012", MapperFactory::UnknownBoard },
+ { "KS7013B", MapperFactory::UnknownBoard },
+ { "KS7016", MapperFactory::UnknownBoard },
+ { "KS7017", MapperFactory::UnknownBoard },
+ { "KS7030", MapperFactory::UnknownBoard },
+ { "KS7031", MapperFactory::UnknownBoard },
+ { "KS7032", 142 },
+ { "KS7037", MapperFactory::UnknownBoard },
+ { "KS7057", MapperFactory::UnknownBoard },
+ { "LE05", MapperFactory::UnknownBoard },
+ { "LH10", MapperFactory::UnknownBoard },
+ { "LH32", 125 },
+ { "LH53", MapperFactory::UnknownBoard },
+ { "MALISB", MapperFactory::UnknownBoard },
+ { "MARIO1-MALEE2", MapperFactory::UnknownBoard },
+ { "MHROM", 66 },
+ { "N625092", 221 },
+ { "NROM", 0 },
+ { "NROM-128", 0 },
+ { "NROM-256", 0 },
+ { "NTBROM", 68 },
+ { "NTD-03", MapperFactory::UnknownBoard },
+ { "NovelDiamond9999999in1", MapperFactory::UnknownBoard },
+ { "OneBus", MapperFactory::UnknownBoard },
+ { "PEC-586", MapperFactory::UnknownBoard },
+ { "RET-CUFROM", 29 },
+ { "RROM", 0 },
+ { "RROM-128", 0 },
+ { "SA-002", 136 },
+ { "SA-0036", 149 },
+ { "SA-0037", 148 },
+ { "SA-009", 160 },
+ { "SA-016-1M", 146 },
+ { "SA-72007", 145 },
+ { "SA-72008", 133 },
+ { "SA-9602B", MapperFactory::UnknownBoard },
+ { "SA-NROM", 143 },
+ { "SAROM", 1 },
+ { "SBROM", 1 },
+ { "SC-127", 35 },
+ { "SCROM", 1 },
+ { "SEROM", 1 },
+ { "SGROM", 1 },
+ { "SHERO", MapperFactory::UnknownBoard },
+ { "SKROM", 1 },
+ { "SL12", 116 },
+ { "SL1632", 14 },
+ { "SL1ROM", 1 },
+ { "SLROM", 1 },
+ { "SMB2J", MapperFactory::UnknownBoard },
+ { "SNROM", 1 },
+ { "SOROM", 1 },
+ { "SSS-NROM-256", MapperFactory::UnknownBoard },
+ { "SUNSOFT_UNROM", 93 }, // fix me, real pcb name, real pcb type
+ { "Sachen-74LS374N", 150 },
+ { "Sachen-74LS374NA", 243 }, //seems to be custom mapper
+ { "Sachen-8259A", 141 },
+ { "Sachen-8259B", 138 },
+ { "Sachen-8259C", 139 },
+ { "Sachen-8259D", 137 },
+ { "Super24in1SC03", MapperFactory::UnknownBoard },
+ { "SuperHIK8in1", 45 },
+ { "Supervision16in1", 53 },
+ { "T-227-1", MapperFactory::UnknownBoard },
+ { "T-230", MapperFactory::UnknownBoard },
+ { "T-262", MapperFactory::UnknownBoard },
+ { "TBROM", 4 },
+ { "TC-U01-1.5M", 147 },
+ { "TEK90", 90 },
+ { "TEROM", 4 },
+ { "TF1201", MapperFactory::UnknownBoard },
+ { "TFROM", 4 },
+ { "TGROM", 4 },
+ { "TKROM", 4 },
+ { "TKSROM", 4 },
+ { "TLROM", 4 },
+ { "TLSROM", 4 },
+ { "TQROM", 4 },
+ { "TR1ROM", 4 },
+ { "TSROM", 4 },
+ { "TVROM", 4 },
+ { "Transformer", MapperFactory::UnknownBoard },
+ { "UNROM", 2 },
+ { "UNROM-512-8", 30 },
+ { "UNROM-512-16", 30 },
+ { "UNROM-512-32", 30 },
+ { "UOROM", 2 },
+ { "VRC7", MapperFactory::UnknownBoard },
+ { "YOKO", MapperFactory::UnknownBoard },
+ { "SB-2000", MapperFactory::UnknownBoard },
+ { "COOLBOY", MapperFactory::UnknownBoard },
+ { "158B", MapperFactory::UnknownBoard },
+ { "DRAGONFIGHTER", MapperFactory::UnknownBoard },
+ { "EH8813A", MapperFactory::UnknownBoard },
+ { "HP898F", MapperFactory::UnknownBoard },
+ { "F-15", MapperFactory::UnknownBoard },
+ { "RT-01", MapperFactory::UnknownBoard },
+ { "81-01-31-C", MapperFactory::UnknownBoard },
+ { "8-IN-1", MapperFactory::UnknownBoard }
+ };
+
+ vector _prgChunks[16];
+ vector _chrChunks[16];
+ string _mapperName;
+
+ void Read(uint8_t* &data, uint8_t& dest)
+ {
+ dest = data[0];
+ data++;
+ }
+
+ void Read(uint8_t* &data, uint32_t& dest)
+ {
+ dest = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
+ data += 4;
+ }
+
+ void Read(uint8_t* &data, uint8_t* dest, size_t len)
+ {
+ memcpy(dest, data, len);
+ data += len;
+ }
+
+ string ReadString(uint8_t* &data, uint8_t* chunkEnd)
+ {
+ stringstream ss;
+ while(data < chunkEnd) {
+ if(data[0] == 0) {
+ //end of string
+ data = chunkEnd;
+ break;
+ } else {
+ ss << (char)data[0];
+ }
+ data++;
+ }
+
+ return ss.str();
+ }
+
+ string ReadFourCC(uint8_t* &data)
+ {
+ stringstream ss;
+ for(int i = 0; i < 4; i++) {
+ ss << (char)data[i];
+ }
+ data += 4;
+ return ss.str();
+ }
+
+ bool ReadChunk(uint8_t* &data, uint8_t* dataEnd, RomData& romData)
+ {
+ if(data + 8 > dataEnd) {
+ return false;
+ }
+
+ NsfHeader& header = romData.NsfHeader;
+
+ string fourCC = ReadFourCC(data);
+
+ uint32_t length;
+ Read(data, length);
+
+ uint8_t* chunkEnd = data + length;
+ if(chunkEnd > dataEnd) {
+ return false;
+ }
+
+ if(fourCC.compare("MAPR") == 0) {
+ _mapperName = ReadString(data, chunkEnd);
+ if(_mapperName.size() > 0) {
+ romData.MapperID = GetMapperID(_mapperName);
+ } else {
+ romData.Error = true;
+ return false;
+ }
+ } else if(fourCC.substr(0, 3).compare("PRG") == 0) {
+ uint32_t chunkNumber;
+ std::stringstream ss;
+ ss << std::hex << fourCC[3];
+ ss >> chunkNumber;
+
+ _prgChunks[chunkNumber].resize(length);
+ Read(data, _prgChunks[chunkNumber].data(), length);
+ } else if(fourCC.substr(0, 3).compare("CHR") == 0) {
+ uint32_t chunkNumber;
+ std::stringstream ss;
+ ss << std::hex << fourCC[3];
+ ss >> chunkNumber;
+
+ _chrChunks[chunkNumber].resize(length);
+ Read(data, _chrChunks[chunkNumber].data(), length);
+ } else if(fourCC.compare("TVCI") == 0) {
+ uint8_t value;
+ Read(data, value);
+ romData.System = value == 1 ? GameSystem::NesPal : GameSystem::NesNtsc;
+ } else if(fourCC.compare("CTRL") == 0) {
+ //not supported
+ } else if(fourCC.compare("BATR") == 0) {
+ uint8_t value;
+ Read(data, value);
+ romData.HasBattery = value > 0;
+ } else if(fourCC.compare("MIRR") == 0) {
+ uint8_t value;
+ Read(data, value);
+
+ switch(value) {
+ default:
+ case 0: romData.MirroringType = MirroringType::Horizontal; break;
+ case 1: romData.MirroringType = MirroringType::Vertical; break;
+ case 2: romData.MirroringType = MirroringType::ScreenAOnly; break;
+ case 3: romData.MirroringType = MirroringType::ScreenBOnly; break;
+ case 4: romData.MirroringType = MirroringType::FourScreens; break;
+ }
+ } else {
+ //Unsupported/unused FourCCs: PCKn, CCKn, NAME, WRTR, READ, DINF, VROR
+ }
+
+ data = chunkEnd;
+
+ return true;
+ }
+
+ int32_t GetMapperID(string mapperName)
+ {
+ string prefix = mapperName.substr(0, 4);
+ if(prefix.compare("NES-") == 0 || prefix.compare("UNL-") == 0 || prefix.compare("HVC-") == 0 || prefix.compare("BTL-") == 0 || prefix.compare("BMC-") == 0) {
+ mapperName = mapperName.substr(4);
+ }
+
+ auto result = _boardMappings.find(mapperName);
+ if(result != _boardMappings.end()) {
+ return result->second;
+ }
+
+ MessageManager::Log("[UNIF] Error: Unknown board");
+
+ return MapperFactory::UnknownBoard;
+ }
+
+public:
+ RomData LoadRom(vector& romFile)
+ {
+ RomData romData;
+
+ //Skip header, version & null bytes, start reading at first chunk
+ uint8_t* data = romFile.data() + 32;
+ uint8_t* endOfFile = romFile.data() + romFile.size();
+
+ while(ReadChunk(data, endOfFile, romData)) {
+ //Read all chunks
+ }
+
+ for(int i = 0; i < 16; i++) {
+ romData.PrgRom.insert(romData.PrgRom.end(), _prgChunks[i].begin(), _prgChunks[i].end());
+ romData.ChrRom.insert(romData.ChrRom.end(), _chrChunks[i].begin(), _chrChunks[i].end());
+ }
+
+ if(romData.PrgRom.size() == 0 || _mapperName.empty()) {
+ romData.Error = true;
+ } else {
+ vector fullRom;
+ fullRom.insert(fullRom.end(), romData.PrgRom.begin(), romData.PrgRom.end());
+ fullRom.insert(fullRom.end(), romData.ChrRom.begin(), romData.ChrRom.end());
+
+ romData.Crc32 = CRC32::GetCRC(fullRom.data(), fullRom.size());;
+ romData.PrgCrc32 = CRC32::GetCRC(romData.PrgRom.data(), romData.PrgRom.size());
+
+ stringstream crcHex;
+ crcHex << std::hex << std::uppercase << std::setfill('0') << std::setw(8) << romData.Crc32;
+ MessageManager::Log("PRG+CHR CRC32: 0x" + crcHex.str());
+
+ 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");
+ if(romData.ChrRom.size() == 0) {
+ MessageManager::Log("[UNIF] CHR RAM: 8 KB");
+ }
+
+ string mirroringType;
+ switch(romData.MirroringType) {
+ case MirroringType::Horizontal: mirroringType = "Horizontal"; break;
+ case MirroringType::Vertical: mirroringType = "Vertical"; break;
+ case MirroringType::ScreenAOnly: mirroringType = "1-Screen (A)"; break;
+ case MirroringType::ScreenBOnly: mirroringType = "1-Screen (B)"; break;
+ case MirroringType::FourScreens: mirroringType = "Four Screens"; break;
+ }
+
+ MessageManager::Log("[UNIF] Mirroring: " + mirroringType);
+ MessageManager::Log("[UNIF] Battery: " + string(romData.HasBattery ? "Yes" : "No"));
+
+ GameDatabase::SetGameInfo(romData.Crc32, romData, !EmulationSettings::CheckFlag(EmulationFlags::DisableGameDatabase));
+
+ if(romData.MapperID == MapperFactory::UnknownBoard) {
+ MessageManager::DisplayMessage("Error", "UnsupportedMapper", "UNIF: " + _mapperName);
+ romData.Error = true;
+ }
+ }
+
+ return romData;
+ }
+};
\ No newline at end of file
diff --git a/GUI.NET/Config/PreferenceInfo.cs b/GUI.NET/Config/PreferenceInfo.cs
index 96d5cfe5..ebbc50b3 100644
--- a/GUI.NET/Config/PreferenceInfo.cs
+++ b/GUI.NET/Config/PreferenceInfo.cs
@@ -32,6 +32,7 @@ namespace Mesen.GUI.Config
public bool AssociateMstFiles = false;
public bool AssociateNsfFiles = false;
public bool AssociateNsfeFiles = false;
+ public bool AssociateUnfFiles = false;
public bool NsfDisableApuIrqs = true;
public bool NsfMoveToNextTrackAfterTime = true;
@@ -78,6 +79,7 @@ namespace Mesen.GUI.Config
UpdateFileAssociation("mst", preferenceInfo.AssociateMstFiles);
UpdateFileAssociation("nsf", preferenceInfo.AssociateNsfFiles);
UpdateFileAssociation("nsfe", preferenceInfo.AssociateNsfeFiles);
+ UpdateFileAssociation("unf", preferenceInfo.AssociateUnfFiles);
InteropEmu.SetFlag(EmulationFlags.Mmc3IrqAltBehavior, preferenceInfo.UseAlternativeMmc3Irq);
InteropEmu.SetFlag(EmulationFlags.AllowInvalidInput, preferenceInfo.AllowInvalidInput);
diff --git a/GUI.NET/Dependencies/resources.en.xml b/GUI.NET/Dependencies/resources.en.xml
index 22e42391..0a2a29d1 100644
--- a/GUI.NET/Dependencies/resources.en.xml
+++ b/GUI.NET/Dependencies/resources.en.xml
@@ -5,8 +5,8 @@
Movie files (*.mmo)|*.mmo|All Files (*.*)|*.*
Wave files (*.wav)|*.wav|All Files (*.*)|*.*
Palette Files (*.pal)|*.pal|All Files (*.*)|*.*
- All supported formats (*.nes, *.zip, *.7z, *.nsf, *.nsfe, *.fds)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE|NES Roms (*.nes)|*.NES|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|All (*.*)|*.*
- All supported formats (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE|NES Roms (*.nes)|*.NES|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|IPS Patches (*.ips)|*.IPS|All (*.*)|*.*
+ All supported formats (*.nes, *.zip, *.7z, *.nsf, *.nsfe, *.fds, *.unf)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE;*.UNF|NES Roms (*.nes, *.unf)|*.NES;*.UNF|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|All (*.*)|*.*
+ All supported formats (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE;*.UNF|NES Roms (*.nes, *.unf)|*.NES;*.UNF|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|IPS Patches (*.ips)|*.IPS|All (*.*)|*.*
Test files (*.mtp)|*.mtp|All (*.*)|*.*
Resume
diff --git a/GUI.NET/Dependencies/resources.es.xml b/GUI.NET/Dependencies/resources.es.xml
index 689a7fab..a1210095 100644
--- a/GUI.NET/Dependencies/resources.es.xml
+++ b/GUI.NET/Dependencies/resources.es.xml
@@ -376,8 +376,8 @@
Videos (*.mmo)|*.mmo|Todos los archivos (*.*)|*.*
Archivos wave (*.wav)|*.wav|Todos los archivos (*.*)|*.*
Archivos pal (*.pal)|*.pal|Todos los archivos (*.*)|*.*
- Todos los formatos soportados (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE|Roms de NES (*.nes)|*.NES|Roms de Famicom Disk System (*.fds)|*.FDS|Archivos NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Archivos ZIP (*.zip)|*.ZIP|Archivos 7-Zip (*.7z)|*.7z|Todos los archivos (*.*)|*.*
- Todos los formatos soportados (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE|Roms de NES(*.nes)|*.NES|Roms de Famicom Disk System (*.fds)|*.FDS|Archivos NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Archivos ZIP (*.zip)|*.ZIP|Archivos 7-Zip (*.7z)|*.7z|Archivos IPS (*.ips)|*.IPS|Todos los archivos (*.*)|*.*
+ Todos los formatos soportados (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE;*.UNF|Roms de NES (*.nes, *.unf)|*.NES;*.UNF|Roms de Famicom Disk System (*.fds)|*.FDS|Archivos NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Archivos ZIP (*.zip)|*.ZIP|Archivos 7-Zip (*.7z)|*.7z|Todos los archivos (*.*)|*.*
+ Todos los formatos soportados (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE;*.UNF|Roms de NES(*.nes, *.unf)|*.NES;*.UNF|Roms de Famicom Disk System (*.fds)|*.FDS|Archivos NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Archivos ZIP (*.zip)|*.ZIP|Archivos 7-Zip (*.7z)|*.7z|Archivos IPS (*.ips)|*.IPS|Todos los archivos (*.*)|*.*
Archivos de test (*.mtp)|*.mtp|Todos los archivos (*.*)|*.*
Continuar
diff --git a/GUI.NET/Dependencies/resources.fr.xml b/GUI.NET/Dependencies/resources.fr.xml
index 3c69f3b2..0a426abf 100644
--- a/GUI.NET/Dependencies/resources.fr.xml
+++ b/GUI.NET/Dependencies/resources.fr.xml
@@ -376,8 +376,8 @@
Films (*.mmo)|*.mmo|Tous les fichiers (*.*)|*.*
Fichiers wave (*.wav)|*.wav|Tous les fichiers (*.*)|*.*
Fichier de palette (*.pal)|*.pal|Tous les fichiers (*.*)|*.*
- Tous les formats supportés (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE|Roms de NES (*.nes)|*.NES|Roms du Famicom Disk System (*.fds)|*.FDS|Fichiers NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Fichiers ZIP (*.zip)|*.ZIP|Fichiers 7-Zip (*.7z)|*.7z|Tous les fichiers (*.*)|*.*
- Tous les formats supportés (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE|Roms de NES(*.nes)|*.NES|Roms du Famicom Disk System (*.fds)|*.FDS|Fichiers NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Fichiers ZIP (*.zip)|*.ZIP|Fichiers 7-Zip (*.7z)|*.7z|Fichiers IPS (*.ips)|*.IPS|Tous les fichiers (*.*)|*.*
+ Tous les formats supportés (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE;*.UNF|Roms de NES (*.nes, *.unf)|*.NES;*.UNF|Roms du Famicom Disk System (*.fds)|*.FDS|Fichiers NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Fichiers ZIP (*.zip)|*.ZIP|Fichiers 7-Zip (*.7z)|*.7z|Tous les fichiers (*.*)|*.*
+ Tous les formats supportés (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE;*.UNF|Roms de NES (*.nes, *.unf)|*.NES;*.UNF|Roms du Famicom Disk System (*.fds)|*.FDS|Fichiers NSF (*.nsf, *.nsfe)|*.NSF;*.NSFE|Fichiers ZIP (*.zip)|*.ZIP|Fichiers 7-Zip (*.7z)|*.7z|Fichiers IPS (*.ips)|*.IPS|Tous les fichiers (*.*)|*.*
Fichiers de test (*.mtp)|*.mtp|Tous les fichiers (*.*)|*.*
Continuer
diff --git a/GUI.NET/Dependencies/resources.ja.xml b/GUI.NET/Dependencies/resources.ja.xml
index 012e2597..614777bb 100644
--- a/GUI.NET/Dependencies/resources.ja.xml
+++ b/GUI.NET/Dependencies/resources.ja.xml
@@ -368,8 +368,8 @@
動画 (*.mmo)|*.mmo|すべてのファイル (*.*)|*.*
WAVファイル (*.wav)|*.wav|すべてのファイル (*.*)|*.*
パレットファイル (*.pal)|*.pal|すべてのファイル (*.*)|*.*
- 対応するすべてのファイル (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe)|*.NES;*.ZIP;*.FDS;*.7z;*.NSF;*.NSFE|ファミコンゲーム (*.nes)|*.NES|ファミコンディスクシステムのゲーム (*.fds)|*.FDS|NSFファイル (*.nsf, *.nsfe)|*.NSF;*.NSFE|ZIPファイル (*.zip)|*.ZIP|7-Zipファイル (*.7z)|*.7z|すべてのファイル (*.*)|*.*
- 対応するすべてのファイル (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE|ファミコンゲーム (*.nes)|*.NES|ファミコンディスクシステムのゲーム (*.fds)|*.FDS|NSFファイル (*.nsf, *.nsfe)|*.NSF;*.NSFE|ZIPファイル (*.zip)|*.ZIP|7-Zipファイル (*.7z)|*.7z|IPSファイル (*.ips)|*.IPS|すべてのファイル (*.*)|*.*
+ 対応するすべてのファイル (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf)|*.NES;*.ZIP;*.FDS;*.7z;*.NSF;*.NSFE;*.UNF|ファミコンゲーム (*.nes, *.unf)|*.NES;*.UNF|ファミコンディスクシステムのゲーム (*.fds)|*.FDS|NSFファイル (*.nsf, *.nsfe)|*.NSF;*.NSFE|ZIPファイル (*.zip)|*.ZIP|7-Zipファイル (*.7z)|*.7z|すべてのファイル (*.*)|*.*
+ 対応するすべてのファイル (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE;*.UNF|ファミコンゲーム (*.nes, *.unf)|*.NES;*.UNF|ファミコンディスクシステムのゲーム (*.fds)|*.FDS|NSFファイル (*.nsf, *.nsfe)|*.NSF;*.NSFE|ZIPファイル (*.zip)|*.ZIP|7-Zipファイル (*.7z)|*.7z|IPSファイル (*.ips)|*.IPS|すべてのファイル (*.*)|*.*
テストファイル (*.mtp)|*.mtp|すべてのファイル (*.*)|*.*
再開
diff --git a/GUI.NET/Dependencies/resources.ru.xml b/GUI.NET/Dependencies/resources.ru.xml
index 3ce3b53c..373db8e8 100644
--- a/GUI.NET/Dependencies/resources.ru.xml
+++ b/GUI.NET/Dependencies/resources.ru.xml
@@ -376,8 +376,8 @@
Записи (*.mmo)|*.mmo|All Files (*.*)|*.*
Wave files (*.wav)|*.wav|All Files (*.*)|*.*
Palette Files (*.pal)|*.pal|All Files (*.*)|*.*
- Все поддерживаемые форматы (*.nes, *.zip, *.7z, *.nsf, *.nsfe, *.fds)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE|NES Roms (*.nes)|*.NES|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|All (*.*)|*.*
- Все поддерживаемые форматы (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE|NES Roms (*.nes)|*.NES|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|IPS Patches (*.ips)|*.IPS|All (*.*)|*.*
+ Все поддерживаемые форматы (*.nes, *.zip, *.7z, *.nsf, *.nsfe, *.fds, *.unf)|*.NES;*.ZIP;*.7z;*.FDS;*.NSF;*.NSFE;*.UNF|NES Roms (*.nes, *.unf)|*.NES;*.UNF|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|All (*.*)|*.*
+ Все поддерживаемые форматы (*.nes, *.zip, *.7z, *.fds, *.nsf, *.nsfe, *.unf, *.ips)|*.NES;*.ZIP;*.7z;*.IPS;*.FDS;*.NSF;*.NSFE;*.UNF|NES Roms (*.nes, *.unf)|*.NES;*.UNF|Famicom Disk System Roms (*.fds)|*.FDS|NSF files (*.nsf, *.nsfe)|*.nsf;*.nsfe|ZIP Archives (*.zip)|*.ZIP|7-Zip Archives (*.7z)|*.7z|IPS Patches (*.ips)|*.IPS|All (*.*)|*.*
Test files (*.mtp)|*.mtp|All (*.*)|*.*
Продолжить
diff --git a/GUI.NET/Forms/Config/frmPreferences.Designer.cs b/GUI.NET/Forms/Config/frmPreferences.Designer.cs
index ab72f647..650bd9e7 100644
--- a/GUI.NET/Forms/Config/frmPreferences.Designer.cs
+++ b/GUI.NET/Forms/Config/frmPreferences.Designer.cs
@@ -80,10 +80,11 @@
this.chkNsfFormat = new System.Windows.Forms.CheckBox();
this.tpgAdvanced = new System.Windows.Forms.TabPage();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
- this.tmrSyncDateTime = new System.Windows.Forms.Timer(this.components);
- this.chkFdsFastForwardOnLoad = new System.Windows.Forms.CheckBox();
- this.chkFdsAutoLoadDisk = new System.Windows.Forms.CheckBox();
this.chkDisableGameDatabase = new System.Windows.Forms.CheckBox();
+ this.chkFdsAutoLoadDisk = new System.Windows.Forms.CheckBox();
+ this.chkFdsFastForwardOnLoad = new System.Windows.Forms.CheckBox();
+ this.tmrSyncDateTime = new System.Windows.Forms.Timer(this.components);
+ this.chkUnfFormat = new System.Windows.Forms.CheckBox();
this.tlpMain.SuspendLayout();
this.flowLayoutPanel2.SuspendLayout();
this.tabMain.SuspendLayout();
@@ -105,6 +106,7 @@
this.grpFileAssociations.SuspendLayout();
this.tlpFileFormat.SuspendLayout();
this.tpgAdvanced.SuspendLayout();
+ this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// baseConfigPanel
@@ -597,7 +599,7 @@
this.chkNsfDisableApuIrqs.AutoSize = true;
this.chkNsfDisableApuIrqs.Location = new System.Drawing.Point(3, 51);
this.chkNsfDisableApuIrqs.Name = "chkNsfDisableApuIrqs";
- this.chkNsfDisableApuIrqs.Size = new System.Drawing.Size(113, 17);
+ this.chkNsfDisableApuIrqs.Size = new System.Drawing.Size(194, 17);
this.chkNsfDisableApuIrqs.TabIndex = 6;
this.chkNsfDisableApuIrqs.Text = "Disable APU IRQs (Recommended)";
this.chkNsfDisableApuIrqs.UseVisualStyleBackColor = true;
@@ -629,16 +631,18 @@
this.tlpFileFormat.ColumnCount = 2;
this.tlpFileFormat.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpFileFormat.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
- this.tlpFileFormat.Controls.Add(this.chkNsfeFormat, 0, 3);
+ this.tlpFileFormat.Controls.Add(this.chkNsfeFormat, 0, 4);
this.tlpFileFormat.Controls.Add(this.chkNesFormat, 0, 0);
this.tlpFileFormat.Controls.Add(this.chkFdsFormat, 0, 1);
this.tlpFileFormat.Controls.Add(this.chkMmoFormat, 1, 0);
this.tlpFileFormat.Controls.Add(this.chkMstFormat, 1, 1);
- this.tlpFileFormat.Controls.Add(this.chkNsfFormat, 0, 2);
+ this.tlpFileFormat.Controls.Add(this.chkNsfFormat, 0, 3);
+ this.tlpFileFormat.Controls.Add(this.chkUnfFormat, 0, 2);
this.tlpFileFormat.Dock = System.Windows.Forms.DockStyle.Fill;
this.tlpFileFormat.Location = new System.Drawing.Point(3, 16);
this.tlpFileFormat.Name = "tlpFileFormat";
- this.tlpFileFormat.RowCount = 4;
+ this.tlpFileFormat.RowCount = 5;
+ this.tlpFileFormat.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpFileFormat.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpFileFormat.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpFileFormat.RowStyles.Add(new System.Windows.Forms.RowStyle());
@@ -649,7 +653,7 @@
// chkNsfeFormat
//
this.chkNsfeFormat.AutoSize = true;
- this.chkNsfeFormat.Location = new System.Drawing.Point(3, 72);
+ this.chkNsfeFormat.Location = new System.Drawing.Point(3, 95);
this.chkNsfeFormat.Name = "chkNsfeFormat";
this.chkNsfeFormat.Size = new System.Drawing.Size(226, 17);
this.chkNsfeFormat.TabIndex = 15;
@@ -700,7 +704,7 @@
// chkNsfFormat
//
this.chkNsfFormat.AutoSize = true;
- this.chkNsfFormat.Location = new System.Drawing.Point(3, 49);
+ this.chkNsfFormat.Location = new System.Drawing.Point(3, 72);
this.chkNsfFormat.Name = "chkNsfFormat";
this.chkNsfFormat.Size = new System.Drawing.Size(171, 17);
this.chkNsfFormat.TabIndex = 14;
@@ -738,20 +742,15 @@
this.tableLayoutPanel1.Size = new System.Drawing.Size(473, 250);
this.tableLayoutPanel1.TabIndex = 0;
//
- // tmrSyncDateTime
+ // chkDisableGameDatabase
//
- this.tmrSyncDateTime.Enabled = true;
- this.tmrSyncDateTime.Tick += new System.EventHandler(this.tmrSyncDateTime_Tick);
- //
- // chkFdsFastForwardOnLoad
- //
- this.chkFdsFastForwardOnLoad.AutoSize = true;
- this.chkFdsFastForwardOnLoad.Location = new System.Drawing.Point(3, 49);
- this.chkFdsFastForwardOnLoad.Name = "chkFdsFastForwardOnLoad";
- this.chkFdsFastForwardOnLoad.Size = new System.Drawing.Size(342, 17);
- this.chkFdsFastForwardOnLoad.TabIndex = 4;
- this.chkFdsFastForwardOnLoad.Text = "Automatically fast forward FDS games when disk or BIOS is loading";
- this.chkFdsFastForwardOnLoad.UseVisualStyleBackColor = true;
+ this.chkDisableGameDatabase.AutoSize = true;
+ this.chkDisableGameDatabase.Location = new System.Drawing.Point(3, 3);
+ this.chkDisableGameDatabase.Name = "chkDisableGameDatabase";
+ this.chkDisableGameDatabase.Size = new System.Drawing.Size(170, 17);
+ this.chkDisableGameDatabase.TabIndex = 6;
+ this.chkDisableGameDatabase.Text = "Disable built-in game database";
+ this.chkDisableGameDatabase.UseVisualStyleBackColor = true;
//
// chkFdsAutoLoadDisk
//
@@ -763,15 +762,30 @@
this.chkFdsAutoLoadDisk.Text = "Automatically insert disk 1 side A when starting FDS games";
this.chkFdsAutoLoadDisk.UseVisualStyleBackColor = true;
//
- // chkDisableGameDatabase
+ // chkFdsFastForwardOnLoad
//
- this.chkDisableGameDatabase.AutoSize = true;
- this.chkDisableGameDatabase.Location = new System.Drawing.Point(3, 3);
- this.chkDisableGameDatabase.Name = "chkDisableGameDatabase";
- this.chkDisableGameDatabase.Size = new System.Drawing.Size(170, 17);
- this.chkDisableGameDatabase.TabIndex = 6;
- this.chkDisableGameDatabase.Text = "Disable built-in game database";
- this.chkDisableGameDatabase.UseVisualStyleBackColor = true;
+ this.chkFdsFastForwardOnLoad.AutoSize = true;
+ this.chkFdsFastForwardOnLoad.Location = new System.Drawing.Point(3, 49);
+ this.chkFdsFastForwardOnLoad.Name = "chkFdsFastForwardOnLoad";
+ this.chkFdsFastForwardOnLoad.Size = new System.Drawing.Size(342, 17);
+ this.chkFdsFastForwardOnLoad.TabIndex = 4;
+ this.chkFdsFastForwardOnLoad.Text = "Automatically fast forward FDS games when disk or BIOS is loading";
+ this.chkFdsFastForwardOnLoad.UseVisualStyleBackColor = true;
+ //
+ // tmrSyncDateTime
+ //
+ this.tmrSyncDateTime.Enabled = true;
+ this.tmrSyncDateTime.Tick += new System.EventHandler(this.tmrSyncDateTime_Tick);
+ //
+ // chkUnfFormat
+ //
+ this.chkUnfFormat.AutoSize = true;
+ this.chkUnfFormat.Location = new System.Drawing.Point(3, 49);
+ this.chkUnfFormat.Name = "chkUnfFormat";
+ this.chkUnfFormat.Size = new System.Drawing.Size(85, 17);
+ this.chkUnfFormat.TabIndex = 16;
+ this.chkUnfFormat.Text = ".UNF (UNIF)";
+ this.chkUnfFormat.UseVisualStyleBackColor = true;
//
// frmPreferences
//
@@ -818,6 +832,8 @@
this.tlpFileFormat.ResumeLayout(false);
this.tlpFileFormat.PerformLayout();
this.tpgAdvanced.ResumeLayout(false);
+ this.tableLayoutPanel1.ResumeLayout(false);
+ this.tableLayoutPanel1.PerformLayout();
this.ResumeLayout(false);
}
@@ -879,5 +895,6 @@
private System.Windows.Forms.NumericUpDown nudNsfAutoDetectSilenceDelay;
private System.Windows.Forms.Label lblNsfMillisecondsOfSilence;
private System.Windows.Forms.CheckBox chkNsfDisableApuIrqs;
+ private System.Windows.Forms.CheckBox chkUnfFormat;
}
}
\ No newline at end of file
diff --git a/GUI.NET/Forms/Config/frmPreferences.cs b/GUI.NET/Forms/Config/frmPreferences.cs
index 35343e29..3597e8bd 100644
--- a/GUI.NET/Forms/Config/frmPreferences.cs
+++ b/GUI.NET/Forms/Config/frmPreferences.cs
@@ -31,6 +31,7 @@ namespace Mesen.GUI.Forms.Config
AddBinding("AssociateMstFiles", chkMstFormat);
AddBinding("AssociateNsfFiles", chkNsfFormat);
AddBinding("AssociateNsfeFiles", chkNsfeFormat);
+ AddBinding("AssociateUnfFiles", chkUnfFormat);
AddBinding("NsfAutoDetectSilence", chkNsfAutoDetectSilence);
AddBinding("NsfMoveToNextTrackAfterTime", chkNsfMoveToNextTrackAfterTime);