Add support for the older Votrax SC-01 chip; currently only used by Bally Astrocade-derived arcade hardware. All other devices remain using the Votrax SC-01-A. [Lord Nightmare]

This commit is contained in:
Lord-Nightmare 2023-05-16 10:19:10 -04:00
parent 9c03e279bf
commit f64470c568
16 changed files with 54 additions and 21 deletions

View file

@ -969,7 +969,6 @@ if (SOUNDS["SP0250"]~=null) then
end
---------------------------------------------------
-- S14001A speech synthesizer
--@src/devices/sound/s14001a.h,SOUNDS["S14001A"] = true
@ -1122,11 +1121,12 @@ if (SOUNDS["VLM5030"]~=null) then
end
---------------------------------------------------
-- Votrax speech synthesizer
--@src/devices/sound/votrax.h,SOUNDS["VOTRAX"] = true
-- Votrax SC-01[-A] speech synthesizer
--@src/devices/sound/votrax.h,SOUNDS["VOTRAX_SC01"] = true
--@src/devices/sound/votrax.h,SOUNDS["VOTRAX_SC01A"] = true
---------------------------------------------------
if (SOUNDS["VOTRAX"]~=null) then
if (SOUNDS["VOTRAX_SC01"]~=null or SOUNDS["VOTRAX_SC01A"]~=null) then
files {
MAME_DIR .. "src/devices/sound/votrax.cpp",
MAME_DIR .. "src/devices/sound/votrax.h",

View file

@ -41,7 +41,7 @@ SOUNDS["HC55516"] = true
SOUNDS["OKIM6295"] = true
SOUNDS["SAMPLES"] = true
SOUNDS["TMS5220"] = true
SOUNDS["VOTRAX"] = true
SOUNDS["VOTRAX_SC01"] = true
SOUNDS["YM2151"] = true
SOUNDS["YM3812"] = true

View file

@ -182,6 +182,7 @@ void a2bus_mockingboard_device::device_add_mconfig(machine_config &config)
m_ay2->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
VOTRAX_SC01(config, m_sc01, 1022727);
VOTRAX_SC01A(config, m_sc01, 1022727);
m_sc01->ar_callback().set(m_via1, FUNC(via6522_device::write_cb1));
m_sc01->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
m_sc01->add_route(ALL_OUTPUTS, "rspeaker", 1.0);

View file

@ -35,7 +35,7 @@ void c64_speakeasy_cartridge_device::device_add_mconfig(machine_config &config)
{
SPEAKER(config, "mono").front_center();
VOTRAX_SC01(config, m_votrax, 720000).add_route(ALL_OUTPUTS, "mono", 0.85);
VOTRAX_SC01A(config, m_votrax, 720000).add_route(ALL_OUTPUTS, "mono", 0.85);
}

View file

@ -37,7 +37,7 @@ void vic20_speakeasy_device::device_add_mconfig(machine_config &config)
{
SPEAKER(config, "mono").front_center();
VOTRAX_SC01(config, m_votrax, 720000).add_route(ALL_OUTPUTS, "mono", 0.85);
VOTRAX_SC01A(config, m_votrax, 720000).add_route(ALL_OUTPUTS, "mono", 0.85);
}

View file

@ -26,10 +26,16 @@ tp1 = phi clock (tied to f2q rom access)
#include "votrax.h"
DEFINE_DEVICE_TYPE(VOTRAX_SC01, votrax_sc01_device, "votrax", "Votrax SC-01")
DEFINE_DEVICE_TYPE(VOTRAX_SC01, votrax_sc01_device, "votrsc01", "Votrax SC-01")
DEFINE_DEVICE_TYPE(VOTRAX_SC01A, votrax_sc01a_device, "votrsc01a", "Votrax SC-01-A")
// ROM definition for the Votrax phone ROM
ROM_START( votrax_sc01 )
ROM_REGION64_LE( 0x200, "internal", 0 )
ROM_LOAD( "sc01.bin", 0x000, 0x200, CRC(528d1c57) SHA1(268b5884dce04e49e2376df3e2dc82e852b708c1) )
ROM_END
ROM_START( votrax_sc01a )
ROM_REGION64_LE( 0x200, "internal", 0 )
ROM_LOAD( "sc01a.bin", 0x000, 0x200, CRC(fc416227) SHA1(1d6da90b1807a01b5e186ef08476119a862b5e6d) )
ROM_END
@ -74,9 +80,14 @@ const double votrax_sc01_device::s_glottal_wave[9] =
1/7.0
};
votrax_sc01_device::votrax_sc01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, VOTRAX_SC01, tag, owner, clock),
: votrax_sc01_device(mconfig, VOTRAX_SC01, tag, owner, clock)
{
}
// overridable type for subclass
votrax_sc01_device::votrax_sc01_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock),
device_sound_interface(mconfig, *this),
m_stream(nullptr),
m_rom(*this, "internal"),
@ -84,6 +95,11 @@ votrax_sc01_device::votrax_sc01_device(const machine_config &mconfig, const char
{
}
votrax_sc01a_device::votrax_sc01a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: votrax_sc01_device(mconfig, VOTRAX_SC01A, tag, owner, clock)
{
}
void votrax_sc01_device::write(uint8_t data)
{
// flush out anything currently processing
@ -158,6 +174,11 @@ const tiny_rom_entry *votrax_sc01_device::device_rom_region() const
return ROM_NAME( votrax_sc01 );
}
const tiny_rom_entry *votrax_sc01a_device::device_rom_region() const
{
return ROM_NAME( votrax_sc01a );
}
//-------------------------------------------------
// device_start - handle device startup

View file

@ -29,6 +29,8 @@ public:
DECLARE_READ_LINE_MEMBER(request) { m_stream->update(); return m_ar_state; }
protected:
// overridable type for subclass
votrax_sc01_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
virtual const tiny_rom_entry *device_rom_region() const override;
virtual void device_start() override;
@ -181,6 +183,14 @@ private:
stream_buffer::sample_t analog_calc(); // Compute one more sample
};
class votrax_sc01a_device : public votrax_sc01_device
{
public:
votrax_sc01a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual const tiny_rom_entry *device_rom_region() const override;
};
//**************************************************************************
// GLOBAL VARIABLES
@ -188,5 +198,6 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(VOTRAX_SC01, votrax_sc01_device)
DECLARE_DEVICE_TYPE(VOTRAX_SC01A, votrax_sc01a_device)
#endif // MAME_SOUND_VOTRAX_H

