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) #define unlikely(x) __builtin_expect((x), 0)
static const uint8_t duties[] = { static const uint8_t duties[] = {
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1,
1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0,
}; };
static void refresh_channel(GB_gameboy_t *gb, unsigned index, unsigned cycles_offset) 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; gb->apu.square_channels[0].sample_length;
} }
if (value & 0x80) { 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]) { 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; gb->apu.square_channels[index].sample_countdown = (gb->apu.square_channels[index].sample_length ^ 0x7FF) * 2 + 6 - gb->apu.lf_div;
} }
else { else {
/* Timing quirk: if already active, sound starts 2 (2MHz) ticks earlier. /* Timing quirk: if already active, sound starts 2 (2MHz) ticks earlier.*/
The current sample index remains unchanged! */
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].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; gb->apu.square_channels[index].current_volume = gb->io_registers[index == GB_SQUARE_1 ? GB_IO_NR12 : GB_IO_NR22] >> 4;