Support for VS Unisystem games (Not yet supported properly in movies and netplay)

This commit is contained in:
Souryo 2016-04-30 20:08:53 -04:00
parent 21b0d0cb06
commit 04d470b15d
38 changed files with 2028 additions and 41 deletions

View file

@ -328,6 +328,7 @@ void BaseMapper::Initialize(RomData &romData)
_hasBattery = romData.HasBattery || ForceBattery();
_isPalRom = romData.IsPalRom;
_isVsSystem = romData.IsVsSystem;
_crc32 = romData.Crc32;
_hasBusConflicts = HasBusConflicts();
@ -417,8 +418,13 @@ void BaseMapper::ApplyCheats()
void BaseMapper::GetMemoryRanges(MemoryRanges &ranges)
{
ranges.AddHandler(MemoryOperation::Read, 0x4018, 0xFFFF);
ranges.AddHandler(MemoryOperation::Write, 0x4018, 0xFFFF);
if(IsVsSystem()) {
ranges.AddHandler(MemoryOperation::Read, 0x6000, 0xFFFF);
ranges.AddHandler(MemoryOperation::Write, 0x6000, 0xFFFF);
} else {
ranges.AddHandler(MemoryOperation::Read, 0x4018, 0xFFFF);
ranges.AddHandler(MemoryOperation::Write, 0x4018, 0xFFFF);
}
}
void BaseMapper::SetDefaultNametables(uint8_t* nametableA, uint8_t* nametableB)
@ -482,6 +488,11 @@ bool BaseMapper::IsPalRom()
return _isPalRom;
}
bool BaseMapper::IsVsSystem()
{
return _isVsSystem;
}
uint32_t BaseMapper::GetCrc32()
{
return _crc32;

View file

@ -47,6 +47,7 @@ private:
bool _onlyChrRam = false;
bool _isPalRom = false;
bool _isVsSystem = false;
bool _hasBusConflicts = false;
string _romFilename;
@ -158,6 +159,7 @@ public:
void SetDefaultNametables(uint8_t* nametableA, uint8_t* nametableB);
bool IsPalRom();
bool IsVsSystem();
uint32_t GetCrc32();
uint8_t ReadRAM(uint16_t addr);

View file

@ -2,6 +2,8 @@
#include <thread>
#include "Console.h"
#include "BaseMapper.h"
#include "ControlManager.h"
#include "VsControlManager.h"
#include "MapperFactory.h"
#include "Debugger.h"
#include "MessageManager.h"
@ -53,7 +55,7 @@ void Console::Initialize(string romFilename, stringstream *filestream, string ip
}
_apu.reset(new APU(_memoryManager.get()));
_controlManager.reset(new ControlManager());
_controlManager.reset(_mapper->IsVsSystem() ? new VsControlManager() : new ControlManager());
_memoryManager->RegisterIODevice(_mapper.get());
_memoryManager->RegisterIODevice(_ppu.get());

View file

@ -29,12 +29,12 @@ class ControlManager : public Snapshotable, public IMemoryHandler
bool _refreshState = false;
void RefreshAllPorts();
uint8_t GetPortValue(uint8_t port);
static void RegisterControlDevice(shared_ptr<BaseControlDevice> controlDevice, uint8_t port);
void UnregisterControlDevice(uint8_t port);
protected:
uint8_t GetPortValue(uint8_t port);
virtual void StreamState(bool saving);
public:
@ -59,12 +59,12 @@ class ControlManager : public Snapshotable, public IMemoryHandler
static void BroadcastInput(uint8_t port, uint8_t state);
void GetMemoryRanges(MemoryRanges &ranges)
virtual void GetMemoryRanges(MemoryRanges &ranges)
{
ranges.AddHandler(MemoryOperation::Read, 0x4016, 0x4017);
ranges.AddHandler(MemoryOperation::Write, 0x4016);
}
uint8_t ReadRAM(uint16_t addr);
void WriteRAM(uint16_t addr, uint8_t value);
virtual uint8_t ReadRAM(uint16_t addr);
virtual void WriteRAM(uint16_t addr, uint8_t value);
};

View file

@ -522,6 +522,8 @@
<ClInclude Include="VRC6.h" />
<ClInclude Include="VRC7.h" />
<ClInclude Include="VrcIrq.h" />
<ClInclude Include="VsControlManager.h" />
<ClInclude Include="VsSystem.h" />
<ClInclude Include="Zapper.h" />
</ItemGroup>
<ItemGroup>
@ -579,6 +581,7 @@
<ClCompile Include="VideoRenderer.cpp" />
<ClCompile Include="VideoDecoder.cpp" />
<ClCompile Include="BaseVideoFilter.cpp" />
<ClCompile Include="VsControlManager.cpp" />
<ClCompile Include="Zapper.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

View file

@ -575,6 +575,12 @@
<ClInclude Include="Mapper241.h">
<Filter>Nes\Mappers\Unnamed</Filter>
</ClInclude>
<ClInclude Include="VsSystem.h">
<Filter>Nes\Mappers</Filter>
</ClInclude>
<ClInclude Include="VsControlManager.h">
<Filter>Nes</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
@ -646,9 +652,6 @@
<ClCompile Include="ControlManager.cpp">
<Filter>Nes</Filter>
</ClCompile>
<ClCompile Include="MapperFactory.cpp">
<Filter>Nes</Filter>
</ClCompile>
<ClCompile Include="MemoryManager.cpp">
<Filter>Nes</Filter>
</ClCompile>
@ -715,5 +718,11 @@
<ClCompile Include="ReverbFilter.cpp">
<Filter>Nes\APU\Filters</Filter>
</ClCompile>
<ClCompile Include="MapperFactory.cpp">
<Filter>Nes\Mappers</Filter>
</ClCompile>
<ClCompile Include="VsControlManager.cpp">
<Filter>Nes</Filter>
</ClCompile>
</ItemGroup>
</Project>

View file

