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 041847fd45c3f672f430d2d722fb1b644a01f674
parent b8f568f42693c6465010ea90c3f5e6ff5fd89f81
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Wed, 24 Jul 2024 00:09:10 +0200

fix HDI/UC HDI08/irq issues

Diffstat:
Msource/nord/n2x/n2xLib/n2xdsp.cpp | 44++++++--------------------------------------
1 file changed, 6 insertions(+), 38 deletions(-)

diff --git a/source/nord/n2x/n2xLib/n2xdsp.cpp b/source/nord/n2x/n2xLib/n2xdsp.cpp @@ -198,7 +198,7 @@ namespace n2x }); } const bool res = hdiTransferDSPtoUC(); - assert(!_needMoreData || res); +// assert(!_needMoreData || res); } void DSP::hdiTransferUCtoDSP(const uint32_t _word) @@ -210,44 +210,10 @@ namespace n2x void DSP::hdiSendIrqToDSP(const uint8_t _irq) { - waitDspRxEmpty(); +// waitDspRxEmpty(); const auto& rxData = hdi08().rxData(); - auto& rxHack = const_cast<std::decay_t<decltype(rxData)>&>(rxData); - if(hdi08().rxData().size() > 1) - { - dsp56k::TWord vv = ~0; - while(!hdi08().rxData().empty()) - { - auto v = rxHack.pop_front(); -// if(vv == static_cast<dsp56k::TWord>(~0)) - vv = v; - LOG('[' << m_name << "] Discarding UC2DSP HDI word " << HEX(v)); - } - LOG('[' << m_name << "] Re-sending word " << HEX(vv)); - hdi08().writeRX(&vv,1); - } - - if(m_index == 0) - { - const auto v = rxData.front(); - const auto pc = m_hardware.getUC().getPrevPC(); - - switch (_irq) - { - case 0x64: LOG('[' << m_name << "] r7 = " << HEX(v) << ", pc = " << HEX(pc)); break; - case 0x66: LOG('[' << m_name << "] x:(r7) = " << HEX(v) << ", pc = " << HEX(pc)); break; - case 0x68: LOG('[' << m_name << "] y:(r7) = " << HEX(v) << ", pc = " << HEX(pc)); break; - case 0x6a: LOG('[' << m_name << "] x:(r7)+ = " << HEX(v) << ", pc = " << HEX(pc)); break; - case 0x6c: LOG('[' << m_name << "] y:(r7)+ = " << HEX(v) << ", pc = " << HEX(pc)); break; - case 0x6e: LOG('[' << m_name << "] x:(r7)+n7 = " << HEX(v) << ", pc = " << HEX(pc)); break; - case 0x70: LOG('[' << m_name << "] y:(r7)+n7 = " << HEX(v) << ", pc = " << HEX(pc)); break; - case 0x72: LOG('[' << m_name << "] n7 = " << HEX(v) << ", pc = " << HEX(pc)); break; - default: - LOG('[' << m_name << "] sendIRQtoDSP " << HEXN(_irq, 2)); - break; - } - } + assert(rxData.size() <= 1); dsp().injectExternalInterrupt(_irq); @@ -261,6 +227,8 @@ namespace n2x uint8_t DSP::hdiUcReadIsr(uint8_t _isr) { + hdiTransferDSPtoUC(); + // transfer DSP host flags HF2&3 to uc const auto hf23 = hdi08().readControlRegister() & 0x18; _isr &= ~0x18; @@ -304,7 +272,7 @@ namespace n2x if (m_hdiUC.canReceiveData() && hdi08().hasTX()) { const auto v = hdi08().readTX(); - LOG('[' << m_name << "] HDI dsp2UC=" << HEX(v)); +// LOG('[' << m_name << "] HDI dsp2UC=" << HEX(v)); m_hdiUC.writeRx(v); return true; }