diff --git a/devices/common/dmacore.h b/devices/common/dmacore.h index 72bedb8..5737cd2 100644 --- a/devices/common/dmacore.h +++ b/devices/common/dmacore.h @@ -33,7 +33,16 @@ enum DmaPullResult : int { class DmaOutChannel { public: - virtual bool is_active() = 0; + virtual bool is_active() { return true; }; + virtual DmaPullResult pull_data(uint32_t req_len, uint32_t *avail_len, + uint8_t **p_data) = 0; +}; + +// Base class for bidirectional DMA channels. +class DmaBidirChannel { +public: + virtual bool is_active() { return true; }; + virtual int push_data(const char* src_ptr, int len) = 0; virtual DmaPullResult pull_data(uint32_t req_len, uint32_t *avail_len, uint8_t **p_data) = 0; }; diff --git a/devices/floppy/swim3.h b/devices/floppy/swim3.h index 2b5a154..05acf8e 100644 --- a/devices/floppy/swim3.h +++ b/devices/floppy/swim3.h @@ -24,6 +24,7 @@ along with this program. If not, see . #ifndef SWIM3_H #define SWIM3_H +#include #include #include #include @@ -78,6 +79,10 @@ public: uint8_t read(uint8_t reg_offset); void write(uint8_t reg_offset, uint8_t value); + void set_dma_channel(DmaBidirChannel *dma_ch) { + this->dma_ch = dma_ch; + }; + protected: void update_irq(); void start_stepping(); @@ -89,6 +94,8 @@ protected: private: std::unique_ptr int_drive; + DmaBidirChannel* dma_ch; + uint8_t setup_reg; uint8_t mode_reg; uint8_t error;