Trait spectrusty::bus::BusDevice

source ·
pub trait BusDevice: Debug {
    type Timestamp: Sized;
    type NextDevice: BusDevice<Timestamp = Self::Timestamp>;

    fn next_device_mut(&mut self) -> &mut Self::NextDevice;
    fn next_device_ref(&self) -> &Self::NextDevice;
    fn into_next_device(self) -> Self::NextDevice;

    fn reset(&mut self, timestamp: Self::Timestamp) { ... }
    fn update_timestamp(&mut self, timestamp: Self::Timestamp) { ... }
    fn next_frame(&mut self, eof_timestamp: Self::Timestamp) { ... }
    fn read_io(
        &mut self,
        port: u16,
        timestamp: Self::Timestamp
    ) -> Option<(u8, Option<NonZeroU16>)> { ... } fn write_io(
        &mut self,
        port: u16,
        data: u8,
        timestamp: Self::Timestamp
    ) -> Option<u16> { ... } fn type_id(&self) -> TypeId
    where
        Self: 'static
, { ... } }
Expand description

An interface for emulating devices that communicate with the emulated CPU via I/O requests.

This trait allows attaching many, different devices to form a so-called “daisy chain”.

Implementations of this trait should be provided as an associated type of ControlUnit::BusDevice.

Required Associated Types§

A type used as a time-stamp.

A type of the next device in a daisy chain.

Required Methods§

Returns a mutable reference to the next device.

Returns a reference to the next device.

Destructs self and returns the instance of the next bus device.

Provided Methods§

Resets the device and all devices in this chain.

This method is called from ControlUnit::reset.

Default implementation forwards this call to the next device.

NOTE: Implementations should always forward this call down the chain after optionally applying it to self.

This method should be called near the end of each frame.

Default implementation forwards this call to the next device.

NOTE: Implementations should always forward this call down the chain after optionally applying it to self.

This method should be called just before the T-state counter of the control unit is wrapped when preparing for the next frame.

It allows the devices that are tracking time to adjust stored timestamps accordingly by subtracting the total number of T-states per frame from the stored ones. The eof_timestamp argument indicates the total number of T-states in a single frame.

Optionally enables implementations to perform an end-of-frame action.

Default implementation forwards this call to the next device.

NOTE: Implementations should always forward this call down the chain after optionally applying it to self.

This method is called by the control unit during an I/O read cycle.

Default implementation forwards this call to the next device.

Returns an optional tuple with the (data, insert wait states).

NOTE: Implementations should only need to forward this call if it does not apply to this device or if not all bits are modified by the implementing device. In the latter case the result from the forwarded call should be logically ANDed with the result of reading from this device and if the upstream result is None the result should be returned with all unused bits set to 1.

This method is called by the control unit during an I/O write cycle.

Returns Some(insert wait states) if the device has blocked writing through it.

Default implementation forwards this call to the next device.

NOTE: Implementations should only forward this call to the next device if it does not apply to this device or if the device doesn’t block writing. If the device blocks writing to downstream devices and the port matches, this method must return true. Otherwise this method should return the forwarded result.

Gets the TypeId of self.

A required part for the ability to downcast dynamic BusDevice instances.

Safety

The default implementation of this method must not be overwritten by the specializations. Consider this method as final.

Implementations on Foreign Types§

Implementors§