gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

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 }