@ -1,21 +1,6 @@
#include "stdafx.h"
#include "EmulationSettings.h"
uint32_t EmulationSettings::PpuPaletteArgb[64] = {
0xFF666666, 0xFF002A88, 0xFF1412A7, 0xFF3B00A4, 0xFF5C007E,
0xFF6E0040, 0xFF6C0600, 0xFF561D00, 0xFF333500, 0xFF0B4800,
0xFF005200, 0xFF004F08, 0xFF00404D, 0xFF000000, 0xFF000000,
0xFF000000, 0xFFADADAD, 0xFF155FD9, 0xFF4240FF, 0xFF7527FE,
0xFFA01ACC, 0xFFB71E7B, 0xFFB53120, 0xFF994E00, 0xFF6B6D00,
0xFF388700, 0xFF0C9300, 0xFF008F32, 0xFF007C8D, 0xFF000000,
0xFF000000, 0xFF000000, 0xFFFFFEFF, 0xFF64B0FF, 0xFF9290FF,
0xFFC676FF, 0xFFF36AFF, 0xFFFE6ECC, 0xFFFE8170, 0xFFEA9E22,
0xFFBCBE00, 0xFF88D800, 0xFF5CE430, 0xFF45E082, 0xFF48CDDE,
0xFF4F4F4F, 0xFF000000, 0xFF000000, 0xFFFFFEFF, 0xFFC0DFFF,
0xFFD3D2FF, 0xFFE8C8FF, 0xFFFBC2FF, 0xFFFEC4EA, 0xFFFECCC5,
0xFFF7D8A5, 0xFFE4E594, 0xFFCFEF96, 0xFFBDF4AB, 0xFFB3F3CC,
0xFFB5EBF2, 0xFFB8B8B8, 0xFF000000, 0xFF000000,
};
#include "VsControlManager.h"
//Version 0.1.1
uint16_t EmulationSettings::_versionMajor = 0;
@ -37,6 +22,7 @@ double EmulationSettings::_reverbStrength = 0;
double EmulationSettings::_reverbDelay = 0;
NesModel EmulationSettings::_model = NesModel::Auto;
PpuModel EmulationSettings::_ppuModel = PpuModel::Ppu2C03;
uint32_t EmulationSettings::_emulationSpeed = 100;
@ -49,4 +35,18 @@ ConsoleType EmulationSettings::_consoleType = ConsoleType::Nes;
ExpansionPortDevice EmulationSettings::_expansionDevice = ExpansionPortDevice::None;
ControllerType EmulationSettings::_controllerTypes[4] = { ControllerType::None, ControllerType::None, ControllerType::None, ControllerType::None };
KeyMappingSet EmulationSettings::_controllerKeys[4] = { KeyMappingSet(), KeyMappingSet(), KeyMappingSet(), KeyMappingSet() };
bool EmulationSettings::_needControllerUpdate = false;
bool EmulationSettings::_needControllerUpdate = false;
uint32_t EmulationSettings::_ppuPaletteArgb[11][64] = {
/* 2C02 */ { 0xFF666666, 0xFF002A88, 0xFF1412A7, 0xFF3B00A4, 0xFF5C007E, 0xFF6E0040, 0xFF6C0600, 0xFF561D00, 0xFF333500, 0xFF0B4800, 0xFF005200, 0xFF004F08, 0xFF00404D, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFADADAD, 0xFF155FD9, 0xFF4240FF, 0xFF7527FE, 0xFFA01ACC, 0xFFB71E7B, 0xFFB53120, 0xFF994E00, 0xFF6B6D00, 0xFF388700, 0xFF0C9300, 0xFF008F32, 0xFF007C8D, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFEFF, 0xFF64B0FF, 0xFF9290FF, 0xFFC676FF, 0xFFF36AFF, 0xFFFE6ECC, 0xFFFE8170, 0xFFEA9E22, 0xFFBCBE00, 0xFF88D800, 0xFF5CE430, 0xFF45E082, 0xFF48CDDE, 0xFF4F4F4F, 0xFF000000, 0xFF000000, 0xFFFFFEFF, 0xFFC0DFFF, 0xFFD3D2FF, 0xFFE8C8FF, 0xFFFBC2FF, 0xFFFEC4EA, 0xFFFECCC5, 0xFFF7D8A5, 0xFFE4E594, 0xFFCFEF96, 0xFFBDF4AB, 0xFFB3F3CC, 0xFFB5EBF2, 0xFFB8B8B8, 0xFF000000, 0xFF000000 } ,
/* 2C03 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
/* 2C04-0001 */ { 0xFFFFB6B6, 0xFFDA6DFF, 0xFFFF0000, 0xFF9191FF, 0xFF009191, 0xFF244800, 0xFF484848, 0xFFFF0091, 0xFFFFFFFF, 0xFF6D6D6D, 0xFFFFB600, 0xFFB6006D, 0xFF91006D, 0xFFDADA00, 0xFF6D4800, 0xFFFFFFFF, 0xFF6DB6FF, 0xFFDAB66D, 0xFF6D2400, 0xFF6DDA00, 0xFF91DAFF, 0xFFDAB6FF, 0xFFFFDA91, 0xFF0048FF, 0xFFFFDA00, 0xFF48FFDA, 0xFF000000, 0xFF480000, 0xFFDADADA, 0xFF919191, 0xFFFF00FF, 0xFF002491, 0xFF00006D, 0xFFB6DAFF, 0xFFFFB6FF, 0xFF00FF00, 0xFF00FFFF, 0xFF004848, 0xFF00B66D, 0xFFB600FF, 0xFF000000, 0xFF914800, 0xFFFF91FF, 0xFFB62400, 0xFF9100FF, 0xFF0000DA, 0xFFFF9100, 0xFF000000, 0xFF000000, 0xFF249100, 0xFFB6B6B6, 0xFF006D24, 0xFFB6FF48, 0xFF6D48DA, 0xFFFFFF00, 0xFFDA6D00, 0xFF004800, 0xFF006DDA, 0xFF009100, 0xFF242424, 0xFFFFFF6D, 0xFFFF6DFF, 0xFF916D00, 0xFF91FF6D },
/* 2C04-0002 */ { 0xFF000000, 0xFFFFB600, 0xFF916D00, 0xFFB6FF48, 0xFF91FF6D, 0xFFFF6DFF, 0xFF009191, 0xFFB6DAFF, 0xFFFF0000, 0xFF9100FF, 0xFFFFFF6D, 0xFFFF91FF, 0xFFFFFFFF, 0xFFDA6DFF, 0xFF91DAFF, 0xFF009100, 0xFF004800, 0xFF6DB6FF, 0xFFB62400, 0xFFDADADA, 0xFF00B66D, 0xFF6DDA00, 0xFF480000, 0xFF9191FF, 0xFF484848, 0xFFFF00FF, 0xFF00006D, 0xFF48FFDA, 0xFFDAB6FF, 0xFF6D4800, 0xFF000000, 0xFF6D48DA, 0xFF91006D, 0xFFFFDA91, 0xFFFF9100, 0xFFFFB6FF, 0xFF006DDA, 0xFF6D2400, 0xFFB6B6B6, 0xFF0000DA, 0xFFB600FF, 0xFFFFDA00, 0xFF6D6D6D, 0xFF244800, 0xFF0048FF, 0xFF000000, 0xFFDADA00, 0xFFFFFFFF, 0xFFDAB66D, 0xFF242424, 0xFF00FF00, 0xFFDA6D00, 0xFF004848, 0xFF002491, 0xFFFF0091, 0xFF249100, 0xFF000000, 0xFF00FFFF, 0xFF914800, 0xFFFFFF00, 0xFFFFB6B6, 0xFFB6006D, 0xFF006D24, 0xFF919191 },
/* 2C04-0003 */ { 0xFFB600FF, 0xFFFF6DFF, 0xFF91FF6D, 0xFFB6B6B6, 0xFF009100, 0xFFFFFFFF, 0xFFB6DAFF, 0xFF244800, 0xFF002491, 0xFF000000, 0xFFFFDA91, 0xFF6D4800, 0xFFFF0091, 0xFFDADADA, 0xFFDAB66D, 0xFF91DAFF, 0xFF9191FF, 0xFF009191, 0xFFB6006D, 0xFF0048FF, 0xFF249100, 0xFF916D00, 0xFFDA6D00, 0xFF00B66D, 0xFF6D6D6D, 0xFF6D48DA, 0xFF000000, 0xFF0000DA, 0xFFFF0000, 0xFFB62400, 0xFFFF91FF, 0xFFFFB6B6, 0xFFDA6DFF, 0xFF004800, 0xFF00006D, 0xFFFFFF00, 0xFF242424, 0xFFFFB600, 0xFFFF9100, 0xFFFFFFFF, 0xFF6DDA00, 0xFF91006D, 0xFF6DB6FF, 0xFFFF00FF, 0xFF006DDA, 0xFF919191, 0xFF000000, 0xFF6D2400, 0xFF00FFFF, 0xFF480000, 0xFFB6FF48, 0xFFFFB6FF, 0xFF914800, 0xFF00FF00, 0xFFDADA00, 0xFF484848, 0xFF006D24, 0xFF000000, 0xFFDAB6FF, 0xFFFFFF6D, 0xFF9100FF, 0xFF48FFDA, 0xFFFFDA00, 0xFF004848 },
/* 2C04-0004 */ { 0xFF916D00, 0xFF6D48DA, 0xFF009191, 0xFFDADA00, 0xFF000000, 0xFFFFB6B6, 0xFF002491, 0xFFDA6D00, 0xFFB6B6B6, 0xFF6D2400, 0xFF00FF00, 0xFF00006D, 0xFFFFDA91, 0xFFFFFF00, 0xFF009100, 0xFFB6FF48, 0xFFFF6DFF, 0xFF480000, 0xFF0048FF, 0xFFFF91FF, 0xFF000000, 0xFF484848, 0xFFB62400, 0xFFFF9100, 0xFFDAB66D, 0xFF00B66D, 0xFF9191FF, 0xFF249100, 0xFF91006D, 0xFF000000, 0xFF91FF6D, 0xFF6DB6FF, 0xFFB6006D, 0xFF006D24, 0xFF914800, 0xFF0000DA, 0xFF9100FF, 0xFFB600FF, 0xFF6D6D6D, 0xFFFF0091, 0xFF004848, 0xFFDADADA, 0xFF006DDA, 0xFF004800, 0xFF242424, 0xFFFFFF6D, 0xFF919191, 0xFFFF00FF, 0xFFFFB6FF, 0xFFFFFFFF, 0xFF6D4800, 0xFFFF0000, 0xFFFFDA00, 0xFF48FFDA, 0xFFFFFFFF, 0xFF91DAFF, 0xFF000000, 0xFFFFB600, 0xFFDA6DFF, 0xFFB6DAFF, 0xFF6DDA00, 0xFFDAB6FF, 0xFF00FFFF, 0xFF244800 },
/* 2C05-01 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
/* 2C05-02 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
/* 2C05-03 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
/* 2C05-04 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 },
/* 2C05-05 */ { 0xFF6D6D6D, 0xFF002491, 0xFF0000DA, 0xFF6D48DA, 0xFF91006D, 0xFFB6006D, 0xFFB62400, 0xFF914800, 0xFF6D4800, 0xFF244800, 0xFF006D24, 0xFF009100, 0xFF004848, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFB6B6B6, 0xFF006DDA, 0xFF0048FF, 0xFF9100FF, 0xFFB600FF, 0xFFFF0091, 0xFFFF0000, 0xFFDA6D00, 0xFF916D00, 0xFF249100, 0xFF009100, 0xFF00B66D, 0xFF009191, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF6DB6FF, 0xFF9191FF, 0xFFDA6DFF, 0xFFFF00FF, 0xFFFF6DFF, 0xFFFF9100, 0xFFFFB600, 0xFFDADA00, 0xFF6DDA00, 0xFF00FF00, 0xFF48FFDA, 0xFF00FFFF, 0xFF000000, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFFB6DAFF, 0xFFDAB6FF, 0xFFFFB6FF, 0xFFFF91FF, 0xFFFFB6B6, 0xFFFFDA91, 0xFFFFFF48, 0xFFFFFF6D, 0xFFB6FF48, 0xFF91FF6D, 0xFF48FFDA, 0xFF91DAFF, 0xFF000000, 0xFF000000, 0xFF000000 }
};

View file

