| @@ -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); | |||