Fixed the noise channel. Fixed speech in IM. Added 0xED57 to play WBIII

This commit is contained in:
2026-05-15 22:09:20 +01:00
parent f52a5cbfdb
commit 4e745b4fbc
5 changed files with 411 additions and 380 deletions

View File

@@ -22,7 +22,9 @@ namespace Core.Audio
private int[] _counters = new int[4];
private int[] _polarities = new int[4] { 1, 1, 1, 1 }; // 1 = High, -1 = Low
private ushort _lfsr = 0x8000; // Linear Feedback Shift Register (For Noise)
private bool _noiseFlipFlop = false;
// --- FILTER VARIABLES ---
private float _previousSample = 0f;
private float _previousFiltered = 0f;
// The SN76489 Volume Table reduces amplitude by exactly 2 decibels per step.
private static readonly float[] VolumeTable = {
@@ -84,39 +86,34 @@ namespace Core.Audio
_counters[3]--;
if (_counters[3] <= 0)
{
// Reload the counter
// 1. Reload the counter
int shiftRate = Registers[6] & 0x03;
if (shiftRate == 0) _counters[3] = 0x10; // Fast
else if (shiftRate == 1) _counters[3] = 0x20; // Medium
else if (shiftRate == 2) _counters[3] = 0x40; // Slow
else _counters[3] = (Registers[4] == 0) ? 1024 : Registers[4]; // Linked to Tone 2
// THE FIX: Toggle the internal clock (Divide by 2!)
_noiseFlipFlop = !_noiseFlipFlop;
// 2. NO FLIP FLOP! Shift the LFSR immediately!
bool isWhiteNoise = (Registers[6] & 0x04) != 0;
// Only shift the random static when the clock goes High
if (_noiseFlipFlop)
{
int tappedBit = _lfsr & 1;
_lfsr >>= 1;
// Read the bits BEFORE shifting
int bit0 = _lfsr & 1;
int bit3 = (_lfsr >> 3) & 1;
if (tappedBit == 1)
{
bool isWhiteNoise = (Registers[6] & 0x04) != 0;
if (isWhiteNoise) _lfsr ^= 0x0009; // SMS-specific XOR mask
// The Master System physically XORs bit 0 and bit 3 for White Noise.
// For Periodic Noise, it just feeds bit 0 straight back in.
int feedback = isWhiteNoise ? (bit0 ^ bit3) : bit0;
_lfsr |= 0x8000; // Inject the high bit
}
// Shift the register right and push the feedback into the highest bit (Bit 15)
_lfsr = (ushort)((_lfsr >> 1) | (feedback << 15));
// The noise channel output is driven directly by the tapped bit
_polarities[3] = (tappedBit == 1) ? 1 : -1;
}
// The noise speaker is driven directly by the lowest bit
_polarities[3] = (_lfsr & 1) == 1 ? 1 : -1;
}
}
private void MixAndOutputSample()
{
// If the UI hasn't hooked up the speakers yet, just throw the audio away!
if (AudioDevice == null) return;
float sample = 0f;
@@ -124,9 +121,16 @@ namespace Core.Audio
// Mix Tone Channels 0, 1, 2
for (int i = 0; i < 3; i++)
{
// HARDWARE QUIRK: If the tone frequency is 1 or 0, the channel outputs a
// constant DC voltage instead of vibrating, meaning it is effectively silent.
if (Registers[i * 2] > 1)
int tone = Registers[i * 2];
// THE FIX 1: Catch ALL ultrasonic frequencies (1 through 5) to stop Aliasing!
if (tone >= 0 && tone <= 5)
{
// THE FIX 2: Scale it by 0.5f. A fast square wave spends 50% of its time
// high, so it naturally averages out to half volume. This prevents clipping!
sample += 0.5f * VolumeTable[Registers[(i * 2) + 1]];
}
else
{
sample += _polarities[i] * VolumeTable[Registers[(i * 2) + 1]];
}
@@ -135,10 +139,18 @@ namespace Core.Audio
// Mix Noise Channel 3
sample += _polarities[3] * VolumeTable[Registers[7]];
// Divide by 4 so all 4 channels together never exceed 1.0f (which would cause horrible distortion!)
// Divide by 4 so all 4 channels together never exceed 1.0f
sample /= 4.0f;
AudioDevice.AddSample(sample);
// THE FIX 3: The DC Blocker (1-Pole High-Pass Filter)
// PCM speech creates a massive DC offset (pushes the speaker cone forward and leaves it there).
// This filter smoothly pulls the speaker cone back to center at 35Hz, removing the hum and distortion!
float filteredSample = sample - _previousSample + 0.995f * _previousFiltered;
_previousSample = sample;
_previousFiltered = filteredSample;
AudioDevice.AddSample(filteredSample);
}
public void WritePort7F(byte value)
{

View File

@@ -1340,6 +1340,18 @@ namespace Core.Cpu
case 0x56: // IM 1
InterruptMode = 1;
return 8;
case 0x57: // LD A, I
{
AF.High = I; // Copy I into A
byte flags57 = (byte)(AF.Low & 0x01); // Preserve Carry
if ((AF.High & 0x80) != 0) flags57 |= 0x80; // S flag
if (AF.High == 0) flags57 |= 0x40; // Z flag
if (IFF2) flags57 |= 0x04; // P/V flag gets IFF2
flags57 |= (byte)(AF.High & 0x28);
AF.Low = flags57;
return 9;
}
case 0x58: // IN E, (C)
byte inVal58 = ReadPort(BC.Word);
DE.Low = inVal58;

View File

@@ -19,7 +19,8 @@ namespace Core
public ushort? Breakpoint { get; set; } = null;
// NTSC SMS T-States per frame
public const int TStatesPerFrame = 59736;
public const int TStatesPerFrame = 59736; //NTSC
//public const int TStatesPerFrame = 49780; //PAL
public SmsMachine()
{
@@ -46,7 +47,7 @@ namespace Core
public void RunFrame()
{
int tStatesThisFrame = 0;
while (tStatesThisFrame < 59736) // Standard NTSC frame time
while (tStatesThisFrame < TStatesPerFrame) // Standard NTSC frame time
{
// 1. Run one CPU instruction
int cycles = Cpu.Step();

View File

@@ -1,356 +1,362 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<ItemGroup>
<None Remove="ROMS\After Burner %28UE%29 [!].sms" />
<None Remove="ROMS\Alex Kidd in High Tech World %28UE%29 [!].sms" />
<None Remove="ROMS\Alex Kidd in Miracle World %28UE%29 [!].sms" />
<None Remove="ROMS\Back to the Future 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Back to the Future 3 %28UE%29 [!].sms" />
<None Remove="ROMS\Bart vs. the Space Mutants %28UE%29 [!].sms" />
<None Remove="ROMS\Bart vs. the World %28UE%29 [!].sms" />
<None Remove="ROMS\Black Belt %28UE%29 [!].sms" />
<None Remove="ROMS\California Games %28UE%29 [!].sms" />
<None Remove="ROMS\California Games 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Casino Games %28UE%29 [!].sms" />
<None Remove="ROMS\Choplifter %28SG-1000%29 [!].sg" />
<None Remove="ROMS\Cloud Master %28JUE%29.sms" />
<None Remove="ROMS\Cool Spot %28UE%29 [!].sms" />
<None Remove="ROMS\Desert Strike %28UE%29 [!].sms" />
<None Remove="ROMS\Double Dragon %28UE%29 [!].sms" />
<None Remove="ROMS\Dynamite Dux %28UE%29 [!].sms" />
<None Remove="ROMS\Ecco the Dolphin %28UE%29.sms" />
<None Remove="ROMS\Fantasy Zone %28UE%29 [!].sms" />
<None Remove="ROMS\Fantasy Zone 2 - The Tears of Opa-Opa %28UE%29 [!].sms" />
<None Remove="ROMS\Fantasy Zone 3 - The Maze %28UE%29 [!].sms" />
<None Remove="ROMS\Gangster Town %28UE%29 [!].sms" />
<None Remove="ROMS\Gauntlet %28UE%29 [!].sms" />
<None Remove="ROMS\Ghost House %28UE%29 [!].sms" />
<None Remove="ROMS\Ghouls %27n Ghosts %28UE%29 [!].sms" />
<None Remove="ROMS\Global Defense %28UE%29 [!].sms" />
<None Remove="ROMS\Golden Axe %28UE%29 [!].sms" />
<None Remove="ROMS\Golden Axe Warrior.sms" />
<None Remove="ROMS\Great Baseball %28UE%29 [!].sms" />
<None Remove="ROMS\Great Basketball %28UE%29 [!].sms" />
<None Remove="ROMS\Great Football %28UE%29 [!].sms" />
<None Remove="ROMS\Great Golf %28UE%29 [!].sms" />
<None Remove="ROMS\Great Ice Hockey %28UE%29 [!].sms" />
<None Remove="ROMS\Great Volleyball %28UE%29 [!].sms" />
<None Remove="ROMS\Hang-On %28UE%29 [!].sms" />
<None Remove="ROMS\Hang-On 2 %28SG-1000%29.sg" />
<None Remove="ROMS\Heavyweight Champ %28UE%29 [!].sms" />
<None Remove="ROMS\Home Alone %28UE%29 [!].sms" />
<None Remove="ROMS\Impossible Mission %28UE%29 [!].sms" />
<None Remove="ROMS\Japanese SMS BIOS v2.1 %28J%29 [!].sms" />
<None Remove="ROMS\Jurassic Park %28UE%29 [!].sms" />
<None Remove="ROMS\Mickey Mouse - Castle of Illusion %28UE%29 [!].sms" />
<None Remove="ROMS\Mickey Mouse - Land of Illusion %28UE%29 [!].sms" />
<None Remove="ROMS\Mickey Mouse - Legend of Illusion %28UE%29 [!].sms" />
<None Remove="ROMS\Mortal Kombat %28UE%29 [!].sms" />
<None Remove="ROMS\Mortal Kombat 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Mortal Kombat 3 %28UE%29 [!].sms" />
<None Remove="ROMS\OutRun %28UE%29 [!].sms" />
<None Remove="ROMS\Paperboy %28UE%29 [!].sms" />
<None Remove="ROMS\Parlour Games %28UE%29 [!].sms" />
<None Remove="ROMS\Phantasy Star %28UE%29 [!].sms" />
<None Remove="ROMS\Populous %28UE%29 [!].sms" />
<None Remove="ROMS\Psychic World %28UE%29 [!].sms" />
<None Remove="ROMS\Psycho Fox %28UE%29 [!].sms" />
<None Remove="ROMS\R-Type.sms" />
<None Remove="ROMS\Road Rash %28UE%29 [!].sms" />
<None Remove="ROMS\Shadow of the Beast %28UE%29 [!].sms" />
<None Remove="ROMS\Smash TV %28UE%29 [!].sms" />
<None Remove="ROMS\SMSTestSuite.sms" />
<None Remove="ROMS\Sonic 2.sms" />
<None Remove="ROMS\Sonic Chaos %28UE%29 [!].sms" />
<None Remove="ROMS\Sonic.sms" />
<None Remove="ROMS\Space Harrier %28UE%29 [!].sms" />
<None Remove="ROMS\Speedball %28UE%29 %28Virgin%29 [!].sms" />
<None Remove="ROMS\Star Wars %28UE%29 [!].sms" />
<None Remove="ROMS\Street Fighter 2 %28Brazil%29 [!].sms" />
<None Remove="ROMS\Streets of Rage %28UE%29 [!].sms" />
<None Remove="ROMS\Streets of Rage 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Summer Games %28UE%29 [!].sms" />
<None Remove="ROMS\Super Kick Off %28UE%29 [!].sms" />
<None Remove="ROMS\Super Monaco GP %28UE%29 [!].sms" />
<None Remove="ROMS\Super Monaco GP 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Super Tennis %28UE%29 [!].sms" />
<None Remove="ROMS\Terminator 2 - Judgment Day %28UE%29 [!].sms" />
<None Remove="ROMS\Terminator, The %28UE%29 [!].sms" />
<None Remove="ROMS\Trans-Bot %28UE%29.sms" />
<None Remove="ROMS\Winter Olympics %2794 %28UE%29 [!].sms" />
<None Remove="ROMS\Wonder Boy %28UE%29 [!].sms" />
<None Remove="ROMS\Wonder Boy 2 - Wonderboy in Monsterland %28UE%29 [!].sms" />
<None Remove="ROMS\Wonder Boy 3 - The Dragon%27s Trap %28UE%29 [!].sms" />
<None Remove="ROMS\zexall.sms" />
<None Remove="ROMS\zexdoc.sav" />
<None Remove="ROMS\zexdoc.sms" />
</ItemGroup>
<!-- This specific line is what maps Label, Button, TextBox, and STAThread -->
<UseWindowsForms>true</UseWindowsForms>
<ItemGroup>
<EmbeddedResource Include="ROMS\After Burner (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Alex Kidd in High Tech World (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Alex Kidd in Miracle World (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Back to the Future 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Back to the Future 3 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Bart vs. the Space Mutants (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Bart vs. the World (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Black Belt (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\California Games (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\California Games 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Casino Games (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Choplifter (SG-1000) [!].sg">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Cloud Master (JUE).sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Cool Spot (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Desert Strike (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Double Dragon (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Dynamite Dux (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Ecco the Dolphin (UE).sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Fantasy Zone (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Fantasy Zone 2 - The Tears of Opa-Opa (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Fantasy Zone 3 - The Maze (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Gangster Town (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Gauntlet (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Ghost House (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Ghouls 'n Ghosts (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Global Defense (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Golden Axe (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Golden Axe Warrior.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Baseball (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Basketball (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Football (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Golf (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Ice Hockey (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Volleyball (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Hang-On (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Hang-On 2 (SG-1000).sg">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Heavyweight Champ (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Home Alone (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Impossible Mission (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Japanese SMS BIOS v2.1 (J) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Jurassic Park (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mickey Mouse - Castle of Illusion (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mickey Mouse - Land of Illusion (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mickey Mouse - Legend of Illusion (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mortal Kombat (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mortal Kombat 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mortal Kombat 3 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\OutRun (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Paperboy (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Parlour Games (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Phantasy Star (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Populous (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Psychic World (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Psycho Fox (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\R-Type.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Road Rash (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Shadow of the Beast (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Smash TV (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\SMSTestSuite.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Sonic 2.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Sonic Chaos (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Sonic.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Space Harrier (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Speedball (UE) (Virgin) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Star Wars (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Street Fighter 2 (Brazil) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Streets of Rage (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Streets of Rage 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Summer Games (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Super Kick Off (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Super Monaco GP (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Super Monaco GP 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Super Tennis (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Terminator 2 - Judgment Day (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Terminator, The (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Trans-Bot (UE).sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Winter Olympics '94 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Wonder Boy (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Wonder Boy 2 - Wonderboy in Monsterland (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Wonder Boy 3 - The Dragon's Trap (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\zexall.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\zexdoc.sav" />
<EmbeddedResource Include="ROMS\zexdoc.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
<!-- Single File Settings -->
<PublishSingleFile>true</PublishSingleFile>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NAudio" Version="2.3.0" />
<PackageReference Include="Vortice.XInput" Version="3.8.3" />
</ItemGroup>
<ItemGroup>
<None Remove="ROMS\After Burner %28UE%29 [!].sms" />
<None Remove="ROMS\Alex Kidd in High Tech World %28UE%29 [!].sms" />
<None Remove="ROMS\Alex Kidd in Miracle World %28UE%29 [!].sms" />
<None Remove="ROMS\Back to the Future 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Back to the Future 3 %28UE%29 [!].sms" />
<None Remove="ROMS\Bart vs. the Space Mutants %28UE%29 [!].sms" />
<None Remove="ROMS\Bart vs. the World %28UE%29 [!].sms" />
<None Remove="ROMS\Black Belt %28UE%29 [!].sms" />
<None Remove="ROMS\California Games %28UE%29 [!].sms" />
<None Remove="ROMS\California Games 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Casino Games %28UE%29 [!].sms" />
<None Remove="ROMS\Choplifter %28SG-1000%29 [!].sg" />
<None Remove="ROMS\Cloud Master %28JUE%29.sms" />
<None Remove="ROMS\Cool Spot %28UE%29 [!].sms" />
<None Remove="ROMS\Desert Strike %28UE%29 [!].sms" />
<None Remove="ROMS\Double Dragon %28UE%29 [!].sms" />
<None Remove="ROMS\Dynamite Dux %28UE%29 [!].sms" />
<None Remove="ROMS\Ecco the Dolphin %28UE%29.sms" />
<None Remove="ROMS\Fantasy Zone %28UE%29 [!].sms" />
<None Remove="ROMS\Fantasy Zone 2 - The Tears of Opa-Opa %28UE%29 [!].sms" />
<None Remove="ROMS\Fantasy Zone 3 - The Maze %28UE%29 [!].sms" />
<None Remove="ROMS\Gangster Town %28UE%29 [!].sms" />
<None Remove="ROMS\Gauntlet %28UE%29 [!].sms" />
<None Remove="ROMS\Ghost House %28UE%29 [!].sms" />
<None Remove="ROMS\Ghouls %27n Ghosts %28UE%29 [!].sms" />
<None Remove="ROMS\Global Defense %28UE%29 [!].sms" />
<None Remove="ROMS\Golden Axe %28UE%29 [!].sms" />
<None Remove="ROMS\Golden Axe Warrior.sms" />
<None Remove="ROMS\Great Baseball %28UE%29 [!].sms" />
<None Remove="ROMS\Great Basketball %28UE%29 [!].sms" />
<None Remove="ROMS\Great Football %28UE%29 [!].sms" />
<None Remove="ROMS\Great Golf %28UE%29 [!].sms" />
<None Remove="ROMS\Great Ice Hockey %28UE%29 [!].sms" />
<None Remove="ROMS\Great Volleyball %28UE%29 [!].sms" />
<None Remove="ROMS\Hang-On %28UE%29 [!].sms" />
<None Remove="ROMS\Hang-On 2 %28SG-1000%29.sg" />
<None Remove="ROMS\Heavyweight Champ %28UE%29 [!].sms" />
<None Remove="ROMS\Home Alone %28UE%29 [!].sms" />
<None Remove="ROMS\Impossible Mission %28UE%29 [!].sms" />
<None Remove="ROMS\Japanese SMS BIOS v2.1 %28J%29 [!].sms" />
<None Remove="ROMS\Jurassic Park %28UE%29 [!].sms" />
<None Remove="ROMS\Mickey Mouse - Castle of Illusion %28UE%29 [!].sms" />
<None Remove="ROMS\Mickey Mouse - Land of Illusion %28UE%29 [!].sms" />
<None Remove="ROMS\Mickey Mouse - Legend of Illusion %28UE%29 [!].sms" />
<None Remove="ROMS\Mortal Kombat %28UE%29 [!].sms" />
<None Remove="ROMS\Mortal Kombat 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Mortal Kombat 3 %28UE%29 [!].sms" />
<None Remove="ROMS\OutRun %28UE%29 [!].sms" />
<None Remove="ROMS\Paperboy %28UE%29 [!].sms" />
<None Remove="ROMS\Parlour Games %28UE%29 [!].sms" />
<None Remove="ROMS\Phantasy Star %28UE%29 [!].sms" />
<None Remove="ROMS\Populous %28UE%29 [!].sms" />
<None Remove="ROMS\Psychic World %28UE%29 [!].sms" />
<None Remove="ROMS\Psycho Fox %28UE%29 [!].sms" />
<None Remove="ROMS\R-Type.sms" />
<None Remove="ROMS\Road Rash %28UE%29 [!].sms" />
<None Remove="ROMS\Shadow of the Beast %28UE%29 [!].sms" />
<None Remove="ROMS\Smash TV %28UE%29 [!].sms" />
<None Remove="ROMS\SMSTestSuite.sms" />
<None Remove="ROMS\Sonic 2.sms" />
<None Remove="ROMS\Sonic Chaos %28UE%29 [!].sms" />
<None Remove="ROMS\Sonic.sms" />
<None Remove="ROMS\Space Harrier %28UE%29 [!].sms" />
<None Remove="ROMS\Speedball %28UE%29 %28Virgin%29 [!].sms" />
<None Remove="ROMS\Star Wars %28UE%29 [!].sms" />
<None Remove="ROMS\Street Fighter 2 %28Brazil%29 [!].sms" />
<None Remove="ROMS\Streets of Rage %28UE%29 [!].sms" />
<None Remove="ROMS\Streets of Rage 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Summer Games %28UE%29 [!].sms" />
<None Remove="ROMS\Super Kick Off %28UE%29 [!].sms" />
<None Remove="ROMS\Super Monaco GP %28UE%29 [!].sms" />
<None Remove="ROMS\Super Monaco GP 2 %28UE%29 [!].sms" />
<None Remove="ROMS\Super Tennis %28UE%29 [!].sms" />
<None Remove="ROMS\Terminator 2 - Judgment Day %28UE%29 [!].sms" />
<None Remove="ROMS\Terminator, The %28UE%29 [!].sms" />
<None Remove="ROMS\Trans-Bot %28UE%29.sms" />
<None Remove="ROMS\Winter Olympics %2794 %28UE%29 [!].sms" />
<None Remove="ROMS\Wonder Boy %28UE%29 [!].sms" />
<None Remove="ROMS\Wonder Boy 2 - Wonderboy in Monsterland %28UE%29 [!].sms" />
<None Remove="ROMS\Wonder Boy 3 - The Dragon%27s Trap %28UE%29 [!].sms" />
<None Remove="ROMS\zexall.sms" />
<None Remove="ROMS\zexdoc.sav" />
<None Remove="ROMS\zexdoc.sms" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Core\Core.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="ROMS\After Burner (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Alex Kidd in High Tech World (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Alex Kidd in Miracle World (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Back to the Future 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Back to the Future 3 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Bart vs. the Space Mutants (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Bart vs. the World (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Black Belt (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\California Games (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\California Games 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Casino Games (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Choplifter (SG-1000) [!].sg">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Cloud Master (JUE).sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Cool Spot (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Desert Strike (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Double Dragon (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Dynamite Dux (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Ecco the Dolphin (UE).sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Fantasy Zone (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Fantasy Zone 2 - The Tears of Opa-Opa (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Fantasy Zone 3 - The Maze (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Gangster Town (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Gauntlet (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Ghost House (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Ghouls 'n Ghosts (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Global Defense (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Golden Axe (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Golden Axe Warrior.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Baseball (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Basketball (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Football (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Golf (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Ice Hockey (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Great Volleyball (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Hang-On (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Hang-On 2 (SG-1000).sg">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Heavyweight Champ (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Home Alone (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Impossible Mission (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Japanese SMS BIOS v2.1 (J) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Jurassic Park (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mickey Mouse - Castle of Illusion (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mickey Mouse - Land of Illusion (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mickey Mouse - Legend of Illusion (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mortal Kombat (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mortal Kombat 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Mortal Kombat 3 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\OutRun (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Paperboy (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Parlour Games (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Phantasy Star (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Populous (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Psychic World (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Psycho Fox (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\R-Type.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Road Rash (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Shadow of the Beast (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Smash TV (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\SMSTestSuite.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Sonic 2.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Sonic Chaos (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Sonic.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Space Harrier (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Speedball (UE) (Virgin) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Star Wars (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Street Fighter 2 (Brazil) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Streets of Rage (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Streets of Rage 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Summer Games (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Super Kick Off (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Super Monaco GP (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Super Monaco GP 2 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Super Tennis (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Terminator 2 - Judgment Day (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Terminator, The (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Trans-Bot (UE).sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Winter Olympics '94 (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Wonder Boy (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Wonder Boy 2 - Wonderboy in Monsterland (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\Wonder Boy 3 - The Dragon's Trap (UE) [!].sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\zexall.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="ROMS\zexdoc.sav" />
<EmbeddedResource Include="ROMS\zexdoc.sms">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<PackageReference Include="NAudio" Version="2.3.0" />
<PackageReference Include="Vortice.XInput" Version="3.8.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Core\Core.csproj" />
</ItemGroup>
</Project>

View File

@@ -18,7 +18,8 @@ namespace Desktop
private Bitmap _screenBitmap = new Bitmap(256, 192, PixelFormat.Format32bppArgb);
private NAudioPlayer _audioPlayer;
private Task _emulatorTask;
private double TargetFrameTime = 16.667f;
private double TargetFrameTime = 16.667f; //NTSC
//private double TargetFrameTime = 20; //PAL
public int TotalFrameCount = 0;
public double FrameTime { get; private set; } = 0;
public double FramesPerSecond { get; private set; } = 0;
@@ -152,7 +153,6 @@ namespace Desktop
}
}
// --- METRICS MATH ---
double currentTime = _stopwatch.Elapsed.TotalMilliseconds;
TotalFrameCount++;
framesThisSecond++;
@@ -165,7 +165,7 @@ namespace Desktop
BeginInvoke((System.Windows.Forms.MethodInvoker)delegate
{
this.Text = $"Parsons Master System - {_currentRomName} [FPS/FT: {FramesPerSecond:F0}/{FrameTime:F1}]";
this.Text = $"Parsons Master System 2026 - {_currentRomName} [FPS/FT: {FramesPerSecond:F0}/{FrameTime:F1}]";
});
}