@ -159,6 +159,21 @@ enum class StereoFilter
Panning = 2,
};
enum class PpuModel
{
Ppu2C02 = 0,
Ppu2C03 = 1,
Ppu2C04A = 2,
Ppu2C04B = 3,
Ppu2C04C = 4,
Ppu2C04D = 5,
Ppu2C05A = 6,
Ppu2C05B = 7,
Ppu2C05C = 8,
Ppu2C05D = 9,
Ppu2C05E = 10
};
class EmulationSettings
{
private:
@ -166,7 +181,7 @@ private:
static uint8_t _versionMinor;
static uint8_t _versionRevision;
static uint32_t PpuPaletteArgb[64];
static uint32_t _ppuPaletteArgb[11][64];
static uint32_t _flags;
static Language _displayLanguage;
@ -182,6 +197,7 @@ private:
static double _reverbDelay;
static NesModel _model;
static PpuModel _ppuModel;
static uint32_t _emulationSpeed;
@ -247,6 +263,16 @@ public:
return _model;
}
static void SetPpuModel(PpuModel ppuModel)
{
_ppuModel = ppuModel;
}
static PpuModel GetPpuModel()
{
return _ppuModel;
}
//0: Muted, 0.5: Default, 1.0: Max volume
static void SetChannelVolume(AudioChannel channel, double volume)
{
@ -410,17 +436,17 @@ public:
static uint32_t* GetRgbPalette()
{
return PpuPaletteArgb;
return _ppuPaletteArgb[(int)_ppuModel];
}
static void GetRgbPalette(uint32_t* paletteBuffer)
{
memcpy(paletteBuffer, PpuPaletteArgb, sizeof(PpuPaletteArgb));
memcpy(paletteBuffer, _ppuPaletteArgb[0], sizeof(_ppuPaletteArgb[0]));
}
static void SetRgbPalette(uint32_t* paletteBuffer)
{
memcpy(PpuPaletteArgb, paletteBuffer, sizeof(PpuPaletteArgb));
memcpy(_ppuPaletteArgb[0], paletteBuffer, sizeof(_ppuPaletteArgb[0]));
}
static void SetExpansionDevice(ExpansionPortDevice expansionDevice)

View file

@ -154,10 +154,7 @@ public:
RomData romData;
romData.MapperID = MapperFactory::FdsMapperID;
romData.SubMapperID = 0;
romData.MirroringType = MirroringType::Vertical;
romData.HasBattery = false;
romData.IsPalRom = false;
romData.PrgRom = LoadBios();
if(romData.PrgRom.size() != 0x2000) {

View file

@ -89,6 +89,7 @@
#include "VRC3.h"
#include "VRC6.h"
#include "VRC7.h"
#include "VsSystem.h"
BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
{
@ -160,6 +161,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case 94: return new UnRom_94();
case 95: return new Namco108_95();
case 97: return new IremTamS1();
case 99: return new VsSystem();
case 101: return new JalecoJfxx(true);
case 107: return new Mapper107();
case 112: return new Mapper112();

View file

@ -11,6 +11,8 @@ PPU::PPU(MemoryManager *memoryManager)
{
PPU::Instance = this;
EmulationSettings::SetPpuModel(PpuModel::Ppu2C02);
_memoryManager = memoryManager;
_outputBuffers[0] = new uint16_t[256 * 240];
_outputBuffers[1] = new uint16_t[256 * 240];
@ -20,7 +22,7 @@ PPU::PPU(MemoryManager *memoryManager)
uint8_t paletteRamBootValues[0x20] { 0x09, 0x01, 0x00, 0x01, 0x00, 0x02, 0x02, 0x0D, 0x08, 0x10, 0x08, 0x24, 0x00, 0x00, 0x04, 0x2C,
0x09, 0x01, 0x34, 0x03, 0x00, 0x04, 0x00, 0x14, 0x08, 0x3A, 0x00, 0x02, 0x00, 0x20, 0x2C, 0x08 };
memcpy(_paletteRAM, paletteRamBootValues, sizeof(_paletteRAM));
memset(_spriteRAM, 0xFF, 0x100);
memset(_spriteRAM, 0xFF, 0x100);
memset(_secondarySpriteRAM, 0xFF, 0x20);
Reset();
@ -137,6 +139,14 @@ uint8_t PPU::ReadRAM(uint16_t addr)
UpdateStatusFlag();
returnValue = _state.Status;
openBusMask = 0x1F;
switch(EmulationSettings::GetPpuModel()) {
case PpuModel::Ppu2C05A: openBusMask = 0x00; returnValue |= 0x1B; break;
case PpuModel::Ppu2C05B: openBusMask = 0x00; returnValue |= 0x3D; break;
case PpuModel::Ppu2C05C: openBusMask = 0x00; returnValue |= 0x1C; break;
case PpuModel::Ppu2C05D: openBusMask = 0x00; returnValue |= 0x1B; break;
case PpuModel::Ppu2C05E: openBusMask = 0x00; break;
}
break;
case PPURegisters::SpriteData:
@ -190,10 +200,18 @@ void PPU::WriteRAM(uint16_t addr, uint8_t value)
switch(GetRegisterID(addr)) {
case PPURegisters::Control:
SetControlRegister(value);
if(EmulationSettings::GetPpuModel() >= PpuModel::Ppu2C05A && EmulationSettings::GetPpuModel() <= PpuModel::Ppu2C05E) {
SetMaskRegister(value);
} else {
SetControlRegister(value);
}
break;
case PPURegisters::Mask:
SetMaskRegister(value);
if(EmulationSettings::GetPpuModel() >= PpuModel::Ppu2C05A && EmulationSettings::GetPpuModel() <= PpuModel::Ppu2C05E) {
SetControlRegister(value);
} else {
SetMaskRegister(value);
}
break;
case PPURegisters::SpriteAddr:
_state.SpriteRamAddr = value;

View file

@ -22,9 +22,11 @@ struct RomData
string Filename;
uint16_t MapperID;
uint8_t SubMapperID;
bool HasBattery;
bool IsPalRom;
uint8_t SubMapperID = 0;
bool HasBattery = false;
bool IsPalRom = false;
bool IsVsSystem = false;
bool IsPlayChoice = false;
MirroringType MirroringType;
vector<uint8_t> PrgRom;
@ -95,6 +97,24 @@ struct NESHeader
}
}
bool IsPlaychoice()
{
switch(GetRomHeaderVersion()) {
case RomHeaderVersion::Nes2_0:
case RomHeaderVersion::iNes: return (Byte7 & 0x02) == 0x02;
default: return false;
}
}
bool IsVsSystem()
{
switch(GetRomHeaderVersion()) {
case RomHeaderVersion::Nes2_0:
case RomHeaderVersion::iNes: return (Byte7 & 0x01) == 0x01;
default: return false;
}
}
RomHeaderVersion GetRomHeaderVersion()
{
if((Byte7 & 0x0C) == 0x08) {

View file

@ -122,6 +122,10 @@ bool RomLoader::LoadFile(string filename, istream *filestream, string ipsFilenam
RomData RomLoader::GetRomData()
{
_romData.Filename = _filename;
//Use filename to detect PAL/VS system games
_romData.IsPalRom |= _filename.find("(e)") != string::npos || _filename.find("(E)") != string::npos;
_romData.IsVsSystem |= _filename.find("(VS)") != string::npos || _filename.find("(vs)") != string::npos || _filename.find("(Vs)") != string::npos || _filename.find("(vS)") != string::npos;
return _romData;
}

View file

@ -0,0 +1,4 @@
#include "stdafx.h"
#include "VsControlManager.h"
VsControlManager *VsControlManager::_instance = nullptr;

121
Core/VsControlManager.h Normal file
View file

@ -0,0 +1,121 @@
#pragma once
#include "stdafx.h"
#include "ControlManager.h"
#include "CPU.h"
#include <assert.h>
class VsControlManager : public ControlManager
{
private:
static VsControlManager *_instance;
uint8_t _prgChrSelectBit;
uint8_t _dipSwitches = 0;
bool _serviceButton = false;
bool _coinInserted[2] = { };
int32_t _coinInsertCycle[2] = { };
private:
void UpdateCoinInsertedFlags()
{
int32_t cycle = CPU::GetCycleCount();
for(int i = 0; i < 2; i++) {
if(_coinInserted[i] && cycle - _coinInsertCycle[i] > 120000) {
_coinInserted[i] = false;
}
}
}
public:
VsControlManager()
{
_instance = this;
}
~VsControlManager()
{
if(_instance == this) {
_instance = nullptr;
}
}
static VsControlManager* GetInstance()
{
return _instance;
}
void InsertCoin(uint8_t port)
{
assert(port < 2);
_coinInsertCycle[port] = CPU::GetCycleCount();
_coinInserted[port] = true;
}
void SetDipSwitches(uint8_t dipSwitches)
{
_dipSwitches = dipSwitches;
}
void SetServiceButtonState(bool pushed)
{
_serviceButton = pushed;
}
void GetMemoryRanges(MemoryRanges &ranges)
{
ControlManager::GetMemoryRanges(ranges);
ranges.AddHandler(MemoryOperation::Read, 0x4020, 0x5FFF);
ranges.AddHandler(MemoryOperation::Write, 0x4020, 0x5FFF);
}
uint8_t GetPrgChrSelectBit()
{
return _prgChrSelectBit;
}
uint8_t ReadRAM(uint16_t addr)
{
UpdateCoinInsertedFlags();
uint8_t value = 0;
switch(addr) {
case 0x4016: value = GetPortValue(1); break;
case 0x4017: value = GetPortValue(0); break;
}
value &= 0x01;
if(addr == 0x4016) {
if(_coinInserted[0]) {
value |= 0x20;
}
if(_coinInserted[1]) {
value |= 0x40;
}
if(_serviceButton) {
value |= 0x04;
}
value |= ((_dipSwitches & 0x01) ? 0x08 : 0x00);
value |= ((_dipSwitches & 0x02) ? 0x10 : 0x00);
} else if(addr == 0x4017) {
value |= ((_dipSwitches & 0x04) ? 0x04 : 0x00);
value |= ((_dipSwitches & 0x08) ? 0x08 : 0x00);
value |= ((_dipSwitches & 0x10) ? 0x10 : 0x00);
value |= ((_dipSwitches & 0x20) ? 0x20 : 0x00);
value |= ((_dipSwitches & 0x40) ? 0x40 : 0x00);
value |= ((_dipSwitches & 0x80) ? 0x80 : 0x00);
}
return value;
}
void WriteRAM(uint16_t addr, uint8_t value)
{
ControlManager::WriteRAM(addr, value);
if(addr == 0x4016) {
_prgChrSelectBit = (value >> 2) & 0x01;
}
}
};

36
Core/VsSystem.h Normal file
View file

@ -0,0 +1,36 @@
#pragma once
#include "stdafx.h"
#include "BaseMapper.h"
#include "VsControlManager.h"
class VsSystem : public BaseMapper
{
private:
uint8_t _prgChrSelectBit = false;
protected:
virtual uint16_t GetPRGPageSize() { return 0x2000; }
virtual uint16_t GetCHRPageSize() { return 0x2000; }
virtual void InitMapper()
{
if(_prgSize > 0x6000) {
SelectPRGPage(0, 0);
}
SelectPRGPage(1, 1);
SelectPRGPage(2, 2);
SelectPRGPage(3, 3);
SelectCHRPage(0, 0);
}
uint8_t ReadVRAM(uint16_t addr)
{
if(_prgChrSelectBit != VsControlManager::GetInstance()->GetPrgChrSelectBit()) {
_prgChrSelectBit = VsControlManager::GetInstance()->GetPrgChrSelectBit();
SelectCHRPage(0, _prgChrSelectBit);
}
return BaseMapper::ReadVRAM(addr);
}
};

View file

@ -20,6 +20,8 @@ public:
romData.MirroringType = header.GetMirroringType();
romData.HasBattery = header.HasBattery();
romData.IsPalRom = header.IsPalRom();
romData.IsVsSystem = header.IsVsSystem();
romData.IsPlayChoice = header.IsPlaychoice();
romData.PrgRom.insert(romData.PrgRom.end(), buffer, buffer + header.GetPrgSize());
buffer += header.GetPrgSize();

View file

@ -18,6 +18,7 @@ namespace Mesen.GUI.Config
public VideoInfo VideoInfo;
public InputInfo InputInfo;
public List<string> RecentFiles;
public List<VsConfigInfo> VsConfig;
public List<CheatInfo> Cheats;
public bool ShowOnlyCheatsForCurrentGame;
public NesModel Region;

View file

@ -0,0 +1,111 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace Mesen.GUI.Config
{
public class VsConfigInfo
{
public string GameID;
public string GameHash;
public InteropEmu.PpuModel PpuModel;
public byte DipSwitches;
public static VsConfigInfo GetCurrentGameConfig(bool createNew)
{
string hash = MD5Helper.GetMD5Hash(InteropEmu.GetROMPath());
foreach(VsConfigInfo config in ConfigManager.Config.VsConfig) {
if(config.GameHash == hash) {
return config;
}
}
if(createNew) {
VsConfigInfo newConfig = new VsConfigInfo();
newConfig.GameHash = hash;
ConfigManager.Config.VsConfig.Add(newConfig);
return newConfig;
} else {
return null;
}
}
public static void ApplyConfig()
{
VsConfigInfo configInfo = GetCurrentGameConfig(false);
if(configInfo != null) {
InteropEmu.VsSetGameConfig(configInfo.PpuModel, configInfo.DipSwitches);
}
}
}
public class VsGameConfig
{
public string GameName;
public List<List<string>> DipSwitches;
private static Dictionary<string, VsGameConfig> _gameConfigs = new Dictionary<string, VsGameConfig>();
public static string GetGameID(string romName)
{
romName = romName.ToLowerInvariant().Replace(" ", "");
foreach(KeyValuePair<string, VsGameConfig> kvp in _gameConfigs) {
if(romName.Contains(kvp.Key.ToLowerInvariant().Replace(" ", "")) || romName.Contains(kvp.Value.GameName.ToLowerInvariant().Replace(" ", ""))) {
return kvp.Key;
}
}
return "Unknown";
}
public static VsGameConfig GetGameConfig(string gameID)
{
if(gameID != null && _gameConfigs.ContainsKey(gameID)) {
return _gameConfigs[gameID];
} else {
return null;
}
}
public static Dictionary<string, VsGameConfig> GetGameConfigs()
{
return _gameConfigs;
}
static VsGameConfig()
{
XmlDocument config = new XmlDocument();
config.Load(ResourceManager.GetZippedResource("VsSystem.xml"));
foreach(XmlNode gameNode in config.SelectNodes("/VsSystemGames/Game")) {
var gameConfig = new VsGameConfig();
gameConfig.GameName = gameNode.Attributes["Localization"].Value;
gameConfig.DipSwitches = new List<List<string>>();
foreach(XmlNode dipSwitch in gameNode.SelectNodes("DipSwitch")) {
if(dipSwitch.Attributes["Localization"] != null) {
var list = new List<string>();
gameConfig.DipSwitches.Add(list);
list.Add(dipSwitch.Attributes["Localization"].Value);
foreach(XmlNode option in dipSwitch.SelectNodes("Option")) {
list.Add(option.InnerText);
}
} else {
var list = new List<string>();
gameConfig.DipSwitches.Add(list);
list.Add("Unknown");
list.Add("Off");
list.Add("On");
}
}
_gameConfigs[gameNode.Attributes["ID"].Value] = gameConfig;
}
}
}
}

View file

@ -0,0 +1,737 @@
<?xml version="1.0" encoding="UTF-8"?>
<VsSystemGames>
<Game ID="BattleCity" Localization="Battle City">
<DipSwitch Localization="Credits for 2 Players">
<Option>1</Option>
<Option>2</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>3</Option>
<Option>5</Option>
</DipSwitch>
<DipSwitch Localization="Demo Sounds">
<Option>On</Option>
<Option>Off</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="PPU">
<Option>RP2C04-0001</Option>
<Option>RP2C04-0002</Option>
<Option>RP2C04-0003</Option>
<Option>RP2C04-0004</Option>
</DipSwitch>
</Game>
<Game ID="Castlevania" Localization="Castlevania">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>5 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>3</Option>
<Option>2</Option>
</DipSwitch>
<DipSwitch Localization="Bonus">
<Option>100k</Option>
<Option>300k</Option>
<Option>200k</Option>
<Option>400k</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty">
<Option>Normal</Option>
<Option>Hard</Option>
</DipSwitch>
</Game>
<Game ID="CluCluLand" Localization="Clu Clu Land">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Lives">
<Option>3</Option>
<Option>5</Option>
<Option>4</Option>
<Option>2</Option>
</DipSwitch>
<DipSwitch />
</Game>
<Game ID="DrMario" Localization="Dr. Mario">
<DipSwitch Localization="Drop Rate Increases After">
<Option>7 Pills</Option>
<Option>8 Pills</Option>
<Option>9 Pills</Option>
<Option>10 Pills</Option>
</DipSwitch>
<DipSwitch Localization="Virus Level">
<Option>1</Option>
<Option>3</Option>
<Option>5</Option>
<Option>7</Option>
</DipSwitch>
<DipSwitch Localization="Drop Speed">
<Option>Slow</Option>
<Option>Normal</Option>
<Option>Fast</Option>
<Option>Faster</Option>
</DipSwitch>
<DipSwitch Localization="Free Play">
<Option>Off</Option>
<Option>On</Option>
</DipSwitch>
<DipSwitch Localization="Demo Sounds">
<Option>Off</Option>
<Option>On</Option>
</DipSwitch>
</Game>
<Game ID="DuckHunt" Localization="Duck Hunt">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>5 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty">
<Option>Very Easy</Option>
<Option>Easy</Option>
<Option>Hard</Option>
<Option>Very Hard</Option>
</DipSwitch>
<DipSwitch Localization="Misses per Game">
<Option>3</Option>
<Option>5</Option>
</DipSwitch>
<DipSwitch Localization="Bonus Life">
<Option>30000</Option>
<Option>50000</Option>
<Option>80000</Option>
<Option>100000</Option>
</DipSwitch>
</Game>
<Game ID="ExciteBike" Localization="Excitebike">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Bonus">
<Option>100k and Every 50k</Option>
<Option>100k Only</Option>
<Option>Every 100k</Option>
<Option>None</Option>
</DipSwitch>
<DipSwitch Localization="Part 1 Qualifying Time">
<Option>Normal</Option>
<Option>Hard</Option>
</DipSwitch>
<DipSwitch Localization="Part 2 Qualifying Time">
<Option>Normal</Option>
<Option>Hard</Option>
</DipSwitch>
</Game>
<Game ID="FreedomForce" Localization="Freedom Force">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>5 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch />
</Game>
<Game ID="Golf" Localization="Golf">
<DipSwitch Localization="Coins">
<Option>Free Play</Option>
<Option>1 coin = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
</DipSwitch>
<DipSwitch Localization="Hole Size">
<Option>Large</Option>
<Option>Small</Option>
</DipSwitch>
<DipSwitch Localization="Points per Stroke">
<Option>Easy</Option>
<Option>Hard</Option>
</DipSwitch>
<DipSwitch Localization="Starting Points">
<Option>10</Option>
<Option>16</Option>
<Option>13</Option>
<Option>20</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty Vs. Computer">
<Option>Easy</Option>
<Option>Hard</Option>
</DipSwitch>
</Game>
<Game ID="Goonies" Localization="Goonies">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>5 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>3</Option>
<Option>2</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Timer">
<Option>Normal</Option>
<Option>Fast</Option>
</DipSwitch>
<DipSwitch Localization="Demo Sounds">
<Option>Off</Option>
<Option>On</Option>
</DipSwitch>
</Game>
<Game ID="Gradius" Localization="Gradius">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>5 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>4</Option>
<Option>3</Option>
</DipSwitch>
<DipSwitch Localization="Bonus">
<Option>100k</Option>
<Option>300k</Option>
<Option>200k</Option>
<Option>400k</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty">
<Option>Normal</Option>
<Option>Hard</Option>
</DipSwitch>
<DipSwitch Localization="Demo Sounds">
<Option>Off</Option>
<Option>On</Option>
</DipSwitch>
</Game>
<Game ID="Gumshoe" Localization="Gumshoe">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>5 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty">
<Option>Easy</Option>
<Option>Normal</Option>
<Option>Hard</Option>
<Option>Very Hard</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>5</Option>
<Option>3</Option>
</DipSwitch>
<DipSwitch Localization="Bullets per Balloon">
<Option>3</Option>
<Option>2</Option>
</DipSwitch>
<DipSwitch Localization="Bonus Life">
<Option>80000</Option>
<Option>100000</Option>
</DipSwitch>
</Game>
<Game ID="HoganAlley" Localization="Hogan's Alley">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>5 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty">
<Option>Easy</Option>
<Option>Normal</Option>
<Option>Hard</Option>
<Option>Very Hard</Option>
</DipSwitch>
<DipSwitch Localization="Misses per Game">
<Option>3</Option>
<Option>5</Option>
</DipSwitch>
<DipSwitch Localization="Bonus Life">
<Option>30000</Option>
<Option>50000</Option>
<Option>80000</Option>
<Option>100000</Option>
</DipSwitch>
</Game>
<Game ID="IceClimber" Localization="Ice Climber">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>3</Option>
<Option>5</Option>
<Option>4</Option>
<Option>7</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty">
<Option>Normal</Option>
<Option>Hard</Option>
</DipSwitch>
<DipSwitch Localization="Time before the bear">
<Option>Long</Option>
<Option>Short</Option>
</DipSwitch>
</Game>
<Game ID="MachRider" Localization="Mach Rider">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Time">
<Option>280</Option>
<Option>220</Option>
<Option>250</Option>
<Option>200</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch />
</Game>
<Game ID="MachRiderFightingCourse" Localization="Mach Rider - Fighting Course">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="1st Race Length (km)">
<Option>12</Option>
<Option>15</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch />
</Game>
<Game ID="MightyBombJack" Localization="Mighty Bomb Jack">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>5 coins = 1 credit</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>3</Option>
<Option>4</Option>
<Option>2</Option>
<Option>5</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch />
</Game>
<Game ID="NinjaJajamaruKun" Localization="Ninja Jajamaru Kun">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>3</Option>
<Option>5</Option>
<Option>4</Option>
<Option>Unused</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Demo Sounds">
<Option>Off</Option>
<Option>On</Option>
</DipSwitch>
</Game>
<Game ID="Pinball" Localization="Pinball">
<DipSwitch Localization="Coins">
<Option>Free Play</Option>
<Option>1 coin = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Balls">
<Option>3</Option>
<Option>5</Option>
<Option>4</Option>
<Option>2</Option>
</DipSwitch>
<DipSwitch Localization="Ball Speed">
<Option>Normal</Option>
<Option>Fast</Option>
</DipSwitch>
</Game>
<Game ID="Platoon" Localization="Platoon">
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Demo Sounds">
<Option>Off</Option>
<Option>On</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>1 coin = 3 credits</Option>
<Option>2 coins = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>4 coins = 1 credit</Option>
<Option>5 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
</Game>
<Game ID="RBI Baseball" Localization="RBI Baseball">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>2 coins = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
</DipSwitch>
<DipSwitch Localization="1p/inn, 2p/inn, Time/Min">
<Option>3, 2, 6</Option>
<Option>2, 1, 3</Option>
<Option>4, 3, 7</Option>
<Option>2, 2, 4</Option>
</DipSwitch>
<DipSwitch Localization="Demo Sounds">
<Option>Off</Option>
<Option>On</Option>
</DipSwitch>
<DipSwitch Localization="PPU">
<Option>RP2C04-0001</Option>
<Option>RP2C03</Option>
<Option>RP2C04-0002</Option>
<Option>Unused</Option>
<Option>RP2C04-0003</Option>
<Option>RP2C04-0004</Option>
<Option>Unused</Option>
</DipSwitch>
</Game>
<Game ID="RaidBungelingBay" Localization="Raid on Bungeling Bay">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>2</Option>
<Option>3</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch />
</Game>
<Game ID="Slalom" Localization="Slalom">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>5 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Freestyle Points">
<Option>Left / Right</Option>
<Option>Hold Time</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty">
<Option>Very Easy</Option>
<Option>Easy</Option>
<Option>Hard</Option>
<Option>Very Hard</Option>
</DipSwitch>
<DipSwitch Localization="Allow Continue">
<Option>Yes</Option>
<Option>No</Option>
</DipSwitch>
<DipSwitch Localization="Inverted Input">
<Option>Off</Option>
<Option>On</Option>
</DipSwitch>
</Game>
<Game ID="Soccer" Localization="Soccer">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Points Timer">
<Option>600 Pts</Option>
<Option>1000 Pts</Option>
<Option>800 Pts</Option>
<Option>1200 Pts</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty">
<Option>Very Easy</Option>
<Option>Easy</Option>
<Option>Hard</Option>
<Option>Very Hard</Option>
</DipSwitch>
</Game>
<Game ID="StarLuster" Localization="Star Luster">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Palette Color">
<Option>Unused</Option>
<Option>Green</Option>
<Option>Black</Option>
<Option>Grey</Option>
</DipSwitch>
<DipSwitch />
</Game>
<Game ID="SuperMarioBros" Localization="Super Mario Bros">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 5 credits</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 4 credits</Option>
<Option>1 coin = 2 credits</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>3</Option>
<Option>2</Option>
</DipSwitch>
<DipSwitch Localization="Bonus Life">
<Option>100</Option>
<Option>200</Option>
<Option>150</Option>
<Option>250</Option>
</DipSwitch>
<DipSwitch Localization="Timer">
<Option>Normal</Option>
<Option>Fast</Option>
</DipSwitch>
<DipSwitch Localization="Continue Lives">
<Option>4</Option>
<Option>3</Option>
</DipSwitch>
</Game>
<Game ID="SuperSkyKid" Localization="Super Sky Kid">
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Lives">
<Option>2</Option>
<Option>3</Option>
</DipSwitch>
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>2 coins = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
</DipSwitch>
<DipSwitch Localization="PPU">
<Option>RP2C04-0001</Option>
<Option>RP2C03</Option>
<Option>RP2C04-0002</Option>
<Option>Unused</Option>
<Option>RP2C04-0003</Option>
<Option>Unused</Option>
<Option>RP2C04-0004</Option>
<Option>Unused</Option>
</DipSwitch>
</Game>
<Game ID="SuperXevious" Localization="Super Xevious">
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>2 coins = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
</DipSwitch>
<DipSwitch Localization="PPU">
<Option>RP2C04-0001</Option>
<Option>RP2C04-0002</Option>
<Option>RP2C04-0003</Option>
<Option>RP2C04-0004</Option>
</DipSwitch>
</Game>
<Game ID="Tetris" Localization="Tetris">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>3 coins = 1 credit</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Palette Color">
<Option>Unused</Option>
<Option>Green</Option>
<Option>Black</Option>
<Option>Grey</Option>
</DipSwitch>
<DipSwitch />
</Game>
<Game ID="TKOBoxing" Localization="TKO Boxing">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>2 coins = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch Localization="Palette Color">
<Option>Black</Option>
<Option>White</Option>
</DipSwitch>
<DipSwitch />
<DipSwitch />
</Game>
<Game ID="TopGun" Localization="Top Gun">
<DipSwitch Localization="Coins">
<Option>1 coin = 1 credit</Option>
<Option>3 coins = 1 credit</Option>
<Option>1 coin = 3 credits</Option>
<Option>5 coins = 1 credit</Option>
<Option>1 coin = 2 credits</Option>
<Option>4 coins = 1 credit</Option>
<Option>2 coins = 1 credit</Option>
<Option>Free Play</Option>
</DipSwitch>
<DipSwitch Localization="Lives">
<Option>3 per coin - 12 maximum</Option>
<Option>2 per coin - 9 maximum</Option>
</DipSwitch>
<DipSwitch Localization="Bonus">
<Option>30k and every 50k</Option>
<Option>100k and every 150k</Option>
<Option>50k and every 100k</Option>
<Option>200k and every 200k</Option>
</DipSwitch>
<DipSwitch Localization="Difficulty">
<Option>Easy</Option>
<Option>Hard</Option>
</DipSwitch>
<DipSwitch Localization="Demo Sounds">
<Option>Off</Option>
<Option>On</Option>
</DipSwitch>
</Game>
<Game ID="Unknown" Localization="Unknown">
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch />
<DipSwitch />
</Game>
</VsSystemGames>

View file

@ -62,6 +62,18 @@
<Value ID="FourPlayerAdapter">Four Player Adapter</Value>
<Value ID="ArkanoidController">Arkanoid Controller</Value>
</Enum>
<Enum ID="PpuModel">
<Value ID="Ppu2C03">RP2C03</Value>
<Value ID="Ppu2C04A">RP2C04-0001</Value>
<Value ID="Ppu2C04B">RP2C04-0002</Value>
<Value ID="Ppu2C04C">RP2C04-0003</Value>
<Value ID="Ppu2C04D">RP2C04-0004</Value>
<Value ID="Ppu2C05A">RP2C05-01</Value>
<Value ID="Ppu2C05B">RP2C05-02</Value>
<Value ID="Ppu2C05C">RP2C05-03</Value>
<Value ID="Ppu2C05D">RP2C05-04</Value>
<Value ID="Ppu2C05E">RP2C05-05</Value>
</Enum>
<Enum ID="Language">
<Value ID="SystemDefault">User Account Default</Value>
<Value ID="English">English</Value>

View file

@ -15,6 +15,9 @@
<Control ID="mnuSwitchDiskSide">Changer le disque de côté</Control>
<Control ID="mnuSelectDisk">Choisir le disque</Control>
<Control ID="mnuEjectDisk">Éjecter le disque</Control>
<Control ID="mnuVsGameConfig">Configuration du jeu VS</Control>
<Control ID="mnuInsertCoin1">Insérer une pièce (1)</Control>
<Control ID="mnuInsertCoin2">Insérer une pièce (2)</Control>
<Control ID="mnuOptions">Options</Control>
<Control ID="mnuEmulationSpeed">Vitesse</Control>
<Control ID="mnuEmuSpeedNormal">Normale (100%)</Control>
@ -256,6 +259,11 @@
<Control ID="lblDonate">Mesen est gratuit. Par contre, si vous voulez supporter son dévelopement, cliquez sur le lien ci-dessous pour plus d'information. Thank you!</Control>
<Control ID="lnkDonate">Pour plus d'information, cliquez ici.</Control>
</Form>
<Form ID="frmVsGameConfig" Title="Configuration du jeu VS">
<Control ID="lblGame">Jeu</Control>
<Control ID="lblPpuModel">Modèle du PPU</Control>
<Control ID="grpDipSwitches">Commutateurs DIP</Control>
</Form>
</Forms>
<Messages>
<Message ID="FilterAll">Tous les fichiers (*.*)|*.*</Message>
@ -319,6 +327,18 @@
<Value ID="FourPlayerAdapter">Adapteur pour 4 joueurs</Value>
<Value ID="ArkanoidController">Manette Arkanoid</Value>
</Enum>
<Enum ID="PpuModel">
<Value ID="Ppu2C03">RP2C03</Value>
<Value ID="Ppu2C04A">RP2C04-0001</Value>
<Value ID="Ppu2C04B">RP2C04-0002</Value>
<Value ID="Ppu2C04C">RP2C04-0003</Value>
<Value ID="Ppu2C04D">RP2C04-0004</Value>
<Value ID="Ppu2C05A">RP2C05-01</Value>
<Value ID="Ppu2C05B">RP2C05-02</Value>
<Value ID="Ppu2C05C">RP2C05-03</Value>
<Value ID="Ppu2C05D">RP2C05-04</Value>
<Value ID="Ppu2C05E">RP2C05-05</Value>
</Enum>
<Enum ID="Language">
<Value ID="SystemDefault">Défaut du compte utilisateur</Value>
<Value ID="English">English</Value>

View file

@ -15,6 +15,9 @@
<Control ID="mnuSwitchDiskSide">A面B面切り替え</Control>
<Control ID="mnuSelectDisk">ディスク選択</Control>
<Control ID="mnuEjectDisk">ディスクを取り出す</Control>
<Control ID="mnuVsGameConfig">VSゲームの設定</Control>
<Control ID="mnuInsertCoin1">インサートコイン 1</Control>
<Control ID="mnuInsertCoin2">インサートコイン 2</Control>
<Control ID="mnuOptions">設定</Control>
<Control ID="mnuEmulationSpeed">速度</Control>
<Control ID="mnuEmuSpeedNormal">通常 (100%)</Control>
@ -317,6 +320,18 @@
<Value ID="FourPlayerAdapter">4-Player Adapter</Value>
<Value ID="ArkanoidController">Arkanoidコントローラ</Value>
</Enum>
<Enum ID="PpuModel">
<Value ID="Ppu2C03">RP2C03</Value>
<Value ID="Ppu2C04A">RP2C04-0001</Value>
<Value ID="Ppu2C04B">RP2C04-0002</Value>
<Value ID="Ppu2C04C">RP2C04-0003</Value>
<Value ID="Ppu2C04D">RP2C04-0004</Value>
<Value ID="Ppu2C05A">RP2C05-01</Value>
<Value ID="Ppu2C05B">RP2C05-02</Value>
<Value ID="Ppu2C05C">RP2C05-03</Value>
<Value ID="Ppu2C05D">RP2C05-04</Value>
<Value ID="Ppu2C05E">RP2C05-05</Value>
</Enum>
<Enum ID="Language">
<Value ID="SystemDefault">ユーザーアカウントのデフォルト</Value>
<Value ID="English">English</Value>

View file

@ -0,0 +1,84 @@
namespace Mesen.GUI.Forms.Config
{
partial class ctrlDipSwitch
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.lblName = new System.Windows.Forms.Label();
this.cboDipSwitch = new System.Windows.Forms.ComboBox();
this.flowLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// flowLayoutPanel1
//
this.flowLayoutPanel1.Controls.Add(this.lblName);
this.flowLayoutPanel1.Controls.Add(this.cboDipSwitch);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(249, 27);
this.flowLayoutPanel1.TabIndex = 0;
//
// lblName
//
this.lblName.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblName.AutoSize = true;
this.lblName.Location = new System.Drawing.Point(3, 7);
this.lblName.Name = "lblName";
this.lblName.Size = new System.Drawing.Size(55, 13);
this.lblName.TabIndex = 1;
this.lblName.Text = "DipSwitch";
//
// cboDipSwitch
//
this.cboDipSwitch.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cboDipSwitch.FormattingEnabled = true;
this.cboDipSwitch.Location = new System.Drawing.Point(64, 3);
this.cboDipSwitch.Name = "cboDipSwitch";
this.cboDipSwitch.Size = new System.Drawing.Size(181, 21);
this.cboDipSwitch.TabIndex = 2;
//
// ctrlDipSwitch
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.flowLayoutPanel1);
this.Name = "ctrlDipSwitch";
this.Size = new System.Drawing.Size(249, 27);
this.flowLayoutPanel1.ResumeLayout(false);
this.flowLayoutPanel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private System.Windows.Forms.Label lblName;
private System.Windows.Forms.ComboBox cboDipSwitch;
}
}

View file

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Forms.Config
{
public partial class ctrlDipSwitch : UserControl
{
public ctrlDipSwitch()
{
InitializeComponent();
}
[Bindable(true)]
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[EditorBrowsable(EditorBrowsableState.Always)]
public override string Text
{
get
{
return lblName.Text;
}
set
{
lblName.Text=value;
}
}
public ComboBox.ObjectCollection Items
{
get
{
return cboDipSwitch.Items;
}
}
public int SelectedIndex
{
get
{
return cboDipSwitch.SelectedIndex;
}
set
{
cboDipSwitch.SelectedIndex = value;
}
}
}
}

View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -0,0 +1,144 @@
namespace Mesen.GUI.Forms.Config
{
partial class frmVsGameConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tlpMain = new System.Windows.Forms.TableLayoutPanel();
this.cboGame = new System.Windows.Forms.ComboBox();
this.lblGame = new System.Windows.Forms.Label();
this.lblPpuModel = new System.Windows.Forms.Label();
this.cboPpuModel = new System.Windows.Forms.ComboBox();
this.grpDipSwitches = new System.Windows.Forms.GroupBox();
this.tlpMain.SuspendLayout();
this.SuspendLayout();
//
// baseConfigPanel
//
this.baseConfigPanel.Location = new System.Drawing.Point(0, 295);
this.baseConfigPanel.Size = new System.Drawing.Size(305, 29);
//
// tlpMain
//
this.tlpMain.ColumnCount = 2;
this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpMain.Controls.Add(this.cboGame, 1, 0);
this.tlpMain.Controls.Add(this.lblGame, 0, 0);
this.tlpMain.Controls.Add(this.lblPpuModel, 0, 1);
this.tlpMain.Controls.Add(this.cboPpuModel, 1, 1);
this.tlpMain.Controls.Add(this.grpDipSwitches, 0, 2);
this.tlpMain.Dock = System.Windows.Forms.DockStyle.Fill;
this.tlpMain.Location = new System.Drawing.Point(0, 0);
this.tlpMain.Name = "tlpMain";
this.tlpMain.RowCount = 3;
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.Size = new System.Drawing.Size(305, 324);
this.tlpMain.TabIndex = 0;
//
// cboGame
//
this.cboGame.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cboGame.FormattingEnabled = true;
this.cboGame.Location = new System.Drawing.Point(73, 3);
this.cboGame.Name = "cboGame";
this.cboGame.Size = new System.Drawing.Size(194, 21);
this.cboGame.TabIndex = 5;
this.cboGame.SelectedIndexChanged += new System.EventHandler(this.cboGame_SelectedIndexChanged);
//
// lblGame
//
this.lblGame.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblGame.AutoSize = true;
this.lblGame.Location = new System.Drawing.Point(3, 7);
this.lblGame.Name = "lblGame";
this.lblGame.Size = new System.Drawing.Size(38, 13);
this.lblGame.TabIndex = 4;
this.lblGame.Text = "Game:";
//
// lblPpuModel
//
this.lblPpuModel.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblPpuModel.AutoSize = true;
this.lblPpuModel.Location = new System.Drawing.Point(3, 34);
this.lblPpuModel.Name = "lblPpuModel";
this.lblPpuModel.Size = new System.Drawing.Size(64, 13);
this.lblPpuModel.TabIndex = 1;
this.lblPpuModel.Text = "PPU Model:";
//
// cboPpuModel
//
this.cboPpuModel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cboPpuModel.FormattingEnabled = true;
this.cboPpuModel.Location = new System.Drawing.Point(73, 30);
this.cboPpuModel.Name = "cboPpuModel";
this.cboPpuModel.Size = new System.Drawing.Size(194, 21);
this.cboPpuModel.TabIndex = 2;
//
// grpDipSwitches
//
this.tlpMain.SetColumnSpan(this.grpDipSwitches, 2);
this.grpDipSwitches.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpDipSwitches.Location = new System.Drawing.Point(3, 57);
this.grpDipSwitches.Margin = new System.Windows.Forms.Padding(3, 3, 3, 30);
this.grpDipSwitches.Name = "grpDipSwitches";
this.grpDipSwitches.Size = new System.Drawing.Size(299, 237);
this.grpDipSwitches.TabIndex = 3;
this.grpDipSwitches.TabStop = false;
this.grpDipSwitches.Text = "DIP Switches";
//
// frmVsGameConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(305, 324);
this.Controls.Add(this.tlpMain);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "frmVsGameConfig";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Game Configuration";
this.Controls.SetChildIndex(this.tlpMain, 0);
this.Controls.SetChildIndex(this.baseConfigPanel, 0);
this.tlpMain.ResumeLayout(false);
this.tlpMain.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tlpMain;
private System.Windows.Forms.Label lblPpuModel;
private System.Windows.Forms.ComboBox cboPpuModel;
private System.Windows.Forms.GroupBox grpDipSwitches;
private System.Windows.Forms.ComboBox cboGame;
private System.Windows.Forms.Label lblGame;
}
}

View file

@ -0,0 +1,142 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Mesen.GUI.Config;
namespace Mesen.GUI.Forms.Config
{
public partial class frmVsGameConfig : BaseConfigForm
{
public frmVsGameConfig(VsConfigInfo configInfo)
{
InitializeComponent();
Entity = configInfo;
if(string.IsNullOrWhiteSpace(configInfo.GameID)) {
configInfo.GameID = VsGameConfig.GetGameID(InteropEmu.GetROMPath());
}
AddBinding("PpuModel", cboPpuModel);
foreach(KeyValuePair<string, VsGameConfig> kvp in VsGameConfig.GetGameConfigs()) {
cboGame.Items.Add(kvp.Value.GameName);
if(kvp.Key == configInfo.GameID) {
cboGame.SelectedIndex = cboGame.Items.Count - 1;
}
}
}
private void cboGame_SelectedIndexChanged(object sender, EventArgs e)
{
VsGameConfig config = VsGameConfig.GetGameConfig(VsGameConfig.GetGameID(cboGame.SelectedItem.ToString()));
UpdateDipSwitches(config, false);
}
private void UpdateDipSwitches(VsGameConfig config, bool updateDropdown)
{
grpDipSwitches.Controls.Clear();
List<List<string>> dipSwitches;
if(config != null) {
dipSwitches = config.DipSwitches;
if(updateDropdown) {
cboGame.SelectedIndexChanged -= cboGame_SelectedIndexChanged;
cboGame.SelectedItem = config.GameName;
cboGame.SelectedIndexChanged += cboGame_SelectedIndexChanged;
}
} else {
dipSwitches = new List<List<string>>();
for(int i = 0; i < 8; i++) {
dipSwitches.Add(new List<string>(new string[] { "Unknown", "Off", "On" }));
}
}
int row = 0;
var tlpDipSwitches = new TableLayoutPanel();
tlpDipSwitches.Dock = DockStyle.Fill;
tlpDipSwitches.ColumnStyles.Add(new ColumnStyle());
tlpDipSwitches.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
tlpDipSwitches.ColumnCount = 2;
byte value = ((VsConfigInfo)Entity).DipSwitches;
int currentBit = 0;
foreach(List<string> setting in dipSwitches) {
var optionLabel = new Label();
optionLabel.AutoSize = true;
optionLabel.Text = setting[0] + ":";
optionLabel.TextAlign = ContentAlignment.MiddleLeft;
optionLabel.Dock = DockStyle.Fill;
var optionDropdown = new ComboBox();
optionDropdown.DropDownStyle = ComboBoxStyle.DropDownList;
for(int i = 1, len = setting.Count; i < len; i++) {
optionDropdown.Items.Add(new DipSwitchOption() { Index = i - 1, DisplayValue = setting[i] });
}
int bitCount = (int)Math.Round(Math.Log(optionDropdown.Items.Count) / Math.Log(2));
int selectedIndex = (value >> currentBit) & ((1 << bitCount) - 1);
optionDropdown.SelectedIndex = selectedIndex;
currentBit += bitCount;
tlpDipSwitches.RowStyles.Add(new RowStyle(SizeType.AutoSize));
tlpDipSwitches.Controls.Add(optionLabel, 0, row);
tlpDipSwitches.Controls.Add(optionDropdown, 1, row);
row++;
}
tlpDipSwitches.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tlpDipSwitches.RowCount = row + 1;
grpDipSwitches.Controls.Add(tlpDipSwitches);
tlpDipSwitches.PerformLayout();
}
private byte GetDipSwitchValue()
{
int value = 0;
int currentBit = 0;
if(grpDipSwitches.Controls.Count > 0) {
foreach(Control control in grpDipSwitches.Controls[0].Controls) {
if(control is ComboBox && control != cboPpuModel) {
ComboBox dipSwitch = (ComboBox)control;
int bitCount = (int)Math.Round(Math.Log(dipSwitch.Items.Count) / Math.Log(2));
if(dipSwitch.SelectedItem != null) {
value |= ((DipSwitchOption)dipSwitch.SelectedItem).Index << currentBit;
}
currentBit += bitCount;
}
}
}
return (byte)value;
}
protected override void UpdateConfig()
{
base.UpdateConfig();
((VsConfigInfo)Entity).DipSwitches = (byte)GetDipSwitchValue();
((VsConfigInfo)Entity).GameID = VsGameConfig.GetGameID(cboGame.SelectedItem.ToString());
}
}
public class DipSwitchOption
{
public int Index;
public string DisplayValue;
public override string ToString()
{
return DisplayValue;
}
}
}

View file

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View file

@ -64,6 +64,10 @@ namespace Mesen.GUI.Forms
this.mnuSwitchDiskSide = new System.Windows.Forms.ToolStripMenuItem();
this.mnuSelectDisk = new System.Windows.Forms.ToolStripMenuItem();
this.mnuEjectDisk = new System.Windows.Forms.ToolStripMenuItem();
this.sepVsSystem = new System.Windows.Forms.ToolStripSeparator();
this.mnuVsGameConfig = new System.Windows.Forms.ToolStripMenuItem();
this.mnuInsertCoin1 = new System.Windows.Forms.ToolStripMenuItem();
this.mnuInsertCoin2 = new System.Windows.Forms.ToolStripMenuItem();
this.mnuOptions = new System.Windows.Forms.ToolStripMenuItem();
this.mnuEmulationSpeed = new System.Windows.Forms.ToolStripMenuItem();
this.mnuEmuSpeedNormal = new System.Windows.Forms.ToolStripMenuItem();
@ -261,7 +265,11 @@ namespace Mesen.GUI.Forms
this.sepFdsDisk,
this.mnuSwitchDiskSide,
this.mnuSelectDisk,
this.mnuEjectDisk});
this.mnuEjectDisk,
this.sepVsSystem,
this.mnuVsGameConfig,
this.mnuInsertCoin1,
this.mnuInsertCoin2});
this.mnuGame.Name = "mnuGame";
this.mnuGame.Size = new System.Drawing.Size(55, 22);
this.mnuGame.Text = "Game";
@ -322,6 +330,38 @@ namespace Mesen.GUI.Forms
this.mnuEjectDisk.Text = "Eject Disk";
this.mnuEjectDisk.Click += new System.EventHandler(this.mnuEjectDisk_Click);
//
// sepVsSystem
//
this.sepVsSystem.Name = "sepVsSystem";
this.sepVsSystem.Size = new System.Drawing.Size(217, 6);
this.sepVsSystem.Visible = false;
//
// mnuVsGameConfig
//
this.mnuVsGameConfig.Image = global::Mesen.GUI.Properties.Resources.DipSwitches;
this.mnuVsGameConfig.Name = "mnuVsGameConfig";
this.mnuVsGameConfig.Size = new System.Drawing.Size(220, 22);
this.mnuVsGameConfig.Text = "Game Configuration";
this.mnuVsGameConfig.Click += new System.EventHandler(this.mnuVsGameConfig_Click);
//
// mnuInsertCoin1
//
this.mnuInsertCoin1.Image = global::Mesen.GUI.Properties.Resources.coins;
this.mnuInsertCoin1.Name = "mnuInsertCoin1";
this.mnuInsertCoin1.Size = new System.Drawing.Size(220, 22);
this.mnuInsertCoin1.Text = "Insert Coin (1)";
this.mnuInsertCoin1.Visible = false;
this.mnuInsertCoin1.Click += new System.EventHandler(this.mnuInsertCoin1_Click);
//
// mnuInsertCoin2
//
this.mnuInsertCoin2.Image = global::Mesen.GUI.Properties.Resources.coins;
this.mnuInsertCoin2.Name = "mnuInsertCoin2";
this.mnuInsertCoin2.Size = new System.Drawing.Size(220, 22);
this.mnuInsertCoin2.Text = "Insert Coin (2)";
this.mnuInsertCoin2.Visible = false;
this.mnuInsertCoin2.Click += new System.EventHandler(this.mnuInsertCoin2_Click);
//
// mnuOptions
//
this.mnuOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -1037,6 +1077,10 @@ namespace Mesen.GUI.Forms
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem14;
private System.Windows.Forms.ToolStripMenuItem mnuShowFPS;
private System.Windows.Forms.ToolStripMenuItem mnuFullscreen;
private System.Windows.Forms.ToolStripSeparator sepVsSystem;
private System.Windows.Forms.ToolStripMenuItem mnuInsertCoin1;
private System.Windows.Forms.ToolStripMenuItem mnuVsGameConfig;
private System.Windows.Forms.ToolStripMenuItem mnuInsertCoin2;
}
}

