diff --git a/emulator/core/src/lib.rs b/emulator/core/src/lib.rs index ba8a434..8066649 100644 --- a/emulator/core/src/lib.rs +++ b/emulator/core/src/lib.rs @@ -20,7 +20,7 @@ pub use crate::devices::{Address, Addressable, Steppable, Interruptable, Debugga pub use crate::devices::{read_beu16, read_beu32, read_leu16, read_leu32, write_beu16, write_beu32, write_leu16, write_leu32, wrap_transmutable}; pub use crate::error::Error; pub use crate::interrupts::InterruptController; -pub use crate::memory::{MemoryBlock, AddressRightShifter, AddressRepeater, Bus, BusPort, dump_slice}; +pub use crate::memory::{MemoryBlock, AddressTranslator, AddressRepeater, Bus, BusPort, dump_slice}; pub use crate::signals::{Observable, Signal, EdgeSignal, ObservableSignal, ObservableEdgeSignal}; pub use crate::system::System; diff --git a/emulator/systems/genesis/src/peripherals/coprocessor.rs b/emulator/systems/genesis/src/peripherals/coprocessor.rs index c3c0d13..5788cff 100644 --- a/emulator/systems/genesis/src/peripherals/coprocessor.rs +++ b/emulator/systems/genesis/src/peripherals/coprocessor.rs @@ -1,6 +1,6 @@ use std::rc::Rc; -use std::cell::RefCell; +use std::cell::{Cell, RefCell}; use moa_core::{warn, info}; use moa_core::{Bus, Signal, Error, ClockTime, Address, Addressable, Transmutable}; @@ -62,16 +62,10 @@ impl Transmutable for CoprocessorCoordinator { } -pub struct CoprocessorBankRegister { - base: Signal
, -} +type CoprocessorRegister = Rc>; -impl CoprocessorBankRegister { - pub fn new(base: Signal
) -> Self { - Self { - base, - } - } +pub struct CoprocessorBankRegister { + base: CoprocessorRegister, } impl Addressable for CoprocessorBankRegister { @@ -100,16 +94,19 @@ impl Transmutable for CoprocessorBankRegister { pub struct CoprocessorBankArea { - base: Signal
, + base: CoprocessorRegister, bus: Rc>, } impl CoprocessorBankArea { - pub fn new(base: Signal
, bus: Rc>) -> Self { - Self { + pub fn new(bus: Rc>) -> (Self, CoprocessorBankRegister) { + let base = Rc::new(Cell::new(0)); + let register = CoprocessorBankRegister { base: base.clone() }; + let bank = Self { base, bus, - } + }; + (bank, register) } } diff --git a/emulator/systems/genesis/src/system.rs b/emulator/systems/genesis/src/system.rs index a8fabbd..cd1ccca 100644 --- a/emulator/systems/genesis/src/system.rs +++ b/emulator/systems/genesis/src/system.rs @@ -3,7 +3,7 @@ use std::mem; use std::rc::Rc; use std::cell::RefCell; -use moa_core::{System, Error, Frequency, Signal, MemoryBlock, Bus, Address, Addressable, Device}; +use moa_core::{System, Error, Frequency, MemoryBlock, Bus, Address, Addressable, Device}; use moa_core::host::Host; use moa_m68k::{M68k, M68kType}; @@ -14,7 +14,7 @@ use moa_peripherals_yamaha::Sn76489; use crate::utils; use crate::peripherals::ym7101::Ym7101; use crate::peripherals::controllers::GenesisControllers; -use crate::peripherals::coprocessor::{CoprocessorCoordinator, CoprocessorBankRegister, CoprocessorBankArea}; +use crate::peripherals::coprocessor::{CoprocessorCoordinator, CoprocessorBankArea}; pub struct SegaGenesisOptions { @@ -68,12 +68,12 @@ pub fn build_genesis(host: &mut H, mut options: SegaGenesisOptions) -> // Build the Coprocessor's Bus - let bank_register = Signal::new(0); let coproc_ram = Device::new(MemoryBlock::new(vec![0; 0x00002000])); let coproc_ym_sound = Device::new(Ym2612::new(host, Frequency::from_hz(7_670_454))?); let coproc_sn_sound = Device::new(Sn76489::new(host, Frequency::from_hz(3_579_545))?); - let coproc_register = Device::new(CoprocessorBankRegister::new(bank_register.clone())); - let coproc_area = Device::new(CoprocessorBankArea::new(bank_register, system.bus.clone())); + let (coproc_area, coproc_register) = CoprocessorBankArea::new(system.bus.clone()); + let coproc_area = Device::new(coproc_area); + let coproc_register = Device::new(coproc_register); let coproc_bus = Rc::new(RefCell::new(Bus::default())); coproc_bus.borrow_mut().set_ignore_unmapped(true);