|
|
|
@@ -81,8 +81,6 @@ static void nes_apu_write_square(nes_apu_Channel* channel, |
|
|
|
((val & apu_Square_Period) >> 4) |
|
|
|
); |
|
|
|
channel->flags |= apu_Channel_Reload; |
|
|
|
//channel->sweep_delay = 0; |
|
|
|
//channel->step = 0; |
|
|
|
|
|
|
|
} else if (2 <= reg) { |
|
|
|
channel->reg[reg] = val; |
|
|
|
@@ -90,14 +88,11 @@ static void nes_apu_write_square(nes_apu_Channel* channel, |
|
|
|
(apu_channel_raw_timer_value(channel) /*+ 1*/) * 2 |
|
|
|
) * nes_clock_cpu_div; |
|
|
|
if (3 == reg) { |
|
|
|
//channel->flags |= apu_Channel_Reload; // TODO: No? |
|
|
|
// channel->sweep_delay = 0; // TODO: No? |
|
|
|
// channel->step = 7; |
|
|
|
// channel->envelope = 15; |
|
|
|
//channel->envelope = (channel->reg[0] & apu_Envelope_Volume); |
|
|
|
// channel->flags |= apu_Channel_Reload; |
|
|
|
channel->delay = 0; |
|
|
|
// Envelope and step are already restarted |
|
|
|
} |
|
|
|
} |
|
|
|
// TODO? |
|
|
|
} |
|
|
|
|
|
|
|
static void nes_apu_write_triangle(nes_apu_Channel* channel, |
|
|
|
@@ -235,12 +230,15 @@ static inline void nes_apu_clock_length(nes_apu_Channel* channel, |
|
|
|
|
|
|
|
static inline void nes_apu_clock_sweep(nes_apu_Channel* channel, |
|
|
|
int adjust) { |
|
|
|
int decrement = 1; |
|
|
|
|
|
|
|
if (channel->flags & apu_Channel_Reload) { |
|
|
|
channel->flags &= ~apu_Channel_Reload; |
|
|
|
channel->sweep_delay = channel->sweep_period; |
|
|
|
decrement = 0; |
|
|
|
} |
|
|
|
|
|
|
|
} else if (channel->sweep_delay == 0) { |
|
|
|
channel->sweep_delay = channel->sweep_period; |
|
|
|
if (channel->sweep_delay == 0) { |
|
|
|
decrement = 0; |
|
|
|
if ( (channel->reg[1] & apu_Square_Enable) && |
|
|
|
0 != (channel->reg[1] & apu_Square_Shift)) { |
|
|
|
int delta = ( |
|
|
|
@@ -255,9 +253,12 @@ static inline void nes_apu_clock_sweep(nes_apu_Channel* channel, |
|
|
|
channel->period = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
if (decrement) { |
|
|
|
channel->sweep_delay--; |
|
|
|
} else { |
|
|
|
channel->sweep_delay = channel->sweep_period; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@@ -317,13 +318,8 @@ void nes_apu_write(nes_apu* apu, uint16_t addr, uint8_t val) { |
|
|
|
if ( chan != apu_Channel_DMC && |
|
|
|
(apu->status & (1 << chan))) { |
|
|
|
channel->length = apu_length_lut[val >> 3]; |
|
|
|
// channel->step = (uint8_t)-1; |
|
|
|
/*if (chan != apu_Channel_Triangle)*/ { |
|
|
|
channel->flags |= apu_Channel_Start; |
|
|
|
// channel->envelope = 15; |
|
|
|
// TODO |
|
|
|
// channel->env_delay = channel->env_period; |
|
|
|
} |
|
|
|
channel->step = (uint8_t)-1; |
|
|
|
channel->flags |= apu_Channel_Start; |
|
|
|
} |
|
|
|
} |
|
|
|
channel->write(channel, reg, val); |
|
|
|
|