diff --git a/src/mame/namco/namcos21_dsp_c67.cpp b/src/mame/namco/namcos21_dsp_c67.cpp index a33f905046c..cf540ebce60 100644 --- a/src/mame/namco/namcos21_dsp_c67.cpp +++ b/src/mame/namco/namcos21_dsp_c67.cpp @@ -34,14 +34,14 @@ namcos21_dsp_c67_device::namcos21_dsp_c67_device(const machine_config &mconfig, void namcos21_dsp_c67_device::device_start() { - m_dspram16.resize(0x10000/2); // 0x8000 16-bit words - std::fill(std::begin(m_dspram16), std::end(m_dspram16), 0x0000); + m_dspram16 = std::make_unique(0x10000/2); // 0x8000 16-bit words + std::fill_n(m_dspram16.get(), 0x10000/2, 0x0000); m_yield_hack_cb.resolve_safe(); m_pointram = std::make_unique(PTRAM_SIZE); m_mpDspState = std::make_unique(); - save_item(NAME(m_dspram16)); + save_pointer(NAME(m_dspram16), 0x10000/2); save_item(NAME(m_mpDspState->masterSourceAddr)); save_item(NAME(m_mpDspState->slaveInputBuffer)); @@ -213,24 +213,23 @@ void namcos21_dsp_c67_device::transmit_word_to_slave(uint16_t data) void namcos21_dsp_c67_device::transfer_dsp_data() { uint16_t addr = m_mpDspState->masterSourceAddr; - int mode = addr&0x8000; - addr&=0x7fff; - if( addr ) + bool const mode = BIT(addr, 15); + addr &= 0x7fff; + if (addr) { - for(;;) + for (;;) { - int i; - uint16_t old = addr; - uint16_t code = m_dspram16[addr++]; - if( code == 0xffff ) + uint16_t const old = addr; + uint16_t const code = m_dspram16[addr++]; + if (code == 0xffff) { - if( mode ) + if (mode) { addr = m_dspram16[addr]; m_mpDspState->masterSourceAddr = addr; - if (ENABLE_LOGGING) logerror( "LOOP:0x%04x\n", addr ); - addr&=0x7fff; - if( old==addr ) + if (ENABLE_LOGGING) logerror("LOOP:0x%04x\n", addr); + addr &= 0x7fff; + if (old == addr) { return; } @@ -241,71 +240,70 @@ void namcos21_dsp_c67_device::transfer_dsp_data() return; } } - else if( mode==0 ) - { /* direct data transfer */ - if (ENABLE_LOGGING) logerror( "DATA TFR(0x%x)\n", code ); + else if (!mode) + { + // direct data transfer + if (ENABLE_LOGGING) logerror("DATA TFR(0x%x)\n", code); transmit_word_to_slave(code); - for( i=0; i 2) { - break; + transmit_word_to_slave(0); // pad1 + transmit_word_to_slave(len + 1); + for (int i = 0; i < len; i++) + { // transform + transmit_word_to_slave(m_dspram16[addr + i]); + } + transmit_word_to_slave(0); // pad2 + transmit_word_to_slave(primWords + 1); + for (int i = 0; i < primWords; i++) + { + transmit_word_to_slave((uint16_t)read_pointrom_data(subAddr + i)); + } } else { - int primWords = (uint16_t)read_pointrom_data(subAddr++); - // TODO: this function causes an IDC overflow in Solvalou, something else failed prior to that? - // In Header TFR when bad parameters happens there's a suspicious 0x000f 0x0003 as first two words, - // maybe it's supposed to have a different length there ... - // cfr: object code 0x17 in service mode - if( primWords>2 ) - { - transmit_word_to_slave(0); /* pad1 */ - transmit_word_to_slave(len+1); - for( i=0; i +#include #define ENABLE_LOGGING 0 @@ -81,7 +82,7 @@ private: required_device m_c67master; required_device_array m_c67slave; required_region_ptr m_ptrom24; - std::vector m_dspram16; + std::unique_ptr m_dspram16; required_shared_ptr m_master_dsp_ram; @@ -90,7 +91,7 @@ private: std::unique_ptr m_mpDspState; - std::unique_ptr m_pointram; + std::unique_ptr m_pointram; int m_pointram_idx; uint16_t m_pointram_control; uint32_t m_pointrom_idx; @@ -153,4 +154,4 @@ private: DECLARE_DEVICE_TYPE(NAMCOS21_DSP_C67, namcos21_dsp_c67_device) -#endif // MAME_VIDEO_NAMCOS21_DSP_C67_H +#endif // MAME_NAMCO_NAMCOS21_DSP_C67_H