GBHawk: fix audio
This commit is contained in:
parent
09f75c281c
commit
db91189668
|
@ -117,8 +117,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
|
|
||||||
public int latched_sample_L, latched_sample_R;
|
public int latched_sample_L, latched_sample_R;
|
||||||
|
|
||||||
public int SQ1_bias_gain, SQ2_bias_gain, WAVE_bias_gain, NOISE_bias_gain;
|
|
||||||
|
|
||||||
public byte ReadReg(int addr)
|
public byte ReadReg(int addr)
|
||||||
{
|
{
|
||||||
byte ret = 0;
|
byte ret = 0;
|
||||||
|
@ -351,7 +349,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
Audio_Regs[NR30] = value;
|
Audio_Regs[NR30] = value;
|
||||||
WAVE_DAC_pow = (value & 0x80) > 0;
|
WAVE_DAC_pow = (value & 0x80) > 0;
|
||||||
if (!WAVE_DAC_pow) { WAVE_enable = false; }
|
if (!WAVE_DAC_pow) { WAVE_enable = false; }
|
||||||
//calculate_bias_gain_w();
|
calculate_bias_gain_w();
|
||||||
break;
|
break;
|
||||||
case 0xFF1B: // NR31 (length)
|
case 0xFF1B: // NR31 (length)
|
||||||
Audio_Regs[NR31] = value;
|
Audio_Regs[NR31] = value;
|
||||||
|
@ -375,6 +373,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
|
|
||||||
if ((sequencer_len & 1) == 0)
|
if ((sequencer_len & 1) == 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!WAVE_len_en && ((value & 0x40) > 0) && (WAVE_len_cntr > 0))
|
if (!WAVE_len_en && ((value & 0x40) > 0) && (WAVE_len_cntr > 0))
|
||||||
{
|
{
|
||||||
WAVE_len_cntr--;
|
WAVE_len_cntr--;
|
||||||
|
@ -410,11 +409,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
if (((value & 0x40) > 0) && ((sequencer_len & 1) == 0)) { WAVE_len_cntr--; }
|
if (((value & 0x40) > 0) && ((sequencer_len & 1) == 0)) { WAVE_len_cntr--; }
|
||||||
}
|
}
|
||||||
WAVE_intl_cntr = (2048 - WAVE_frq) * 2 + 6; // trigger delay for wave channel
|
WAVE_intl_cntr = (2048 - WAVE_frq) * 2 + 6; // trigger delay for wave channel
|
||||||
|
|
||||||
WAVE_wave_cntr = 0;
|
WAVE_wave_cntr = 0;
|
||||||
if (!WAVE_DAC_pow) { WAVE_enable = false; }
|
if (!WAVE_DAC_pow) { WAVE_enable = false; }
|
||||||
}
|
}
|
||||||
|
|
||||||
//calculate_bias_gain_w();
|
calculate_bias_gain_w();
|
||||||
WAVE_len_en = (value & 0x40) > 0;
|
WAVE_len_en = (value & 0x40) > 0;
|
||||||
break;
|
break;
|
||||||
case 0xFF20: // NR41 (length)
|
case 0xFF20: // NR41 (length)
|
||||||
|
@ -612,7 +612,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
SQ1_duty_cntr++;
|
SQ1_duty_cntr++;
|
||||||
SQ1_duty_cntr &= 7;
|
SQ1_duty_cntr &= 7;
|
||||||
|
|
||||||
SQ1_output = DUTY_CYCLES[SQ1_duty * 8 + SQ1_duty_cntr] ? SQ1_vol_state : SQ1_bias_gain;
|
SQ1_output = DUTY_CYCLES[SQ1_duty * 8 + SQ1_duty_cntr] ? (SQ1_vol_state + 15) : 15;
|
||||||
|
|
||||||
// avoid aliasing at high frequenices
|
// avoid aliasing at high frequenices
|
||||||
//if (SQ1_frq > 0x7F0) { SQ1_output = 0; }
|
//if (SQ1_frq > 0x7F0) { SQ1_output = 0; }
|
||||||
|
@ -629,7 +629,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
SQ2_duty_cntr++;
|
SQ2_duty_cntr++;
|
||||||
SQ2_duty_cntr &= 7;
|
SQ2_duty_cntr &= 7;
|
||||||
|
|
||||||
SQ2_output = DUTY_CYCLES[SQ2_duty * 8 + SQ2_duty_cntr] ? SQ2_vol_state : SQ2_bias_gain;
|
SQ2_output = DUTY_CYCLES[SQ2_duty * 8 + SQ2_duty_cntr] ? (SQ2_vol_state + 15) : 15;
|
||||||
|
|
||||||
// avoid aliasing at high frequenices
|
// avoid aliasing at high frequenices
|
||||||
//if (SQ2_frq > 0x7F0) { SQ2_output = 0; }
|
//if (SQ2_frq > 0x7F0) { SQ2_output = 0; }
|
||||||
|
@ -670,7 +670,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
sample = (byte)((sample & 0xF) >> 2);
|
sample = (byte)((sample & 0xF) >> 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
WAVE_output = sample;
|
WAVE_output = (sample + 15);
|
||||||
|
|
||||||
// NOTE: The sample buffer is only reloaded after the current sample is played, even if just triggered
|
// NOTE: The sample buffer is only reloaded after the current sample is played, even if just triggered
|
||||||
WAVE_wave_cntr++;
|
WAVE_wave_cntr++;
|
||||||
|
@ -697,7 +697,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
NOISE_LFSR |= (bit_lfsr << 6);
|
NOISE_LFSR |= (bit_lfsr << 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
NOISE_output = (NOISE_LFSR & 1) > 0 ? NOISE_bias_gain : NOISE_vol_state;
|
NOISE_output = (NOISE_LFSR & 1) > 0 ? 15 : (NOISE_vol_state + 15);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -989,99 +989,41 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
|
|
||||||
public void calculate_bias_gain_a()
|
public void calculate_bias_gain_a()
|
||||||
{
|
{
|
||||||
if ((AUD_CTRL_sq1_R_en | AUD_CTRL_sq1_L_en) && ((Audio_Regs[NR12] & 0xF8) > 0))
|
if (!SQ1_enable && ((Audio_Regs[NR12] & 0xF8) > 0)) { SQ1_output = 15; }
|
||||||
{
|
else if ((Audio_Regs[NR12] & 0xF8) == 0) { SQ1_output = 0; }
|
||||||
SQ1_bias_gain = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SQ1_bias_gain = 0;
|
|
||||||
}
|
|
||||||
if ((AUD_CTRL_sq2_R_en | AUD_CTRL_sq2_L_en) && ((Audio_Regs[NR22] & 0xF8) > 0))
|
|
||||||
{
|
|
||||||
SQ2_bias_gain = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SQ2_bias_gain = 0;
|
|
||||||
}
|
|
||||||
if ((AUD_CTRL_wave_R_en | AUD_CTRL_wave_L_en) && WAVE_DAC_pow)
|
|
||||||
{
|
|
||||||
WAVE_bias_gain = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WAVE_bias_gain = 0;
|
|
||||||
}
|
|
||||||
if ((AUD_CTRL_noise_R_en | AUD_CTRL_noise_L_en) && ((Audio_Regs[NR42] & 0xF8) > 0))
|
|
||||||
{
|
|
||||||
NOISE_bias_gain = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NOISE_bias_gain = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!SQ1_enable) { SQ1_output = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 1; }
|
if (!SQ2_enable && ((Audio_Regs[NR22] & 0xF8) > 0)) { SQ2_output = 15; }
|
||||||
if (!SQ2_enable) { SQ2_output = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 1; }
|
else if ((Audio_Regs[NR22] & 0xF8) == 0) { SQ2_output = 0; }
|
||||||
//if (!WAVE_enable) { WAVE_output = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 1; }
|
|
||||||
if (!NOISE_enable) { NOISE_output = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 2; }
|
if (!WAVE_enable && WAVE_DAC_pow) { WAVE_output = 22; }
|
||||||
|
else if (!WAVE_DAC_pow) { WAVE_output = 22; }
|
||||||
|
|
||||||
|
if (!NOISE_enable && ((Audio_Regs[NR42] & 0xF8) > 0)) { NOISE_output = 15; }
|
||||||
|
else if ((Audio_Regs[NR42] & 0xF8) == 0) { NOISE_output = 0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void calculate_bias_gain_1()
|
public void calculate_bias_gain_1()
|
||||||
{
|
{
|
||||||
if ((AUD_CTRL_sq1_R_en | AUD_CTRL_sq1_L_en) && ((Audio_Regs[NR12] & 0xF8) > 0))
|
if (!SQ1_enable && ((Audio_Regs[NR12] & 0xF8) > 0)) { SQ1_output = 15; }
|
||||||
{
|
else if ((Audio_Regs[NR12] & 0xF8) == 0) { SQ1_output = 0; }
|
||||||
SQ1_bias_gain = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SQ1_bias_gain = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!SQ1_enable) { SQ1_output = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 1; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void calculate_bias_gain_2()
|
public void calculate_bias_gain_2()
|
||||||
{
|
{
|
||||||
if ((AUD_CTRL_sq2_R_en | AUD_CTRL_sq2_L_en) && ((Audio_Regs[NR22] & 0xF8) > 0))
|
if (!SQ2_enable && ((Audio_Regs[NR22] & 0xF8) > 0)) { SQ2_output = 15; }
|
||||||
{
|
else if ((Audio_Regs[NR22] & 0xF8) == 0) { SQ2_output = 0; }
|
||||||
SQ2_bias_gain = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SQ2_bias_gain = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!SQ2_enable) { SQ2_output = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 1; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void calculate_bias_gain_w()
|
public void calculate_bias_gain_w()
|
||||||
{
|
{
|
||||||
if ((AUD_CTRL_wave_R_en | AUD_CTRL_wave_L_en) && WAVE_DAC_pow)
|
if (!WAVE_enable && WAVE_DAC_pow) { WAVE_output = 22; }
|
||||||
{
|
else if (!WAVE_DAC_pow) { WAVE_output = 22; }
|
||||||
WAVE_bias_gain = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WAVE_bias_gain = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!WAVE_enable) { WAVE_output = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 1; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void calculate_bias_gain_n()
|
public void calculate_bias_gain_n()
|
||||||
{
|
{
|
||||||
if ((AUD_CTRL_noise_R_en | AUD_CTRL_noise_L_en) && ((Audio_Regs[NR42] & 0xF8) > 0))
|
if (!NOISE_enable && ((Audio_Regs[NR42] & 0xF8) > 0)) { NOISE_output = 15; }
|
||||||
{
|
else if ((Audio_Regs[NR42] & 0xF8) == 0) { NOISE_output = 0; }
|
||||||
NOISE_bias_gain = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NOISE_bias_gain = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!NOISE_enable) { NOISE_output = (AUD_CTRL_vol_R | AUD_CTRL_vol_L) >> 2; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SyncState(Serializer ser)
|
public void SyncState(Serializer ser)
|
||||||
|
@ -1186,11 +1128,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
ser.Sync(nameof(AUD_CTRL_power), ref AUD_CTRL_power);
|
ser.Sync(nameof(AUD_CTRL_power), ref AUD_CTRL_power);
|
||||||
ser.Sync(nameof(AUD_CTRL_vol_L), ref AUD_CTRL_vol_L);
|
ser.Sync(nameof(AUD_CTRL_vol_L), ref AUD_CTRL_vol_L);
|
||||||
ser.Sync(nameof(AUD_CTRL_vol_R), ref AUD_CTRL_vol_R);
|
ser.Sync(nameof(AUD_CTRL_vol_R), ref AUD_CTRL_vol_R);
|
||||||
|
|
||||||
ser.Sync(nameof(SQ1_bias_gain), ref SQ1_bias_gain);
|
|
||||||
ser.Sync(nameof(SQ2_bias_gain), ref SQ2_bias_gain);
|
|
||||||
ser.Sync(nameof(WAVE_bias_gain), ref WAVE_bias_gain);
|
|
||||||
ser.Sync(nameof(NOISE_bias_gain), ref NOISE_bias_gain);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte Read_NR52()
|
public byte Read_NR52()
|
||||||
|
|
Loading…
Reference in New Issue