View file

@ -62,6 +62,7 @@ namespace Mesen.GUI.Forms
menuTimer.Start();
VideoInfo.ApplyConfig();
InitializeVsSystemMenu();
InitializeFdsDiskMenu();
InitializeEmulationSpeedMenu();
@ -268,7 +269,9 @@ namespace Mesen.GUI.Forms
case InteropEmu.ConsoleNotificationType.GameLoaded:
_currentGame = Path.GetFileNameWithoutExtension(InteropEmu.GetROMPath());
InitializeFdsDiskMenu();
InitializeVsSystemMenu();
CheatInfo.ApplyCheats();
VsConfigInfo.ApplyConfig();
InitializeStateMenu(mnuSaveState, true);
InitializeStateMenu(mnuLoadState, false);
this.StartEmuThread();
@ -1108,5 +1111,31 @@ namespace Mesen.GUI.Forms
{
_menuOpened = false;
}
private void InitializeVsSystemMenu()
{
sepVsSystem.Visible = InteropEmu.IsVsSystem();
mnuInsertCoin1.Visible = InteropEmu.IsVsSystem();
mnuInsertCoin2.Visible = InteropEmu.IsVsSystem();
mnuVsGameConfig.Visible = InteropEmu.IsVsSystem();
}
private void mnuInsertCoin1_Click(object sender, EventArgs e)
{
InteropEmu.VsInsertCoin(0);
}
private void mnuInsertCoin2_Click(object sender, EventArgs e)
{
InteropEmu.VsInsertCoin(1);
}
private void mnuVsGameConfig_Click(object sender, EventArgs e)
{
VsConfigInfo configInfo = VsConfigInfo.GetCurrentGameConfig(true);
if(new frmVsGameConfig(configInfo).ShowDialog(sender, this) == DialogResult.OK) {
VsConfigInfo.ApplyConfig();
}
}
}
}

