Browse Source

Clean up sweep and envelope restarts

- SMB3 pipe/shrink sound still a little off
master
Nathaniel Walizer 11 months ago
parent
commit
ba28706092
1 changed files with 15 additions and 19 deletions
  1. +15
    -19
      src/apu.c

+ 15
- 19
src/apu.c View File

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


Loading…
Cancel
Save