GBHawk: GBC Audio Quirks
This commit is contained in:
parent
426c3ddaea
commit
f016c60b13
|
@ -155,7 +155,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
case 0xFF3F:
|
case 0xFF3F:
|
||||||
if (WAVE_enable)
|
if (WAVE_enable)
|
||||||
{
|
{
|
||||||
if (WAVE_can_get) { ret = Wave_RAM[WAVE_wave_cntr >> 1]; }
|
if (WAVE_can_get || Core.is_GBC) { ret = Wave_RAM[WAVE_wave_cntr >> 1]; }
|
||||||
else { ret = 0xFF; }
|
else { ret = 0xFF; }
|
||||||
}
|
}
|
||||||
else { ret = Wave_RAM[addr & 0x0F]; }
|
else { ret = Wave_RAM[addr & 0x0F]; }
|
||||||
|
@ -367,7 +367,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
if (WAVE_trigger)
|
if (WAVE_trigger)
|
||||||
{
|
{
|
||||||
// some corruption occurs if triggering while reading
|
// some corruption occurs if triggering while reading
|
||||||
if (WAVE_enable && WAVE_intl_cntr == 2)
|
if (WAVE_enable && (WAVE_intl_cntr == 2) && !Core.is_GBC)
|
||||||
{
|
{
|
||||||
// we want to use the previous wave cntr value since it was just incremented
|
// we want to use the previous wave cntr value since it was just incremented
|
||||||
int t_wave_cntr = (WAVE_wave_cntr + 1) & 31;
|
int t_wave_cntr = (WAVE_wave_cntr + 1) & 31;
|
||||||
|
@ -500,7 +500,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
case 0xFF3F:
|
case 0xFF3F:
|
||||||
if (WAVE_enable)
|
if (WAVE_enable)
|
||||||
{
|
{
|
||||||
if (WAVE_can_get) { Wave_RAM[WAVE_wave_cntr >> 1] = value; }
|
if (WAVE_can_get || Core.is_GBC) { Wave_RAM[WAVE_wave_cntr >> 1] = value; }
|
||||||
}
|
}
|
||||||
else { Wave_RAM[addr & 0xF] = value; }
|
else { Wave_RAM[addr & 0xF] = value; }
|
||||||
|
|
||||||
|
@ -508,25 +508,38 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// when power is off, only length counters and waveRAM are effected by writes
|
// when power is off, only length counters and waveRAM are effected by writes
|
||||||
|
// ON GBC, length counters cannot be written to either
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (addr)
|
switch (addr)
|
||||||
{
|
{
|
||||||
case 0xFF11: // NR11 (sound length / wave pattern duty %)
|
case 0xFF11: // NR11 (sound length / wave pattern duty %)
|
||||||
SQ1_length = (ushort)(64 - (value & 0x3F));
|
if (!Core.is_GBC)
|
||||||
SQ1_len_cntr = SQ1_length;
|
{
|
||||||
|
SQ1_length = (ushort)(64 - (value & 0x3F));
|
||||||
|
SQ1_len_cntr = SQ1_length;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0xFF16: // NR21 (sound length / wave pattern duty %)
|
case 0xFF16: // NR21 (sound length / wave pattern duty %)
|
||||||
SQ2_length = (ushort)(64 - (value & 0x3F));
|
if (!Core.is_GBC)
|
||||||
SQ2_len_cntr = SQ2_length;
|
{
|
||||||
|
SQ2_length = (ushort)(64 - (value & 0x3F));
|
||||||
|
SQ2_len_cntr = SQ2_length;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0xFF1B: // NR31 (length)
|
case 0xFF1B: // NR31 (length)
|
||||||
WAVE_length = (ushort)(256 - value);
|
if (!Core.is_GBC)
|
||||||
WAVE_len_cntr = WAVE_length;
|
{
|
||||||
|
WAVE_length = (ushort)(256 - value);
|
||||||
|
WAVE_len_cntr = WAVE_length;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0xFF20: // NR41 (length)
|
case 0xFF20: // NR41 (length)
|
||||||
NOISE_length = (ushort)(64 - (value & 0x3F));
|
if (!Core.is_GBC)
|
||||||
NOISE_len_cntr = NOISE_length;
|
{
|
||||||
|
NOISE_length = (ushort)(64 - (value & 0x3F));
|
||||||
|
NOISE_len_cntr = NOISE_length;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0xFF26: // NR52 (ctrl)
|
case 0xFF26: // NR52 (ctrl)
|
||||||
AUD_CTRL_power = (value & 0x80) > 0;
|
AUD_CTRL_power = (value & 0x80) > 0;
|
||||||
|
@ -865,7 +878,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 0x16; i++)
|
for (int i = 0; i < 0x16; i++)
|
||||||
{
|
{
|
||||||
WriteReg(0xFF10 + i, 0);
|
WriteReg(0xFF10 + i, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// duty and length are reset
|
// duty and length are reset
|
||||||
|
@ -878,6 +891,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
||||||
|
|
||||||
SQ1_output = SQ2_output = WAVE_output = NOISE_output = 0;
|
SQ1_output = SQ2_output = WAVE_output = NOISE_output = 0;
|
||||||
|
|
||||||
|
// on GBC, lengths are also reset
|
||||||
|
if (Core.is_GBC)
|
||||||
|
{
|
||||||
|
SQ1_length = SQ2_length = WAVE_length = NOISE_length = 0;
|
||||||
|
SQ1_len_cntr = SQ2_len_cntr = WAVE_len_cntr = NOISE_len_cntr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
sequencer_len = 0;
|
sequencer_len = 0;
|
||||||
sequencer_vol = 0;
|
sequencer_vol = 0;
|
||||||
sequencer_swp = 0;
|
sequencer_swp = 0;
|
||||||
|
|
Loading…
Reference in New Issue