diff --git a/BizHawk.Emulation/Consoles/Atari/2600/TIA.cs b/BizHawk.Emulation/Consoles/Atari/2600/TIA.cs index c53ec762bc..4941e3af07 100644 --- a/BizHawk.Emulation/Consoles/Atari/2600/TIA.cs +++ b/BizHawk.Emulation/Consoles/Atari/2600/TIA.cs @@ -430,8 +430,11 @@ namespace BizHawk.Emulation.Consoles.Atari public struct audio { + /// noise/division control public byte AUDC; + /// frequency divider public byte AUDF; + /// volume public byte AUDV; public byte sr4; @@ -463,8 +466,8 @@ namespace BizHawk.Emulation.Consoles.Atari public void GetSamples(short[] samples) { - short[] moreSamples = new short[1000]; - for (int i = 0; i < 1000; i++) + short[] moreSamples = new short[523]; + for (int i = 0; i < moreSamples.Length; i++) { for (int snd = 0; snd < 2; snd++) { @@ -513,7 +516,7 @@ namespace BizHawk.Emulation.Consoles.Atari } } - moreSamples[i] = (short)(((AUD[0].sr4 & 0x08) != 0) ? 32767 : 0); + moreSamples[i] += (short)(((AUD[snd].sr4 & 0x08) != 0) ? AUD[snd].AUDV * 1092 : 0); } /*if (++freqDiv == (audioFreqDiv * 2)) { @@ -525,21 +528,11 @@ namespace BizHawk.Emulation.Consoles.Atari */ } - for (int i = 0; i < samples.Length/2; i++) + for (int i = 0; i < samples.Length / 2; i++) { - //samples[i] = 0; - //if (audioEnabled) - //{ - samples[i*2] = moreSamples[(int)(((double)moreSamples.Length / (double)(samples.Length/2)) * i)]; - //samples[i * 2 + 1] = moreSamples[(int)((moreSamples.Length / (samples.Length / 2)) * i)]; - //samples[i] = (short)(Math.Sin(((((32000.0 / (tia.audioFreqDiv+1)) / 60.0) * Math.PI) / samples.Length) * i) * MaxVolume + MaxVolume); - //} - //else - //{ - // samples[i] = 0; - //} + samples[i * 2] = moreSamples[(int)(((double)moreSamples.Length / (double)(samples.Length / 2)) * i)]; + samples[i * 2 + 1] = samples[i * 2]; } - //samples = tia.samples; } public void DiscardSamples() { } public int MaxVolume { get; set; } @@ -1056,11 +1049,27 @@ namespace BizHawk.Emulation.Consoles.Atari } else if (maskedAddr == 0x15) // AUDC0 { - AUD[0].AUDC = value; + AUD[0].AUDC = (byte)(value & 15); + } + else if (maskedAddr == 0x16) // AUDC1 + { + AUD[1].AUDC = (byte)(value & 15); } else if (maskedAddr == 0x17) // AUDF0 { - AUD[0].AUDF = (byte)(value + 1); + AUD[0].AUDF = (byte)((value & 31) + 1); + } + else if (maskedAddr == 0x18) // AUDF1 + { + AUD[1].AUDF = (byte)((value & 31) + 1); + } + else if (maskedAddr == 0x19) // AUDV0 + { + AUD[0].AUDV = (byte)(value & 15); + } + else if (maskedAddr == 0x1A) // AUDV1 + { + AUD[1].AUDV = (byte)(value & 15); } else if (maskedAddr == 0x1B) // GRP0 {