View file

@ -173,6 +173,7 @@
<Compile Include="Config\PlayerProfile.cs" />
<Compile Include="Config\ConfigManager.cs" />
<Compile Include="Config\ServerInfo.cs" />
<Compile Include="Config\VsConfigInfo.cs" />
<Compile Include="Controls\ctrlTrackbar.cs">
<SubType>UserControl</SubType>
</Compile>
@ -314,6 +315,12 @@
<Compile Include="Forms\Cheats\frmCheat.Designer.cs">
<DependentUpon>frmCheat.cs</DependentUpon>
</Compile>
<Compile Include="Forms\Config\ctrlDipSwitch.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Forms\Config\ctrlDipSwitch.Designer.cs">
<DependentUpon>ctrlDipSwitch.cs</DependentUpon>
</Compile>
<Compile Include="Forms\Config\ctrlInputPortConfig.cs">
<SubType>UserControl</SubType>
</Compile>
@ -368,6 +375,12 @@
<Compile Include="Forms\Cheats\frmCheatList.Designer.cs">
<DependentUpon>frmCheatList.cs</DependentUpon>
</Compile>
<Compile Include="Forms\Config\frmVsGameConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\Config\frmVsGameConfig.Designer.cs">
<DependentUpon>frmVsGameConfig.cs</DependentUpon>
</Compile>
<Compile Include="Forms\frmAbout.cs">
<SubType>Form</SubType>
</Compile>
@ -484,6 +497,9 @@
<EmbeddedResource Include="Forms\Cheats\frmCheat.resx">
<DependentUpon>frmCheat.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\Config\ctrlDipSwitch.resx">
<DependentUpon>ctrlDipSwitch.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\Config\ctrlInputPortConfig.resx">
<DependentUpon>ctrlInputPortConfig.cs</DependentUpon>
</EmbeddedResource>
@ -511,6 +527,9 @@
<EmbeddedResource Include="Forms\Cheats\frmCheatList.resx">
<DependentUpon>frmCheatList.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\Config\frmVsGameConfig.resx">
<DependentUpon>frmVsGameConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\frmAbout.resx">
<DependentUpon>frmAbout.cs</DependentUpon>
</EmbeddedResource>
@ -564,6 +583,7 @@
</Content>
<Content Include="Dependencies\resources.en.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<SubType>Designer</SubType>
</Content>
<Content Include="Dependencies\resources.fr.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
@ -573,7 +593,13 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<SubType>Designer</SubType>
</Content>
<Content Include="Dependencies\VsSystem.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<SubType>Designer</SubType>
</Content>
<Content Include="Icon.ico" />
<Content Include="Resources\coins.png" />
<None Include="Resources\DipSwitches.png" />
<None Include="Resources\MesenIcon.png" />
<None Include="Resources\system-software-update.png" />
<None Include="Resources\view-refresh.png" />

