From e8962957fac2dcf410c141b79eec8c5c2298cea2 Mon Sep 17 00:00:00 2001 From: Souryo Date: Sun, 14 Aug 2016 20:12:50 -0400 Subject: [PATCH] UNIF support --- Core/Core.vcxproj | 1 + Core/Core.vcxproj.filters | 3 + Core/MapperFactory.cpp | 3 +- Core/MapperFactory.h | 1 + Core/MessageManager.cpp | 10 +- Core/NsfeLoader.h | 7 +- Core/RomLoader.cpp | 12 +- Core/UnifLoader.h | 363 ++++++++++++++++++ GUI.NET/Config/PreferenceInfo.cs | 2 + GUI.NET/Dependencies/resources.en.xml | 4 +- GUI.NET/Dependencies/resources.es.xml | 4 +- GUI.NET/Dependencies/resources.fr.xml | 4 +- GUI.NET/Dependencies/resources.ja.xml | 4 +- GUI.NET/Dependencies/resources.ru.xml | 4 +- .../Forms/Config/frmPreferences.Designer.cs | 77 ++-- GUI.NET/Forms/Config/frmPreferences.cs | 1 + 16 files changed, 449 insertions(+), 51 deletions(-) create mode 100644 Core/UnifLoader.h 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);