Added the APU Class and wired it all up ready for the maths
This commit is contained in:
224
Core/Audio/SmsApu.cs
Normal file
224
Core/Audio/SmsApu.cs
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
using Core.Interfaces;
|
||||||
|
|
||||||
|
namespace Core.Audio
|
||||||
|
{
|
||||||
|
public class SmsApu
|
||||||
|
{
|
||||||
|
// Your existing variables
|
||||||
|
public ushort[] Registers { get; private set; } = new ushort[8];
|
||||||
|
private int _latchedRegister = 0;
|
||||||
|
|
||||||
|
// THE NEW CONNECTION: Where we send the audio!
|
||||||
|
public IAudioDevice AudioDevice { get; set; }
|
||||||
|
|
||||||
|
// --- TIMING VARIABLES ---
|
||||||
|
private const double ClockRate = 3579545.0; // NTSC Master System speed
|
||||||
|
private const int SampleRate = 44100; // CD-Quality Audio
|
||||||
|
private double _cyclesPerSample = ClockRate / SampleRate;
|
||||||
|
private double _sampleCycleTracker = 0;
|
||||||
|
private int _psgCycleTracker = 0;
|
||||||
|
|
||||||
|
// --- SYNTHESIZER STATE ---
|
||||||
|
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)
|
||||||
|
|
||||||
|
// The SN76489 Volume Table reduces amplitude by exactly 2 decibels per step.
|
||||||
|
private static readonly float[] VolumeTable = {
|
||||||
|
1.0f, 0.7943f, 0.6309f, 0.5011f, 0.3981f, 0.3162f, 0.2511f, 0.1995f,
|
||||||
|
0.1584f, 0.1258f, 0.1000f, 0.0794f, 0.0630f, 0.0501f, 0.0398f, 0.0f
|
||||||
|
};
|
||||||
|
|
||||||
|
public SmsApu()
|
||||||
|
{
|
||||||
|
Registers[1] = 0x0F;
|
||||||
|
Registers[3] = 0x0F;
|
||||||
|
Registers[5] = 0x0F;
|
||||||
|
Registers[7] = 0x0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
// [KEEP YOUR EXISTING WritePort7F METHOD HERE]
|
||||||
|
|
||||||
|
public void Update(int tStates)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tStates; i++)
|
||||||
|
{
|
||||||
|
// 1. The hardware chip only updates its wave counters every 16 CPU cycles
|
||||||
|
_psgCycleTracker++;
|
||||||
|
if (_psgCycleTracker >= 16)
|
||||||
|
{
|
||||||
|
_psgCycleTracker = 0;
|
||||||
|
TickChannels();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. We only want to generate 44,100 samples per second, not 3.58 million!
|
||||||
|
_sampleCycleTracker++;
|
||||||
|
if (_sampleCycleTracker >= _cyclesPerSample)
|
||||||
|
{
|
||||||
|
_sampleCycleTracker -= _cyclesPerSample;
|
||||||
|
MixAndOutputSample();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TickChannels()
|
||||||
|
{
|
||||||
|
// --- TONE CHANNELS (0, 1, and 2) ---
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
_counters[i]--;
|
||||||
|
if (_counters[i] <= 0)
|
||||||
|
{
|
||||||
|
// Reload the counter from the Tone Register.
|
||||||
|
// HARDWARE QUIRK: A tone register of 0 acts as 1024!
|
||||||
|
int tone = Registers[i * 2];
|
||||||
|
_counters[i] = (tone == 0) ? 1024 : tone;
|
||||||
|
|
||||||
|
// Flip the wave polarity! (This creates the vibration of the sound)
|
||||||
|
_polarities[i] *= -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- NOISE CHANNEL (3) ---
|
||||||
|
_counters[3]--;
|
||||||
|
if (_counters[3] <= 0)
|
||||||
|
{
|
||||||
|
// Noise rate depends on Bits 0-1 of Register 6
|
||||||
|
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!
|
||||||
|
|
||||||
|
// Shift the Noise LFSR
|
||||||
|
int tappedBit = _lfsr & 1;
|
||||||
|
_lfsr >>= 1;
|
||||||
|
|
||||||
|
if (tappedBit == 1)
|
||||||
|
{
|
||||||
|
bool isWhiteNoise = (Registers[6] & 0x04) != 0;
|
||||||
|
// The Sega Master System physically tapped bits 0 and 3 for its white noise
|
||||||
|
if (isWhiteNoise) _lfsr ^= 0x0009;
|
||||||
|
|
||||||
|
_lfsr |= 0x8000; // Inject the high bit
|
||||||
|
}
|
||||||
|
|
||||||
|
_polarities[3] = (tappedBit == 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;
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
{
|
||||||
|
sample += _polarities[i] * VolumeTable[Registers[(i * 2) + 1]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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!)
|
||||||
|
sample /= 4.0f;
|
||||||
|
|
||||||
|
AudioDevice.AddSample(sample);
|
||||||
|
}
|
||||||
|
public void WritePort7F(byte value)
|
||||||
|
{
|
||||||
|
if ((value & 0x80) != 0)
|
||||||
|
{
|
||||||
|
// --- LATCH BYTE --- (Bit 7 is 1)
|
||||||
|
// Bits 4-6 contain the Register Index (0 to 7)
|
||||||
|
_latchedRegister = (value >> 4) & 0x07;
|
||||||
|
|
||||||
|
// Bits 0-3 contain the lower 4 bits of data
|
||||||
|
int data = value & 0x0F;
|
||||||
|
|
||||||
|
if (_latchedRegister % 2 != 0 || _latchedRegister == 6)
|
||||||
|
{
|
||||||
|
// Volume registers (1, 3, 5, 7) and Noise Control (6) only hold 4 bits total.
|
||||||
|
// We completely overwrite them.
|
||||||
|
Registers[_latchedRegister] = (ushort)data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Tone registers (0, 2, 4) hold 10 bits.
|
||||||
|
// A Latch byte ONLY overwrites the bottom 4 bits and leaves the top 6 alone!
|
||||||
|
Registers[_latchedRegister] = (ushort)((Registers[_latchedRegister] & 0x03F0) | data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// --- DATA BYTE --- (Bit 7 is 0)
|
||||||
|
// Bits 0-5 contain the upper 6 bits of data for the currently latched Tone register
|
||||||
|
int data = value & 0x3F;
|
||||||
|
|
||||||
|
if (_latchedRegister % 2 == 0 && _latchedRegister != 6)
|
||||||
|
{
|
||||||
|
// Update the top 6 bits of the 10-bit Tone register
|
||||||
|
Registers[_latchedRegister] = (ushort)((Registers[_latchedRegister] & 0x000F) | (data << 4));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If a Data Byte is sent to a Volume or Noise register, it just overwrites the lower 4 bits again
|
||||||
|
Registers[_latchedRegister] = (ushort)(data & 0x0F);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//using System;
|
||||||
|
|
||||||
|
//namespace Core.Audio
|
||||||
|
//{
|
||||||
|
// public class SmsApu
|
||||||
|
// {
|
||||||
|
// // The 8 internal registers of the PSG
|
||||||
|
// // 0: Tone 0 Frequency (10 bits)
|
||||||
|
// // 1: Tone 0 Volume (4 bits)
|
||||||
|
// // 2: Tone 1 Frequency (10 bits)
|
||||||
|
// // 3: Tone 1 Volume (4 bits)
|
||||||
|
// // 4: Tone 2 Frequency (10 bits)
|
||||||
|
// // 5: Tone 2 Volume (4 bits)
|
||||||
|
// // 6: Noise Control (3 bits)
|
||||||
|
// // 7: Noise Volume (4 bits)
|
||||||
|
// public ushort[] Registers { get; private set; } = new ushort[8];
|
||||||
|
|
||||||
|
// // Remembers which register the CPU is currently talking to
|
||||||
|
// private int _latchedRegister = 0;
|
||||||
|
|
||||||
|
// public SmsApu()
|
||||||
|
// {
|
||||||
|
// // Volumes default to 0x0F (Silence! 0 = max volume, 15 = off)
|
||||||
|
// Registers[1] = 0x0F;
|
||||||
|
// Registers[3] = 0x0F;
|
||||||
|
// Registers[5] = 0x0F;
|
||||||
|
// Registers[7] = 0x0F;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// }
|
||||||
|
//}
|
||||||
@@ -6,12 +6,6 @@
|
|||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Remove="Audio\**" />
|
|
||||||
<EmbeddedResource Remove="Audio\**" />
|
|
||||||
<None Remove="Audio\**" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Cpu\" />
|
<Folder Include="Cpu\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
public interface IAudioDevice
|
public interface IAudioDevice
|
||||||
{
|
{
|
||||||
// Now accepts the Beeper state + 3 AY frequencies + 3 AY volumes
|
// Accepts a single, fully-mixed audio sample (usually between -1.0f and 1.0f)
|
||||||
void AddSample(bool isHigh, float freqA, float volA, float freqB, float volB, float freqC, float volC);
|
void AddSample(float sample);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Core.Interfaces;
|
using Core.Audio;
|
||||||
|
using Core.Interfaces;
|
||||||
using Core.Video;
|
using Core.Video;
|
||||||
|
|
||||||
namespace Core.Io
|
namespace Core.Io
|
||||||
@@ -6,7 +7,7 @@ namespace Core.Io
|
|||||||
public class SmsIoBus : IIoBus
|
public class SmsIoBus : IIoBus
|
||||||
{
|
{
|
||||||
public SmsVdp VideoProcessor { get; set; }
|
public SmsVdp VideoProcessor { get; set; }
|
||||||
// public Psg AudioProcessor { get; set; }
|
public SmsApu AudioProcessor { get; set; }
|
||||||
|
|
||||||
// Joypad State (0xFF means no buttons pressed - the SMS uses Active-Low logic!)
|
// Joypad State (0xFF means no buttons pressed - the SMS uses Active-Low logic!)
|
||||||
public byte Joypad1Keyboard = 0xFF;
|
public byte Joypad1Keyboard = 0xFF;
|
||||||
@@ -42,15 +43,19 @@ namespace Core.Io
|
|||||||
{
|
{
|
||||||
byte lowerPort = (byte)(port & 0xFF);
|
byte lowerPort = (byte)(port & 0xFF);
|
||||||
|
|
||||||
if (lowerPort >= 0x40 && lowerPort <= 0x7F)
|
// Audio Ports
|
||||||
|
if (lowerPort == 0x7E || lowerPort == 0x7F)
|
||||||
{
|
{
|
||||||
// PSG Audio Write (Usually written exactly to 0x7F)
|
AudioProcessor.WritePort7F(value);
|
||||||
// AudioProcessor.WriteData(value);
|
|
||||||
}
|
}
|
||||||
else if (lowerPort >= 0x80 && lowerPort <= 0xBF)
|
// Video Ports
|
||||||
|
else if (lowerPort == 0xBE)
|
||||||
{
|
{
|
||||||
if ((lowerPort & 0x01) == 0) VideoProcessor.WriteDataPort(value);
|
VideoProcessor.WriteDataPort(value);
|
||||||
else VideoProcessor.WriteControlPort(value);
|
}
|
||||||
|
else if (lowerPort == 0xBF)
|
||||||
|
{
|
||||||
|
VideoProcessor.WriteControlPort(value);
|
||||||
}
|
}
|
||||||
else if (lowerPort <= 0x3F)
|
else if (lowerPort <= 0x3F)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
using Core.Cpu;
|
using Core.Cpu;
|
||||||
using Core.Io;
|
using Core.Io;
|
||||||
using Core.Memory;
|
using Core.Memory;
|
||||||
|
using Core.Video;
|
||||||
|
using Core.Audio;
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -12,7 +14,8 @@ namespace Core
|
|||||||
public Z80 Cpu { get; private set; }
|
public Z80 Cpu { get; private set; }
|
||||||
public SmsMemoryBus MemoryBus { get; private set; }
|
public SmsMemoryBus MemoryBus { get; private set; }
|
||||||
public SmsIoBus IoBus { get; private set; }
|
public SmsIoBus IoBus { get; private set; }
|
||||||
public Core.Video.SmsVdp VideoProcessor { get; private set; }
|
public SmsVdp VideoProcessor { get; private set; }
|
||||||
|
public SmsApu AudioProcessor { get; private set; }
|
||||||
public ushort? Breakpoint { get; set; } = null;
|
public ushort? Breakpoint { get; set; } = null;
|
||||||
|
|
||||||
// NTSC SMS T-States per frame
|
// NTSC SMS T-States per frame
|
||||||
@@ -21,8 +24,9 @@ namespace Core
|
|||||||
public SmsMachine()
|
public SmsMachine()
|
||||||
{
|
{
|
||||||
MemoryBus = new SmsMemoryBus();
|
MemoryBus = new SmsMemoryBus();
|
||||||
VideoProcessor = new Core.Video.SmsVdp();
|
VideoProcessor = new SmsVdp();
|
||||||
IoBus = new SmsIoBus { VideoProcessor = this.VideoProcessor };
|
AudioProcessor = new SmsApu();
|
||||||
|
IoBus = new SmsIoBus { VideoProcessor = this.VideoProcessor, AudioProcessor = this.AudioProcessor };
|
||||||
Cpu = new Z80(MemoryBus, IoBus);
|
Cpu = new Z80(MemoryBus, IoBus);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,13 +54,15 @@ namespace Core
|
|||||||
|
|
||||||
// 2. Tell the VDP to catch up
|
// 2. Tell the VDP to catch up
|
||||||
VideoProcessor.Update(cycles);
|
VideoProcessor.Update(cycles);
|
||||||
|
AudioProcessor.Update(cycles);
|
||||||
|
|
||||||
// 3. Check if the VDP is begging for attention!
|
// 3. Check if the VDP is begging for attention!
|
||||||
if (VideoProcessor.InterruptPending && Cpu.IFF1)
|
if (VideoProcessor.InterruptPending && Cpu.IFF1)
|
||||||
{
|
{
|
||||||
int intCycles = Cpu.RequestInterrupt();
|
int intCycles = Cpu.RequestInterrupt();
|
||||||
tStatesThisFrame += intCycles;
|
tStatesThisFrame += intCycles;
|
||||||
VideoProcessor.Update(intCycles); // Keep VDP perfectly in sync
|
VideoProcessor.Update(intCycles);
|
||||||
|
AudioProcessor.Update(intCycles);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. THE RESTORED BREAKPOINT TRAP
|
// 4. THE RESTORED BREAKPOINT TRAP
|
||||||
|
|||||||
@@ -9,31 +9,331 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<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\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\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\SMSTestSuite.sms" />
|
||||||
<None Remove="ROMS\Sonic 2.sms" />
|
<None Remove="ROMS\Sonic 2.sms" />
|
||||||
|
<None Remove="ROMS\Sonic Chaos %28UE%29 [!].sms" />
|
||||||
<None Remove="ROMS\Sonic.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\zexall.sms" />
|
||||||
<None Remove="ROMS\zexdoc.sms" />
|
<None Remove="ROMS\zexdoc.sms" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="ROMS\After Burner (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Alex Kidd in High Tech World (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Alex Kidd in Miracle World (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Back to the Future 2 (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Back to the Future 3 (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Bart vs. the Space Mutants (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Bart vs. the World (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Black Belt (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\California Games (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\California Games 2 (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Casino Games (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Choplifter (SG-1000) [!].sg">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Cloud Master (JUE).sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Cool Spot (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Desert Strike (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Double Dragon (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Dynamite Dux (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Ecco the Dolphin (UE).sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Fantasy Zone (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Fantasy Zone 2 - The Tears of Opa-Opa (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Fantasy Zone 3 - The Maze (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Gangster Town (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Gauntlet (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Ghost House (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Ghouls 'n Ghosts (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Global Defense (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Golden Axe (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="ROMS\Golden Axe Warrior.sms">
|
<EmbeddedResource Include="ROMS\Golden Axe Warrior.sms">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Great Baseball (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Great Basketball (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Great Football (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Great Golf (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Great Ice Hockey (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Great Volleyball (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Hang-On (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Hang-On 2 (SG-1000).sg">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Heavyweight Champ (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Home Alone (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Impossible Mission (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Japanese SMS BIOS v2.1 (J) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Jurassic Park (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Mickey Mouse - Castle of Illusion (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Mickey Mouse - Land of Illusion (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Mickey Mouse - Legend of Illusion (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Mortal Kombat (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Mortal Kombat 2 (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Mortal Kombat 3 (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\OutRun (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Paperboy (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Parlour Games (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Phantasy Star (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Populous (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Psychic World (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Psycho Fox (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="ROMS\R-Type.sms">
|
<EmbeddedResource Include="ROMS\R-Type.sms">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Road Rash (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Shadow of the Beast (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Smash TV (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="ROMS\SMSTestSuite.sms">
|
<EmbeddedResource Include="ROMS\SMSTestSuite.sms">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="ROMS\Sonic 2.sms">
|
<EmbeddedResource Include="ROMS\Sonic 2.sms">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Sonic Chaos (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="ROMS\Sonic.sms">
|
<EmbeddedResource Include="ROMS\Sonic.sms">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Space Harrier (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Speedball (UE) (Virgin) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Star Wars (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Street Fighter 2 (Brazil) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Streets of Rage (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Streets of Rage 2 (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Summer Games (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Super Kick Off (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Super Monaco GP (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Super Monaco GP 2 (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Super Tennis (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Terminator 2 - Judgment Day (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Terminator, The (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Trans-Bot (UE).sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Winter Olympics '94 (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Wonder Boy (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Wonder Boy 2 - Wonderboy in Monsterland (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="ROMS\Wonder Boy 3 - The Dragon's Trap (UE) [!].sms">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="ROMS\zexall.sms">
|
<EmbeddedResource Include="ROMS\zexall.sms">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
|||||||
Reference in New Issue
Block a user