View file

@ -91,6 +91,10 @@ namespace Mesen.GUI
[DllImport(DLLPath)] public static extern void FdsInsertDisk(UInt32 diskNumber);
[DllImport(DLLPath)] public static extern void FdsSwitchDiskSide();
[DllImport(DLLPath)] [return: MarshalAs(UnmanagedType.I1)] public static extern bool IsVsSystem();
[DllImport(DLLPath)] public static extern void VsInsertCoin(UInt32 port);
[DllImport(DLLPath)] public static extern void VsSetGameConfig(PpuModel model, byte dipSwitches);
[DllImport(DLLPath)] public static extern void CheatAddCustom(UInt32 address, Byte value, Int32 compareValue, [MarshalAs(UnmanagedType.I1)]bool isRelativeAddress);
[DllImport(DLLPath)] public static extern void CheatAddGameGenie([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(UTF8Marshaler))]string code);
[DllImport(DLLPath)] public static extern void CheatAddProActionRocky(UInt32 code);
@ -340,6 +344,21 @@ namespace Mesen.GUI
ArkanoidController = 3,
}
public enum PpuModel
{
Ppu2C02 = 0,
Ppu2C03 = 1,
Ppu2C04A = 2,
Ppu2C04B = 3,
Ppu2C04C = 4,
Ppu2C04D = 5,
Ppu2C05A = 6,
Ppu2C05B = 7,
Ppu2C05C = 8,
Ppu2C05D = 9,
Ppu2C05E = 10,
}
public struct KeyMappingSet
{
public KeyMapping Mapping1;

View file

@ -100,6 +100,16 @@ namespace Mesen.GUI.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap coins {
get {
object obj = ResourceManager.GetObject("coins", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -110,6 +120,16 @@ namespace Mesen.GUI.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap DipSwitches {
get {
object obj = ResourceManager.GetObject("DipSwitches", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View file

@ -193,4 +193,10 @@
<data name="Video" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\image-x-generic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="coins" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\coins.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DipSwitches" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DipSwitches.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

BIN
GUI.NET/Resources/coins.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 B

View file

@ -14,6 +14,7 @@
#include "../Core/VideoDecoder.h"
#include "../Core/AutoRomTest.h"
#include "../Core/FDS.h"
#include "../Core/VsControlManager.h"
NES::Renderer *_renderer = nullptr;
SoundManager *_soundManager = nullptr;
@ -283,5 +284,24 @@ namespace InteropEmu {
DllExport void __stdcall FdsEjectDisk() { FDS::EjectDisk(); }
DllExport void __stdcall FdsInsertDisk(uint32_t diskNumber) { FDS::InsertDisk(diskNumber); }
DllExport void __stdcall FdsSwitchDiskSide() { FDS::SwitchDiskSide(); }
//VS System functions
DllExport bool __stdcall IsVsSystem() { return VsControlManager::GetInstance() != nullptr; }
DllExport void __stdcall VsInsertCoin(uint32_t port)
{
VsControlManager* vs = VsControlManager::GetInstance();
if(vs) {
vs->InsertCoin(port);
}
}
DllExport void __stdcall VsSetGameConfig(PpuModel model, uint8_t dipSwitches)
{
VsControlManager* vs = VsControlManager::GetInstance();
if(vs) {
EmulationSettings::SetPpuModel(model);
vs->SetDipSwitches(dipSwitches);
}
}
}
}