mirror of
https://github.com/transistorfet/moa.git
synced 2024-12-12 20:30:24 +00:00
Add more helper methods
This commit is contained in:
parent
1686afe22b
commit
b1e7634959
@ -179,6 +179,10 @@ pub trait DynDevice: Any + 'static + Transmutable {}
|
|||||||
|
|
||||||
pub type Device = Rc<RefCell<dyn DynDevice>>;
|
pub type Device = Rc<RefCell<dyn DynDevice>>;
|
||||||
|
|
||||||
|
pub fn wrap_device<T: DynDevice>(value: T) -> Device {
|
||||||
|
Rc::new(RefCell::new(value))
|
||||||
|
}
|
||||||
|
|
||||||
impl<T> DynDevice for T where T: Transmutable + 'static {}
|
impl<T> DynDevice for T where T: Transmutable + 'static {}
|
||||||
|
|
||||||
pub trait Transmutable {
|
pub trait Transmutable {
|
||||||
|
@ -7,10 +7,10 @@ mod memory;
|
|||||||
mod system;
|
mod system;
|
||||||
|
|
||||||
pub use crate::devices::{
|
pub use crate::devices::{
|
||||||
Address, Addressable, Steppable, Interruptable, Debuggable, Inspectable, Transmutable, TransmutableBox, DynDevice
|
Address, Addressable, Steppable, Interruptable, Debuggable, Inspectable, Transmutable, TransmutableBox, DynDevice, Device,
|
||||||
};
|
};
|
||||||
pub use crate::devices::{
|
pub use crate::devices::{
|
||||||
read_beu16, read_beu32, read_leu16, read_leu32, write_beu16, write_beu32, write_leu16, write_leu32, wrap_transmutable,
|
read_beu16, read_beu32, read_leu16, read_leu32, write_beu16, write_beu32, write_leu16, write_leu32, wrap_transmutable, wrap_device
|
||||||
};
|
};
|
||||||
pub use crate::error::Error;
|
pub use crate::error::Error;
|
||||||
pub use crate::interrupts::InterruptController;
|
pub use crate::interrupts::InterruptController;
|
||||||
|
@ -4,7 +4,7 @@ use std::collections::{BTreeMap, HashMap};
|
|||||||
use femtos::{Instant, Duration};
|
use femtos::{Instant, Duration};
|
||||||
|
|
||||||
use crate::devices::{downcast_rc_refc, get_next_device_id, Device, DeviceId, DynDevice};
|
use crate::devices::{downcast_rc_refc, get_next_device_id, Device, DeviceId, DynDevice};
|
||||||
use crate::{Address, Bus, Error, InterruptController};
|
use crate::{wrap_device, Address, Bus, Error, InterruptController};
|
||||||
|
|
||||||
|
|
||||||
pub struct System {
|
pub struct System {
|
||||||
@ -127,12 +127,7 @@ impl System {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_device<T: DynDevice>(&mut self, device: T, settings: DeviceSettings) -> Result<DeviceId, Error> {
|
pub fn add_device<T: DynDevice>(&mut self, device: T, settings: DeviceSettings) -> Result<DeviceId, Error> {
|
||||||
self.add_device_rc_ref(Rc::new(RefCell::new(device)), settings)
|
self.add_device_rc_dyn(wrap_device(device), settings)
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_device_rc_ref<T: DynDevice>(&mut self, device: Rc<RefCell<T>>, settings: DeviceSettings) -> Result<DeviceId, Error> {
|
|
||||||
let device = device as Device;
|
|
||||||
self.add_device_rc_dyn(device, settings)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_device_rc_dyn(&mut self, device: Device, settings: DeviceSettings) -> Result<DeviceId, Error> {
|
pub fn add_device_rc_dyn(&mut self, device: Device, settings: DeviceSettings) -> Result<DeviceId, Error> {
|
||||||
@ -154,7 +149,11 @@ impl System {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_named_device<T: DynDevice>(&mut self, name: &str, device: T) -> Result<DeviceId, Error> {
|
pub fn add_named_device<T: DynDevice>(&mut self, name: &str, device: T) -> Result<DeviceId, Error> {
|
||||||
self.add_device(device, DeviceSettings {
|
self.add_named_device_rc_dyn(name, wrap_device(device))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_named_device_rc_dyn(&mut self, name: &str, device: Device) -> Result<DeviceId, Error> {
|
||||||
|
self.add_device_rc_dyn(device, DeviceSettings {
|
||||||
name: Some(name.to_owned()),
|
name: Some(name.to_owned()),
|
||||||
queue: true,
|
queue: true,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
@ -162,16 +161,25 @@ impl System {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_addressable_device<T: DynDevice>(&mut self, addr: Address, device: T) -> Result<DeviceId, Error> {
|
pub fn add_addressable_device<T: DynDevice>(&mut self, addr: Address, device: T) -> Result<DeviceId, Error> {
|
||||||
self.add_device(device, DeviceSettings {
|
self.add_addressable_device_rc_dyn(addr, wrap_device(device))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_addressable_device_rc_dyn(&mut self, addr: Address, device: Device) -> Result<DeviceId, Error> {
|
||||||
|
self.add_device_rc_dyn(device, DeviceSettings {
|
||||||
name: Some(format!("mem{:x}", addr)),
|
name: Some(format!("mem{:x}", addr)),
|
||||||
address: Some(addr),
|
address: Some(addr),
|
||||||
queue: true,
|
queue: true,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn add_peripheral<T: DynDevice>(&mut self, name: &str, addr: Address, device: T) -> Result<DeviceId, Error> {
|
pub fn add_peripheral<T: DynDevice>(&mut self, name: &str, addr: Address, device: T) -> Result<DeviceId, Error> {
|
||||||
self.add_device(device, DeviceSettings {
|
self.add_peripheral_rc_dyn(name, addr, wrap_device(device))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_peripheral_rc_dyn(&mut self, name: &str, addr: Address, device: Device) -> Result<DeviceId, Error> {
|
||||||
|
self.add_device_rc_dyn(device, DeviceSettings {
|
||||||
name: Some(name.to_owned()),
|
name: Some(name.to_owned()),
|
||||||
address: Some(addr),
|
address: Some(addr),
|
||||||
queue: true,
|
queue: true,
|
||||||
@ -180,7 +188,11 @@ impl System {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_interruptable_device<T: DynDevice>(&mut self, name: &str, device: T) -> Result<DeviceId, Error> {
|
pub fn add_interruptable_device<T: DynDevice>(&mut self, name: &str, device: T) -> Result<DeviceId, Error> {
|
||||||
self.add_device(device, DeviceSettings {
|
self.add_interruptable_device_rc_dyn(name, wrap_device(device))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_interruptable_device_rc_dyn(&mut self, name: &str, device: Device) -> Result<DeviceId, Error> {
|
||||||
|
self.add_device_rc_dyn(device, DeviceSettings {
|
||||||
name: Some(name.to_owned()),
|
name: Some(name.to_owned()),
|
||||||
queue: true,
|
queue: true,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
Loading…
Reference in New Issue
Block a user