-Added options to disable palette reads & oamaddr bug

-Better PAL emulation post scanline 260
-Fixed out of bounds memory access in oamaddr bug emulation
This commit is contained in:
Souryo 2017-02-24 21:43:42 -05:00
parent 1dd6a47de7
commit c2115defd9
22 changed files with 522 additions and 170 deletions

View file

@ -9,7 +9,7 @@ uint8_t EmulationSettings::_versionRevision = 1;
Language EmulationSettings::_displayLanguage = Language::English;
uint32_t EmulationSettings::_flags = 0;
uint64_t EmulationSettings::_flags = 0;
uint32_t EmulationSettings::_audioLatency = 20000;
double EmulationSettings::_channelVolume[11] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };

View file

@ -4,7 +4,7 @@
#include "MessageManager.h"
#include "GameClient.h"
enum EmulationFlags
enum EmulationFlags : int64_t
{
Paused = 0x01,
ShowFPS = 0x02,
@ -40,10 +40,12 @@ enum EmulationFlags
ForceSpritesFirstColumn = 0x2000000,
DisablePpu2004Reads = 0x4000000,
DisableNoiseModeFlag = 0x8000000,
DisablePaletteRead = 0x10000000,
DisableOamAddrBug = 0x20000000,
Turbo = 0x20000000,
InBackground = 0x40000000,
NsfPlayerEnabled = 0x80000000,
Turbo = 0x2000000000,
InBackground = 0x4000000000,
NsfPlayerEnabled = 0x8000000000,
};
enum class AudioChannel
@ -307,7 +309,7 @@ private:
static uint32_t _ppuPaletteArgb[11][64];
static uint32_t _defaultPpuPalette[64];
static uint32_t _flags;
static uint64_t _flags;
static Language _displayLanguage;
@ -392,7 +394,7 @@ public:
_flags &= ~flags;
}
static bool CheckFlag(uint32_t flag)
static bool CheckFlag(EmulationFlags flag)
{
return (_flags & flag) == flag;
}

View file

