feat(apu): add timer/sequencer/LFSR fields for channel output tracking
This commit is contained in:
@@ -34,6 +34,12 @@ impl Apu {
|
||||
frame_reset_delay: 0,
|
||||
pending_frame_mode_5step: false,
|
||||
pending_frame_irq_inhibit: false,
|
||||
pulse_timer_counter: [0; 2],
|
||||
pulse_duty_step: [0; 2],
|
||||
triangle_timer_counter: 0,
|
||||
triangle_step: 0,
|
||||
noise_timer_counter: 0,
|
||||
noise_lfsr: 1, // LFSR initialized to 1 per NES hardware
|
||||
}
|
||||
}
|
||||
|
||||
@@ -227,6 +233,13 @@ impl Apu {
|
||||
out.push(self.frame_reset_delay);
|
||||
out.push(u8::from(self.pending_frame_mode_5step));
|
||||
out.push(u8::from(self.pending_frame_irq_inhibit));
|
||||
out.extend_from_slice(&self.pulse_timer_counter[0].to_le_bytes());
|
||||
out.extend_from_slice(&self.pulse_timer_counter[1].to_le_bytes());
|
||||
out.extend_from_slice(&self.pulse_duty_step);
|
||||
out.extend_from_slice(&self.triangle_timer_counter.to_le_bytes());
|
||||
out.push(self.triangle_step);
|
||||
out.extend_from_slice(&self.noise_timer_counter.to_le_bytes());
|
||||
out.extend_from_slice(&self.noise_lfsr.to_le_bytes());
|
||||
}
|
||||
|
||||
pub fn load_state_tail(&mut self, state: ApuStateTail) {
|
||||
@@ -260,5 +273,11 @@ impl Apu {
|
||||
self.frame_reset_delay = state.frame_reset_delay;
|
||||
self.pending_frame_mode_5step = state.pending_frame_mode_5step;
|
||||
self.pending_frame_irq_inhibit = state.pending_frame_irq_inhibit;
|
||||
self.pulse_timer_counter = state.pulse_timer_counter;
|
||||
self.pulse_duty_step = [state.pulse_duty_step[0] & 0x07, state.pulse_duty_step[1] & 0x07];
|
||||
self.triangle_timer_counter = state.triangle_timer_counter;
|
||||
self.triangle_step = state.triangle_step & 0x1F;
|
||||
self.noise_timer_counter = state.noise_timer_counter;
|
||||
self.noise_lfsr = if state.noise_lfsr == 0 { 1 } else { state.noise_lfsr };
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user