apu
This commit is contained in:
parent
2cc8df766e
commit
6fb17d77c6
|
@ -35,6 +35,7 @@ pub struct Apu {
|
||||||
tnd_table: Vec<f32>,
|
tnd_table: Vec<f32>,
|
||||||
|
|
||||||
frame_counter: u8,
|
frame_counter: u8,
|
||||||
|
current_frame: u8,
|
||||||
mode: u8,
|
mode: u8,
|
||||||
interrupt_inhibit: u8,
|
interrupt_inhibit: u8,
|
||||||
frame_interrupt: bool,
|
frame_interrupt: bool,
|
||||||
|
@ -65,6 +66,7 @@ impl Apu {
|
||||||
tnd_table: tnd_table,
|
tnd_table: tnd_table,
|
||||||
|
|
||||||
frame_counter: 0,
|
frame_counter: 0,
|
||||||
|
current_frame: 0,
|
||||||
mode: 0,
|
mode: 0,
|
||||||
interrupt_inhibit: 0,
|
interrupt_inhibit: 0,
|
||||||
frame_interrupt: false,
|
frame_interrupt: false,
|
||||||
|
@ -100,7 +102,7 @@ impl Apu {
|
||||||
0x4014 => (),
|
0x4014 => (),
|
||||||
0x4015 => self.control(value),
|
0x4015 => self.control(value),
|
||||||
0x4016 => (),
|
0x4016 => (),
|
||||||
0x4017 => self.step_frame_counter(value),
|
0x4017 => self.set_frame_counter(value),
|
||||||
_ => panic!("bad address written: 0x{:X}", address),
|
_ => panic!("bad address written: 0x{:X}", address),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,7 +118,7 @@ impl Apu {
|
||||||
// - - - f - - - - - IRQ (if bit 6 is clear)
|
// - - - f - - - - - IRQ (if bit 6 is clear)
|
||||||
// - l - l - l - - l Length counter and sweep
|
// - l - l - l - - l Length counter and sweep
|
||||||
// e e e e e e e - e Envelope and linear counter
|
// e e e e e e e - e Envelope and linear counter
|
||||||
fn step_frame_counter(&mut self, value: u8) {
|
fn set_frame_counter(&mut self, value: u8) {
|
||||||
// 0 selects 4-step sequence, 1 selects 5-step sequence
|
// 0 selects 4-step sequence, 1 selects 5-step sequence
|
||||||
if value & (1<<7) == 0 {
|
if value & (1<<7) == 0 {
|
||||||
self.mode = 0;
|
self.mode = 0;
|
||||||
|
@ -132,6 +134,27 @@ impl Apu {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn step_frame_counter(&mut self) {
|
||||||
|
match self.frame_counter {
|
||||||
|
4 => {
|
||||||
|
self.square1.clock_envelope();
|
||||||
|
self.square2.clock_envelope();
|
||||||
|
self.triangle.clock_linear_counter();
|
||||||
|
self.noise.clock_envelope();
|
||||||
|
if self.current_frame == 1 || self.current_frame == 3 {
|
||||||
|
|
||||||
|
}
|
||||||
|
if self.current_frame == 3 {
|
||||||
|
self.issue_irq();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
5 => {
|
||||||
|
|
||||||
|
},
|
||||||
|
_ => panic!("invalid frame counter value"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn control(&mut self, value: u8) {
|
fn control(&mut self, value: u8) {
|
||||||
// Writing to this register clears the DMC interrupt flag.
|
// Writing to this register clears the DMC interrupt flag.
|
||||||
self.dmc.interrupt = false;
|
self.dmc.interrupt = false;
|
||||||
|
@ -213,4 +236,8 @@ impl Apu {
|
||||||
// TODO: If an interrupt flag was set at the same moment of the read, it will read back as 1 but it will not be cleared.
|
// TODO: If an interrupt flag was set at the same moment of the read, it will read back as 1 but it will not be cleared.
|
||||||
val
|
val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn issue_irq(&mut self) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,10 @@ impl Noise {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clock_envelope(&mut self) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
pub fn loop_noise(&mut self, value: u8) {
|
pub fn loop_noise(&mut self, value: u8) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,4 +31,8 @@ impl Triangle {
|
||||||
pub fn counter(&mut self, value: u8) {
|
pub fn counter(&mut self, value: u8) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clock_linear_counter(&mut self) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue