Untangled gottlieb audio from the arcade driver, so it becomes available for pinball.

This commit is contained in:
Robbbert 2014-10-11 00:09:59 +00:00
parent 2b7bf5c0c7
commit 4c4c3b484c
6 changed files with 239 additions and 233 deletions

1
.gitattributes vendored
View File

@ -4462,6 +4462,7 @@ src/mame/audio/geebee.c svneol=native#text/plain
src/mame/audio/gomoku.c svneol=native#text/plain
src/mame/audio/gorf.c svneol=native#text/plain
src/mame/audio/gottlieb.c svneol=native#text/plain
src/mame/audio/gottlieb.h svneol=native#text/plain
src/mame/audio/gotya.c svneol=native#text/plain
src/mame/audio/grchamp.c svneol=native#text/plain
src/mame/audio/gridlee.c svneol=native#text/plain

View File

@ -2,7 +2,7 @@
// copyright-holders:Aaron Giles
/***************************************************************************
gottlieb.h
gottlieb.c
Gottlieb 6502-based sound hardware implementations.
@ -10,8 +10,7 @@
***************************************************************************/
#include "emu.h"
#include "includes/gottlieb.h"
#include "audio/gottlieb.h"
#define SOUND1_CLOCK XTAL_3_579545MHz
@ -247,46 +246,6 @@ MACHINE_CONFIG_END
#endif
//**************************************************************************
// QBERT MECHANICAL KNOCKER
//**************************************************************************
//-------------------------------------------------
// qbert cabinets have a mechanical knocker near the floor,
// MAME simulates this with a sample.
// (like all MAME samples, it is optional. If you actually have
// a real kicker/knocker, hook it up via output "knocker0")
//-------------------------------------------------
void gottlieb_state::qbert_knocker(UINT8 knock)
{
output_set_value("knocker0", knock);
// start sound on rising edge
if (knock & ~m_knocker_prev)
m_knocker_sample->start(0, 0);
m_knocker_prev = knock;
}
static const char *const qbert_knocker_names[] =
{
"*qbert",
"knocker",
0 /* end of array */
};
MACHINE_CONFIG_FRAGMENT( qbert_knocker )
MCFG_SPEAKER_ADD("knocker", 0.0, 0.0, 1.0)
MCFG_SOUND_ADD("knocker_sam", SAMPLES, 0)
MCFG_SAMPLES_CHANNELS(1)
MCFG_SAMPLES_NAMES(qbert_knocker_names)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "knocker", 1.0)
MACHINE_CONFIG_END
//**************************************************************************
// REV 1 SOUND BOARD: 6502 + DAC
//**************************************************************************

193
src/mame/audio/gottlieb.h Normal file
View File

@ -0,0 +1,193 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
Gottlieb hardware
***************************************************************************/
#include "emu.h"
#include "cpu/m6502/m6502.h"
#include "machine/6532riot.h"
#include "sound/dac.h"
#include "sound/ay8910.h"
#include "sound/sp0250.h"
#include "sound/votrax.h"
// set to 0 to enable Votrax device and disable samples
#define USE_FAKE_VOTRAX (1)
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
extern const device_type GOTTLIEB_SOUND_REV1;
extern const device_type GOTTLIEB_SOUND_REV1_WITH_VOTRAX;
extern const device_type GOTTLIEB_SOUND_REV2;
//**************************************************************************
// DEVICE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_GOTTLIEB_SOUND_R1_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, GOTTLIEB_SOUND_REV1, 0)
#define MCFG_GOTTLIEB_SOUND_R1_ADD_VOTRAX(_tag) \
MCFG_DEVICE_ADD(_tag, GOTTLIEB_SOUND_REV1_WITH_VOTRAX, 0)
#define MCFG_GOTTLIEB_SOUND_R2_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, GOTTLIEB_SOUND_REV2, 0)
#define MCFG_GOTTLIEB_SOUND_R2_ADD_COBRAM3(_tag) \
MCFG_DEVICE_ADD(_tag, GOTTLIEB_SOUND_REV2, 0) \
gottlieb_sound_r2_device::static_enable_cobram3_mods(*device);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> gottlieb_sound_r1_device
// rev 1 sound board, with unpopulated VOTRAX
class gottlieb_sound_r1_device : public device_t, public device_mixer_interface
{
public:
// construction/destruction
gottlieb_sound_r1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
gottlieb_sound_r1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock, bool populate_votrax);
// read/write
DECLARE_WRITE8_MEMBER( write );
// internal communications
DECLARE_WRITE_LINE_MEMBER( snd_interrupt );
DECLARE_WRITE8_MEMBER( r6532_portb_w );
DECLARE_WRITE8_MEMBER( votrax_data_w );
DECLARE_WRITE8_MEMBER( speech_clock_dac_w );
DECLARE_WRITE_LINE_MEMBER( votrax_request );
protected:
// device-level overrides
virtual machine_config_constructor device_mconfig_additions() const;
virtual ioport_constructor device_input_ports() const;
virtual void device_start();
private:
// devices
required_device<m6502_device> m_audiocpu;
required_device<riot6532_device> m_riot;
required_device<dac_device> m_dac;
optional_device<votrax_sc01_device> m_votrax;
// internal state
//bool m_populate_votrax;
UINT8 m_last_speech_clock;
#if USE_FAKE_VOTRAX
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
void fake_votrax_data_w(UINT8 data);
void trigger_sample(UINT8 data);
optional_device<samples_device> m_samples;
UINT8 m_score_sample;
UINT8 m_random_offset;
UINT8 m_votrax_queue[100];
UINT8 m_votrax_queuepos;
#endif
};
// fully populated rev 1 sound board
class gottlieb_sound_r1_with_votrax_device : public gottlieb_sound_r1_device
{
public:
// construction/destruction
gottlieb_sound_r1_with_votrax_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
protected:
// device-level overrides
virtual machine_config_constructor device_mconfig_additions() const;
virtual ioport_constructor device_input_ports() const;
};
// ======================> gottlieb_sound_r2_device
// fully populated rev 2 sound board
class gottlieb_sound_r2_device : public device_t, public device_mixer_interface
{
public:
// construction/destruction
gottlieb_sound_r2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// static configuration helpers
static void static_enable_cobram3_mods(device_t &device);
// read/write
DECLARE_WRITE8_MEMBER( write );
// internal communications
DECLARE_READ8_MEMBER( speech_data_r );
DECLARE_READ8_MEMBER( audio_data_r );
DECLARE_WRITE8_MEMBER( signal_audio_nmi_w );
DECLARE_WRITE8_MEMBER( nmi_rate_w );
CUSTOM_INPUT_MEMBER( speech_drq_custom_r );
DECLARE_WRITE8_MEMBER( dac_w );
DECLARE_WRITE8_MEMBER( speech_control_w );
DECLARE_WRITE8_MEMBER( sp0250_latch_w );
DECLARE_WRITE8_MEMBER( psg_latch_w );
protected:
// device-level overrides
virtual machine_config_constructor device_mconfig_additions() const;
virtual ioport_constructor device_input_ports() const;
virtual void device_start();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
// internal helpers
void nmi_timer_adjust();
void nmi_state_update();
// timer IDs
enum
{
TID_NMI_GENERATE,
TID_NMI_CLEAR,
TID_SOUND_LATCH_WRITE
};
// devices
required_device<m6502_device> m_audiocpu;
required_device<m6502_device> m_speechcpu;
required_device<dac_device> m_dac;
required_device<ay8913_device> m_ay1;
required_device<ay8913_device> m_ay2;
optional_device<sp0250_device> m_sp0250;
// internal state
bool m_cobram3_mod;
emu_timer * m_nmi_timer;
UINT8 m_nmi_rate;
UINT8 m_nmi_state;
UINT8 m_audiocpu_latch;
UINT8 m_speechcpu_latch;
UINT8 m_speech_control;
UINT8 m_last_command;
UINT8 m_dac_data[2];
UINT8 m_psg_latch;
UINT8 m_psg_data_latch;
UINT8 m_sp0250_latch;
};
/*----------- defined in audio/gottlieb.c -----------*/
#if USE_FAKE_VOTRAX
MACHINE_CONFIG_EXTERN( reactor_samples );
MACHINE_CONFIG_EXTERN( qbert_samples );
#endif

View File

@ -194,13 +194,8 @@ VBlank duration: 1/VSYNC * (16/256) = 1017.6 us
***************************************************************************/
#include "emu.h"
#include "machine/6532riot.h"
#include "sound/ay8910.h"
#include "sound/dac.h"
#include "sound/samples.h"
#include "machine/nvram.h"
#include "includes/gottlieb.h"
#include "machine/nvram.h"
#define LOG_AUDIO_DECODE (0)
@ -642,6 +637,46 @@ void gottlieb_state::laserdisc_audio_process(laserdisc_device &device, int sampl
//**************************************************************************
// QBERT MECHANICAL KNOCKER
//**************************************************************************
//-------------------------------------------------
// qbert cabinets have a mechanical knocker near the floor,
// MAME simulates this with a sample.
// (like all MAME samples, it is optional. If you actually have
// a real kicker/knocker, hook it up via output "knocker0")
//-------------------------------------------------
void gottlieb_state::qbert_knocker(UINT8 knock)
{
output_set_value("knocker0", knock);
// start sound on rising edge
if (knock & ~m_knocker_prev)
m_knocker_sample->start(0, 0);
m_knocker_prev = knock;
}
static const char *const qbert_knocker_names[] =
{
"*qbert",
"knocker",
0 /* end of array */
};
MACHINE_CONFIG_FRAGMENT( qbert_knocker )
MCFG_SPEAKER_ADD("knocker", 0.0, 0.0, 1.0)
MCFG_SOUND_ADD("knocker_sam", SAMPLES, 0)
MCFG_SAMPLES_CHANNELS(1)
MCFG_SAMPLES_NAMES(qbert_knocker_names)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "knocker", 1.0)
MACHINE_CONFIG_END
/*************************************
*
* Interrupt generation

View File

@ -6,192 +6,20 @@
***************************************************************************/
#include "emu.h"
#include "audio/gottlieb.h"
#include "cpu/i86/i86.h"
#include "cpu/m6502/m6502.h"
#include "machine/6532riot.h"
#include "sound/dac.h"
#include "sound/ay8910.h"
#include "sound/sp0250.h"
#include "sound/samples.h"
#include "sound/votrax.h"
#include "machine/ldpr8210.h"
// set to 0 to enable Votrax device and disable samples
#define USE_FAKE_VOTRAX (1)
#define GOTTLIEB_VIDEO_HCOUNT 318
#define GOTTLIEB_VIDEO_HBLANK 256
#define GOTTLIEB_VIDEO_VCOUNT 256
#define GOTTLIEB_VIDEO_VBLANK 240
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
extern const device_type GOTTLIEB_SOUND_REV1;
extern const device_type GOTTLIEB_SOUND_REV1_WITH_VOTRAX;
extern const device_type GOTTLIEB_SOUND_REV2;
//**************************************************************************
// DEVICE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_GOTTLIEB_SOUND_R1_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, GOTTLIEB_SOUND_REV1, 0)
#define MCFG_GOTTLIEB_SOUND_R1_ADD_VOTRAX(_tag) \
MCFG_DEVICE_ADD(_tag, GOTTLIEB_SOUND_REV1_WITH_VOTRAX, 0)
#define MCFG_GOTTLIEB_SOUND_R2_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, GOTTLIEB_SOUND_REV2, 0)
#define MCFG_GOTTLIEB_SOUND_R2_ADD_COBRAM3(_tag) \
MCFG_DEVICE_ADD(_tag, GOTTLIEB_SOUND_REV2, 0) \
gottlieb_sound_r2_device::static_enable_cobram3_mods(*device);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> gottlieb_sound_r1_device
// rev 1 sound board, with unpopulated VOTRAX
class gottlieb_sound_r1_device : public device_t,
public device_mixer_interface
{
public:
// construction/destruction
gottlieb_sound_r1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
gottlieb_sound_r1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock, bool populate_votrax);
// read/write
DECLARE_WRITE8_MEMBER( write );
// internal communications
DECLARE_WRITE_LINE_MEMBER( snd_interrupt );
DECLARE_WRITE8_MEMBER( r6532_portb_w );
DECLARE_WRITE8_MEMBER( votrax_data_w );
DECLARE_WRITE8_MEMBER( speech_clock_dac_w );
DECLARE_WRITE_LINE_MEMBER( votrax_request );
protected:
// device-level overrides
virtual machine_config_constructor device_mconfig_additions() const;
virtual ioport_constructor device_input_ports() const;
virtual void device_start();
private:
// devices
required_device<m6502_device> m_audiocpu;
required_device<riot6532_device> m_riot;
required_device<dac_device> m_dac;
optional_device<votrax_sc01_device> m_votrax;
// internal state
//bool m_populate_votrax;
UINT8 m_last_speech_clock;
#if USE_FAKE_VOTRAX
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
void fake_votrax_data_w(UINT8 data);
void trigger_sample(UINT8 data);
optional_device<samples_device> m_samples;
UINT8 m_score_sample;
UINT8 m_random_offset;
UINT8 m_votrax_queue[100];
UINT8 m_votrax_queuepos;
#endif
};
// fully populated rev 1 sound board
class gottlieb_sound_r1_with_votrax_device : public gottlieb_sound_r1_device
{
public:
// construction/destruction
gottlieb_sound_r1_with_votrax_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
protected:
// device-level overrides
virtual machine_config_constructor device_mconfig_additions() const;
virtual ioport_constructor device_input_ports() const;
};
// ======================> gottlieb_sound_r2_device
// fully populated rev 2 sound board
class gottlieb_sound_r2_device : public device_t,
public device_mixer_interface
{
public:
// construction/destruction
gottlieb_sound_r2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// static configuration helpers
static void static_enable_cobram3_mods(device_t &device);
// read/write
DECLARE_WRITE8_MEMBER( write );
// internal communications
DECLARE_READ8_MEMBER( speech_data_r );
DECLARE_READ8_MEMBER( audio_data_r );
DECLARE_WRITE8_MEMBER( signal_audio_nmi_w );
DECLARE_WRITE8_MEMBER( nmi_rate_w );
CUSTOM_INPUT_MEMBER( speech_drq_custom_r );
DECLARE_WRITE8_MEMBER( dac_w );
DECLARE_WRITE8_MEMBER( speech_control_w );
DECLARE_WRITE8_MEMBER( sp0250_latch_w );
DECLARE_WRITE8_MEMBER( psg_latch_w );
protected:
// device-level overrides
virtual machine_config_constructor device_mconfig_additions() const;
virtual ioport_constructor device_input_ports() const;
virtual void device_start();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
// internal helpers
void nmi_timer_adjust();
void nmi_state_update();
// timer IDs
enum
{
TID_NMI_GENERATE,
TID_NMI_CLEAR,
TID_SOUND_LATCH_WRITE
};
// devices
required_device<m6502_device> m_audiocpu;
required_device<m6502_device> m_speechcpu;
required_device<dac_device> m_dac;
required_device<ay8913_device> m_ay1;
required_device<ay8913_device> m_ay2;
optional_device<sp0250_device> m_sp0250;
// internal state
bool m_cobram3_mod;
emu_timer * m_nmi_timer;
UINT8 m_nmi_rate;
UINT8 m_nmi_state;
UINT8 m_audiocpu_latch;
UINT8 m_speechcpu_latch;
UINT8 m_speech_control;
UINT8 m_last_command;
UINT8 m_dac_data[2];
UINT8 m_psg_latch;
UINT8 m_psg_data_latch;
UINT8 m_sp0250_latch;
};
// ======================> gottlieb_state
@ -311,12 +139,3 @@ public:
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
};
/*----------- defined in audio/gottlieb.c -----------*/
MACHINE_CONFIG_EXTERN( qbert_knocker );
#if USE_FAKE_VOTRAX
MACHINE_CONFIG_EXTERN( reactor_samples );
MACHINE_CONFIG_EXTERN( qbert_samples );
#endif

View File

@ -4,7 +4,6 @@
***************************************************************************/
#include "emu.h"
#include "includes/gottlieb.h"
#include "video/resnet.h"