mirror of https://github.com/LIJI32/SameBoy.git
Add initial edge trigger detection method
- GB_get_channel_edge_triggered()
This commit is contained in:
parent
5c7b1f01a3
commit
7bdf8dbe47
28
Core/apu.c
28
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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue