PPU: Added option to emulate OAM row corruption when disabling rendering at certain points during rendering

This commit is contained in:
Sour 2020-04-30 18:40:39 -04:00
parent bf6d161e1a
commit 59fddb7008
17 changed files with 1008 additions and 904 deletions

View file

@ -23,6 +23,8 @@ enum EmulationFlags : uint64_t
PauseOnMovieEnd = 0x0100, PauseOnMovieEnd = 0x0100,
EnablePpuOamRowCorruption = 0x0200,
AllowBackgroundInput = 0x0400, AllowBackgroundInput = 0x0400,
ReduceSoundInBackground = 0x0800, ReduceSoundInBackground = 0x0800,
MuteSoundInBackground = 0x1000, MuteSoundInBackground = 0x1000,

View file

@ -30,6 +30,9 @@ PPU::PPU(shared_ptr<Console> console)
0x09, 0x01, 0x34, 0x03, 0x00, 0x04, 0x00, 0x14, 0x08, 0x3A, 0x00, 0x02, 0x00, 0x20, 0x2C, 0x08 }; 0x09, 0x01, 0x34, 0x03, 0x00, 0x04, 0x00, 0x14, 0x08, 0x3A, 0x00, 0x02, 0x00, 0x20, 0x2C, 0x08 };
memcpy(_paletteRAM, paletteRamBootValues, sizeof(_paletteRAM)); memcpy(_paletteRAM, paletteRamBootValues, sizeof(_paletteRAM));
//This should (presumably) persist across resets
memset(_corruptOamRow, 0, sizeof(_corruptOamRow));
_console->InitializeRam(_spriteRAM, 0x100); _console->InitializeRam(_spriteRAM, 0x100);
_console->InitializeRam(_secondarySpriteRAM, 0x20); _console->InitializeRam(_secondarySpriteRAM, 0x20);
@ -546,6 +549,11 @@ void PPU::SetMaskRegister(uint8_t value)
if(_renderingEnabled != (_flags.BackgroundEnabled | _flags.SpritesEnabled)) { if(_renderingEnabled != (_flags.BackgroundEnabled | _flags.SpritesEnabled)) {
_needStateUpdate = true; _needStateUpdate = true;
if(_renderingEnabled && _scanline < 240) {
//Rendering was just disabled by the write
SetOamCorruptionFlags();
}
} }
UpdateMinimumDrawCycles(); UpdateMinimumDrawCycles();
@ -1222,6 +1230,49 @@ void PPU::DebugUpdateFrameBuffer(bool toGrayscale)
} }
} }
void PPU::SetOamCorruptionFlags()
{
if(!_settings->CheckFlag(EmulationFlags::EnablePpuOamRowCorruption)) {
return;
}
//Note: Still pending more research, but this currently matches a portion of the issues that have been observed
//When rendering is disabled in some sections of the screen, either:
// A- During Secondary OAM clear (first ~64 cycles)
// B- During OAM tile fetching (cycle ~256 to cycle ~320)
//then OAM memory gets corrupted the next time the PPU starts rendering again (usually at the start of the next frame)
//This usually causes the first "row" of OAM (the first 8 bytes) to get copied over another, causing some sprites to be missing
//and causing an extra set of the first 2 sprites to appear on the screen (not possible to see them except via any overflow they may cause)
if(_cycle >= 1 && _cycle < 65) {
//Every 2 dots causes the corruption to shift down 1 OAM row (8 bytes)
_corruptOamRow[(_cycle - 1) >> 1] = true;
} else if(_cycle >= 257 && _cycle < 321) {
//This section is in 8-dot segments.
//The first 3 dot increment the corrupted row by 1, and then the last 5 dots corrupt the next row for 5 dots.
uint8_t base = (_cycle - 257) >> 3;
uint8_t offset = std::min<uint8_t>(3, (_cycle - 257) & 0x07);
_corruptOamRow[base * 4 + offset] = true;
}
}
void PPU::ProcessOamCorruption()
{
if(!_settings->CheckFlag(EmulationFlags::EnablePpuOamRowCorruption)) {
return;
}
//Copy first OAM row over another row, as needed by corruption flags (can be over itself, which causes no actual harm)
for(int i = 0; i < 32; i++) {
if(_corruptOamRow[i]) {
if(i > 0) {
memcpy(_spriteRAM + i * 8, _spriteRAM, 8);
}
_corruptOamRow[i] = false;
}
}
}
void PPU::Exec() void PPU::Exec()
{ {
if(_cycle > 339) { if(_cycle > 339) {
@ -1233,6 +1284,10 @@ void PPU::Exec()
//Force prerender scanline sprite fetches to load the dummy $FF tiles (fixes shaking in Ninja Gaiden 3 stage 1 after beating boss) //Force prerender scanline sprite fetches to load the dummy $FF tiles (fixes shaking in Ninja Gaiden 3 stage 1 after beating boss)
_spriteCount = 0; _spriteCount = 0;
if(_renderingEnabled) {
ProcessOamCorruption();
}
UpdateMinimumDrawCycles(); UpdateMinimumDrawCycles();
} }
@ -1297,6 +1352,9 @@ void PPU::UpdateState()
_prevRenderingEnabled = _renderingEnabled; _prevRenderingEnabled = _renderingEnabled;
if(_renderingEnabled != (_flags.BackgroundEnabled | _flags.SpritesEnabled)) { if(_renderingEnabled != (_flags.BackgroundEnabled | _flags.SpritesEnabled)) {
_renderingEnabled = _flags.BackgroundEnabled | _flags.SpritesEnabled; _renderingEnabled = _flags.BackgroundEnabled | _flags.SpritesEnabled;
if(_renderingEnabled) {
ProcessOamCorruption();
}
} }
if(_prevRenderingEnabled != _renderingEnabled) { if(_prevRenderingEnabled != _renderingEnabled) {
_needStateUpdate = true; _needStateUpdate = true;
@ -1436,6 +1494,8 @@ void PPU::StreamState(bool saving)
_oamDecayCycles[i] = _console->GetCpu()->GetCycleCount(); _oamDecayCycles[i] = _console->GetCpu()->GetCycleCount();
} }
memset(_corruptOamRow, 0, sizeof(_corruptOamRow));
for(int i = 0; i < 257; i++) { for(int i = 0; i < 257; i++) {
_hasSprite[i] = true; _hasSprite[i] = true;
} }

View file

@ -105,6 +105,7 @@ class PPU : public IMemoryHandler, public Snapshotable
uint64_t _oamDecayCycles[0x40]; uint64_t _oamDecayCycles[0x40];
bool _enableOamDecay; bool _enableOamDecay;
bool _corruptOamRow[32];
void UpdateStatusFlag(); void UpdateStatusFlag();
@ -141,6 +142,9 @@ class PPU : public IMemoryHandler, public Snapshotable
__forceinline uint8_t ReadSpriteRam(uint8_t addr); __forceinline uint8_t ReadSpriteRam(uint8_t addr);
__forceinline void WriteSpriteRam(uint8_t addr, uint8_t value); __forceinline void WriteSpriteRam(uint8_t addr, uint8_t value);
void SetOamCorruptionFlags();
void ProcessOamCorruption();
void UpdateMinimumDrawCycles(); void UpdateMinimumDrawCycles();
uint8_t GetPixelColor(); uint8_t GetPixelColor();

View file

@ -25,6 +25,7 @@ namespace Mesen.GUI.Config
public bool RandomizeCpuPpuAlignment = false; public bool RandomizeCpuPpuAlignment = false;
public bool EnablePpu2006ScrollGlitch = false; public bool EnablePpu2006ScrollGlitch = false;
public bool EnablePpu2000ScrollGlitch = false; public bool EnablePpu2000ScrollGlitch = false;
public bool EnablePpuOamRowCorruption = false;
public bool UseAlternativeMmc3Irq = false; public bool UseAlternativeMmc3Irq = false;
@ -65,6 +66,7 @@ namespace Mesen.GUI.Config
InteropEmu.SetFlag(EmulationFlags.RandomizeCpuPpuAlignment, emulationInfo.RandomizeCpuPpuAlignment); InteropEmu.SetFlag(EmulationFlags.RandomizeCpuPpuAlignment, emulationInfo.RandomizeCpuPpuAlignment);
InteropEmu.SetFlag(EmulationFlags.EnablePpu2000ScrollGlitch, emulationInfo.EnablePpu2000ScrollGlitch); InteropEmu.SetFlag(EmulationFlags.EnablePpu2000ScrollGlitch, emulationInfo.EnablePpu2000ScrollGlitch);
InteropEmu.SetFlag(EmulationFlags.EnablePpu2006ScrollGlitch, emulationInfo.EnablePpu2006ScrollGlitch); InteropEmu.SetFlag(EmulationFlags.EnablePpu2006ScrollGlitch, emulationInfo.EnablePpu2006ScrollGlitch);
InteropEmu.SetFlag(EmulationFlags.EnablePpuOamRowCorruption, emulationInfo.EnablePpuOamRowCorruption);
InteropEmu.SetPpuNmiConfig(emulationInfo.PpuExtraScanlinesBeforeNmi, emulationInfo.PpuExtraScanlinesAfterNmi); InteropEmu.SetPpuNmiConfig(emulationInfo.PpuExtraScanlinesBeforeNmi, emulationInfo.PpuExtraScanlinesAfterNmi);

View file

@ -328,6 +328,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">Randomize power-on/reset CPU/PPU alignment</Control> <Control ID="chkRandomizeCpuPpuAlignment">Randomize power-on/reset CPU/PPU alignment</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">Enable PPU $2006 scroll glitch emulation</Control> <Control ID="chkEnablePpu2006ScrollGlitch">Enable PPU $2006 scroll glitch emulation</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">Enable PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control> <Control ID="chkEnablePpu2000ScrollGlitch">Enable PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control>
<Control ID="chkEnablePpuOamRowCorruption">Enable PPU OAM row corruption emulation</Control>
<Control ID="tpgOverclocking">Forçament</Control> <Control ID="tpgOverclocking">Forçament</Control>
<Control ID="grpOverclocking">Forçament de CPU</Control> <Control ID="grpOverclocking">Forçament de CPU</Control>

View file

@ -317,7 +317,7 @@
<Control ID="lblMiscSettings">Miscellaneous Settings</Control> <Control ID="lblMiscSettings">Miscellaneous Settings</Control>
<Control ID="chkUseAlternativeMmc3Irq">Use alternative MMC3 IRQ behavior</Control> <Control ID="chkUseAlternativeMmc3Irq">Use alternative MMC3 IRQ behavior</Control>
<Control ID="chkAllowInvalidInput">Allow invalid input (e.g Down + Up or Left + Right at the same time)</Control> <Control ID="chkAllowInvalidInput">Allow invalid input (e.g Down + Up or Left + Right at the same time)</Control>
<Control ID="chkEnableOamDecay">Enable OAM RAM decay</Control> <Control ID="chkEnableOamDecay">Enable PPU OAM decay</Control>
<Control ID="chkDisablePpu2004Reads">Disable PPU $2004 reads (Famicom behavior)</Control> <Control ID="chkDisablePpu2004Reads">Disable PPU $2004 reads (Famicom behavior)</Control>
<Control ID="chkDisableOamAddrBug">Disable PPU OAMADDR bug emulation</Control> <Control ID="chkDisableOamAddrBug">Disable PPU OAMADDR bug emulation</Control>
<Control ID="chkDisablePaletteRead">Disable PPU palette reads</Control> <Control ID="chkDisablePaletteRead">Disable PPU palette reads</Control>
@ -327,6 +327,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">Randomize power-on/reset CPU/PPU alignment</Control> <Control ID="chkRandomizeCpuPpuAlignment">Randomize power-on/reset CPU/PPU alignment</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">Enable PPU $2006 scroll glitch emulation</Control> <Control ID="chkEnablePpu2006ScrollGlitch">Enable PPU $2006 scroll glitch emulation</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">Enable PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control> <Control ID="chkEnablePpu2000ScrollGlitch">Enable PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control>
<Control ID="chkEnablePpuOamRowCorruption">Enable PPU OAM row corruption emulation</Control>
<Control ID="lblRamPowerOnState">Default power on state for RAM:</Control> <Control ID="lblRamPowerOnState">Default power on state for RAM:</Control>

View file

@ -327,6 +327,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">Aleatorizar el encendido/reinicio de la alineación CPU/PPU</Control> <Control ID="chkRandomizeCpuPpuAlignment">Aleatorizar el encendido/reinicio de la alineación CPU/PPU</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">Habilitar el fallo de emulación de scroll PPU $2006</Control> <Control ID="chkEnablePpu2006ScrollGlitch">Habilitar el fallo de emulación de scroll PPU $2006</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">Habilitar el fallo de emulación de scroll de primera escritura PPU $2000/$2005/$2006</Control> <Control ID="chkEnablePpu2000ScrollGlitch">Habilitar el fallo de emulación de scroll de primera escritura PPU $2000/$2005/$2006</Control>
<Control ID="chkEnablePpuOamRowCorruption">Enable PPU OAM row corruption emulation</Control>
<Control ID="tpgOverclocking">Overclocking</Control> <Control ID="tpgOverclocking">Overclocking</Control>
<Control ID="grpOverclocking">Overclocking de CPU</Control> <Control ID="grpOverclocking">Overclocking de CPU</Control>

View file

@ -327,6 +327,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">Démarrer le jeu avec un alignement CPU/PPU aléatoire</Control> <Control ID="chkRandomizeCpuPpuAlignment">Démarrer le jeu avec un alignement CPU/PPU aléatoire</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">Simuler le bug de scrolling lors de l'écriture à $2006</Control> <Control ID="chkEnablePpu2006ScrollGlitch">Simuler le bug de scrolling lors de l'écriture à $2006</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">Simuler le bug de scrolling lors de l'écriture à $2000/$2005/$2006</Control> <Control ID="chkEnablePpu2000ScrollGlitch">Simuler le bug de scrolling lors de l'écriture à $2000/$2005/$2006</Control>
<Control ID="chkEnablePpuOamRowCorruption">Simuler le bug de corruption de la rangée OAM</Control>
<Control ID="lblRamPowerOnState">État initial de la mémoire au démarrage : </Control> <Control ID="lblRamPowerOnState">État initial de la mémoire au démarrage : </Control>

View file

@ -327,6 +327,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">Randomize power-on/reset CPU/PPU alignment</Control> <Control ID="chkRandomizeCpuPpuAlignment">Randomize power-on/reset CPU/PPU alignment</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">Enable PPU $2006 scroll glitch emulation</Control> <Control ID="chkEnablePpu2006ScrollGlitch">Enable PPU $2006 scroll glitch emulation</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">Enable PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control> <Control ID="chkEnablePpu2000ScrollGlitch">Enable PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control>
<Control ID="chkEnablePpuOamRowCorruption">Enable PPU OAM row corruption emulation</Control>
<Control ID="lblRamPowerOnState">Stato di accensione predefinito per la RAM:</Control> <Control ID="lblRamPowerOnState">Stato di accensione predefinito per la RAM:</Control>

View file

@ -326,6 +326,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">ランダムなCPU/PPUアラインメントでゲームを起動する</Control> <Control ID="chkRandomizeCpuPpuAlignment">ランダムなCPU/PPUアラインメントでゲームを起動する</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">$2006に書き込む時に発生するスクロールバグを再現する</Control> <Control ID="chkEnablePpu2006ScrollGlitch">$2006に書き込む時に発生するスクロールバグを再現する</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">$2000・$2005・$2006に書き込む時に発生するスクロールバグを再現する</Control> <Control ID="chkEnablePpu2000ScrollGlitch">$2000・$2005・$2006に書き込む時に発生するスクロールバグを再現する</Control>
<Control ID="chkEnablePpuOamRowCorruption">OAM行のデータの汚染を再現する</Control>
<Control ID="lblRamPowerOnState">起動時のメモリの状態 : </Control> <Control ID="lblRamPowerOnState">起動時のメモリの状態 : </Control>

View file

@ -327,6 +327,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">Aleatorizar o ligar/reiniciar do alinhamento da CPU/PPU</Control> <Control ID="chkRandomizeCpuPpuAlignment">Aleatorizar o ligar/reiniciar do alinhamento da CPU/PPU</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">Ativar emulação do erro gráfico PPU $2006 na rolagem</Control> <Control ID="chkEnablePpu2006ScrollGlitch">Ativar emulação do erro gráfico PPU $2006 na rolagem</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">Ativar emulação do erro gráfico PPU $2000/$2005/$2006 na rolagem na primeira escrita</Control> <Control ID="chkEnablePpu2000ScrollGlitch">Ativar emulação do erro gráfico PPU $2000/$2005/$2006 na rolagem na primeira escrita</Control>
<Control ID="chkEnablePpuOamRowCorruption">Enable PPU OAM row corruption emulation</Control>
<Control ID="lblRamPowerOnState">Estado inicial da RAM durante o início:</Control> <Control ID="lblRamPowerOnState">Estado inicial da RAM durante o início:</Control>

View file

@ -327,6 +327,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">Рандомизировать включение/перезагрузку выравнивания CPU/PPU</Control> <Control ID="chkRandomizeCpuPpuAlignment">Рандомизировать включение/перезагрузку выравнивания CPU/PPU</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">Включить PPU $2006 scroll glitch emulation</Control> <Control ID="chkEnablePpu2006ScrollGlitch">Включить PPU $2006 scroll glitch emulation</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">Включить PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control> <Control ID="chkEnablePpu2000ScrollGlitch">Включить PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control>
<Control ID="chkEnablePpuOamRowCorruption">Enable PPU OAM row corruption emulation</Control>
<Control ID="tpgOverclocking">Разгон</Control> <Control ID="tpgOverclocking">Разгон</Control>
<Control ID="grpOverclocking">Разгон CPU</Control> <Control ID="grpOverclocking">Разгон CPU</Control>

View file

@ -327,6 +327,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">Randomize power-on/reset CPU/PPU alignment</Control> <Control ID="chkRandomizeCpuPpuAlignment">Randomize power-on/reset CPU/PPU alignment</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">Enable PPU $2006 scroll glitch emulation</Control> <Control ID="chkEnablePpu2006ScrollGlitch">Enable PPU $2006 scroll glitch emulation</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">Enable PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control> <Control ID="chkEnablePpu2000ScrollGlitch">Enable PPU $2000/$2005/$2006 first-write scroll glitch emulation</Control>
<Control ID="chkEnablePpuOamRowCorruption">Enable PPU OAM row corruption emulation</Control>
<Control ID="tpgOverclocking">Розгін</Control> <Control ID="tpgOverclocking">Розгін</Control>
<Control ID="grpOverclocking">Розгін CPU</Control> <Control ID="grpOverclocking">Розгін CPU</Control>

View file

@ -353,6 +353,7 @@
<Control ID="chkRandomizeCpuPpuAlignment">随机 CPU/PPU 开机对齐</Control> <Control ID="chkRandomizeCpuPpuAlignment">随机 CPU/PPU 开机对齐</Control>
<Control ID="chkEnablePpu2006ScrollGlitch">模拟 PPU $2006 卷轴故障</Control> <Control ID="chkEnablePpu2006ScrollGlitch">模拟 PPU $2006 卷轴故障</Control>
<Control ID="chkEnablePpu2000ScrollGlitch">模拟首次写入 PPU $2000/$2005/$2006 卷轴故障</Control> <Control ID="chkEnablePpu2000ScrollGlitch">模拟首次写入 PPU $2000/$2005/$2006 卷轴故障</Control>
<Control ID="chkEnablePpuOamRowCorruption">Enable PPU OAM row corruption emulation</Control>
<Control ID="lblRamPowerOnState">默认开机 RAM 状态:</Control> <Control ID="lblRamPowerOnState">默认开机 RAM 状态:</Control>
<Control ID="tpgOverclocking">超频</Control> <Control ID="tpgOverclocking">超频</Control>

View file

@ -52,14 +52,16 @@ namespace Mesen.GUI.Forms.Config
this.lblRewindSpeedHint = new System.Windows.Forms.Label(); this.lblRewindSpeedHint = new System.Windows.Forms.Label();
this.tpgAdvanced = new System.Windows.Forms.TabPage(); this.tpgAdvanced = new System.Windows.Forms.TabPage();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.chkEnablePpuOamRowCorruption = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkEnablePpu2000ScrollGlitch = new Mesen.GUI.Controls.ctrlRiskyOption(); this.chkEnablePpu2000ScrollGlitch = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkEnablePpu2006ScrollGlitch = new Mesen.GUI.Controls.ctrlRiskyOption(); this.chkEnablePpu2006ScrollGlitch = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkRandomizeCpuPpuAlignment = new Mesen.GUI.Controls.ctrlRiskyOption(); this.chkRandomizeCpuPpuAlignment = new Mesen.GUI.Controls.ctrlRiskyOption();
this.lblMiscSettings = new System.Windows.Forms.Label(); this.lblMiscSettings = new System.Windows.Forms.Label();
this.chkMapperRandomPowerOnState = new Mesen.GUI.Controls.ctrlRiskyOption(); this.chkMapperRandomPowerOnState = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkEnableOamDecay = new Mesen.GUI.Controls.ctrlRiskyOption(); this.chkEnableOamDecay = new Mesen.GUI.Controls.ctrlRiskyOption();
this.lblRamPowerOnState = new System.Windows.Forms.Label(); this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.cboRamPowerOnState = new System.Windows.Forms.ComboBox(); this.cboRamPowerOnState = new System.Windows.Forms.ComboBox();
this.lblRamPowerOnState = new System.Windows.Forms.Label();
this.chkDisablePaletteRead = new Mesen.GUI.Controls.ctrlRiskyOption(); this.chkDisablePaletteRead = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkDisableOamAddrBug = new Mesen.GUI.Controls.ctrlRiskyOption(); this.chkDisableOamAddrBug = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkDisablePpuReset = new Mesen.GUI.Controls.ctrlRiskyOption(); this.chkDisablePpuReset = new Mesen.GUI.Controls.ctrlRiskyOption();
@ -91,7 +93,6 @@ namespace Mesen.GUI.Forms.Config
this.chkShowLagCounter = new System.Windows.Forms.CheckBox(); this.chkShowLagCounter = new System.Windows.Forms.CheckBox();
this.btnResetLagCounter = new System.Windows.Forms.Button(); this.btnResetLagCounter = new System.Windows.Forms.Button();
this.tmrUpdateClockRate = new System.Windows.Forms.Timer(this.components); this.tmrUpdateClockRate = new System.Windows.Forms.Timer(this.components);
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.tabMain.SuspendLayout(); this.tabMain.SuspendLayout();
this.tpgGeneral.SuspendLayout(); this.tpgGeneral.SuspendLayout();
this.tableLayoutPanel4.SuspendLayout(); this.tableLayoutPanel4.SuspendLayout();
@ -101,6 +102,7 @@ namespace Mesen.GUI.Forms.Config
this.flowLayoutPanel10.SuspendLayout(); this.flowLayoutPanel10.SuspendLayout();
this.tpgAdvanced.SuspendLayout(); this.tpgAdvanced.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.tpgOverclocking.SuspendLayout(); this.tpgOverclocking.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.picHint)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.picHint)).BeginInit();
this.tableLayoutPanel3.SuspendLayout(); this.tableLayoutPanel3.SuspendLayout();
@ -110,12 +112,11 @@ namespace Mesen.GUI.Forms.Config
this.tableLayoutPanel5.SuspendLayout(); this.tableLayoutPanel5.SuspendLayout();
this.flowLayoutPanel2.SuspendLayout(); this.flowLayoutPanel2.SuspendLayout();
this.flowLayoutPanel7.SuspendLayout(); this.flowLayoutPanel7.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// baseConfigPanel // baseConfigPanel
// //
this.baseConfigPanel.Location = new System.Drawing.Point(0, 386); this.baseConfigPanel.Location = new System.Drawing.Point(0, 408);
this.baseConfigPanel.Size = new System.Drawing.Size(533, 29); this.baseConfigPanel.Size = new System.Drawing.Size(533, 29);
// //
// tabMain // tabMain
@ -127,7 +128,7 @@ namespace Mesen.GUI.Forms.Config
this.tabMain.Location = new System.Drawing.Point(0, 0); this.tabMain.Location = new System.Drawing.Point(0, 0);
this.tabMain.Name = "tabMain"; this.tabMain.Name = "tabMain";
this.tabMain.SelectedIndex = 0; this.tabMain.SelectedIndex = 0;
this.tabMain.Size = new System.Drawing.Size(533, 386); this.tabMain.Size = new System.Drawing.Size(533, 408);
this.tabMain.TabIndex = 2; this.tabMain.TabIndex = 2;
// //
// tpgGeneral // tpgGeneral
@ -136,7 +137,7 @@ namespace Mesen.GUI.Forms.Config
this.tpgGeneral.Location = new System.Drawing.Point(4, 22); this.tpgGeneral.Location = new System.Drawing.Point(4, 22);
this.tpgGeneral.Name = "tpgGeneral"; this.tpgGeneral.Name = "tpgGeneral";
this.tpgGeneral.Padding = new System.Windows.Forms.Padding(3); this.tpgGeneral.Padding = new System.Windows.Forms.Padding(3);
this.tpgGeneral.Size = new System.Drawing.Size(525, 360); this.tpgGeneral.Size = new System.Drawing.Size(525, 382);
this.tpgGeneral.TabIndex = 0; this.tpgGeneral.TabIndex = 0;
this.tpgGeneral.Text = "General"; this.tpgGeneral.Text = "General";
this.tpgGeneral.UseVisualStyleBackColor = true; this.tpgGeneral.UseVisualStyleBackColor = true;
@ -164,7 +165,7 @@ namespace Mesen.GUI.Forms.Config
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel4.Size = new System.Drawing.Size(519, 354); this.tableLayoutPanel4.Size = new System.Drawing.Size(519, 376);
this.tableLayoutPanel4.TabIndex = 0; this.tableLayoutPanel4.TabIndex = 0;
// //
// flowLayoutPanel5 // flowLayoutPanel5
@ -187,6 +188,7 @@ namespace Mesen.GUI.Forms.Config
0, 0,
0, 0,
0}); 0});
this.nudRunAheadFrames.IsHex = false;
this.nudRunAheadFrames.Location = new System.Drawing.Point(3, 3); this.nudRunAheadFrames.Location = new System.Drawing.Point(3, 3);
this.nudRunAheadFrames.Maximum = new decimal(new int[] { this.nudRunAheadFrames.Maximum = new decimal(new int[] {
10, 10,
@ -249,6 +251,7 @@ namespace Mesen.GUI.Forms.Config
0, 0,
0, 0,
0}); 0});
this.nudTurboSpeed.IsHex = false;
this.nudTurboSpeed.Location = new System.Drawing.Point(3, 3); this.nudTurboSpeed.Location = new System.Drawing.Point(3, 3);
this.nudTurboSpeed.Maximum = new decimal(new int[] { this.nudTurboSpeed.Maximum = new decimal(new int[] {
5000, 5000,
@ -311,6 +314,7 @@ namespace Mesen.GUI.Forms.Config
0, 0,
0, 0,
0}); 0});
this.nudEmulationSpeed.IsHex = false;
this.nudEmulationSpeed.Location = new System.Drawing.Point(3, 3); this.nudEmulationSpeed.Location = new System.Drawing.Point(3, 3);
this.nudEmulationSpeed.Maximum = new decimal(new int[] { this.nudEmulationSpeed.Maximum = new decimal(new int[] {
5000, 5000,
@ -383,6 +387,7 @@ namespace Mesen.GUI.Forms.Config
0, 0,
0, 0,
0}); 0});
this.nudRewindSpeed.IsHex = false;
this.nudRewindSpeed.Location = new System.Drawing.Point(3, 3); this.nudRewindSpeed.Location = new System.Drawing.Point(3, 3);
this.nudRewindSpeed.Maximum = new decimal(new int[] { this.nudRewindSpeed.Maximum = new decimal(new int[] {
5000, 5000,
@ -421,7 +426,7 @@ namespace Mesen.GUI.Forms.Config
this.tpgAdvanced.Location = new System.Drawing.Point(4, 22); this.tpgAdvanced.Location = new System.Drawing.Point(4, 22);
this.tpgAdvanced.Name = "tpgAdvanced"; this.tpgAdvanced.Name = "tpgAdvanced";
this.tpgAdvanced.Padding = new System.Windows.Forms.Padding(3); this.tpgAdvanced.Padding = new System.Windows.Forms.Padding(3);
this.tpgAdvanced.Size = new System.Drawing.Size(525, 360); this.tpgAdvanced.Size = new System.Drawing.Size(525, 382);
this.tpgAdvanced.TabIndex = 1; this.tpgAdvanced.TabIndex = 1;
this.tpgAdvanced.Text = "Advanced"; this.tpgAdvanced.Text = "Advanced";
this.tpgAdvanced.UseVisualStyleBackColor = true; this.tpgAdvanced.UseVisualStyleBackColor = true;
@ -430,25 +435,26 @@ namespace Mesen.GUI.Forms.Config
// //
this.tableLayoutPanel1.ColumnCount = 1; this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.chkEnablePpu2000ScrollGlitch, 0, 5); this.tableLayoutPanel1.Controls.Add(this.chkEnablePpuOamRowCorruption, 0, 6);
this.tableLayoutPanel1.Controls.Add(this.chkEnablePpu2006ScrollGlitch, 0, 4); this.tableLayoutPanel1.Controls.Add(this.chkEnablePpu2000ScrollGlitch, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.chkRandomizeCpuPpuAlignment, 0, 3); this.tableLayoutPanel1.Controls.Add(this.chkEnablePpu2006ScrollGlitch, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.lblMiscSettings, 0, 7); this.tableLayoutPanel1.Controls.Add(this.chkRandomizeCpuPpuAlignment, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.chkMapperRandomPowerOnState, 0, 2); this.tableLayoutPanel1.Controls.Add(this.lblMiscSettings, 0, 8);
this.tableLayoutPanel1.Controls.Add(this.chkEnableOamDecay, 0, 1); this.tableLayoutPanel1.Controls.Add(this.chkMapperRandomPowerOnState, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 6); this.tableLayoutPanel1.Controls.Add(this.chkEnableOamDecay, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.chkDisablePaletteRead, 0, 13); this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 7);
this.tableLayoutPanel1.Controls.Add(this.chkDisableOamAddrBug, 0, 11); this.tableLayoutPanel1.Controls.Add(this.chkDisablePaletteRead, 0, 14);
this.tableLayoutPanel1.Controls.Add(this.chkDisablePpuReset, 0, 10); this.tableLayoutPanel1.Controls.Add(this.chkDisableOamAddrBug, 0, 12);
this.tableLayoutPanel1.Controls.Add(this.chkDisablePpu2004Reads, 0, 12); this.tableLayoutPanel1.Controls.Add(this.chkDisablePpuReset, 0, 11);
this.tableLayoutPanel1.Controls.Add(this.chkUseNes101Hvc101Behavior, 0, 9); this.tableLayoutPanel1.Controls.Add(this.chkDisablePpu2004Reads, 0, 13);
this.tableLayoutPanel1.Controls.Add(this.chkAllowInvalidInput, 0, 14); this.tableLayoutPanel1.Controls.Add(this.chkUseNes101Hvc101Behavior, 0, 10);
this.tableLayoutPanel1.Controls.Add(this.chkUseAlternativeMmc3Irq, 0, 8); this.tableLayoutPanel1.Controls.Add(this.chkAllowInvalidInput, 0, 15);
this.tableLayoutPanel1.Controls.Add(this.chkUseAlternativeMmc3Irq, 0, 9);
this.tableLayoutPanel1.Controls.Add(this.lblDeveloperSettings, 0, 0); this.tableLayoutPanel1.Controls.Add(this.lblDeveloperSettings, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 16; this.tableLayoutPanel1.RowCount = 17;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
@ -456,6 +462,7 @@ namespace Mesen.GUI.Forms.Config
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
@ -465,15 +472,28 @@ namespace Mesen.GUI.Forms.Config
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(519, 354); this.tableLayoutPanel1.Size = new System.Drawing.Size(519, 376);
this.tableLayoutPanel1.TabIndex = 0; this.tableLayoutPanel1.TabIndex = 0;
// //
// chkEnablePpuOamRowCorruption
//
this.chkEnablePpuOamRowCorruption.AutoSize = true;
this.chkEnablePpuOamRowCorruption.Checked = false;
this.chkEnablePpuOamRowCorruption.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkEnablePpuOamRowCorruption.Location = new System.Drawing.Point(10, 135);
this.chkEnablePpuOamRowCorruption.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkEnablePpuOamRowCorruption.MinimumSize = new System.Drawing.Size(0, 23);
this.chkEnablePpuOamRowCorruption.Name = "chkEnablePpuOamRowCorruption";
this.chkEnablePpuOamRowCorruption.Size = new System.Drawing.Size(509, 23);
this.chkEnablePpuOamRowCorruption.TabIndex = 39;
this.chkEnablePpuOamRowCorruption.Text = "Enable PPU OAM row corruption emulation";
//
// chkEnablePpu2000ScrollGlitch // chkEnablePpu2000ScrollGlitch
// //
this.chkEnablePpu2000ScrollGlitch.AutoSize = true; this.chkEnablePpu2000ScrollGlitch.AutoSize = true;
this.chkEnablePpu2000ScrollGlitch.Checked = false; this.chkEnablePpu2000ScrollGlitch.Checked = false;
this.chkEnablePpu2000ScrollGlitch.Dock = System.Windows.Forms.DockStyle.Fill; this.chkEnablePpu2000ScrollGlitch.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkEnablePpu2000ScrollGlitch.Location = new System.Drawing.Point(10, 112); this.chkEnablePpu2000ScrollGlitch.Location = new System.Drawing.Point(10, 89);
this.chkEnablePpu2000ScrollGlitch.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkEnablePpu2000ScrollGlitch.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkEnablePpu2000ScrollGlitch.MinimumSize = new System.Drawing.Size(0, 23); this.chkEnablePpu2000ScrollGlitch.MinimumSize = new System.Drawing.Size(0, 23);
this.chkEnablePpu2000ScrollGlitch.Name = "chkEnablePpu2000ScrollGlitch"; this.chkEnablePpu2000ScrollGlitch.Name = "chkEnablePpu2000ScrollGlitch";
@ -486,7 +506,7 @@ namespace Mesen.GUI.Forms.Config
this.chkEnablePpu2006ScrollGlitch.AutoSize = true; this.chkEnablePpu2006ScrollGlitch.AutoSize = true;
this.chkEnablePpu2006ScrollGlitch.Checked = false; this.chkEnablePpu2006ScrollGlitch.Checked = false;
this.chkEnablePpu2006ScrollGlitch.Dock = System.Windows.Forms.DockStyle.Fill; this.chkEnablePpu2006ScrollGlitch.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkEnablePpu2006ScrollGlitch.Location = new System.Drawing.Point(10, 89); this.chkEnablePpu2006ScrollGlitch.Location = new System.Drawing.Point(10, 66);
this.chkEnablePpu2006ScrollGlitch.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkEnablePpu2006ScrollGlitch.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkEnablePpu2006ScrollGlitch.MinimumSize = new System.Drawing.Size(0, 23); this.chkEnablePpu2006ScrollGlitch.MinimumSize = new System.Drawing.Size(0, 23);
this.chkEnablePpu2006ScrollGlitch.Name = "chkEnablePpu2006ScrollGlitch"; this.chkEnablePpu2006ScrollGlitch.Name = "chkEnablePpu2006ScrollGlitch";
@ -499,7 +519,7 @@ namespace Mesen.GUI.Forms.Config
this.chkRandomizeCpuPpuAlignment.AutoSize = true; this.chkRandomizeCpuPpuAlignment.AutoSize = true;
this.chkRandomizeCpuPpuAlignment.Checked = false; this.chkRandomizeCpuPpuAlignment.Checked = false;
this.chkRandomizeCpuPpuAlignment.Dock = System.Windows.Forms.DockStyle.Fill; this.chkRandomizeCpuPpuAlignment.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkRandomizeCpuPpuAlignment.Location = new System.Drawing.Point(10, 66); this.chkRandomizeCpuPpuAlignment.Location = new System.Drawing.Point(10, 43);
this.chkRandomizeCpuPpuAlignment.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkRandomizeCpuPpuAlignment.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkRandomizeCpuPpuAlignment.MinimumSize = new System.Drawing.Size(0, 23); this.chkRandomizeCpuPpuAlignment.MinimumSize = new System.Drawing.Size(0, 23);
this.chkRandomizeCpuPpuAlignment.Name = "chkRandomizeCpuPpuAlignment"; this.chkRandomizeCpuPpuAlignment.Name = "chkRandomizeCpuPpuAlignment";
@ -512,7 +532,7 @@ namespace Mesen.GUI.Forms.Config
this.lblMiscSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.lblMiscSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.lblMiscSettings.AutoSize = true; this.lblMiscSettings.AutoSize = true;
this.lblMiscSettings.ForeColor = System.Drawing.SystemColors.GrayText; this.lblMiscSettings.ForeColor = System.Drawing.SystemColors.GrayText;
this.lblMiscSettings.Location = new System.Drawing.Point(0, 166); this.lblMiscSettings.Location = new System.Drawing.Point(0, 189);
this.lblMiscSettings.Margin = new System.Windows.Forms.Padding(0, 0, 3, 2); this.lblMiscSettings.Margin = new System.Windows.Forms.Padding(0, 0, 3, 2);
this.lblMiscSettings.Name = "lblMiscSettings"; this.lblMiscSettings.Name = "lblMiscSettings";
this.lblMiscSettings.Size = new System.Drawing.Size(115, 13); this.lblMiscSettings.Size = new System.Drawing.Size(115, 13);
@ -524,7 +544,7 @@ namespace Mesen.GUI.Forms.Config
this.chkMapperRandomPowerOnState.AutoSize = true; this.chkMapperRandomPowerOnState.AutoSize = true;
this.chkMapperRandomPowerOnState.Checked = false; this.chkMapperRandomPowerOnState.Checked = false;
this.chkMapperRandomPowerOnState.Dock = System.Windows.Forms.DockStyle.Fill; this.chkMapperRandomPowerOnState.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkMapperRandomPowerOnState.Location = new System.Drawing.Point(10, 43); this.chkMapperRandomPowerOnState.Location = new System.Drawing.Point(10, 20);
this.chkMapperRandomPowerOnState.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkMapperRandomPowerOnState.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkMapperRandomPowerOnState.MinimumSize = new System.Drawing.Size(0, 23); this.chkMapperRandomPowerOnState.MinimumSize = new System.Drawing.Size(0, 23);
this.chkMapperRandomPowerOnState.Name = "chkMapperRandomPowerOnState"; this.chkMapperRandomPowerOnState.Name = "chkMapperRandomPowerOnState";
@ -536,7 +556,7 @@ namespace Mesen.GUI.Forms.Config
// //
this.chkEnableOamDecay.Checked = false; this.chkEnableOamDecay.Checked = false;
this.chkEnableOamDecay.Dock = System.Windows.Forms.DockStyle.Fill; this.chkEnableOamDecay.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkEnableOamDecay.Location = new System.Drawing.Point(10, 20); this.chkEnableOamDecay.Location = new System.Drawing.Point(10, 112);
this.chkEnableOamDecay.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkEnableOamDecay.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkEnableOamDecay.MinimumSize = new System.Drawing.Size(0, 21); this.chkEnableOamDecay.MinimumSize = new System.Drawing.Size(0, 21);
this.chkEnableOamDecay.Name = "chkEnableOamDecay"; this.chkEnableOamDecay.Name = "chkEnableOamDecay";
@ -544,15 +564,21 @@ namespace Mesen.GUI.Forms.Config
this.chkEnableOamDecay.TabIndex = 9; this.chkEnableOamDecay.TabIndex = 9;
this.chkEnableOamDecay.Text = "Enable OAM RAM decay"; this.chkEnableOamDecay.Text = "Enable OAM RAM decay";
// //
// lblRamPowerOnState // tableLayoutPanel2
// //
this.lblRamPowerOnState.Anchor = System.Windows.Forms.AnchorStyles.Left; this.tableLayoutPanel2.ColumnCount = 2;
this.lblRamPowerOnState.AutoSize = true; this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.lblRamPowerOnState.Location = new System.Drawing.Point(3, 6); this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.lblRamPowerOnState.Name = "lblRamPowerOnState"; this.tableLayoutPanel2.Controls.Add(this.cboRamPowerOnState, 1, 0);
this.lblRamPowerOnState.Size = new System.Drawing.Size(159, 13); this.tableLayoutPanel2.Controls.Add(this.lblRamPowerOnState, 0, 0);
this.lblRamPowerOnState.TabIndex = 0; this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblRamPowerOnState.Text = "Default power on state for RAM:"; this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 158);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(519, 26);
this.tableLayoutPanel2.TabIndex = 2;
// //
// cboRamPowerOnState // cboRamPowerOnState
// //
@ -564,11 +590,21 @@ namespace Mesen.GUI.Forms.Config
this.cboRamPowerOnState.Size = new System.Drawing.Size(348, 21); this.cboRamPowerOnState.Size = new System.Drawing.Size(348, 21);
this.cboRamPowerOnState.TabIndex = 1; this.cboRamPowerOnState.TabIndex = 1;
// //
// lblRamPowerOnState
//
this.lblRamPowerOnState.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblRamPowerOnState.AutoSize = true;
this.lblRamPowerOnState.Location = new System.Drawing.Point(3, 6);
this.lblRamPowerOnState.Name = "lblRamPowerOnState";
this.lblRamPowerOnState.Size = new System.Drawing.Size(159, 13);
this.lblRamPowerOnState.TabIndex = 0;
this.lblRamPowerOnState.Text = "Default power on state for RAM:";
//
// chkDisablePaletteRead // chkDisablePaletteRead
// //
this.chkDisablePaletteRead.Checked = false; this.chkDisablePaletteRead.Checked = false;
this.chkDisablePaletteRead.Dock = System.Windows.Forms.DockStyle.Fill; this.chkDisablePaletteRead.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkDisablePaletteRead.Location = new System.Drawing.Point(10, 296); this.chkDisablePaletteRead.Location = new System.Drawing.Point(10, 319);
this.chkDisablePaletteRead.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkDisablePaletteRead.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkDisablePaletteRead.MinimumSize = new System.Drawing.Size(0, 21); this.chkDisablePaletteRead.MinimumSize = new System.Drawing.Size(0, 21);
this.chkDisablePaletteRead.Name = "chkDisablePaletteRead"; this.chkDisablePaletteRead.Name = "chkDisablePaletteRead";
@ -580,7 +616,7 @@ namespace Mesen.GUI.Forms.Config
// //
this.chkDisableOamAddrBug.Checked = false; this.chkDisableOamAddrBug.Checked = false;
this.chkDisableOamAddrBug.Dock = System.Windows.Forms.DockStyle.Fill; this.chkDisableOamAddrBug.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkDisableOamAddrBug.Location = new System.Drawing.Point(10, 250); this.chkDisableOamAddrBug.Location = new System.Drawing.Point(10, 273);
this.chkDisableOamAddrBug.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkDisableOamAddrBug.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkDisableOamAddrBug.MinimumSize = new System.Drawing.Size(0, 21); this.chkDisableOamAddrBug.MinimumSize = new System.Drawing.Size(0, 21);
this.chkDisableOamAddrBug.Name = "chkDisableOamAddrBug"; this.chkDisableOamAddrBug.Name = "chkDisableOamAddrBug";
@ -592,7 +628,7 @@ namespace Mesen.GUI.Forms.Config
// //
this.chkDisablePpuReset.Checked = false; this.chkDisablePpuReset.Checked = false;
this.chkDisablePpuReset.Dock = System.Windows.Forms.DockStyle.Fill; this.chkDisablePpuReset.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkDisablePpuReset.Location = new System.Drawing.Point(10, 227); this.chkDisablePpuReset.Location = new System.Drawing.Point(10, 250);
this.chkDisablePpuReset.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkDisablePpuReset.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkDisablePpuReset.MinimumSize = new System.Drawing.Size(0, 21); this.chkDisablePpuReset.MinimumSize = new System.Drawing.Size(0, 21);
this.chkDisablePpuReset.Name = "chkDisablePpuReset"; this.chkDisablePpuReset.Name = "chkDisablePpuReset";
@ -604,7 +640,7 @@ namespace Mesen.GUI.Forms.Config
// //
this.chkDisablePpu2004Reads.Checked = false; this.chkDisablePpu2004Reads.Checked = false;
this.chkDisablePpu2004Reads.Dock = System.Windows.Forms.DockStyle.Fill; this.chkDisablePpu2004Reads.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkDisablePpu2004Reads.Location = new System.Drawing.Point(10, 273); this.chkDisablePpu2004Reads.Location = new System.Drawing.Point(10, 296);
this.chkDisablePpu2004Reads.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkDisablePpu2004Reads.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkDisablePpu2004Reads.MinimumSize = new System.Drawing.Size(0, 21); this.chkDisablePpu2004Reads.MinimumSize = new System.Drawing.Size(0, 21);
this.chkDisablePpu2004Reads.Name = "chkDisablePpu2004Reads"; this.chkDisablePpu2004Reads.Name = "chkDisablePpu2004Reads";
@ -615,7 +651,7 @@ namespace Mesen.GUI.Forms.Config
// chkUseNes101Hvc101Behavior // chkUseNes101Hvc101Behavior
// //
this.chkUseNes101Hvc101Behavior.AutoSize = true; this.chkUseNes101Hvc101Behavior.AutoSize = true;
this.chkUseNes101Hvc101Behavior.Location = new System.Drawing.Point(13, 207); this.chkUseNes101Hvc101Behavior.Location = new System.Drawing.Point(13, 230);
this.chkUseNes101Hvc101Behavior.Margin = new System.Windows.Forms.Padding(13, 3, 3, 3); this.chkUseNes101Hvc101Behavior.Margin = new System.Windows.Forms.Padding(13, 3, 3, 3);
this.chkUseNes101Hvc101Behavior.Name = "chkUseNes101Hvc101Behavior"; this.chkUseNes101Hvc101Behavior.Name = "chkUseNes101Hvc101Behavior";
this.chkUseNes101Hvc101Behavior.Size = new System.Drawing.Size(292, 17); this.chkUseNes101Hvc101Behavior.Size = new System.Drawing.Size(292, 17);
@ -628,7 +664,7 @@ namespace Mesen.GUI.Forms.Config
this.chkAllowInvalidInput.AutoSize = true; this.chkAllowInvalidInput.AutoSize = true;
this.chkAllowInvalidInput.Checked = false; this.chkAllowInvalidInput.Checked = false;
this.chkAllowInvalidInput.Dock = System.Windows.Forms.DockStyle.Fill; this.chkAllowInvalidInput.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkAllowInvalidInput.Location = new System.Drawing.Point(10, 319); this.chkAllowInvalidInput.Location = new System.Drawing.Point(10, 342);
this.chkAllowInvalidInput.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0); this.chkAllowInvalidInput.Margin = new System.Windows.Forms.Padding(10, 0, 0, 0);
this.chkAllowInvalidInput.MinimumSize = new System.Drawing.Size(0, 23); this.chkAllowInvalidInput.MinimumSize = new System.Drawing.Size(0, 23);
this.chkAllowInvalidInput.Name = "chkAllowInvalidInput"; this.chkAllowInvalidInput.Name = "chkAllowInvalidInput";
@ -639,7 +675,7 @@ namespace Mesen.GUI.Forms.Config
// chkUseAlternativeMmc3Irq // chkUseAlternativeMmc3Irq
// //
this.chkUseAlternativeMmc3Irq.AutoSize = true; this.chkUseAlternativeMmc3Irq.AutoSize = true;
this.chkUseAlternativeMmc3Irq.Location = new System.Drawing.Point(13, 184); this.chkUseAlternativeMmc3Irq.Location = new System.Drawing.Point(13, 207);
this.chkUseAlternativeMmc3Irq.Margin = new System.Windows.Forms.Padding(13, 3, 3, 3); this.chkUseAlternativeMmc3Irq.Margin = new System.Windows.Forms.Padding(13, 3, 3, 3);
this.chkUseAlternativeMmc3Irq.Name = "chkUseAlternativeMmc3Irq"; this.chkUseAlternativeMmc3Irq.Name = "chkUseAlternativeMmc3Irq";
this.chkUseAlternativeMmc3Irq.Size = new System.Drawing.Size(197, 17); this.chkUseAlternativeMmc3Irq.Size = new System.Drawing.Size(197, 17);
@ -666,7 +702,7 @@ namespace Mesen.GUI.Forms.Config
this.tpgOverclocking.Location = new System.Drawing.Point(4, 22); this.tpgOverclocking.Location = new System.Drawing.Point(4, 22);
this.tpgOverclocking.Name = "tpgOverclocking"; this.tpgOverclocking.Name = "tpgOverclocking";
this.tpgOverclocking.Padding = new System.Windows.Forms.Padding(3); this.tpgOverclocking.Padding = new System.Windows.Forms.Padding(3);
this.tpgOverclocking.Size = new System.Drawing.Size(525, 360); this.tpgOverclocking.Size = new System.Drawing.Size(525, 382);
this.tpgOverclocking.TabIndex = 2; this.tpgOverclocking.TabIndex = 2;
this.tpgOverclocking.Text = "Overclocking"; this.tpgOverclocking.Text = "Overclocking";
this.tpgOverclocking.UseVisualStyleBackColor = true; this.tpgOverclocking.UseVisualStyleBackColor = true;
@ -707,7 +743,7 @@ namespace Mesen.GUI.Forms.Config
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(519, 354); this.tableLayoutPanel3.Size = new System.Drawing.Size(519, 376);
this.tableLayoutPanel3.TabIndex = 0; this.tableLayoutPanel3.TabIndex = 0;
// //
// lblOverclockHint // lblOverclockHint
@ -819,6 +855,7 @@ namespace Mesen.GUI.Forms.Config
0, 0,
0, 0,
0}); 0});
this.nudExtraScanlinesAfterNmi.IsHex = false;
this.nudExtraScanlinesAfterNmi.Location = new System.Drawing.Point(165, 30); this.nudExtraScanlinesAfterNmi.Location = new System.Drawing.Point(165, 30);
this.nudExtraScanlinesAfterNmi.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3); this.nudExtraScanlinesAfterNmi.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.nudExtraScanlinesAfterNmi.Maximum = new decimal(new int[] { this.nudExtraScanlinesAfterNmi.Maximum = new decimal(new int[] {
@ -850,6 +887,7 @@ namespace Mesen.GUI.Forms.Config
0, 0,
0, 0,
0}); 0});
this.nudExtraScanlinesBeforeNmi.IsHex = false;
this.nudExtraScanlinesBeforeNmi.Location = new System.Drawing.Point(165, 3); this.nudExtraScanlinesBeforeNmi.Location = new System.Drawing.Point(165, 3);
this.nudExtraScanlinesBeforeNmi.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3); this.nudExtraScanlinesBeforeNmi.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.nudExtraScanlinesBeforeNmi.Maximum = new decimal(new int[] { this.nudExtraScanlinesBeforeNmi.Maximum = new decimal(new int[] {
@ -931,7 +969,7 @@ namespace Mesen.GUI.Forms.Config
this.flowLayoutPanel7.Location = new System.Drawing.Point(0, 172); this.flowLayoutPanel7.Location = new System.Drawing.Point(0, 172);
this.flowLayoutPanel7.Margin = new System.Windows.Forms.Padding(0); this.flowLayoutPanel7.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel7.Name = "flowLayoutPanel7"; this.flowLayoutPanel7.Name = "flowLayoutPanel7";
this.flowLayoutPanel7.Size = new System.Drawing.Size(519, 182); this.flowLayoutPanel7.Size = new System.Drawing.Size(519, 204);
this.flowLayoutPanel7.TabIndex = 12; this.flowLayoutPanel7.TabIndex = 12;
// //
// chkShowLagCounter // chkShowLagCounter
@ -961,28 +999,12 @@ namespace Mesen.GUI.Forms.Config
this.tmrUpdateClockRate.Enabled = true; this.tmrUpdateClockRate.Enabled = true;
this.tmrUpdateClockRate.Tick += new System.EventHandler(this.tmrUpdateClockRate_Tick); this.tmrUpdateClockRate.Tick += new System.EventHandler(this.tmrUpdateClockRate_Tick);
// //
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 2;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Controls.Add(this.cboRamPowerOnState, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.lblRamPowerOnState, 0, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 135);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(0, 0, 0, 0);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(519, 26);
this.tableLayoutPanel2.TabIndex = 2;
//
// frmEmulationConfig // frmEmulationConfig
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true; this.AutoSize = true;
this.ClientSize = new System.Drawing.Size(533, 415); this.ClientSize = new System.Drawing.Size(533, 437);
this.Controls.Add(this.tabMain); this.Controls.Add(this.tabMain);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false; this.MaximizeBox = false;
@ -1009,6 +1031,8 @@ namespace Mesen.GUI.Forms.Config
this.tpgAdvanced.ResumeLayout(false); this.tpgAdvanced.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout(); this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
this.tpgOverclocking.ResumeLayout(false); this.tpgOverclocking.ResumeLayout(false);
this.tpgOverclocking.PerformLayout(); this.tpgOverclocking.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.picHint)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.picHint)).EndInit();
@ -1024,8 +1048,6 @@ namespace Mesen.GUI.Forms.Config
this.flowLayoutPanel2.PerformLayout(); this.flowLayoutPanel2.PerformLayout();
this.flowLayoutPanel7.ResumeLayout(false); this.flowLayoutPanel7.ResumeLayout(false);
this.flowLayoutPanel7.PerformLayout(); this.flowLayoutPanel7.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
this.ResumeLayout(false); this.ResumeLayout(false);
} }
@ -1092,5 +1114,6 @@ namespace Mesen.GUI.Forms.Config
private System.Windows.Forms.Label lblRunAheadFrames; private System.Windows.Forms.Label lblRunAheadFrames;
private System.Windows.Forms.Label lblRunAhead; private System.Windows.Forms.Label lblRunAhead;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private ctrlRiskyOption chkEnablePpuOamRowCorruption;
} }
} }

