cgb refactor + double speed groundwork
This commit is contained in:
parent
fbae48596e
commit
124b823ae1
|
@ -5,9 +5,10 @@ use self::{
|
||||||
addresses::{Address, AddressMarker, CgbIoAddress, IoAddress},
|
addresses::{Address, AddressMarker, CgbIoAddress, IoAddress},
|
||||||
mmio::{
|
mmio::{
|
||||||
apu::ApuSaveState,
|
apu::ApuSaveState,
|
||||||
|
cgb::{DoubleSpeed, Infrared, VramDma},
|
||||||
gpu::{Colour, GpuSaveState},
|
gpu::{Colour, GpuSaveState},
|
||||||
serial::SerialSaveState,
|
serial::SerialSaveState,
|
||||||
Apu, Gpu, Infrared, Joypad, OamDma, Serial, Timer, VramDma,
|
Apu, Gpu, Joypad, OamDma, Serial, Timer,
|
||||||
},
|
},
|
||||||
rom::RomSaveState,
|
rom::RomSaveState,
|
||||||
};
|
};
|
||||||
|
@ -84,6 +85,7 @@ impl Wram {
|
||||||
struct CgbPeripherals {
|
struct CgbPeripherals {
|
||||||
vram_dma: VramDma,
|
vram_dma: VramDma,
|
||||||
infrared: Infrared,
|
infrared: Infrared,
|
||||||
|
double_speed: DoubleSpeed,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Memory<ColourFormat, R, C>
|
pub struct Memory<ColourFormat, R, C>
|
||||||
|
@ -361,7 +363,7 @@ where
|
||||||
IoAddress::Cgb(address) => {
|
IoAddress::Cgb(address) => {
|
||||||
if let WramBanks::Cgb { banks: _, selected } = &self.ram.banks && let Some(cgb_peripherals) = &self.cgb_peripherals {
|
if let WramBanks::Cgb { banks: _, selected } = &self.ram.banks && let Some(cgb_peripherals) = &self.cgb_peripherals {
|
||||||
match address {
|
match address {
|
||||||
CgbIoAddress::PrepareSpeed => todo!(),
|
CgbIoAddress::PrepareSpeed => cgb_peripherals.double_speed.get(),
|
||||||
CgbIoAddress::VramBank => self.gpu.vram.get_vram_bank(),
|
CgbIoAddress::VramBank => self.gpu.vram.get_vram_bank(),
|
||||||
CgbIoAddress::VramDma(address) => cgb_peripherals.vram_dma.get_register(address),
|
CgbIoAddress::VramDma(address) => cgb_peripherals.vram_dma.get_register(address),
|
||||||
CgbIoAddress::Infrared => cgb_peripherals.infrared.get(),
|
CgbIoAddress::Infrared => cgb_peripherals.infrared.get(),
|
||||||
|
@ -420,7 +422,7 @@ where
|
||||||
IoAddress::Cgb(address) => {
|
IoAddress::Cgb(address) => {
|
||||||
if let WramBanks::Cgb { banks: _, selected } = &mut self.ram.banks && let Some(cgb_peripherals) = &mut self.cgb_peripherals {
|
if let WramBanks::Cgb { banks: _, selected } = &mut self.ram.banks && let Some(cgb_peripherals) = &mut self.cgb_peripherals {
|
||||||
match address {
|
match address {
|
||||||
CgbIoAddress::PrepareSpeed => todo!(),
|
CgbIoAddress::PrepareSpeed => cgb_peripherals.double_speed.set(data),
|
||||||
CgbIoAddress::VramBank => self.gpu.vram.set_vram_bank(data),
|
CgbIoAddress::VramBank => self.gpu.vram.set_vram_bank(data),
|
||||||
CgbIoAddress::VramDma(address) => cgb_peripherals.vram_dma.set_register(address, data),
|
CgbIoAddress::VramDma(address) => cgb_peripherals.vram_dma.set_register(address, data),
|
||||||
CgbIoAddress::Infrared => cgb_peripherals.infrared.set(data),
|
CgbIoAddress::Infrared => cgb_peripherals.infrared.set(data),
|
||||||
|
|
50
lib/src/processor/memory/mmio/cgb/double_speed.rs
Normal file
50
lib/src/processor/memory/mmio/cgb/double_speed.rs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
use crate::{
|
||||||
|
connect::{PocketCamera, Renderer},
|
||||||
|
processor::memory::{mmio::gpu::Colour, Memory},
|
||||||
|
};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Default, Serialize, Deserialize, Clone, Copy)]
|
||||||
|
pub(crate) struct DoubleSpeed {
|
||||||
|
prepared: bool,
|
||||||
|
current: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DoubleSpeed {
|
||||||
|
pub(crate) fn get(&self) -> u8 {
|
||||||
|
0b01111110 | if self.current { 0b1 << 7 } else { 0 } | if self.prepared { 0b1 } else { 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn set(&mut self, data: u8) {
|
||||||
|
self.prepared = data & 0b1 == 0b1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<ColourFormat, R, C> Memory<ColourFormat, R, C>
|
||||||
|
where
|
||||||
|
ColourFormat: From<Colour> + Clone,
|
||||||
|
R: Renderer<ColourFormat>,
|
||||||
|
C: PocketCamera + Send + 'static,
|
||||||
|
{
|
||||||
|
pub(crate) fn is_double_speed(&self) -> bool {
|
||||||
|
self.cgb_peripherals
|
||||||
|
.as_ref()
|
||||||
|
.map_or(false, |v| v.double_speed.current)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn should_switch_speed(&mut self) -> bool {
|
||||||
|
if let Some(cgb_peripherals) = &mut self.cgb_peripherals {
|
||||||
|
if cgb_peripherals.double_speed.prepared && !cgb_peripherals.double_speed.current {
|
||||||
|
cgb_peripherals.double_speed.current = true;
|
||||||
|
cgb_peripherals.double_speed.prepared = false;
|
||||||
|
return true;
|
||||||
|
} else if cgb_peripherals.double_speed.prepared && cgb_peripherals.double_speed.current
|
||||||
|
{
|
||||||
|
cgb_peripherals.double_speed.current = false;
|
||||||
|
cgb_peripherals.double_speed.prepared = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
7
lib/src/processor/memory/mmio/cgb/mod.rs
Normal file
7
lib/src/processor/memory/mmio/cgb/mod.rs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
mod double_speed;
|
||||||
|
mod ir;
|
||||||
|
mod vram_dma;
|
||||||
|
|
||||||
|
pub(crate) use double_speed::DoubleSpeed;
|
||||||
|
pub(crate) use ir::Infrared;
|
||||||
|
pub(crate) use vram_dma::VramDma;
|
|
@ -1,9 +1,9 @@
|
||||||
use super::gpu::{Colour, DrawMode};
|
|
||||||
use crate::{
|
use crate::{
|
||||||
connect::{PocketCamera, Renderer},
|
connect::{PocketCamera, Renderer},
|
||||||
processor::{
|
processor::{
|
||||||
memory::{
|
memory::{
|
||||||
addresses::{AddressMarker, VramDmaAddress},
|
addresses::{AddressMarker, VramDmaAddress},
|
||||||
|
mmio::gpu::{Colour, DrawMode},
|
||||||
Memory,
|
Memory,
|
||||||
},
|
},
|
||||||
SplitRegister,
|
SplitRegister,
|
|
@ -1,16 +1,13 @@
|
||||||
pub(crate) mod apu;
|
pub(crate) mod apu;
|
||||||
|
pub(crate) mod cgb;
|
||||||
pub(crate) mod gpu;
|
pub(crate) mod gpu;
|
||||||
mod ir;
|
|
||||||
pub(crate) mod joypad;
|
pub(crate) mod joypad;
|
||||||
mod oam_dma;
|
mod oam_dma;
|
||||||
pub(crate) mod serial;
|
pub(crate) mod serial;
|
||||||
mod timer;
|
mod timer;
|
||||||
mod vram_dma;
|
|
||||||
pub use apu::Apu;
|
pub use apu::Apu;
|
||||||
pub use gpu::Gpu;
|
pub use gpu::Gpu;
|
||||||
pub use ir::Infrared;
|
|
||||||
pub use joypad::Joypad;
|
pub use joypad::Joypad;
|
||||||
pub use oam_dma::OamDma;
|
pub use oam_dma::OamDma;
|
||||||
pub use serial::Serial;
|
pub use serial::Serial;
|
||||||
pub use timer::Timer;
|
pub use timer::Timer;
|
||||||
pub use vram_dma::VramDma;
|
|
||||||
|
|
Loading…
Reference in a new issue