From 38a07e824693d936ca1d735091da90c6a1d57011 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 9 Mar 2018 19:32:49 -0500 Subject: [PATCH] Coleco: Fix noise channel audio --- .../Consoles/Coleco/SN76489col.cs | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/SN76489col.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/SN76489col.cs index b9e2e26951..63f86a560d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/SN76489col.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/SN76489col.cs @@ -3,6 +3,7 @@ using BizHawk.Common; using BizHawk.Emulation.Common; using BizHawk.Common.NumberExtensions; +using System; namespace BizHawk.Emulation.Cores.ColecoVision { @@ -23,6 +24,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision public bool vol_tone; public bool noise_type; public int noise_rate; + public bool noise_bit; private int _sampleClock; @@ -76,6 +78,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision ser.Sync("Clock_B", ref clock_B); ser.Sync("Clock_C", ref clock_C); ser.Sync("noise_clock", ref noise_clock); + ser.Sync("noise_bit", ref noise_bit); ser.Sync("psg_clock", ref psg_clock); ser.Sync("sample_clock", ref _sampleClock); @@ -85,6 +88,8 @@ namespace BizHawk.Emulation.Cores.ColecoVision ser.Sync("C_up", ref C_up); ser.Sync("noise", ref noise); + ser.Sync("current_sample", ref current_sample); + ser.EndSection(); } @@ -104,8 +109,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision if (vol_tone) { - Chan_vol[chan_sel] &= 0xF0; - Chan_vol[chan_sel] |= (byte)(value & 0xF); + Chan_vol[chan_sel] = (byte)(value & 0xF); } else { @@ -128,8 +132,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision { if (vol_tone) { - Chan_vol[chan_sel] &= 0xF; - Chan_vol[chan_sel] |= (byte)((value & 0xF) << 4); + Chan_vol[chan_sel] = (byte)(value & 0xF); } else { @@ -165,15 +168,18 @@ namespace BizHawk.Emulation.Cores.ColecoVision clock_A--; clock_B--; clock_C--; + noise_clock--; // clock noise if (noise_clock == 0) { + noise_bit = noise.Bit(0); if (noise_type) { int bit = (noise & 1) ^ ((noise >> 1) & 1); noise = noise >> 1; noise |= bit << 14; + } else { @@ -188,7 +194,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision } else if (noise_rate == 1) { - noise_clock = 0x120; + noise_clock = 0x20; } else if (noise_rate == 2) { @@ -197,7 +203,9 @@ namespace BizHawk.Emulation.Cores.ColecoVision else { noise_clock = Chan_tone[2] + 1; - } + } + + noise_clock *= 2; } @@ -229,7 +237,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision v += (short)(C_up ? LogScale[Chan_vol[2]] * 42 : 0); - v += (short)(noise.Bit(0) ? LogScale[Chan_vol[3]] * 42 : 0); + v += (short)(noise_bit ? LogScale[Chan_vol[3]] * 42 : 0); current_sample = (short)v; }