hdi08Queue.h (1163B)
1 #pragma once 2 3 #include <vector> 4 #include <deque> 5 #include <mutex> 6 7 #include "dsp56kEmu/types.h" 8 9 namespace dsp56k 10 { 11 class HDI08; 12 } 13 14 namespace virusLib 15 { 16 class Hdi08Queue 17 { 18 public: 19 Hdi08Queue(dsp56k::HDI08& _hdi08); 20 Hdi08Queue(Hdi08Queue&& _s) noexcept 21 : m_hdi08(_s.m_hdi08) 22 , m_dataRX(std::move(_s.m_dataRX)) 23 , m_lastHostFlag0(_s.m_lastHostFlag0) 24 , m_lastHostFlag1(_s.m_lastHostFlag1) 25 , m_nextHostFlags(_s.m_nextHostFlags) 26 { 27 } 28 Hdi08Queue(const Hdi08Queue&) = delete; 29 30 void writeRX(const std::vector<dsp56k::TWord>& _data); 31 void writeRX(const dsp56k::TWord* _data, size_t _count); 32 33 void writeHostFlags(uint8_t _flag0, uint8_t _flag1); 34 35 void exec(); 36 37 bool rxEmpty() const; 38 39 dsp56k::HDI08& get() const { return m_hdi08; } 40 41 private: 42 bool rxFull() const; 43 bool needsToWaitforHostFlags(uint8_t _flag0, uint8_t _flag1) const; 44 void sendPendingData(); 45 46 static constexpr uint8_t HostFlagInvalid = 0xff; 47 48 dsp56k::HDI08& m_hdi08; 49 std::deque<dsp56k::TWord> m_dataRX; 50 51 uint8_t m_lastHostFlag0 = HostFlagInvalid; 52 uint8_t m_lastHostFlag1 = HostFlagInvalid; 53 54 uint32_t m_nextHostFlags = 0; 55 56 mutable std::mutex m_mutex; 57 }; 58 }