View file

@ -517,7 +517,7 @@ void aussiebyte_state::aussiebyte(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
VOTRAX_SC01(config, m_votrax, 720000); // 720kHz? needs verify
VOTRAX_SC01A(config, m_votrax, 720000); // 720kHz? needs verify
m_votrax->ar_callback().set([this] (bool state) { m_port28 = state ? 0 : 1; });
m_votrax->add_route(ALL_OUTPUTS, "mono", 1.00);

View file

@ -257,7 +257,7 @@ ROM_START( deathrac )
ROM_LOAD( "6331-31.a11", 0x0000, 0x0020, CRC(f304a1fb) SHA1(0f029274bb99723ebcc271d761e1500ca50b2738) )
ROM_LOAD( "6331-32.c12", 0x0000, 0x0020, CRC(f8dbd779) SHA1(55bdaf9eb1ba6185e20512c4874ebb625861508e) )
ROM_LOAD( "6331-33.p14", 0x0000, 0x0020, CRC(2e83bf80) SHA1(02fcc1e879c06759a21ef4f004fe7aa790814112) )
// Note: Image for 36 has all zeros in the second half, which is unused.
// Note: Image for 36 has all zeros in the second half, which is unused. This is verified correct from a real board.
// Other roms in this series (34,35) all have duplicate content in the second half
ROM_LOAD( "6331-36.e7", 0x0000, 0x0020, CRC(bb743b79) SHA1(8eb73782bcea7dbba7b75db32307e562248691bb) )
ROM_LOAD( "6331-35.g7", 0x0000, 0x0020, CRC(5ed8cdd2) SHA1(d193d819ad634c43d648ce49073799b4df6dfd2f) )

View file

@ -564,7 +564,7 @@ void taito_8080::taito4(machine_config &config)
taito(config);
SPEAKER(config, "voxsnd").front_center();
VOTRAX_SC01(config, m_votrax, 720000); // guess
VOTRAX_SC01A(config, m_votrax, 720000); // guess
m_votrax->ar_callback().set(FUNC(taito_8080::votrax_request));
m_votrax->add_route(ALL_OUTPUTS, "voxsnd", 2.0);

View file

@ -880,7 +880,7 @@ void mtrap_sound_device::device_add_mconfig(machine_config &config)
m_cvsd_filter2->add_route(ALL_OUTPUTS, "mono", 1.0);
FILTER_BIQUAD(config, m_cvsd_filter).opamp_mfb_lowpass_setup(RES_K(10), RES_K(3.9), RES_K(18), CAP_N(20), CAP_N(2.2));
m_cvsd_filter->add_route(ALL_OUTPUTS, m_cvsd_filter2, 1.0);
MC3417(config, m_cvsd, 0).add_route(ALL_OUTPUTS, m_cvsd_filter, 0.3086); // each filter has gain of 1.8 for total gain of 3.24, 0.3086 cancels this out. was 0.8
MC3417(config, m_cvsd, 0).add_route(ALL_OUTPUTS, m_cvsd_filter, 0.3086); // each filter has gain of 1.8 for total gain of 3.24, 0.3086 cancels this out.
}

View file

@ -262,7 +262,7 @@ void gottlieb_sound_p3_device::device_start()
//**************************************************************************
// REV 1 SOUND BOARD: 6502 + DAC
// REV 1 SOUND BOARD: 6502 + DAC part number MA-309
//**************************************************************************
//-------------------------------------------------
@ -398,7 +398,7 @@ void gottlieb_sound_r1_device::device_start()
//**************************************************************************
// REV 1 SOUND BOARD WITH VOTRAX
// REV 1 SOUND BOARD WITH VOTRAX, part number MA-216 (same pcb as MA-309 but with a Votrax SC-01(-A) and support components populated)
//**************************************************************************
//-------------------------------------------------
@ -426,7 +426,7 @@ void gottlieb_sound_r1_with_votrax_device::device_add_mconfig(machine_config &co
m_dac->add_route(ALL_OUTPUTS, *this, 0.20);
// add the VOTRAX
VOTRAX_SC01(config, m_votrax, 720000);
VOTRAX_SC01A(config, m_votrax, 720000); // Note: early boards use an SC-01 (reactor, q-bert test version, maybe some early pinball machines?) while later boards (qbert main release, most pinball machines) use an SC-01-A
m_votrax->ar_callback().set("nmi", FUNC(input_merger_device::in_w<1>));
m_votrax->add_route(ALL_OUTPUTS, *this, 0.80);
}

View file

@ -319,7 +319,7 @@ void k28_state::k28(machine_config &config)
// sound hardware
SPEAKER(config, "mono").front_center();
VOTRAX_SC01(config, "speech", 760000).add_route(ALL_OUTPUTS, "mono", 0.5); // measured 760kHz on its RC pin
VOTRAX_SC01A(config, "speech", 760000).add_route(ALL_OUTPUTS, "mono", 0.5); // measured 760kHz on its RC pin
}

View file

@ -680,7 +680,7 @@ void votrhv_state::votrhv(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
// TEMPORARY HACK until 1818c device is done
VOTRAX_SC01(config, m_votrax, 720000);
VOTRAX_SC01A(config, m_votrax, 720000);
m_votrax->ar_callback().set(FUNC(votrhv_state::pho_done));
m_votrax->add_route(ALL_OUTPUTS, "mono", 1.00);
}

View file

@ -570,7 +570,7 @@ void votrpss_state::votrpss(machine_config &config)
ay.port_b_read_callback().set_ioport("DSW1");
ay.port_a_write_callback().set("votrax", FUNC(votrax_sc01_device::write));
ay.add_route(ALL_OUTPUTS, "mono", 0.25);
VOTRAX_SC01(config, "votrax", 720000).add_route(ALL_OUTPUTS, "mono", 1.00); /* the actual SC-01-A clock is generated by an R/C circuit PWMed by the timer1 output of the 8253 PIT to adjust the resistance, to allow for fine pitch control. 8253 Timer2 is used to PWM an analog switch on the output of the SC-01 to adjust the volume.*/
VOTRAX_SC01A(config, "votrax", 720000).add_route(ALL_OUTPUTS, "mono", 1.00); /* the actual SC-01-A clock is generated by an R/C circuit PWMed by the timer1 output of the 8253 PIT to adjust the resistance, to allow for fine pitch control. 8253 Timer2 is used to PWM an analog switch on the output of the SC-01 to adjust the volume.*/
/* Devices */
GENERIC_TERMINAL(config, m_terminal, 0);

View file

@ -163,7 +163,7 @@ void votrtnt_state::votrtnt(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
VOTRAX_SC01(config, m_votrax, 720000); // 720kHz? needs verify
VOTRAX_SC01A(config, m_votrax, 720000); // 720kHz? needs verify
m_votrax->ar_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_votrax->add_route(ALL_OUTPUTS, "mono", 1.00);
}