| @@ -81,8 +81,6 @@ static void nes_apu_write_square(nes_apu_Channel* channel, | |||||
| ((val & apu_Square_Period) >> 4) | ((val & apu_Square_Period) >> 4) | ||||
| ); | ); | ||||
| channel->flags |= apu_Channel_Reload; | channel->flags |= apu_Channel_Reload; | ||||
| //channel->sweep_delay = 0; | |||||
| //channel->step = 0; | |||||
| } else if (2 <= reg) { | } else if (2 <= reg) { | ||||
| channel->reg[reg] = val; | 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 | (apu_channel_raw_timer_value(channel) /*+ 1*/) * 2 | ||||
| ) * nes_clock_cpu_div; | ) * nes_clock_cpu_div; | ||||
| if (3 == reg) { | 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, | 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, | static inline void nes_apu_clock_sweep(nes_apu_Channel* channel, | ||||
| int adjust) { | int adjust) { | ||||
| int decrement = 1; | |||||
| if (channel->flags & apu_Channel_Reload) { | if (channel->flags & apu_Channel_Reload) { | ||||
| 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) && | if ( (channel->reg[1] & apu_Square_Enable) && | ||||
| 0 != (channel->reg[1] & apu_Square_Shift)) { | 0 != (channel->reg[1] & apu_Square_Shift)) { | ||||
| int delta = ( | int delta = ( | ||||
| @@ -255,9 +253,12 @@ static inline void nes_apu_clock_sweep(nes_apu_Channel* channel, | |||||
| channel->period = 0; | channel->period = 0; | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| } else { | |||||
| if (decrement) { | |||||
| channel->sweep_delay--; | 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 && | if ( chan != apu_Channel_DMC && | ||||
| (apu->status & (1 << chan))) { | (apu->status & (1 << chan))) { | ||||
| channel->length = apu_length_lut[val >> 3]; | 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); | channel->write(channel, reg, val); | ||||