UNIF support

This commit is contained in:
Souryo 2016-08-14 20:12:50 -04:00
parent 357d28eb79
commit e8962957fa
16 changed files with 449 additions and 51 deletions

View file

@ -636,6 +636,7 @@
<ClInclude Include="Txc22211B.h" />
<ClInclude Include="Txc22211C.h" />
<ClInclude Include="TxSRom.h" />
<ClInclude Include="UnifLoader.h" />
<ClInclude Include="VideoHud.h" />
<ClInclude Include="VideoRenderer.h" />
<ClInclude Include="UnlPci556.h" />

View file

@ -892,6 +892,9 @@
<ClInclude Include="Sachen_136.h">
<Filter>Nes\Mappers\Sachen</Filter>
</ClInclude>
<ClInclude Include="UnifLoader.h">
<Filter>Nes\RomLoader</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">

View file

@ -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;
}

View file

@ -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<BaseMapper> InitializeFromFile(string romFilename, stringstream *filestream, string ipsFilename, int32_t archiveFileIndex);
};

View file

@ -57,7 +57,7 @@ std::unordered_map<string, string> 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<string, string> 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<string, string> 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<string, string> 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<string, string> 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." },

View file

@ -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
}

View file

@ -7,6 +7,7 @@
#include "FdsLoader.h"
#include "NsfLoader.h"
#include "NsfeLoader.h"
#include "UnifLoader.h"
vector<string> RomLoader::GetArchiveRomList(string filename)
{
@ -19,11 +20,11 @@ vector<string> 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<string> fileList = reader.GetFileList({ ".nes", ".fds", ".nsf", ".nsfe" });
vector<string> 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;
}

363
Core/UnifLoader.h Normal file
View file

@ -0,0 +1,363 @@
#pragma once
#include "stdafx.h"
#include "RomData.h"
#include "GameDatabase.h"
#include <unordered_map>
class UnifLoader
{
private:
std::unordered_map<string, int> _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<uint8_t> _prgChunks[16];
vector<uint8_t> _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<uint8_t>& 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<uint8_t> 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;
}
};

View file

@ -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);

View file

@ -5,8 +5,8 @@
<Message ID="FilterMovie">Movie files (*.mmo)|*.mmo|All Files (*.*)|*.*</Message>
<Message ID="FilterWave">Wave files (*.wav)|*.wav|All Files (*.*)|*.*</Message>
<Message ID="FilterPalette">Palette Files (*.pal)|*.pal|All Files (*.*)|*.*</Message>
<Message ID="FilterRom">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 (*.*)|*.*</Message>
<Message ID="FilterRomIps">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 (*.*)|*.*</Message>
<Message ID="FilterRom">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 (*.*)|*.*</Message>
<Message ID="FilterRomIps">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 (*.*)|*.*</Message>
<Message ID="FilterTest">Test files (*.mtp)|*.mtp|All (*.*)|*.*</Message>
<Message ID="Resume">Resume</Message>

View file

@ -376,8 +376,8 @@
<Message ID="FilterMovie">Videos (*.mmo)|*.mmo|Todos los archivos (*.*)|*.*</Message>
<Message ID="FilterWave">Archivos wave (*.wav)|*.wav|Todos los archivos (*.*)|*.*</Message>
<Message ID="FilterPalette">Archivos pal (*.pal)|*.pal|Todos los archivos (*.*)|*.*</Message>
<Message ID="FilterRom">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 (*.*)|*.*</Message>
<Message ID="FilterRomIps">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 (*.*)|*.*</Message>
<Message ID="FilterRom">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 (*.*)|*.*</Message>
<Message ID="FilterRomIps">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 (*.*)|*.*</Message>
<Message ID="FilterTest">Archivos de test (*.mtp)|*.mtp|Todos los archivos (*.*)|*.*</Message>
<Message ID="Resume">Continuar</Message>

View file

@ -376,8 +376,8 @@
<Message ID="FilterMovie">Films (*.mmo)|*.mmo|Tous les fichiers (*.*)|*.*</Message>
<Message ID="FilterWave">Fichiers wave (*.wav)|*.wav|Tous les fichiers (*.*)|*.*</Message>
<Message ID="FilterPalette">Fichier de palette (*.pal)|*.pal|Tous les fichiers (*.*)|*.*</Message>
<Message ID="FilterRom">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 (*.*)|*.*</Message>
<Message ID="FilterRomIps">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 (*.*)|*.*</Message>
<Message ID="FilterRom">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 (*.*)|*.*</Message>
<Message ID="FilterRomIps">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 (*.*)|*.*</Message>
<Message ID="FilterTest">Fichiers de test (*.mtp)|*.mtp|Tous les fichiers (*.*)|*.*</Message>
<Message ID="Resume">Continuer</Message>

View file

@ -368,8 +368,8 @@
<Message ID="FilterMovie">動画 (*.mmo)|*.mmo|すべてのファイル (*.*)|*.*</Message>
<Message ID="FilterWave">WAVファイル (*.wav)|*.wav|すべてのファイル (*.*)|*.*</Message>
<Message ID="FilterPalette">パレットファイル (*.pal)|*.pal|すべてのファイル (*.*)|*.*</Message>
<Message ID="FilterRom">対応するすべてのファイル (*.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|すべてのファイル (*.*)|*.*</Message>
<Message ID="FilterRomIps">対応するすべてのファイル (*.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|すべてのファイル (*.*)|*.*</Message>
<Message ID="FilterRom">対応するすべてのファイル (*.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|すべてのファイル (*.*)|*.*</Message>
<Message ID="FilterRomIps">対応するすべてのファイル (*.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|すべてのファイル (*.*)|*.*</Message>
<Message ID="FilterTest">テストファイル (*.mtp)|*.mtp|すべてのファイル (*.*)|*.*</Message>
<Message ID="Resume">再開</Message>

View file

@ -376,8 +376,8 @@
<Message ID="FilterMovie">Записи (*.mmo)|*.mmo|All Files (*.*)|*.*</Message>
<Message ID="FilterWave">Wave files (*.wav)|*.wav|All Files (*.*)|*.*</Message>
<Message ID="FilterPalette">Palette Files (*.pal)|*.pal|All Files (*.*)|*.*</Message>
<Message ID="FilterRom">Все поддерживаемые форматы (*.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 (*.*)|*.*</Message>
<Message ID="FilterRomIps">Все поддерживаемые форматы (*.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 (*.*)|*.*</Message>
<Message ID="FilterRom">Все поддерживаемые форматы (*.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 (*.*)|*.*</Message>
<Message ID="FilterRomIps">Все поддерживаемые форматы (*.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 (*.*)|*.*</Message>
<Message ID="FilterTest">Test files (*.mtp)|*.mtp|All (*.*)|*.*</Message>
<Message ID="Resume">Продолжить</Message>

View file

@ -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;
}
}

View file

@ -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);