diff --git a/Core/apu.c b/Core/apu.c index 1efbd96..a2242c9 100644 --- a/Core/apu.c +++ b/Core/apu.c @@ -726,6 +726,7 @@ void GB_apu_run(GB_gameboy_t *gb, bool force) gb->apu.pcm_mask[0] &= i == GB_SQUARE_1? 0xF0 : 0x0F; } gb->apu.square_channels[i].did_tick = true; + gb->apu.square_channels[i].edge_triggered = true; update_square_sample(gb, i); } if (cycles_left) { @@ -746,6 +747,7 @@ void GB_apu_run(GB_gameboy_t *gb, bool force) gb->io_registers[GB_IO_WAV_START + (gb->apu.wave_channel.current_sample_index >> 1)]; update_wave_sample(gb, cycles - cycles_left); gb->apu.wave_channel.wave_form_just_read = true; + gb->apu.wave_channel.edge_triggered = true; } if (cycles_left) { gb->apu.wave_channel.sample_countdown -= cycles_left; @@ -805,6 +807,7 @@ void GB_apu_run(GB_gameboy_t *gb, bool force) } else { gb->apu.noise_channel.countdown_reloaded = true; + gb->apu.noise_channel.edge_triggered = true; } } } @@ -1796,3 +1799,28 @@ void GB_get_apu_wave_table(GB_gameboy_t *gb, uint8_t *wave_table) { wave_table[2 * (i - GB_IO_WAV_START) + 1] = gb->io_registers[i] & 0xF; } } + +bool GB_get_channel_edge_triggered(GB_gameboy_t *gb, GB_channel_t channel) { + bool edge_triggered; + switch (channel) { + case GB_SQUARE_1: + case GB_SQUARE_2: + edge_triggered = gb->apu.square_channels[channel].edge_triggered; + gb->apu.square_channels[channel].edge_triggered = false; + break; + + case GB_WAVE: + edge_triggered = gb->apu.wave_channel.edge_triggered; + gb->apu.wave_channel.edge_triggered = false; + break; + + case GB_NOISE: + edge_triggered = gb->apu.noise_channel.edge_triggered; + gb->apu.noise_channel.edge_triggered = false; + break; + + default: + return false; + } + return edge_triggered; +} diff --git a/Core/apu.h b/Core/apu.h index aec69ac..6cd3b39 100644 --- a/Core/apu.h +++ b/Core/apu.h @@ -92,6 +92,8 @@ typedef struct GB_envelope_clock_t envelope_clock; uint8_t delay; // Hack for CGB D/E phantom step due to how sample_countdown is implemented in SameBoy bool did_tick; + + bool edge_triggered; } square_channels[2]; struct { @@ -107,6 +109,8 @@ typedef struct bool wave_form_just_read; bool pulsed; uint8_t bugged_read_countdown; + + bool edge_triggered; } wave_channel; struct { @@ -127,6 +131,8 @@ typedef struct bool countdown_reloaded; uint8_t dmg_delayed_start; GB_envelope_clock_t envelope_clock; + + bool edge_triggered; } noise_channel; GB_ENUM(uint8_t, { @@ -192,6 +198,7 @@ uint8_t GB_get_channel_volume(GB_gameboy_t *gb, GB_channel_t channel); uint8_t GB_get_channel_amplitude(GB_gameboy_t *gb, GB_channel_t channel); uint16_t GB_get_channel_period(GB_gameboy_t *gb, GB_channel_t channel); void GB_get_apu_wave_table(GB_gameboy_t *gb, uint8_t *wave_table); +bool GB_get_channel_edge_triggered(GB_gameboy_t *gb, GB_channel_t channel); #ifdef GB_INTERNAL internal bool GB_apu_is_DAC_enabled(GB_gameboy_t *gb, GB_channel_t index); internal void GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value);