n2xhdi08.h (1550B)
1 #pragma once 2 3 #include <cassert> 4 5 #include "n2xtypes.h" 6 7 #include "mc68k/hdi08periph.h" 8 9 namespace n2x 10 { 11 using Hdi08DspA = mc68k::Hdi08Periph<g_dspAAddress>; 12 using Hdi08DspB = mc68k::Hdi08Periph<g_dspBAddress>; 13 14 class Hdi08DspBoth : public mc68k::PeripheralBase<g_dspBothAddress, g_dspAAddress - g_dspBothAddress> 15 { 16 public: 17 static constexpr uint32_t OffsetA = g_dspAAddress - base(); 18 static constexpr uint32_t OffsetB = g_dspBAddress - base(); 19 20 Hdi08DspBoth(Hdi08DspA& _a, Hdi08DspB& _b) : m_a(_a), m_b(_b) 21 { 22 } 23 24 void write8(const mc68k::PeriphAddress _addr, const uint8_t _val) override 25 { 26 m_a.write8(offA(_addr), _val); 27 m_b.write8(offB(_addr), _val); 28 } 29 30 void write16(const mc68k::PeriphAddress _addr, const uint16_t _val) override 31 { 32 m_a.write16(offA(_addr), _val); 33 m_b.write16(offB(_addr), _val); 34 } 35 36 uint8_t read8(const mc68k::PeriphAddress _addr) override 37 { 38 assert(false && "not readable"); 39 return m_a.read8(_addr); 40 } 41 42 uint16_t read16(const mc68k::PeriphAddress _addr) override 43 { 44 assert(false && "not readable"); 45 return m_a.read16(_addr); 46 } 47 48 static mc68k::PeriphAddress offA(const mc68k::PeriphAddress _addr) 49 { 50 return off<OffsetA>(_addr); 51 } 52 53 static mc68k::PeriphAddress offB(const mc68k::PeriphAddress _addr) 54 { 55 return off<OffsetB>(_addr); 56 } 57 58 template<uint32_t Off> static mc68k::PeriphAddress off(mc68k::PeriphAddress _addr) 59 { 60 return static_cast<mc68k::PeriphAddress>(static_cast<uint32_t>(_addr) + Off); 61 } 62 private: 63 Hdi08DspA& m_a; 64 Hdi08DspB& m_b; 65 }; 66 }