Current sample index (Channel 1 and 2) is only reset after turning the APU off

This commit is contained in:
Lior Halphon 2017-09-22 02:25:06 +03:00
parent 8f4cd5c412
commit 75db33559a
1 changed files with 7 additions and 8 deletions

View File

@ -7,10 +7,10 @@
#define unlikely(x) __builtin_expect((x), 0)
static const uint8_t duties[] = {
0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 1, 1,
0, 0, 0, 0, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0,
};
static void refresh_channel(GB_gameboy_t *gb, unsigned index, unsigned cycles_offset)
@ -529,14 +529,13 @@ void GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value)
gb->apu.square_channels[0].sample_length;
}
if (value & 0x80) {
/* Current sample index remains unchanged when restarting channels 1 or 2. It is only reset by
turning the APU off. */
if (!gb->apu.is_active[index]) {
gb->apu.square_channels[index].current_sample_index = 7;
gb->apu.square_channels[index].sample_countdown = (gb->apu.square_channels[index].sample_length ^ 0x7FF) * 2 + 6 - gb->apu.lf_div;
}
else {
/* Timing quirk: if already active, sound starts 2 (2MHz) ticks earlier.
The current sample index remains unchanged! */
/* Timing quirk: if already active, sound starts 2 (2MHz) ticks earlier.*/
gb->apu.square_channels[index].sample_countdown = (gb->apu.square_channels[index].sample_length ^ 0x7FF) * 2 + 4 - gb->apu.lf_div;
}
gb->apu.square_channels[index].current_volume = gb->io_registers[index == GB_SQUARE_1 ? GB_IO_NR12 : GB_IO_NR22] >> 4;