feat: implement 0xff24 sound register
This commit is contained in:
parent
251f4e8d6d
commit
92218a227d
10
src/bus.rs
10
src/bus.rs
|
@ -101,8 +101,9 @@ impl Bus {
|
||||||
0xFF0F => self.interrupt.flag.into(),
|
0xFF0F => self.interrupt.flag.into(),
|
||||||
0xFF11 => self.sound.ch1.sound_duty.into(),
|
0xFF11 => self.sound.ch1.sound_duty.into(),
|
||||||
0xFF12 => self.sound.ch1.vol_envelope.into(),
|
0xFF12 => self.sound.ch1.vol_envelope.into(),
|
||||||
0xFF25 => self.sound.select.into(),
|
0xFF24 => self.sound.control.channel.into(),
|
||||||
0xFF26 => self.sound.status.into(),
|
0xFF25 => self.sound.control.select.into(),
|
||||||
|
0xFF26 => self.sound.control.status.into(),
|
||||||
_ => unimplemented!("Unable to read {:#06X} in I/O Registers", addr),
|
_ => unimplemented!("Unable to read {:#06X} in I/O Registers", addr),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -162,8 +163,9 @@ impl Bus {
|
||||||
0xFF0F => self.interrupt.flag = byte.into(),
|
0xFF0F => self.interrupt.flag = byte.into(),
|
||||||
0xFF11 => self.sound.ch1.sound_duty = byte.into(),
|
0xFF11 => self.sound.ch1.sound_duty = byte.into(),
|
||||||
0xFF12 => self.sound.ch1.vol_envelope = byte.into(),
|
0xFF12 => self.sound.ch1.vol_envelope = byte.into(),
|
||||||
0xFF25 => self.sound.select = byte.into(),
|
0xFF24 => self.sound.control.channel = byte.into(),
|
||||||
0xFF26 => self.sound.status = byte.into(), // FIXME: Should we control which bytes are written to here?
|
0xFF25 => self.sound.control.select = byte.into(),
|
||||||
|
0xFF26 => self.sound.control.status = byte.into(), // FIXME: Should we control which bytes are written to here?
|
||||||
_ => unimplemented!("Unable to write to {:#06X} in I/O Registers", addr),
|
_ => unimplemented!("Unable to write to {:#06X} in I/O Registers", addr),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
36
src/sound.rs
36
src/sound.rs
|
@ -1,8 +1,14 @@
|
||||||
#[derive(Debug, Clone, Copy, Default)]
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
pub struct Sound {
|
pub struct Sound {
|
||||||
pub status: SoundStatus,
|
pub control: SoundControl,
|
||||||
pub ch1: Channel1,
|
pub ch1: Channel1,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
|
pub struct SoundControl {
|
||||||
|
pub channel: ChannelControl,
|
||||||
pub select: SoundOutputSelect,
|
pub select: SoundOutputSelect,
|
||||||
|
pub status: SoundStatus,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, Default)]
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
|
@ -202,3 +208,31 @@ impl From<u8> for SoundOutputSelect {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, Default)]
|
||||||
|
pub struct ChannelControl {
|
||||||
|
vin_to_term2: bool,
|
||||||
|
term2_level: u8,
|
||||||
|
vin_to_term1: bool,
|
||||||
|
term1_level: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u8> for ChannelControl {
|
||||||
|
fn from(byte: u8) -> Self {
|
||||||
|
Self {
|
||||||
|
vin_to_term2: byte >> 7 == 0x01, // Get 7th bit
|
||||||
|
term2_level: (byte & 0x7F) >> 4, // Clear 7th then get 6 -> 4th bit
|
||||||
|
vin_to_term1: (byte >> 3) & 0x01 == 0x01,
|
||||||
|
term1_level: byte & 0x07, // Bits 2 -> 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<ChannelControl> for u8 {
|
||||||
|
fn from(control: ChannelControl) -> Self {
|
||||||
|
(control.vin_to_term1 as u8) << 7
|
||||||
|
| (control.term2_level as u8) << 4
|
||||||
|
| (control.vin_to_term1 as u8) << 3
|
||||||
|
| control.term1_level as u8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue