mirror of
https://github.com/mamedev/mame.git
synced 2024-11-16 07:48:32 +01:00
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:
parent
9c03e279bf
commit
f64470c568
16 changed files with 54 additions and 21 deletions
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) )
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue