From 7b7f2456b90847187707b2447b4143d73837a4b2 Mon Sep 17 00:00:00 2001 From: Scott Stone Date: Mon, 27 Oct 2014 22:25:29 -0400 Subject: [PATCH] Correctly model the behavior of a real Coco for the Cassette input in regards to audio (buzzing sound) coming from the port. [Richard Goedeken] --- src/mess/machine/coco.c | 44 +++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/mess/machine/coco.c b/src/mess/machine/coco.c index 2cedfd7b43c..65b438ef1e5 100644 --- a/src/mess/machine/coco.c +++ b/src/mess/machine/coco.c @@ -678,27 +678,29 @@ void coco_state::update_sound(void) */ UINT8 single_bit_sound = (m_pia_1->b_output() & 0x02) ? 0x80 : 0x00; - /* determine the sound mux status */ - soundmux_status_t status = soundmux_status(); - - /* determine the value to send to the DAC */ - m_dac_output = (m_pia_1->a_output() & 0xFC) >> 2; - UINT8 sound_output = single_bit_sound + (status == SOUNDMUX_ENABLE ? m_dac_output << 1 : 0); - m_dac->write_unsigned8(sound_output); - - /* determine the cassette sound status */ - cassette_state cas_sound = (status == (SOUNDMUX_ENABLE | SOUNDMUX_SEL1)) - ? CASSETTE_SPEAKER_ENABLED - : CASSETTE_SPEAKER_MUTED; - m_cassette->change_state(cas_sound, CASSETTE_MASK_SPEAKER); - - /* determine the cartridge sound status */ - m_cococart->cart_set_line( - COCOCART_LINE_SOUND_ENABLE, - (status == (SOUNDMUX_ENABLE | SOUNDMUX_SEL2)) ? COCOCART_LINE_VALUE_ASSERT : COCOCART_LINE_VALUE_CLEAR); -} - - + /* determine the sound mux status */ + soundmux_status_t status = soundmux_status(); + + /* the SC77526 DAC chip internally biases the AC-coupled sound inputs for Cassette and Cartridge at the midpoint of the 3.9v output range */ + bool bCassSoundEnable = (status == (SOUNDMUX_ENABLE | SOUNDMUX_SEL1)); + bool bCartSoundEnable = (status == (SOUNDMUX_ENABLE | SOUNDMUX_SEL2)); + UINT8 cassette_sound = (bCassSoundEnable ? 0x40 : 0); + UINT8 cart_sound = (bCartSoundEnable ? 0x40 : 0); + + /* determine the value to send to the DAC */ + m_dac_output = (m_pia_1->a_output() & 0xFC) >> 2; + UINT8 dac_sound = (status == SOUNDMUX_ENABLE ? m_dac_output << 1 : 0); + m_dac->write_unsigned8(single_bit_sound + dac_sound + cassette_sound + cart_sound); + + /* determine the cassette sound status */ + cassette_state cas_sound = bCassSoundEnable ? CASSETTE_SPEAKER_ENABLED : CASSETTE_SPEAKER_MUTED; + m_cassette->change_state(cas_sound, CASSETTE_MASK_SPEAKER); + + /* determine the cartridge sound status */ + m_cococart->cart_set_line(COCOCART_LINE_SOUND_ENABLE, bCartSoundEnable ? COCOCART_LINE_VALUE_ASSERT : COCOCART_LINE_VALUE_CLEAR); +} + + //------------------------------------------------- // joystick_type - returns the type of joystick