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

commit 43912b2a127e7499de0baabe3af849379f35d45a
parent 34c9eaf92356fc9fbdc276a01ad88ac183c74c03
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Sat, 20 Jul 2024 03:45:15 +0200

begin front panel & keyboard classes

Diffstat:
Msource/nord/n2x/n2xLib/CMakeLists.txt | 2++
Msource/nord/n2x/n2xLib/n2xdevice.cpp | 5+++++
Asource/nord/n2x/n2xLib/n2xfrontpanel.cpp | 15+++++++++++++++
Asource/nord/n2x/n2xLib/n2xfrontpanel.h | 40++++++++++++++++++++++++++++++++++++++++
Asource/nord/n2x/n2xLib/n2xkeyboard.cpp | 5+++++
Asource/nord/n2x/n2xLib/n2xkeyboard.h | 5+++++
Msource/nord/n2x/n2xLib/n2xmc.cpp | 53+++++++++++++++++++++++++++++++++++++++++------------
Msource/nord/n2x/n2xLib/n2xmc.h | 2++
Msource/nord/n2x/n2xLib/n2xtypes.h | 26+++++++++++++-------------
9 files changed, 128 insertions(+), 25 deletions(-)

diff --git a/source/nord/n2x/n2xLib/CMakeLists.txt b/source/nord/n2x/n2xLib/CMakeLists.txt @@ -8,8 +8,10 @@ set(SOURCES i2c.cpp i2c.h n2xdevice.cpp n2xdevice.h n2xdsp.cpp n2xdsp.h + n2xfrontpanel.cpp n2xfrontpanel.h n2xhardware.cpp n2xhardware.h n2xi2cflash.cpp n2xi2cflash.h + n2xkeyboard.cpp n2xkeyboard.h n2xmc.cpp n2xmc.h n2xmiditypes.h n2xrom.cpp n2xrom.h diff --git a/source/nord/n2x/n2xLib/n2xdevice.cpp b/source/nord/n2x/n2xLib/n2xdevice.cpp @@ -0,0 +1,5 @@ +#include "n2xdevice.h" + +namespace n2x +{ +} diff --git a/source/nord/n2x/n2xLib/n2xfrontpanel.cpp b/source/nord/n2x/n2xLib/n2xfrontpanel.cpp @@ -0,0 +1,15 @@ +#include "n2xfrontpanel.h" + +namespace n2x +{ + template class FrontPanelCS<g_frontPanelAddressCS4>; + template class FrontPanelCS<g_frontPanelAddressCS6>; + + template <uint32_t Base> FrontPanelCS<Base>::FrontPanelCS(FrontPanel& _fp): m_panel(_fp) + { + } + + FrontPanel::FrontPanel(): m_cs4(*this), m_cs6(*this) + { + } +} diff --git a/source/nord/n2x/n2xLib/n2xfrontpanel.h b/source/nord/n2x/n2xLib/n2xfrontpanel.h @@ -0,0 +1,40 @@ +#pragma once + +#include "n2xtypes.h" +#include "mc68k/peripheralBase.h" + +namespace n2x +{ + class FrontPanel; + + template<uint32_t Base> + class FrontPanelCS : public mc68k::PeripheralBase<Base, g_frontPanelSize> + { + public: + explicit FrontPanelCS(FrontPanel& _fp); + + private: + FrontPanel& m_panel; + }; + + using FrontPanelCS4 = FrontPanelCS<g_frontPanelAddressCS4>; + using FrontPanelCS6 = FrontPanelCS<g_frontPanelAddressCS6>; + + class FrontPanel + { + public: + FrontPanel(); + + auto& cs4() { return m_cs4; } + auto& cs6() { return m_cs6; } + + bool isInRange(const mc68k::PeriphAddress _pa) const + { + return m_cs4.isInRange(_pa) || m_cs6.isInRange(_pa); + } + + private: + FrontPanelCS4 m_cs4; + FrontPanelCS6 m_cs6; + }; +} diff --git a/source/nord/n2x/n2xLib/n2xkeyboard.cpp b/source/nord/n2x/n2xLib/n2xkeyboard.cpp @@ -0,0 +1,5 @@ +#include "n2xkeyboard.h" + +namespace n2x +{ +} diff --git a/source/nord/n2x/n2xLib/n2xkeyboard.h b/source/nord/n2x/n2xLib/n2xkeyboard.h @@ -0,0 +1,5 @@ +#pragma once + +namespace n2x +{ +} diff --git a/source/nord/n2x/n2xLib/n2xmc.cpp b/source/nord/n2x/n2xLib/n2xmc.cpp @@ -96,6 +96,7 @@ namespace n2x assert(!m_hdi08A.isInRange(pa)); assert(!m_hdi08B.isInRange(pa)); + assert(!m_panel.isInRange(pa)); return 0; } @@ -110,16 +111,16 @@ namespace n2x if(m_hdi08A.isInRange(pa)) return m_hdi08A.read16(pa); if(m_hdi08B.isInRange(pa)) return m_hdi08B.read16(pa); - if(_addr >= g_frontPanelAddressA && _addr < g_frontPanelAddressA + g_frontPanelSize) + if(m_panel.cs4().isInRange(pa)) { - LOG("Read Frontpanel A " << HEX(_addr)); - return 0; + LOG("Read Frontpanel CS4 " << HEX(_addr)); + return m_panel.cs4().read16(pa); } - if(_addr >= g_frontPanelAddressB && _addr < g_frontPanelAddressB + g_frontPanelSize) + if(m_panel.cs6().isInRange(pa)) { - LOG("Read Frontpanel B " << HEX(_addr)); - return 0; + LOG("Read Frontpanel CS6 " << HEX(_addr)); + return m_panel.cs6().read16(pa); } if(_addr >= g_keyboardAddress && _addr < g_keyboardAddress + g_keyboardSize) @@ -141,16 +142,16 @@ namespace n2x if(m_hdi08A.isInRange(pa)) return m_hdi08A.read8(pa); if(m_hdi08B.isInRange(pa)) return m_hdi08B.read8(pa); - if(_addr >= g_frontPanelAddressA && _addr < g_frontPanelAddressA + g_frontPanelSize) + if(m_panel.cs4().isInRange(pa)) { - LOG("Read Frontpanel A " << HEX(_addr)); - return 0xff; + LOG("Read Frontpanel CS4 " << HEX(_addr)); + return 0xff;//m_panel.cs4().read8(pa); } - if(_addr >= g_frontPanelAddressB && _addr < g_frontPanelAddressB + g_frontPanelSize) + if(m_panel.cs6().isInRange(pa)) { - LOG("Read Frontpanel B " << HEX(_addr)); - return 0xff; + LOG("Read Frontpanel CS6 " << HEX(_addr)); + return m_panel.cs6().read8(pa); } if(_addr >= g_keyboardAddress && _addr < g_keyboardAddress + g_keyboardSize) @@ -190,6 +191,20 @@ namespace n2x return; } + if(m_panel.cs4().isInRange(pa)) + { + LOG("Write Frontpanel CS4 " << HEX(_addr) << "=" << HEXN(_val, 4)); + m_panel.cs4().write16(pa, _val); + return; + } + + if(m_panel.cs6().isInRange(pa)) + { + LOG("Write Frontpanel CS6 " << HEX(_addr) << "=" << HEXN(_val, 4)); + m_panel.cs6().write16(pa, _val); + return; + } + Mc68k::write16(_addr, _val); } @@ -220,6 +235,20 @@ namespace n2x m_hdi08B.write8(pa, _val); return; } + + if(m_panel.cs4().isInRange(pa)) + { + LOG("Write Frontpanel CS4 " << HEX(_addr) << "=" << HEXN(_val, 2)); + m_panel.cs4().write8(pa, _val); + return; + } + + if(m_panel.cs6().isInRange(pa)) + { + LOG("Write Frontpanel CS6 " << HEX(_addr) << "=" << HEXN(_val, 2)); + m_panel.cs6().write8(pa, _val); + return; + } Mc68k::write8(_addr, _val); } diff --git a/source/nord/n2x/n2xLib/n2xmc.h b/source/nord/n2x/n2xLib/n2xmc.h @@ -1,5 +1,6 @@ #pragma once +#include "n2xfrontpanel.h" #include "n2xi2cflash.h" #include "n2xtypes.h" #include "mc68k/hdi08.h" @@ -42,6 +43,7 @@ namespace n2x Hdi08DspA m_hdi08A; Hdi08DspB m_hdi08B; + FrontPanel m_panel; uint32_t m_prevPC; wLib::Midi m_midi; diff --git a/source/nord/n2x/n2xLib/n2xtypes.h b/source/nord/n2x/n2xLib/n2xtypes.h @@ -19,22 +19,22 @@ namespace n2x CSBOOT = BootROM $?????? $????? */ - static constexpr uint32_t g_romSize = 1024 * 512; - static constexpr uint32_t g_ramSize = 1024 * 256; - static constexpr uint32_t g_flashSize = 1024 * 64; + static constexpr uint32_t g_romSize = 1024 * 512; + static constexpr uint32_t g_ramSize = 1024 * 256; + static constexpr uint32_t g_flashSize = 1024 * 64; - static constexpr uint32_t g_pcInitial = 0xc2; + static constexpr uint32_t g_pcInitial = 0xc2; - static constexpr uint32_t g_romAddress = 0; - static constexpr uint32_t g_ramAddress = 0x100000; + static constexpr uint32_t g_romAddress = 0; + static constexpr uint32_t g_ramAddress = 0x100000; - static constexpr uint32_t g_dspAAddress = 0x200008; - static constexpr uint32_t g_dspBAddress = 0x200010; + static constexpr uint32_t g_dspAAddress = 0x200008; + static constexpr uint32_t g_dspBAddress = 0x200010; - static constexpr uint32_t g_frontPanelAddressA = 0x202800; - static constexpr uint32_t g_frontPanelAddressB = 0x202000; - static constexpr uint32_t g_keyboardAddress = 0x203000; + static constexpr uint32_t g_frontPanelAddressCS4 = 0x202800; + static constexpr uint32_t g_frontPanelAddressCS6 = 0x202000; + static constexpr uint32_t g_keyboardAddress = 0x203000; - static constexpr uint32_t g_frontPanelSize = 0x800; - static constexpr uint32_t g_keyboardSize = 0x800; + static constexpr uint32_t g_frontPanelSize = 0x800; + static constexpr uint32_t g_keyboardSize = 0x800; }