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:
transistor 2022-10-01 21:01:56 -07:00
parent 2d6044084d
commit 7c279613cc
6 changed files with 64 additions and 56 deletions

View File

@ -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;

View File

@ -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)
}

View File

@ -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 {

View File

@ -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()));

View File

@ -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)
}
}

View File

@ -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))?;
*/