@ -236,7 +236,7 @@ uint8_t PPU::ReadRAM(uint16_t addr)
returnValue = _memoryReadBuffer;
_memoryReadBuffer = _memoryManager->ReadVRAM(_state.VideoRamAddr, MemoryOperationType::Read);
if((_state.VideoRamAddr & 0x3FFF) >= 0x3F00) {
if((_state.VideoRamAddr & 0x3FFF) >= 0x3F00 && !EmulationSettings::CheckFlag(EmulationFlags::DisablePaletteRead)) {
returnValue = ReadPaletteRAM(_state.VideoRamAddr) | (_openBus & 0xC0);
openBusMask = 0xC0;
} else {
@ -738,12 +738,6 @@ void PPU::ProcessPrerenderScanline()
{
ProcessPreVBlankScanline();
if(IsRenderingEnabled() && _cycle == 0 && _state.SpriteRamAddr >= 0x08) {
//This should only be done if rendering is enabled (otherwise oam_stress test fails immediately)
//"If OAMADDR is not less than eight when rendering starts, the eight bytes starting at OAMADDR & 0xF8 are copied to the first eight bytes of OAM"
memcpy(_spriteRAM, _spriteRAM + (_state.SpriteRamAddr & 0xF8), 8);
}
if(_cycle == 0) {
_statusFlags.SpriteOverflow = false;
_statusFlags.Sprite0Hit = false;
@ -786,9 +780,7 @@ void PPU::ProcessVisibleScanline()
DrawPixel();
ShiftTileRegisters();
if(IsRenderingEnabled()) {
CopyOAMData();
}
CopyOAMData();
} else if(_cycle >= 321 && _cycle <= 336) {
LoadTileInfo();
} else if(_cycle == 337 || _cycle == 339) {
@ -802,88 +794,96 @@ void PPU::ProcessVisibleScanline()
void PPU::CopyOAMData()
{
if(_cycle < 65) {
//Clear secondary OAM at between cycle 1 and 64
_oamCopybuffer = 0xFF;
_secondarySpriteRAM[(_cycle - 1) >> 1] = 0xFF;
} else {
if(_cycle == 65) {
_sprite0Added = false;
_spriteInRange = false;
_secondaryOAMAddr = 0;
_overflowSpriteAddr = 0;
if(_nesModel == NesModel::NTSC && IsRenderingEnabled() || _nesModel == NesModel::PAL && (_scanline < 240 || _scanline > 260)) {
if(_cycle < 65) {
if(_cycle < 9 && _state.SpriteRamAddr >= 0x08 && _scanline == -1 && !EmulationSettings::CheckFlag(EmulationFlags::DisableOamAddrBug)) {
//This should only be done if rendering is enabled (otherwise oam_stress test fails immediately)
//"If OAMADDR is not less than eight when rendering starts, the eight bytes starting at OAMADDR & 0xF8 are copied to the first eight bytes of OAM"
_spriteRAM[_cycle - 1] = _spriteRAM[((_state.SpriteRamAddr & 0xF8) + _cycle - 1) & 0xFF];
}
_oamCopyDone = false;
_spriteAddrH = (_state.SpriteRamAddr >> 2) & 0x3F;
_spriteAddrL = _state.SpriteRamAddr & 0x03;
} else if(_cycle == 256) {
_sprite0Visible = _sprite0Added;
_spriteCount = (_secondaryOAMAddr >> 2);
}
if(_cycle & 0x01) {
//Read a byte from the primary OAM on odd cycles
_oamCopybuffer = _spriteRAM[(_spriteAddrH << 2) + _spriteAddrL];
//Clear secondary OAM at between cycle 1 and 64
_oamCopybuffer = 0xFF;
_secondarySpriteRAM[(_cycle - 1) >> 1] = 0xFF;
} else {
if(_oamCopyDone) {
_spriteAddrH = (_spriteAddrH + 1) & 0x3F;
if(_cycle == 65) {
_sprite0Added = false;
_spriteInRange = false;
_secondaryOAMAddr = 0;
_overflowSpriteAddr = 0;
_oamCopyDone = false;
_spriteAddrH = (_state.SpriteRamAddr >> 2) & 0x3F;
_spriteAddrL = _state.SpriteRamAddr & 0x03;
} else if(_cycle == 256) {
_sprite0Visible = _sprite0Added;
_spriteCount = (_secondaryOAMAddr >> 2);
}
if(_cycle & 0x01) {
//Read a byte from the primary OAM on odd cycles
_oamCopybuffer = _spriteRAM[(_spriteAddrH << 2) + _spriteAddrL];
} else {
if(!_spriteInRange && _scanline >= _oamCopybuffer && _scanline < _oamCopybuffer + (_flags.LargeSprites ? 16 : 8)) {
_spriteInRange = true;
}
if(_oamCopyDone) {
_spriteAddrH = (_spriteAddrH + 1) & 0x3F;
} else {
if(!_spriteInRange && _scanline >= _oamCopybuffer && _scanline < _oamCopybuffer + (_flags.LargeSprites ? 16 : 8)) {
_spriteInRange = true;
}
if(_secondaryOAMAddr < 0x20) {
//Copy 1 byte to secondary OAM
_secondarySpriteRAM[_secondaryOAMAddr] = _oamCopybuffer;
if(_secondaryOAMAddr < 0x20) {
//Copy 1 byte to secondary OAM
_secondarySpriteRAM[_secondaryOAMAddr] = _oamCopybuffer;
if(_spriteInRange) {
_spriteAddrL++;
_secondaryOAMAddr++;
if(_spriteInRange) {
_spriteAddrL++;
_secondaryOAMAddr++;
if(_spriteAddrH == 0) {
_sprite0Added = true;
}
if(_spriteAddrH == 0) {
_sprite0Added = true;
}
if(_spriteAddrL == 4) {
//Done copying all 4 bytes
_spriteInRange = false;
_spriteAddrL = 0;
if(_spriteAddrL == 4) {
//Done copying all 4 bytes
_spriteInRange = false;
_spriteAddrL = 0;
_spriteAddrH = (_spriteAddrH + 1) & 0x3F;
if(_spriteAddrH == 0) {
_oamCopyDone = true;
}
}
} else {
//Nothing to copy, skip to next sprite
_spriteAddrH = (_spriteAddrH + 1) & 0x3F;
if(_spriteAddrH == 0) {
_oamCopyDone = true;
}
}
} else {
//Nothing to copy, skip to next sprite
_spriteAddrH = (_spriteAddrH + 1) & 0x3F;
if(_spriteAddrH == 0) {
_oamCopyDone = true;
//8 sprites have been found, check next sprite for overflow + emulate PPU bug
if(_overflowSpriteAddr == 0) {
//Used to remove sprite limit
_overflowSpriteAddr = _spriteAddrH * 4;
}
}
} else {
//8 sprites have been found, check next sprite for overflow + emulate PPU bug
if(_overflowSpriteAddr == 0) {
//Used to remove sprite limit
_overflowSpriteAddr = _spriteAddrH * 4;
}
if(_spriteInRange) {
//Sprite is visible, consider this to be an overflow
_statusFlags.SpriteOverflow = true;
_spriteAddrL = (_spriteAddrL + 1) & 0x03;
if(_spriteAddrL == 4) {
_spriteInRange = false;
if(_spriteInRange) {
//Sprite is visible, consider this to be an overflow
_statusFlags.SpriteOverflow = true;
_spriteAddrL = (_spriteAddrL + 1) & 0x03;
if(_spriteAddrL == 4) {
_spriteInRange = false;
_spriteAddrH = (_spriteAddrH + 1) & 0x3F;
_oamCopyDone = true;
_spriteAddrL = 0;
}
} else {
//Sprite isn't on this scanline, trigger sprite evaluation bug - increment both H & L at the same time
_spriteAddrH = (_spriteAddrH + 1) & 0x3F;
_oamCopyDone = true;
_spriteAddrL = 0;
}
} else {
//Sprite isn't on this scanline, trigger sprite evaluation bug - increment both H & L at the same time
_spriteAddrH = (_spriteAddrH + 1) & 0x3F;
_spriteAddrL = (_spriteAddrL + 1) & 0x03;
_spriteAddrL = (_spriteAddrL + 1) & 0x03;
if(_spriteAddrH == 0) {
_oamCopyDone = true;
if(_spriteAddrH == 0) {
_oamCopyDone = true;
}
}
}
}
@ -949,6 +949,16 @@ void PPU::Exec()
ProcessPrerenderScanline();
} else if(_scanline == _nmiScanline) {
BeginVBlank();
} else if(_nesModel == NesModel::PAL && _scanline > _nmiScanline + 20) {
//"On a PAL machine, because of its extended vertical blank, the PPU begins refreshing OAM roughly 21 scanlines after NMI[2], to prevent it
//from decaying during the longer hiatus of rendering. Additionally, it will continue to refresh during the visible portion of the screen
//even if rendering is disabled. Because of this, OAM DMA must be done near the beginning of vertical blank on PAL, and everywhere else
//it is liable to conflict with the refresh. Since the refresh can't be disabled like on the NTSC hardware, OAM decay does not occur at all on the PAL NES."
if(_cycle > 0 && _cycle <= 256) {
CopyOAMData();
} else if(_cycle >= 257 && _cycle < 320) {
_state.SpriteRamAddr = 0;
}
}
} else {
//Used by NSF player to speed things up

View file

@ -17,6 +17,8 @@ namespace Mesen.GUI.Config
public bool AllowInvalidInput = false;
public bool RemoveSpriteLimit = false;
public bool DisablePpu2004Reads = false;
public bool DisablePaletteRead = false;
public bool DisableOamAddrBug = false;
public bool UseAlternativeMmc3Irq = false;
@ -49,6 +51,8 @@ namespace Mesen.GUI.Config
InteropEmu.SetFlag(EmulationFlags.RemoveSpriteLimit, emulationInfo.RemoveSpriteLimit);
InteropEmu.SetFlag(EmulationFlags.ShowLagCounter, emulationInfo.ShowLagCounter);
InteropEmu.SetFlag(EmulationFlags.DisablePpu2004Reads, emulationInfo.DisablePpu2004Reads);
InteropEmu.SetFlag(EmulationFlags.DisablePaletteRead, emulationInfo.DisablePaletteRead);
InteropEmu.SetFlag(EmulationFlags.DisableOamAddrBug, emulationInfo.DisableOamAddrBug);
InteropEmu.SetOverclockRate(emulationInfo.OverclockRate, emulationInfo.OverclockAdjustApu);
InteropEmu.SetPpuNmiConfig(emulationInfo.PpuExtraScanlinesBeforeNmi, emulationInfo.PpuExtraScanlinesAfterNmi);

View file

@ -0,0 +1,93 @@
namespace Mesen.GUI.Controls
{
partial class ctrlRiskyOption
{
/// <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.chkOption = new System.Windows.Forms.CheckBox();
this.lblNotRecommended = new System.Windows.Forms.Label();
this.flowLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// flowLayoutPanel1
//
this.flowLayoutPanel1.AutoSize = true;
this.flowLayoutPanel1.Controls.Add(this.chkOption);
this.flowLayoutPanel1.Controls.Add(this.lblNotRecommended);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0, 0, 0, 0);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(197, 23);
this.flowLayoutPanel1.TabIndex = 0;
//
// chkOption
//
this.chkOption.AutoSize = true;
this.chkOption.Location = new System.Drawing.Point(3, 3);
this.chkOption.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3);
this.chkOption.Name = "chkOption";
this.chkOption.Size = new System.Drawing.Size(86, 17);
this.chkOption.TabIndex = 0;
this.chkOption.Text = "Option name";
this.chkOption.UseVisualStyleBackColor = true;
this.chkOption.CheckedChanged += new System.EventHandler(this.chkOption_CheckedChanged);
//
// lblNotRecommended
//
this.lblNotRecommended.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblNotRecommended.AutoSize = true;
this.lblNotRecommended.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblNotRecommended.Location = new System.Drawing.Point(89, 5);
this.lblNotRecommended.Margin = new System.Windows.Forms.Padding(0);
this.lblNotRecommended.Name = "lblNotRecommended";
this.lblNotRecommended.Size = new System.Drawing.Size(98, 13);
this.lblNotRecommended.TabIndex = 1;
this.lblNotRecommended.Text = "(not recommended)";
//
// ctrlRiskyOption
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.Controls.Add(this.flowLayoutPanel1);
this.Name = "ctrlRiskyOption";
this.Size = new System.Drawing.Size(197, 23);
this.flowLayoutPanel1.ResumeLayout(false);
this.flowLayoutPanel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private System.Windows.Forms.CheckBox chkOption;
private System.Windows.Forms.Label lblNotRecommended;
}
}

View file

@ -0,0 +1,47 @@
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;
using Mesen.GUI.Forms;
using System.IO;
namespace Mesen.GUI.Controls
{
public partial class ctrlRiskyOption : UserControl
{
public ctrlRiskyOption()
{
InitializeComponent();
this.lblNotRecommended.Text = ResourceHelper.GetMessage("RiskyOptionHint");
this.lblNotRecommended.ForeColor = SystemColors.ControlDark;
}
private void chkOption_CheckedChanged(object sender, EventArgs e)
{
this.lblNotRecommended.ForeColor = this.chkOption.Checked ? Color.Red : SystemColors.ControlDark;
}
[Bindable(true)]
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[EditorBrowsable(EditorBrowsableState.Always)]
public override string Text
{
get { return chkOption.Text; }
set { chkOption.Text = value; }
}
public bool Checked
{
get { return chkOption.Checked; }
set { chkOption.Checked = value; }
}
protected override Padding DefaultMargin { get { return new Padding(0); } }
}
}

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

@ -21,6 +21,8 @@
<Message ID="RomsFound">{0} roms found</Message>
<Message ID="RiskyOptionHint">(not recommended)</Message>
<Message ID="RandomGameNoGameFound">Mesen could not find any games to load.</Message>
<Message ID="CheatsFound">{0} games and {1} cheats in database</Message>

View file

@ -289,6 +289,8 @@
<Control ID="lblRamPowerOnState">Estado inicial de la memoria durante el inicio:</Control>
<Control ID="chkRemoveSpriteLimit">Eliminar el límite de sprites (Reduce el parpadeo en algunos juegos)</Control>
<Control ID="chkDisablePpu2004Reads">Disable PPU $2004 reads</Control>
<Control ID="chkDisableOamAddrBug">Disable PPU OAMADDR bug emulation</Control>
<Control ID="chkDisablePaletteRead">Disable PPU palette reads</Control>
<Control ID="tpgOverclocking">Overclocking</Control>
<Control ID="grpOverclocking">Overclocking de CPU</Control>
@ -518,6 +520,8 @@
<Message ID="RomsFound">{0} roms encontradas</Message>
<Message ID="RiskyOptionHint">(not recommended)</Message>
<Message ID="RandomGameNoGameFound">Mesen no puede encontrar ningún juego para cargar.</Message>
<Message ID="NsfNextTrack">Pista siguiente (Espera para jugar más rápido)</Message>

View file

@ -289,6 +289,9 @@
<Control ID="chkAllowInvalidInput">Permettre les entrées invalides (Bas+Haut ou Gauche+Droite en même temps)</Control>
<Control ID="chkRemoveSpriteLimit">Éliminer la limite de sprites (Réduit le clignotement dans certains jeux)</Control>
<Control ID="chkDisablePpu2004Reads">Empêcher la lecture du registre $2004 du PPU</Control>
<Control ID="chkDisableOamAddrBug">Désactiver l'émulation du bug de OAMADDR du PPU</Control>
<Control ID="chkDisablePaletteRead">Empêcher la lecture de la palette du PPU</Control>
<Control ID="lblRamPowerOnState">État initial de la mémoire au démarrage : </Control>
<Control ID="tpgOverclocking">Overclocking</Control>
@ -527,6 +530,8 @@
<Message ID="PlayerNumber">Joueur {0}</Message>
<Message ID="RomsFound">{0} roms trouvés</Message>
<Message ID="RiskyOptionHint">(déconseillé)</Message>
<Message ID="RandomGameNoGameFound">Mesen n'a pas trouvé de jeu sur votre disque.</Message>

View file

@ -289,6 +289,9 @@
<Control ID="chkAllowInvalidInput">コントローラでは不可能インプットを可能にする (同時に上と下や右と左)</Control>
<Control ID="chkRemoveSpriteLimit">スプライトの制限を解除 (点滅を軽減する)</Control>
<Control ID="chkDisablePpu2004Reads">PPUの$2004を読み込み不可能にする</Control>
<Control ID="chkDisableOamAddrBug">PPUのOAMADDRバグを無効にする</Control>
<Control ID="chkDisablePaletteRead">PPUのパレットラムを読み込み不可能にする</Control>
<Control ID="lblRamPowerOnState">起動時のメモリの状態 : </Control>
<Control ID="tpgOverclocking">オーバークロック</Control>
@ -510,6 +513,8 @@
<Message ID="RomsFound">{0}個</Message>
<Message ID="RiskyOptionHint">(推奨されません)</Message>
<Message ID="RandomGameNoGameFound">Mesenはゲームファイルを見つかりませんでした。</Message>
<Message ID="CheatsFound">ゲーム{0}個とチートコード{1}個を見つけました</Message>

View file

@ -289,6 +289,8 @@
<Control ID="lblRamPowerOnState">Estado inicial da memória durante o início:</Control>
<Control ID="chkRemoveSpriteLimit">Eliminar o limite de sprites (Reduz os "flashes" em alguns jogos)</Control>
<Control ID="chkDisablePpu2004Reads">Disable PPU $2004 reads</Control>
<Control ID="chkDisableOamAddrBug">Disable PPU OAMADDR bug emulation</Control>
<Control ID="chkDisablePaletteRead">Disable PPU palette reads</Control>
<Control ID="tpgOverclocking">Overclocking</Control>
<Control ID="grpOverclocking">Overclocking de CPU</Control>
@ -518,6 +520,8 @@
<Message ID="RomsFound">{0} roms encontradas</Message>
<Message ID="RiskyOptionHint">(not recommended)</Message>
<Message ID="RandomGameNoGameFound">Mesen não encontrou nenhum jogo para carregar.</Message>
<Message ID="NsfNextTrack">Track seguinte (Esperar para jogar mais rápido)</Message>

View file

@ -287,10 +287,12 @@
<Control ID="tpgAdvanced">Расширенные</Control>
<Control ID="chkUseAlternativeMmc3Irq">Использовать альтернативный IRQ MMC3</Control>
<Control ID="chkAllowInvalidInput">Разрешить недопустимые комбинации (Вниз+Вверх и Влево+Вправо)</Control>
<Control ID="lblRamPowerOnState">Содержимое ОЗУ при включении : </Control>
<Control ID="chkRemoveSpriteLimit">Отключить лимит спрайтов (уменьшает мерцание)</Control>
<Control ID="chkDisablePpu2004Reads">Disable PPU $2004 reads</Control>
<Control ID="lblRamPowerOnState">Содержимое ОЗУ при включении : </Control>
<Control ID="chkDisableOamAddrBug">Disable PPU OAMADDR bug emulation</Control>
<Control ID="chkDisablePaletteRead">Disable PPU palette reads</Control>
<Control ID="tpgOverclocking">Разгон</Control>
<Control ID="grpOverclocking">Разгон CPU</Control>
<Control ID="lblOverclockWarning">ВНИМАНИЕ: Разгон может вызвать ошибки в некоторых играх!</Control>
@ -519,6 +521,8 @@
<Message ID="RomsFound">{0} Найденные ROM файлы</Message>
<Message ID="RiskyOptionHint">(not recommended)</Message>
<Message ID="RandomGameNoGameFound">Mesen could not find any games to load.</Message>
<Message ID="CheatsFound">игр {0}, читов {1}</Message>

View file

@ -287,9 +287,11 @@
<Control ID="tpgAdvanced">Розширені</Control>
<Control ID="chkUseAlternativeMmc3Irq">Використовувати альтернативний IRQ MMC3</Control>
<Control ID="chkAllowInvalidInput">Дозволити неприпустимі комбінації (Вниз+Вгору і Ліворуч+Вправо)</Control>
<Control ID="lblRamPowerOnState">Вміст ОЗУ при включенні : </Control>
<Control ID="chkRemoveSpriteLimit">Відключити ліміт спрайтів (зменшує мерехтіння)</Control>
<Control ID="chkDisablePpu2004Reads">Disable PPU $2004 reads</Control>
<Control ID="lblRamPowerOnState">Вміст ОЗУ при включенні : </Control>
<Control ID="chkDisableOamAddrBug">Disable PPU OAMADDR bug emulation</Control>
<Control ID="chkDisablePaletteRead">Disable PPU palette reads</Control>
<Control ID="tpgOverclocking">Розгін</Control>
<Control ID="grpOverclocking">Розгін CPU</Control>
@ -518,6 +520,8 @@
<Message ID="RomsFound">{0} Знайдені ROM файли</Message>
<Message ID="RiskyOptionHint">(not recommended)</Message>
<Message ID="RandomGameNoGameFound">Mesen could not find any games to load.</Message>
<Message ID="CheatsFound">iгр {0}, читiв {1}</Message>

View file

@ -1,4 +1,6 @@
namespace Mesen.GUI.Forms.Config
using Mesen.GUI.Controls;
namespace Mesen.GUI.Forms.Config
{
partial class frmAudioConfig
{
@ -98,9 +100,9 @@
this.lblCrossFeedRatio = new System.Windows.Forms.Label();
this.tpgAdvanced = new System.Windows.Forms.TabPage();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.chkDisableNoiseModeFlag = new System.Windows.Forms.CheckBox();
this.chkDisableNoiseModeFlag = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkSilenceTriangleHighFreq = new System.Windows.Forms.CheckBox();
this.chkSwapDutyCycles = new System.Windows.Forms.CheckBox();
this.chkSwapDutyCycles = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkReduceDmcPopping = new System.Windows.Forms.CheckBox();
this.baseConfigPanel.SuspendLayout();
this.grpVolume.SuspendLayout();
@ -1094,9 +1096,9 @@
this.tableLayoutPanel3.ColumnCount = 1;
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel3.Controls.Add(this.chkDisableNoiseModeFlag, 0, 3);
this.tableLayoutPanel3.Controls.Add(this.chkSilenceTriangleHighFreq, 0, 1);
this.tableLayoutPanel3.Controls.Add(this.chkSwapDutyCycles, 0, 0);
this.tableLayoutPanel3.Controls.Add(this.chkReduceDmcPopping, 0, 2);
this.tableLayoutPanel3.Controls.Add(this.chkSilenceTriangleHighFreq, 0, 0);
this.tableLayoutPanel3.Controls.Add(this.chkSwapDutyCycles, 0, 2);
this.tableLayoutPanel3.Controls.Add(this.chkReduceDmcPopping, 0, 1);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
@ -1112,42 +1114,37 @@
// chkDisableNoiseModeFlag
//
this.chkDisableNoiseModeFlag.AutoSize = true;
this.chkDisableNoiseModeFlag.CheckAlign = System.Drawing.ContentAlignment.TopLeft;
this.chkDisableNoiseModeFlag.Location = new System.Drawing.Point(3, 72);
this.chkDisableNoiseModeFlag.Checked = false;
this.chkDisableNoiseModeFlag.Location = new System.Drawing.Point(0, 69);
this.chkDisableNoiseModeFlag.Name = "chkDisableNoiseModeFlag";
this.chkDisableNoiseModeFlag.Size = new System.Drawing.Size(179, 17);
this.chkDisableNoiseModeFlag.Size = new System.Drawing.Size(277, 23);
this.chkDisableNoiseModeFlag.TabIndex = 3;
this.chkDisableNoiseModeFlag.Text = "Disable noise channel mode flag";
this.chkDisableNoiseModeFlag.TextAlign = System.Drawing.ContentAlignment.TopLeft;
this.chkDisableNoiseModeFlag.UseVisualStyleBackColor = true;
//
// chkSilenceTriangleHighFreq
//
this.chkSilenceTriangleHighFreq.AutoSize = true;
this.chkSilenceTriangleHighFreq.CheckAlign = System.Drawing.ContentAlignment.TopLeft;
this.chkSilenceTriangleHighFreq.Location = new System.Drawing.Point(3, 26);
this.chkSilenceTriangleHighFreq.Location = new System.Drawing.Point(3, 3);
this.chkSilenceTriangleHighFreq.Name = "chkSilenceTriangleHighFreq";
this.chkSilenceTriangleHighFreq.Size = new System.Drawing.Size(337, 17);
this.chkSilenceTriangleHighFreq.TabIndex = 1;
this.chkSilenceTriangleHighFreq.Text = "Mute ultrasonic frequencies on triangle channel (reduces popping)";
this.chkSilenceTriangleHighFreq.TextAlign = System.Drawing.ContentAlignment.TopLeft;
this.chkSilenceTriangleHighFreq.UseVisualStyleBackColor = true;
//
// chkSwapDutyCycles
//
this.chkSwapDutyCycles.AutoSize = true;
this.chkSwapDutyCycles.Location = new System.Drawing.Point(3, 3);
this.chkSwapDutyCycles.Checked = false;
this.chkSwapDutyCycles.Location = new System.Drawing.Point(0, 46);
this.chkSwapDutyCycles.Name = "chkSwapDutyCycles";
this.chkSwapDutyCycles.Size = new System.Drawing.Size(282, 17);
this.chkSwapDutyCycles.Size = new System.Drawing.Size(380, 23);
this.chkSwapDutyCycles.TabIndex = 0;
this.chkSwapDutyCycles.Text = "Swap square channels duty cycles (Mimics old clones)";
this.chkSwapDutyCycles.UseVisualStyleBackColor = true;
//
// chkReduceDmcPopping
//
this.chkReduceDmcPopping.AutoSize = true;
this.chkReduceDmcPopping.CheckAlign = System.Drawing.ContentAlignment.TopLeft;
this.chkReduceDmcPopping.Location = new System.Drawing.Point(3, 49);
this.chkReduceDmcPopping.Location = new System.Drawing.Point(3, 26);
this.chkReduceDmcPopping.Name = "chkReduceDmcPopping";
this.chkReduceDmcPopping.Size = new System.Drawing.Size(243, 17);
this.chkReduceDmcPopping.TabIndex = 2;
@ -1244,7 +1241,7 @@
private System.Windows.Forms.CheckBox chkReduceSoundInBackground;
private System.Windows.Forms.TabPage tpgAdvanced;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
private System.Windows.Forms.CheckBox chkSwapDutyCycles;
private ctrlRiskyOption chkSwapDutyCycles;
private System.Windows.Forms.TabPage tpgEffects;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4;
private System.Windows.Forms.GroupBox grpStereo;
@ -1286,6 +1283,6 @@
private System.Windows.Forms.NumericUpDown nudCrossFeedRatio;
private System.Windows.Forms.Label lblCrossFeedRatio;
private Controls.ctrlHorizontalTrackbar trkTrianglePan;
private System.Windows.Forms.CheckBox chkDisableNoiseModeFlag;
private ctrlRiskyOption chkDisableNoiseModeFlag;
}
}

View file

@ -1,4 +1,6 @@
namespace Mesen.GUI.Forms.Config
using Mesen.GUI.Controls;
namespace Mesen.GUI.Forms.Config
{
partial class frmEmulationConfig
{
@ -42,11 +44,14 @@
this.tpgAdvanced = new System.Windows.Forms.TabPage();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.chkUseAlternativeMmc3Irq = new System.Windows.Forms.CheckBox();
this.chkAllowInvalidInput = new System.Windows.Forms.CheckBox();
this.chkAllowInvalidInput = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkRemoveSpriteLimit = new System.Windows.Forms.CheckBox();
this.flowLayoutPanel8 = new System.Windows.Forms.FlowLayoutPanel();
this.lblRamPowerOnState = new System.Windows.Forms.Label();
this.cboRamPowerOnState = new System.Windows.Forms.ComboBox();
this.chkDisableOamAddrBug = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkDisablePaletteRead = new Mesen.GUI.Controls.ctrlRiskyOption();
this.chkDisablePpu2004Reads = new Mesen.GUI.Controls.ctrlRiskyOption();
this.tpgOverclocking = new System.Windows.Forms.TabPage();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.flowLayoutPanel4 = new System.Windows.Forms.FlowLayoutPanel();
@ -76,7 +81,6 @@
this.chkShowLagCounter = new System.Windows.Forms.CheckBox();
this.btnResetLagCounter = new System.Windows.Forms.Button();
this.tmrUpdateClockRate = new System.Windows.Forms.Timer(this.components);
this.chkDisablePpu2004Reads = new System.Windows.Forms.CheckBox();
this.tabMain.SuspendLayout();
this.tpgGeneral.SuspendLayout();
this.tableLayoutPanel4.SuspendLayout();
@ -106,7 +110,7 @@
// baseConfigPanel
//
this.baseConfigPanel.Location = new System.Drawing.Point(0, 299);
this.baseConfigPanel.Size = new System.Drawing.Size(487, 29);
this.baseConfigPanel.Size = new System.Drawing.Size(533, 29);
//
// tabMain
//
@ -117,7 +121,7 @@
this.tabMain.Location = new System.Drawing.Point(0, 0);
this.tabMain.Name = "tabMain";
this.tabMain.SelectedIndex = 0;
this.tabMain.Size = new System.Drawing.Size(487, 299);
this.tabMain.Size = new System.Drawing.Size(533, 299);
this.tabMain.TabIndex = 2;
//
// tpgGeneral
@ -126,7 +130,7 @@
this.tpgGeneral.Location = new System.Drawing.Point(4, 22);
this.tpgGeneral.Name = "tpgGeneral";
this.tpgGeneral.Padding = new System.Windows.Forms.Padding(3);
this.tpgGeneral.Size = new System.Drawing.Size(479, 273);
this.tpgGeneral.Size = new System.Drawing.Size(525, 273);
this.tpgGeneral.TabIndex = 0;
this.tpgGeneral.Text = "General";
this.tpgGeneral.UseVisualStyleBackColor = true;
@ -147,7 +151,7 @@
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.Size = new System.Drawing.Size(473, 267);
this.tableLayoutPanel4.Size = new System.Drawing.Size(519, 267);
this.tableLayoutPanel4.TabIndex = 0;
//
// flowLayoutPanel9
@ -159,7 +163,7 @@
this.flowLayoutPanel9.Location = new System.Drawing.Point(111, 26);
this.flowLayoutPanel9.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel9.Name = "flowLayoutPanel9";
this.flowLayoutPanel9.Size = new System.Drawing.Size(362, 26);
this.flowLayoutPanel9.Size = new System.Drawing.Size(408, 26);
this.flowLayoutPanel9.TabIndex = 14;
//
// nudTurboSpeed
@ -203,7 +207,7 @@
this.flowLayoutPanel6.Location = new System.Drawing.Point(111, 0);
this.flowLayoutPanel6.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel6.Name = "flowLayoutPanel6";
this.flowLayoutPanel6.Size = new System.Drawing.Size(362, 26);
this.flowLayoutPanel6.Size = new System.Drawing.Size(408, 26);
this.flowLayoutPanel6.TabIndex = 11;
//
// nudEmulationSpeed
@ -244,7 +248,7 @@
this.tpgAdvanced.Location = new System.Drawing.Point(4, 22);
this.tpgAdvanced.Name = "tpgAdvanced";
this.tpgAdvanced.Padding = new System.Windows.Forms.Padding(3);
this.tpgAdvanced.Size = new System.Drawing.Size(479, 273);
this.tpgAdvanced.Size = new System.Drawing.Size(525, 273);
this.tpgAdvanced.TabIndex = 1;
this.tpgAdvanced.Text = "Advanced";
this.tpgAdvanced.UseVisualStyleBackColor = true;
@ -253,28 +257,32 @@
//
this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.chkUseAlternativeMmc3Irq, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.chkAllowInvalidInput, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.chkUseAlternativeMmc3Irq, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.chkAllowInvalidInput, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.chkRemoveSpriteLimit, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel8, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel8, 0, 6);
this.tableLayoutPanel1.Controls.Add(this.chkDisableOamAddrBug, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.chkDisablePaletteRead, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.chkDisablePpu2004Reads, 0, 3);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 6;
this.tableLayoutPanel1.RowCount = 8;
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.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(473, 267);
this.tableLayoutPanel1.Size = new System.Drawing.Size(519, 267);
this.tableLayoutPanel1.TabIndex = 0;
//
// chkUseAlternativeMmc3Irq
//
this.chkUseAlternativeMmc3Irq.AutoSize = true;
this.chkUseAlternativeMmc3Irq.Location = new System.Drawing.Point(3, 49);
this.chkUseAlternativeMmc3Irq.Location = new System.Drawing.Point(3, 26);
this.chkUseAlternativeMmc3Irq.Name = "chkUseAlternativeMmc3Irq";
this.chkUseAlternativeMmc3Irq.Size = new System.Drawing.Size(197, 17);
this.chkUseAlternativeMmc3Irq.TabIndex = 0;
@ -284,12 +292,13 @@
// chkAllowInvalidInput
//
this.chkAllowInvalidInput.AutoSize = true;
this.chkAllowInvalidInput.Location = new System.Drawing.Point(3, 26);
this.chkAllowInvalidInput.Checked = false;
this.chkAllowInvalidInput.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkAllowInvalidInput.Location = new System.Drawing.Point(0, 46);
this.chkAllowInvalidInput.Name = "chkAllowInvalidInput";
this.chkAllowInvalidInput.Size = new System.Drawing.Size(341, 17);
this.chkAllowInvalidInput.Size = new System.Drawing.Size(519, 23);
this.chkAllowInvalidInput.TabIndex = 1;
this.chkAllowInvalidInput.Text = "Allow invalid input (e.g Down + Up or Left + Right at the same time)";
this.chkAllowInvalidInput.UseVisualStyleBackColor = true;
//
// chkRemoveSpriteLimit
//
@ -306,10 +315,10 @@
this.flowLayoutPanel8.Controls.Add(this.lblRamPowerOnState);
this.flowLayoutPanel8.Controls.Add(this.cboRamPowerOnState);
this.flowLayoutPanel8.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel8.Location = new System.Drawing.Point(0, 92);
this.flowLayoutPanel8.Location = new System.Drawing.Point(0, 138);
this.flowLayoutPanel8.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel8.Name = "flowLayoutPanel8";
this.flowLayoutPanel8.Size = new System.Drawing.Size(473, 27);
this.flowLayoutPanel8.Size = new System.Drawing.Size(519, 27);
this.flowLayoutPanel8.TabIndex = 3;
//
// lblRamPowerOnState
@ -331,13 +340,43 @@
this.cboRamPowerOnState.Size = new System.Drawing.Size(176, 21);
this.cboRamPowerOnState.TabIndex = 1;
//
// chkDisableOamAddrBug
//
this.chkDisableOamAddrBug.AutoSize = true;
this.chkDisableOamAddrBug.Checked = false;
this.chkDisableOamAddrBug.Location = new System.Drawing.Point(0, 115);
this.chkDisableOamAddrBug.Name = "chkDisableOamAddrBug";
this.chkDisableOamAddrBug.Size = new System.Drawing.Size(311, 23);
this.chkDisableOamAddrBug.TabIndex = 5;
this.chkDisableOamAddrBug.Text = "Disable PPU OAMADDR bug emulation";
//
// chkDisablePaletteRead
//
this.chkDisablePaletteRead.AutoSize = true;
this.chkDisablePaletteRead.Checked = false;
this.chkDisablePaletteRead.Location = new System.Drawing.Point(0, 92);
this.chkDisablePaletteRead.Name = "chkDisablePaletteRead";
this.chkDisablePaletteRead.Size = new System.Drawing.Size(248, 23);
this.chkDisablePaletteRead.TabIndex = 6;
this.chkDisablePaletteRead.Text = "Disable PPU palette reads";
//
// chkDisablePpu2004Reads
//
this.chkDisablePpu2004Reads.AutoSize = true;
this.chkDisablePpu2004Reads.Checked = false;
this.chkDisablePpu2004Reads.Location = new System.Drawing.Point(0, 69);
this.chkDisablePpu2004Reads.Name = "chkDisablePpu2004Reads";
this.chkDisablePpu2004Reads.Size = new System.Drawing.Size(246, 23);
this.chkDisablePpu2004Reads.TabIndex = 4;
this.chkDisablePpu2004Reads.Text = "Disable PPU $2004 reads";
//
// tpgOverclocking
//
this.tpgOverclocking.Controls.Add(this.tableLayoutPanel3);
this.tpgOverclocking.Location = new System.Drawing.Point(4, 22);
this.tpgOverclocking.Name = "tpgOverclocking";
this.tpgOverclocking.Padding = new System.Windows.Forms.Padding(3);
this.tpgOverclocking.Size = new System.Drawing.Size(479, 273);
this.tpgOverclocking.Size = new System.Drawing.Size(525, 273);
this.tpgOverclocking.TabIndex = 2;
this.tpgOverclocking.Text = "Overclocking";
this.tpgOverclocking.UseVisualStyleBackColor = true;
@ -366,7 +405,7 @@
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
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.Size = new System.Drawing.Size(473, 267);
this.tableLayoutPanel3.Size = new System.Drawing.Size(519, 267);
this.tableLayoutPanel3.TabIndex = 0;
//
// flowLayoutPanel4
@ -377,7 +416,7 @@
this.flowLayoutPanel4.Location = new System.Drawing.Point(0, 189);
this.flowLayoutPanel4.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel4.Name = "flowLayoutPanel4";
this.flowLayoutPanel4.Size = new System.Drawing.Size(473, 20);
this.flowLayoutPanel4.Size = new System.Drawing.Size(519, 20);
this.flowLayoutPanel4.TabIndex = 11;
//
// lblEffectiveClockRateDendy
@ -428,7 +467,7 @@
this.flowLayoutPanel3.Location = new System.Drawing.Point(0, 172);
this.flowLayoutPanel3.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel3.Name = "flowLayoutPanel3";
this.flowLayoutPanel3.Size = new System.Drawing.Size(473, 17);
this.flowLayoutPanel3.Size = new System.Drawing.Size(519, 17);
this.flowLayoutPanel3.TabIndex = 9;
//
// lblEffectiveClockRatePal
@ -456,7 +495,7 @@
this.grpOverclocking.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpOverclocking.Location = new System.Drawing.Point(3, 26);
this.grpOverclocking.Name = "grpOverclocking";
this.grpOverclocking.Size = new System.Drawing.Size(467, 45);
this.grpOverclocking.Size = new System.Drawing.Size(513, 45);
this.grpOverclocking.TabIndex = 6;
this.grpOverclocking.TabStop = false;
this.grpOverclocking.Text = "Overclocking";
@ -475,7 +514,7 @@
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(461, 26);
this.tableLayoutPanel2.Size = new System.Drawing.Size(507, 26);
this.tableLayoutPanel2.TabIndex = 0;
//
// flowLayoutPanel5
@ -487,7 +526,7 @@
this.flowLayoutPanel5.Location = new System.Drawing.Point(0, 0);
this.flowLayoutPanel5.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel5.Name = "flowLayoutPanel5";
this.flowLayoutPanel5.Size = new System.Drawing.Size(461, 25);
this.flowLayoutPanel5.Size = new System.Drawing.Size(507, 25);
this.flowLayoutPanel5.TabIndex = 1;
//
// lblClockRate
@ -542,7 +581,7 @@
this.grpPpuTiming.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpPpuTiming.Location = new System.Drawing.Point(3, 77);
this.grpPpuTiming.Name = "grpPpuTiming";
this.grpPpuTiming.Size = new System.Drawing.Size(467, 75);
this.grpPpuTiming.Size = new System.Drawing.Size(513, 75);
this.grpPpuTiming.TabIndex = 7;
this.grpPpuTiming.TabStop = false;
this.grpPpuTiming.Text = "PPU Vertical Blank Configuration";
@ -563,7 +602,7 @@
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel5.Size = new System.Drawing.Size(461, 56);
this.tableLayoutPanel5.Size = new System.Drawing.Size(507, 56);
this.tableLayoutPanel5.TabIndex = 0;
//
// nudExtraScanlinesAfterNmi
@ -632,7 +671,7 @@
this.flowLayoutPanel2.Location = new System.Drawing.Point(0, 155);
this.flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel2.Name = "flowLayoutPanel2";
this.flowLayoutPanel2.Size = new System.Drawing.Size(473, 17);
this.flowLayoutPanel2.Size = new System.Drawing.Size(519, 17);
this.flowLayoutPanel2.TabIndex = 8;
//
// lblEffectiveClockRate
@ -662,7 +701,7 @@
this.flowLayoutPanel7.Location = new System.Drawing.Point(0, 232);
this.flowLayoutPanel7.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel7.Name = "flowLayoutPanel7";
this.flowLayoutPanel7.Size = new System.Drawing.Size(473, 35);
this.flowLayoutPanel7.Size = new System.Drawing.Size(519, 35);
this.flowLayoutPanel7.TabIndex = 12;
//
// chkShowLagCounter
@ -692,21 +731,11 @@
this.tmrUpdateClockRate.Enabled = true;
this.tmrUpdateClockRate.Tick += new System.EventHandler(this.tmrUpdateClockRate_Tick);
//
// chkDisablePpu2004Reads
//
this.chkDisablePpu2004Reads.AutoSize = true;
this.chkDisablePpu2004Reads.Location = new System.Drawing.Point(3, 72);
this.chkDisablePpu2004Reads.Name = "chkDisablePpu2004Reads";
this.chkDisablePpu2004Reads.Size = new System.Drawing.Size(148, 17);
this.chkDisablePpu2004Reads.TabIndex = 4;
this.chkDisablePpu2004Reads.Text = "Disable PPU $2004 reads";
this.chkDisablePpu2004Reads.UseVisualStyleBackColor = true;
//
// frmEmulationConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(487, 328);
this.ClientSize = new System.Drawing.Size(533, 328);
this.Controls.Add(this.tabMain);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
@ -763,7 +792,7 @@
private System.Windows.Forms.TabPage tpgAdvanced;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.CheckBox chkUseAlternativeMmc3Irq;
private System.Windows.Forms.CheckBox chkAllowInvalidInput;
private ctrlRiskyOption chkAllowInvalidInput;
private System.Windows.Forms.CheckBox chkRemoveSpriteLimit;
private System.Windows.Forms.TabPage tpgOverclocking;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
@ -806,6 +835,8 @@
private System.Windows.Forms.NumericUpDown nudTurboSpeed;
private System.Windows.Forms.Label lblTurboSpeed;
private System.Windows.Forms.Label lblTurboSpeedHint;
private System.Windows.Forms.CheckBox chkDisablePpu2004Reads;
private ctrlRiskyOption chkDisablePpu2004Reads;
private ctrlRiskyOption chkDisableOamAddrBug;
private ctrlRiskyOption chkDisablePaletteRead;
}
}

View file

@ -28,6 +28,8 @@ namespace Mesen.GUI.Forms.Config
AddBinding("AllowInvalidInput", chkAllowInvalidInput);
AddBinding("RemoveSpriteLimit", chkRemoveSpriteLimit);
AddBinding("DisablePpu2004Reads", chkDisablePpu2004Reads);
AddBinding("DisablePaletteRead", chkDisablePaletteRead);
AddBinding("DisableOamAddrBug", chkDisableOamAddrBug);
AddBinding("OverclockRate", nudOverclockRate);
AddBinding("OverclockAdjustApu", chkOverclockAdjustApu);

View file

@ -1,4 +1,6 @@
namespace Mesen.GUI.Forms.Config
using Mesen.GUI.Controls;
namespace Mesen.GUI.Forms.Config
{
partial class frmPreferences
{
@ -89,7 +91,7 @@
this.chkUnfFormat = new System.Windows.Forms.CheckBox();
this.tpgAdvanced = new System.Windows.Forms.TabPage();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.chkDisableGameDatabase = new System.Windows.Forms.CheckBox();
this.chkDisableGameDatabase = new ctrlRiskyOption();
this.chkFdsAutoLoadDisk = new System.Windows.Forms.CheckBox();
this.chkFdsFastForwardOnLoad = new System.Windows.Forms.CheckBox();
this.tmrSyncDateTime = new System.Windows.Forms.Timer(this.components);
@ -886,7 +888,6 @@
this.chkDisableGameDatabase.Size = new System.Drawing.Size(170, 17);
this.chkDisableGameDatabase.TabIndex = 6;
this.chkDisableGameDatabase.Text = "Disable built-in game database";
this.chkDisableGameDatabase.UseVisualStyleBackColor = true;
//
// chkFdsAutoLoadDisk
//
@ -1037,7 +1038,7 @@
private System.Windows.Forms.TabPage tpgNsf;
private System.Windows.Forms.CheckBox chkFdsFastForwardOnLoad;
private System.Windows.Forms.CheckBox chkFdsAutoLoadDisk;
private System.Windows.Forms.CheckBox chkDisableGameDatabase;
private ctrlRiskyOption chkDisableGameDatabase;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel5;
private System.Windows.Forms.CheckBox chkNsfMoveToNextTrackAfterTime;

View file

@ -1,4 +1,6 @@
namespace Mesen.GUI.Forms.Config
using Mesen.GUI.Controls;
namespace Mesen.GUI.Forms.Config
{
partial class frmVideoConfig
{
@ -96,10 +98,10 @@
this.btnLoadPalFile = new System.Windows.Forms.Button();
this.tpgAdvanced = new System.Windows.Forms.TabPage();
this.tableLayoutPanel9 = new System.Windows.Forms.TableLayoutPanel();
this.chkDisableBackground = new System.Windows.Forms.CheckBox();
this.chkDisableSprites = new System.Windows.Forms.CheckBox();
this.chkForceBackgroundFirstColumn = new System.Windows.Forms.CheckBox();
this.chkForceSpritesFirstColumn = new System.Windows.Forms.CheckBox();
this.chkDisableBackground = new ctrlRiskyOption();
this.chkDisableSprites = new ctrlRiskyOption();
this.chkForceBackgroundFirstColumn = new ctrlRiskyOption();
this.chkForceSpritesFirstColumn = new ctrlRiskyOption();
this.contextPicturePresets = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuPresetComposite = new System.Windows.Forms.ToolStripMenuItem();
this.mnuPresetSVideo = new System.Windows.Forms.ToolStripMenuItem();
@ -1091,7 +1093,6 @@
this.chkDisableBackground.Size = new System.Drawing.Size(121, 17);
this.chkDisableBackground.TabIndex = 0;
this.chkDisableBackground.Text = "Disable background";
this.chkDisableBackground.UseVisualStyleBackColor = true;
//
// chkDisableSprites
//
@ -1101,7 +1102,6 @@
this.chkDisableSprites.Size = new System.Drawing.Size(94, 17);
this.chkDisableSprites.TabIndex = 1;
this.chkDisableSprites.Text = "Disable sprites";
this.chkDisableSprites.UseVisualStyleBackColor = true;
//
// chkForceBackgroundFirstColumn
//
@ -1111,7 +1111,6 @@
this.chkForceBackgroundFirstColumn.Size = new System.Drawing.Size(215, 17);
this.chkForceBackgroundFirstColumn.TabIndex = 2;
this.chkForceBackgroundFirstColumn.Text = "Force background display in first column";
this.chkForceBackgroundFirstColumn.UseVisualStyleBackColor = true;
//
// chkForceSpritesFirstColumn
//
@ -1121,7 +1120,6 @@
this.chkForceSpritesFirstColumn.Size = new System.Drawing.Size(183, 17);
this.chkForceSpritesFirstColumn.TabIndex = 3;
this.chkForceSpritesFirstColumn.Text = "Force sprite display in first column";
this.chkForceSpritesFirstColumn.UseVisualStyleBackColor = true;
//
// contextPicturePresets
//
@ -1428,10 +1426,10 @@
private System.Windows.Forms.ComboBox cboFilter;
private System.Windows.Forms.TabPage tpgAdvanced;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel9;
private System.Windows.Forms.CheckBox chkDisableBackground;
private System.Windows.Forms.CheckBox chkDisableSprites;
private System.Windows.Forms.CheckBox chkForceBackgroundFirstColumn;
private System.Windows.Forms.CheckBox chkForceSpritesFirstColumn;
private ctrlRiskyOption chkDisableBackground;
private ctrlRiskyOption chkDisableSprites;
private ctrlRiskyOption chkForceBackgroundFirstColumn;
private ctrlRiskyOption chkForceSpritesFirstColumn;
private System.Windows.Forms.ToolStripMenuItem mnuPaletteNostalgia;
private System.Windows.Forms.ToolStripMenuItem mnuPaletteNesClassic;
private System.Windows.Forms.TableLayoutPanel tlpNtscFilter2;

View file

@ -73,6 +73,8 @@ namespace Mesen.GUI.Forms
}
} else if(kvp.Value is CheckBox) {
((CheckBox)kvp.Value).Checked = Convert.ToBoolean(value);
} else if(kvp.Value is ctrlRiskyOption) {
((ctrlRiskyOption)kvp.Value).Checked = Convert.ToBoolean(value);
} else if(kvp.Value is RadioButton) {
((RadioButton)kvp.Value).Checked = (bool)value;
} else if(kvp.Value is Panel) {
@ -160,6 +162,12 @@ namespace Mesen.GUI.Forms
} else if(field.FieldType == typeof(byte)) {
field.SetValue(Entity, ((CheckBox)kvp.Value).Checked ? (byte)1 : (byte)0);
}
} else if(kvp.Value is ctrlRiskyOption) {
if(field.FieldType == typeof(bool)) {
field.SetValue(Entity, ((ctrlRiskyOption)kvp.Value).Checked);
} else if(field.FieldType == typeof(byte)) {
field.SetValue(Entity, ((ctrlRiskyOption)kvp.Value).Checked ? (byte)1 : (byte)0);
}
} else if(kvp.Value is RadioButton) {
field.SetValue(Entity, ((RadioButton)kvp.Value).Checked);
} else if(kvp.Value is Panel) {

View file

@ -243,6 +243,12 @@
<Compile Include="Controls\ctrlNsfPlayer.Designer.cs">
<DependentUpon>ctrlNsfPlayer.cs</DependentUpon>
</Compile>
<Compile Include="Controls\ctrlRiskyOption.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Controls\ctrlRiskyOption.Designer.cs">
<DependentUpon>ctrlRiskyOption.cs</DependentUpon>
</Compile>
<Compile Include="Controls\ctrlSplitContainer.cs">
<SubType>Component</SubType>
</Compile>
@ -626,6 +632,9 @@
<EmbeddedResource Include="Controls\ctrlNsfPlayer.resx">
<DependentUpon>ctrlNsfPlayer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\ctrlRiskyOption.resx">
<DependentUpon>ctrlRiskyOption.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Controls\ctrlTrackbar.resx">
<DependentUpon>ctrlTrackbar.cs</DependentUpon>
</EmbeddedResource>

View file

@ -805,7 +805,7 @@ namespace Mesen.GUI
}
[Flags]
public enum EmulationFlags
public enum EmulationFlags : UInt64
{
Paused = 0x01,
ShowFPS = 0x02,
@ -841,8 +841,10 @@ namespace Mesen.GUI
ForceSpritesFirstColumn = 0x2000000,
DisablePpu2004Reads = 0x4000000,
DisableNoiseModeFlag = 0x8000000,
DisablePaletteRead = 0x10000000,
DisableOamAddrBug = 0x20000000,
InBackground = 0x40000000,
InBackground = 0x4000000000,
}
[Flags]