Moved AddressRepeater to core, and renamed AddressAdapter
AddressRepeater now takes the range it should repeat over, which only really affects its reported size. AddressAdapter is now AddressRightShifter, which is literally the operation it performs, where the input is still the bits to shift the address right by
This commit is contained in:
parent
2d6044084d
commit
7c279613cc
|
@ -18,7 +18,7 @@ pub use crate::devices::{Clock, ClockElapsed, Address, Addressable, Steppable, I
|
|||
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, ErrorType, LogLevel, log_level};
|
||||
pub use crate::interrupts::InterruptController;
|
||||
pub use crate::memory::{MemoryBlock, AddressAdapter, Bus, BusPort, dump_slice};
|
||||
pub use crate::memory::{MemoryBlock, AddressRightShifter, AddressRepeater, Bus, BusPort, dump_slice};
|
||||
pub use crate::signals::{Observable, Signal, EdgeSignal, ObservableSignal, ObservableEdgeSignal};
|
||||
pub use crate::system::System;
|
||||
|
||||
|
|
|
@ -79,12 +79,12 @@ impl Transmutable for MemoryBlock {
|
|||
}
|
||||
|
||||
|
||||
pub struct AddressAdapter {
|
||||
pub struct AddressRightShifter {
|
||||
subdevice: TransmutableBox,
|
||||
shift: u8,
|
||||
}
|
||||
|
||||
impl AddressAdapter {
|
||||
impl AddressRightShifter {
|
||||
pub fn new(subdevice: TransmutableBox, shift: u8) -> Self {
|
||||
Self {
|
||||
subdevice,
|
||||
|
@ -93,7 +93,7 @@ impl AddressAdapter {
|
|||
}
|
||||
}
|
||||
|
||||
impl Addressable for AddressAdapter {
|
||||
impl Addressable for AddressRightShifter {
|
||||
fn len(&self) -> usize {
|
||||
let len = self.subdevice.borrow_mut().as_addressable().unwrap().len();
|
||||
len << self.shift
|
||||
|
@ -108,7 +108,44 @@ impl Addressable for AddressAdapter {
|
|||
}
|
||||
}
|
||||
|
||||
impl Transmutable for AddressAdapter {
|
||||
impl Transmutable for AddressRightShifter {
|
||||
fn as_addressable(&mut self) -> Option<&mut dyn Addressable> {
|
||||
Some(self)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub struct AddressRepeater {
|
||||
subdevice: TransmutableBox,
|
||||
range: Address,
|
||||
}
|
||||
|
||||
impl AddressRepeater {
|
||||
pub fn new(subdevice: TransmutableBox, range: Address) -> Self {
|
||||
Self {
|
||||
subdevice,
|
||||
range,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Addressable for AddressRepeater {
|
||||
fn len(&self) -> usize {
|
||||
self.range as usize
|
||||
}
|
||||
|
||||
fn read(&mut self, addr: Address, data: &mut [u8]) -> Result<(), Error> {
|
||||
let len = self.subdevice.borrow_mut().as_addressable().unwrap().len() as Address;
|
||||
self.subdevice.borrow_mut().as_addressable().unwrap().read(addr % len, data)
|
||||
}
|
||||
|
||||
fn write(&mut self, addr: Address, data: &[u8]) -> Result<(), Error> {
|
||||
let len = self.subdevice.borrow_mut().as_addressable().unwrap().len() as Address;
|
||||
self.subdevice.borrow_mut().as_addressable().unwrap().write(addr % len, data)
|
||||
}
|
||||
}
|
||||
|
||||
impl Transmutable for AddressRepeater {
|
||||
fn as_addressable(&mut self) -> Option<&mut dyn Addressable> {
|
||||
Some(self)
|
||||
}
|
||||
|
|
|
@ -224,11 +224,21 @@ impl MiniFrontend {
|
|||
// Limit to max ~60 fps update rate
|
||||
window.limit_update_rate(Some(Duration::from_micros(16600)));
|
||||
|
||||
let mut average_time = 0;
|
||||
let mut update_timer = Instant::now();
|
||||
while window.is_open() && !window.is_key_down(Key::Escape) {
|
||||
let frame_time = update_timer.elapsed().as_micros();
|
||||
update_timer = Instant::now();
|
||||
println!("new frame after {:?}us", frame_time);
|
||||
|
||||
let run_timer = Instant::now();
|
||||
if let Some(system) = system.as_mut() {
|
||||
system.run_for(nanoseconds_per_frame).unwrap();
|
||||
//system.run_until_break().unwrap();
|
||||
}
|
||||
let sim_time = run_timer.elapsed().as_micros();
|
||||
average_time = (average_time + sim_time) / 2;
|
||||
println!("ran simulation for {:?}us in {:?}us (avg: {:?}us)", nanoseconds_per_frame / 1_000, sim_time, average_time);
|
||||
|
||||
if let Some(keys) = window.get_keys_pressed(minifb::KeyRepeat::No) {
|
||||
for key in keys {
|
||||
|
|
|
@ -3,7 +3,7 @@ use std::mem;
|
|||
use std::rc::Rc;
|
||||
use std::cell::RefCell;
|
||||
|
||||
use moa_core::{System, Error, Signal, MemoryBlock, Bus, BusPort, Address, Addressable, Debuggable, wrap_transmutable};
|
||||
use moa_core::{System, Error, Signal, MemoryBlock, AddressRepeater, Bus, BusPort, Address, Addressable, Debuggable, wrap_transmutable};
|
||||
use moa_core::host::Host;
|
||||
|
||||
use moa_m68k::{M68k, M68kType};
|
||||
|
@ -70,7 +70,7 @@ pub fn build_genesis<H: Host>(host: &mut H, mut options: SegaGenesisOptions) ->
|
|||
// Build the Coprocessor's Bus
|
||||
let bank_register = Signal::new(0);
|
||||
let coproc_ram = wrap_transmutable(MemoryBlock::new(vec![0; 0x00002000]));
|
||||
let coproc_ym_sound = wrap_transmutable(Ym2612::create(host)?);
|
||||
let coproc_ym_sound = wrap_transmutable(AddressRepeater::new(wrap_transmutable(Ym2612::create(host)?), 0x2000));
|
||||
let coproc_sn_sound = wrap_transmutable(Sn76489::create(host)?);
|
||||
let coproc_register = wrap_transmutable(CoprocessorBankRegister::new(bank_register.clone()));
|
||||
let coproc_area = wrap_transmutable(CoprocessorBankArea::new(bank_register, system.bus.clone()));
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
use std::rc::Rc;
|
||||
use std::cell::RefCell;
|
||||
|
||||
use moa_core::{System, Bus, Error, Observable, Clock, ClockElapsed, Address, Addressable, Steppable, Transmutable, TransmutableBox, wrap_transmutable};
|
||||
use moa_core::{System, Bus, Error, Observable, Clock, ClockElapsed, Address, Addressable, AddressRepeater, Steppable, Transmutable, TransmutableBox, wrap_transmutable};
|
||||
|
||||
use moa_peripherals_mos::Mos6522;
|
||||
use moa_peripherals_zilog::Z8530;
|
||||
|
@ -45,16 +45,16 @@ impl Mainboard {
|
|||
if (port.data & 0x10) == 0 {
|
||||
println!("{}: overlay is 0 (normal)", DEV_NAME);
|
||||
lower_bus.borrow_mut().clear_all_bus_devices();
|
||||
lower_bus.borrow_mut().insert(0x000000, wrap_transmutable(AddressRepeater::new(ram.clone(), 32)));
|
||||
lower_bus.borrow_mut().insert(0x400000, wrap_transmutable(AddressRepeater::new(rom.clone(), 16)));
|
||||
lower_bus.borrow_mut().insert(0x600000, wrap_transmutable(AddressRepeater::new(rom.clone(), 16)));
|
||||
lower_bus.borrow_mut().insert(0x000000, wrap_transmutable(AddressRepeater::new(ram.clone(), 0x400000)));
|
||||
lower_bus.borrow_mut().insert(0x400000, wrap_transmutable(AddressRepeater::new(rom.clone(), 0x100000)));
|
||||
lower_bus.borrow_mut().insert(0x600000, wrap_transmutable(AddressRepeater::new(rom.clone(), 0x100000)));
|
||||
} else {
|
||||
println!("{}: overlay is 1 (startup)", DEV_NAME);
|
||||
lower_bus.borrow_mut().clear_all_bus_devices();
|
||||
lower_bus.borrow_mut().insert(0x000000, wrap_transmutable(AddressRepeater::new(rom.clone(), 16)));
|
||||
lower_bus.borrow_mut().insert(0x200000, wrap_transmutable(AddressRepeater::new(rom.clone(), 16)));
|
||||
lower_bus.borrow_mut().insert(0x400000, wrap_transmutable(AddressRepeater::new(rom.clone(), 16)));
|
||||
lower_bus.borrow_mut().insert(0x600000, wrap_transmutable(AddressRepeater::new(ram.clone(), 16)));
|
||||
lower_bus.borrow_mut().insert(0x000000, wrap_transmutable(AddressRepeater::new(rom.clone(), 0x100000)));
|
||||
lower_bus.borrow_mut().insert(0x200000, wrap_transmutable(AddressRepeater::new(rom.clone(), 0x100000)));
|
||||
lower_bus.borrow_mut().insert(0x400000, wrap_transmutable(AddressRepeater::new(rom.clone(), 0x100000)));
|
||||
lower_bus.borrow_mut().insert(0x600000, wrap_transmutable(AddressRepeater::new(ram.clone(), 0x200000)));
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -164,42 +164,3 @@ impl Addressable for PhaseRead {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
pub struct AddressRepeater {
|
||||
subdevice: TransmutableBox,
|
||||
repeat: u8,
|
||||
}
|
||||
|
||||
impl AddressRepeater {
|
||||
pub fn new(subdevice: TransmutableBox, repeat: u8) -> Self {
|
||||
Self {
|
||||
subdevice,
|
||||
repeat,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Addressable for AddressRepeater {
|
||||
fn len(&self) -> usize {
|
||||
let len = self.subdevice.borrow_mut().as_addressable().unwrap().len();
|
||||
len * self.repeat as usize
|
||||
}
|
||||
|
||||
fn read(&mut self, addr: Address, data: &mut [u8]) -> Result<(), Error> {
|
||||
let len = self.subdevice.borrow_mut().as_addressable().unwrap().len() as Address;
|
||||
self.subdevice.borrow_mut().as_addressable().unwrap().read(addr % len, data)
|
||||
}
|
||||
|
||||
fn write(&mut self, addr: Address, data: &[u8]) -> Result<(), Error> {
|
||||
let len = self.subdevice.borrow_mut().as_addressable().unwrap().len() as Address;
|
||||
self.subdevice.borrow_mut().as_addressable().unwrap().write(addr % len, data)
|
||||
}
|
||||
}
|
||||
|
||||
impl Transmutable for AddressRepeater {
|
||||
fn as_addressable(&mut self) -> Option<&mut dyn Addressable> {
|
||||
Some(self)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ pub fn build_macintosh_512k<H: Host>(host: &mut H) -> Result<System, Error> {
|
|||
system.add_addressable_device(0x00BFFFF0, wrap_transmutable(scc2))?;
|
||||
|
||||
let iwm = IWM::new();
|
||||
let adapter = AddressAdapter::new(wrap_transmutable(iwm), 9);
|
||||
let adapter = AddressRightShifter::new(wrap_transmutable(iwm), 9);
|
||||
system.add_addressable_device(0x00DFE1FF, wrap_transmutable(adapter))?;
|
||||
|
||||
//let via = wrap_transmutable(Mos6522::new());
|
||||
|
@ -54,7 +54,7 @@ pub fn build_macintosh_512k<H: Host>(host: &mut H) -> Result<System, Error> {
|
|||
system.add_addressable_device(0x00000000, mainboard.bus.clone())?;
|
||||
let mainboard_boxed = wrap_transmutable(mainboard);
|
||||
system.add_device("via", mainboard_boxed.clone())?;
|
||||
let adapter = AddressAdapter::new(mainboard_boxed, 9);
|
||||
let adapter = AddressRightShifter::new(mainboard_boxed, 9);
|
||||
system.add_addressable_device(0x00EFE000, wrap_transmutable(adapter))?;
|
||||
*/
|
||||
|
||||
|
|
Loading…
Reference in New Issue