diff options
author | 2018-05-28 21:49:31 -0500 | |
---|---|---|
committer | 2018-05-28 21:49:31 -0500 | |
commit | f93a3c994ff1bb291993904924ebf6fb5b16f000 (patch) | |
tree | d8cd78efb99f883f797e31694e6261052abe7d3e | |
parent | 835d0366ca4229a2cf9813260acd4de239b884cb (diff) |
vis: somewhat better sound (nw)
-rw-r--r-- | src/mame/drivers/vis.cpp | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/src/mame/drivers/vis.cpp b/src/mame/drivers/vis.cpp index 102b0fa1f3a..7b319e7a9ed 100644 --- a/src/mame/drivers/vis.cpp +++ b/src/mame/drivers/vis.cpp @@ -30,12 +30,13 @@ private: required_device<dac_word_interface> m_rdac; required_device<dac_word_interface> m_ldac; uint16_t m_count; + uint16_t m_curcount; uint16_t m_sample[2]; uint8_t m_index[2]; // unknown indexed registers, volume? uint8_t m_data[2][16]; uint8_t m_mode; uint8_t m_stat; - uint8_t m_dmalen; + uint8_t m_ctrl; unsigned int m_sample_byte; unsigned int m_samples; emu_timer *m_pcm; @@ -63,29 +64,26 @@ void vis_audio_device::device_start() void vis_audio_device::device_reset() { - m_count = 0xffff; + m_count = 0; + m_curcount = 0; m_sample_byte = 0; m_samples = 0; m_mode = 0; m_index[0] = m_index[1] = 0; - m_stat = 0; } void vis_audio_device::dack16_w(int line, uint16_t data) { m_sample[m_samples++] = data; - if(m_samples >= ((m_dmalen & 2) ? 1 : 2)) + m_curcount++; + if(m_samples >= 2) m_isa->drq7_w(CLEAR_LINE); } void vis_audio_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - if(m_count == 0xffff) - { - m_isa->drq7_w(ASSERT_LINE); - m_samples = 0; + if(m_samples < 2) return; - } switch(m_mode & 0x88) { case 0x80: // 8bit mono @@ -113,20 +111,18 @@ void vis_audio_device::device_timer(emu_timer &timer, device_timer_id id, int pa break; } - if(m_sample_byte >= ((m_dmalen & 2) ? 2 : 4)) + if(m_sample_byte >= 4) { m_sample_byte = 0; m_samples = 0; - if(m_count) - m_isa->drq7_w(ASSERT_LINE); - else + m_isa->drq7_w(ASSERT_LINE); + if(m_curcount >= m_count) { - m_ldac->write(0x8000); - m_rdac->write(0x8000); - m_stat = 4; - m_isa->irq7_w(ASSERT_LINE); + m_curcount = 0; + m_ctrl |= 4; + if(BIT(m_ctrl, 1)) + m_isa->irq7_w(ASSERT_LINE); } - m_count--; } } @@ -138,8 +134,8 @@ MACHINE_CONFIG_START(vis_audio_device::device_add_mconfig) MCFG_SOUND_ROUTE(1, "rspeaker", 1.00) MCFG_SOUND_ROUTE(2, "lspeaker", 1.00) MCFG_SOUND_ROUTE(3, "rspeaker", 1.00) - MCFG_DEVICE_ADD("ldac", DAC_16BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) // unknown DAC - MCFG_DEVICE_ADD("rdac", DAC_16BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) // unknown DAC + MCFG_DEVICE_ADD("ldac", DAC_16BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0) // sanyo lc7883k + MCFG_DEVICE_ADD("rdac", DAC_16BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0) // sanyo lc7883k MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE(0, "ldac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "ldac", -1.0, DAC_VREF_NEG_INPUT) MCFG_SOUND_ROUTE(0, "rdac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "rdac", -1.0, DAC_VREF_NEG_INPUT) @@ -150,14 +146,20 @@ READ8_MEMBER(vis_audio_device::pcm_r) switch(offset) { case 0x00: + m_isa->irq7_w(CLEAR_LINE); + m_ctrl &= ~4; return m_mode; case 0x02: return m_data[0][m_index[0]]; case 0x04: return m_data[1][m_index[1]]; case 0x09: + { + u8 ret = m_ctrl; m_isa->irq7_w(CLEAR_LINE); - return m_stat; + m_ctrl &= ~4; + return ret; + } case 0x0c: return m_count & 0xff; case 0x0e: @@ -174,6 +176,7 @@ READ8_MEMBER(vis_audio_device::pcm_r) WRITE8_MEMBER(vis_audio_device::pcm_w) { + u8 oldmode = m_mode; switch(offset) { case 0x00: @@ -192,7 +195,7 @@ WRITE8_MEMBER(vis_audio_device::pcm_w) m_index[1] = data; return; case 0x09: - m_dmalen = data; + m_ctrl = data; return; case 0x0c: m_count = (m_count & 0xff00) | data; @@ -207,12 +210,11 @@ WRITE8_MEMBER(vis_audio_device::pcm_w) logerror("unknown pcm write %04x %02x\n", offset, data); return; } - if((m_mode & 0x10) && (m_count != 0xffff)) + if((m_mode & 0x10) && (m_mode ^ oldmode)) { const int rates[] = {44100, 22050, 11025, 5512}; m_samples = 0; m_sample_byte = 0; - m_stat = 0; m_isa->drq7_w(ASSERT_LINE); attotime rate = attotime::from_hz(rates[(m_mode >> 5) & 3]); m_pcm->adjust(rate, 0, rate); |