View file

@ -42,6 +42,7 @@ namespace Mesen.GUI.Forms.Config
AddBinding("RandomizeCpuPpuAlignment", chkRandomizeCpuPpuAlignment); AddBinding("RandomizeCpuPpuAlignment", chkRandomizeCpuPpuAlignment);
AddBinding("EnablePpu2006ScrollGlitch", chkEnablePpu2006ScrollGlitch); AddBinding("EnablePpu2006ScrollGlitch", chkEnablePpu2006ScrollGlitch);
AddBinding("EnablePpu2000ScrollGlitch", chkEnablePpu2000ScrollGlitch); AddBinding("EnablePpu2000ScrollGlitch", chkEnablePpu2000ScrollGlitch);
AddBinding("EnablePpuOamRowCorruption", chkEnablePpuOamRowCorruption);
AddBinding("PpuExtraScanlinesBeforeNmi", nudExtraScanlinesBeforeNmi); AddBinding("PpuExtraScanlinesBeforeNmi", nudExtraScanlinesBeforeNmi);
AddBinding("PpuExtraScanlinesAfterNmi", nudExtraScanlinesAfterNmi); AddBinding("PpuExtraScanlinesAfterNmi", nudExtraScanlinesAfterNmi);

View file

@ -1619,6 +1619,8 @@ namespace Mesen.GUI
PauseOnMovieEnd = 0x0100, PauseOnMovieEnd = 0x0100,
EnablePpuOamRowCorruption = 0x0200,
AllowBackgroundInput = 0x0400, AllowBackgroundInput = 0x0400,
ReduceSoundInBackground = 0x0800, ReduceSoundInBackground = 0x0800,
MuteSoundInBackground = 0x1000, MuteSoundInBackground = 0x1000,