Coleco: Fix noise channel audio

This commit is contained in:
alyosha-tas 2018-03-09 19:32:49 -05:00
parent 444e8d7621
commit 38a07e8246
1 changed files with 15 additions and 7 deletions

View File

@ -3,6 +3,7 @@
using BizHawk.Common; using BizHawk.Common;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
using BizHawk.Common.NumberExtensions; using BizHawk.Common.NumberExtensions;
using System;
namespace BizHawk.Emulation.Cores.ColecoVision namespace BizHawk.Emulation.Cores.ColecoVision
{ {
@ -23,6 +24,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision
public bool vol_tone; public bool vol_tone;
public bool noise_type; public bool noise_type;
public int noise_rate; public int noise_rate;
public bool noise_bit;
private int _sampleClock; private int _sampleClock;
@ -76,6 +78,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision
ser.Sync("Clock_B", ref clock_B); ser.Sync("Clock_B", ref clock_B);
ser.Sync("Clock_C", ref clock_C); ser.Sync("Clock_C", ref clock_C);
ser.Sync("noise_clock", ref noise_clock); ser.Sync("noise_clock", ref noise_clock);
ser.Sync("noise_bit", ref noise_bit);
ser.Sync("psg_clock", ref psg_clock); ser.Sync("psg_clock", ref psg_clock);
ser.Sync("sample_clock", ref _sampleClock); ser.Sync("sample_clock", ref _sampleClock);
@ -85,6 +88,8 @@ namespace BizHawk.Emulation.Cores.ColecoVision
ser.Sync("C_up", ref C_up); ser.Sync("C_up", ref C_up);
ser.Sync("noise", ref noise); ser.Sync("noise", ref noise);
ser.Sync("current_sample", ref current_sample);
ser.EndSection(); ser.EndSection();
} }
@ -104,8 +109,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision
if (vol_tone) if (vol_tone)
{ {
Chan_vol[chan_sel] &= 0xF0; Chan_vol[chan_sel] = (byte)(value & 0xF);
Chan_vol[chan_sel] |= (byte)(value & 0xF);
} }
else else
{ {
@ -128,8 +132,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision
{ {
if (vol_tone) if (vol_tone)
{ {
Chan_vol[chan_sel] &= 0xF; Chan_vol[chan_sel] = (byte)(value & 0xF);
Chan_vol[chan_sel] |= (byte)((value & 0xF) << 4);
} }
else else
{ {
@ -165,15 +168,18 @@ namespace BizHawk.Emulation.Cores.ColecoVision
clock_A--; clock_A--;
clock_B--; clock_B--;
clock_C--; clock_C--;
noise_clock--;
// clock noise // clock noise
if (noise_clock == 0) if (noise_clock == 0)
{ {
noise_bit = noise.Bit(0);
if (noise_type) if (noise_type)
{ {
int bit = (noise & 1) ^ ((noise >> 1) & 1); int bit = (noise & 1) ^ ((noise >> 1) & 1);
noise = noise >> 1; noise = noise >> 1;
noise |= bit << 14; noise |= bit << 14;
} }
else else
{ {
@ -188,7 +194,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision
} }
else if (noise_rate == 1) else if (noise_rate == 1)
{ {
noise_clock = 0x120; noise_clock = 0x20;
} }
else if (noise_rate == 2) else if (noise_rate == 2)
{ {
@ -197,7 +203,9 @@ namespace BizHawk.Emulation.Cores.ColecoVision
else else
{ {
noise_clock = Chan_tone[2] + 1; 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)(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; current_sample = (short)v;
} }