mirror of
https://github.com/holub/mame
synced 2025-05-19 20:29:09 +03:00
cem3394: updated to use delegates and inline configs. nw.
This commit is contained in:
parent
fbc648ce50
commit
207ec49a4d
@ -116,7 +116,6 @@ const device_type CEM3394 = &device_creator<cem3394_device>;
|
|||||||
cem3394_device::cem3394_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
cem3394_device::cem3394_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||||
: device_t(mconfig, CEM3394, "CEM3394", tag, owner, clock, "cem3394", __FILE__),
|
: device_t(mconfig, CEM3394, "CEM3394", tag, owner, clock, "cem3394", __FILE__),
|
||||||
device_sound_interface(mconfig, *this),
|
device_sound_interface(mconfig, *this),
|
||||||
m_external(NULL),
|
|
||||||
m_stream(NULL),
|
m_stream(NULL),
|
||||||
m_vco_zero_freq(0.0),
|
m_vco_zero_freq(0.0),
|
||||||
m_filter_zero_freq(0.0),
|
m_filter_zero_freq(0.0),
|
||||||
@ -154,7 +153,7 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* external volume is effectively 0 if no external function */
|
/* external volume is effectively 0 if no external function */
|
||||||
if (!m_external || !ENABLE_EXTERNAL)
|
if (m_ext_cb.isnull() || !ENABLE_EXTERNAL)
|
||||||
ext_volume = 0;
|
ext_volume = 0;
|
||||||
|
|
||||||
/* adjust the volume for the filter */
|
/* adjust the volume for the filter */
|
||||||
@ -175,7 +174,7 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
|
|||||||
INT16 last_ext = m_last_ext;
|
INT16 last_ext = m_last_ext;
|
||||||
|
|
||||||
/* fetch the external data */
|
/* fetch the external data */
|
||||||
(*m_external)(this, samples, m_external_buffer);
|
m_ext_cb(samples, m_external_buffer);
|
||||||
|
|
||||||
/* compute the modulation depth, and adjust fstep to the maximum frequency */
|
/* compute the modulation depth, and adjust fstep to the maximum frequency */
|
||||||
/* we lop off 13 bits of depth so that we can multiply by stepadjust, below, */
|
/* we lop off 13 bits of depth so that we can multiply by stepadjust, below, */
|
||||||
@ -325,17 +324,14 @@ void cem3394_device::sound_stream_update(sound_stream &stream, stream_sample_t *
|
|||||||
|
|
||||||
void cem3394_device::device_start()
|
void cem3394_device::device_start()
|
||||||
{
|
{
|
||||||
const cem3394_interface *intf = (const cem3394_interface *)static_config();
|
|
||||||
|
|
||||||
/* copy global parameters */
|
/* copy global parameters */
|
||||||
m_sample_rate = CEM3394_SAMPLE_RATE;
|
m_sample_rate = CEM3394_SAMPLE_RATE;
|
||||||
m_inv_sample_rate = 1.0 / (double)m_sample_rate;
|
m_inv_sample_rate = 1.0 / (double)m_sample_rate;
|
||||||
|
|
||||||
/* allocate stream channels, 1 per chip */
|
/* allocate stream channels, 1 per chip */
|
||||||
m_stream = stream_alloc(0, 1, m_sample_rate);
|
m_stream = stream_alloc(0, 1, m_sample_rate);
|
||||||
m_external = intf->external;
|
|
||||||
m_vco_zero_freq = intf->vco_zero_freq;
|
m_ext_cb.bind_relative_to(*owner());
|
||||||
m_filter_zero_freq = intf->filter_zero_freq;
|
|
||||||
|
|
||||||
/* allocate memory for a mixer buffer and external buffer (1 second should do it!) */
|
/* allocate memory for a mixer buffer and external buffer (1 second should do it!) */
|
||||||
m_mixer_buffer = auto_alloc_array(machine(), INT16, m_sample_rate);
|
m_mixer_buffer = auto_alloc_array(machine(), INT16, m_sample_rate);
|
||||||
|
@ -5,15 +5,6 @@
|
|||||||
|
|
||||||
#define CEM3394_SAMPLE_RATE (44100*4)
|
#define CEM3394_SAMPLE_RATE (44100*4)
|
||||||
|
|
||||||
|
|
||||||
// interface
|
|
||||||
struct cem3394_interface
|
|
||||||
{
|
|
||||||
double vco_zero_freq; /* frequency at 0V for VCO */
|
|
||||||
double filter_zero_freq; /* frequency at 0V for filter */
|
|
||||||
void (*external)(device_t*, int, short*);/* external input source */
|
|
||||||
};
|
|
||||||
|
|
||||||
// inputs
|
// inputs
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@ -27,6 +18,9 @@ enum
|
|||||||
CEM3394_FINAL_GAIN
|
CEM3394_FINAL_GAIN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef device_delegate<void (int count, short *buffer)> cem3394_ext_input_delegate;
|
||||||
|
|
||||||
|
#define CEM3394_EXT_INPUT(_name) void _name(int count, short *buffer)
|
||||||
|
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
// INTERFACE CONFIGURATION MACROS
|
// INTERFACE CONFIGURATION MACROS
|
||||||
@ -37,6 +31,14 @@ enum
|
|||||||
#define MCFG_CEM3394_REPLACE(_tag, _clock) \
|
#define MCFG_CEM3394_REPLACE(_tag, _clock) \
|
||||||
MCFG_DEVICE_REPLACE(_tag, CEM3394, _clock)
|
MCFG_DEVICE_REPLACE(_tag, CEM3394, _clock)
|
||||||
|
|
||||||
|
#define MCFG_CEM3394_EXT_INPUT_CB(_class, _method) \
|
||||||
|
cem3394_device::set_ext_input_callback(*device, cem3394_ext_input_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
|
||||||
|
|
||||||
|
#define MCFG_CEM3394_VCO_ZERO(_freq) \
|
||||||
|
cem3394_device::set_vco_zero_freq(*device, _freq);
|
||||||
|
|
||||||
|
#define MCFG_CEM3394_FILTER_ZERO(_freq) \
|
||||||
|
cem3394_device::set_filter_zero_freq(*device, _freq);
|
||||||
|
|
||||||
|
|
||||||
class cem3394_device : public device_t,
|
class cem3394_device : public device_t,
|
||||||
@ -46,6 +48,10 @@ public:
|
|||||||
cem3394_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
cem3394_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
~cem3394_device() { }
|
~cem3394_device() { }
|
||||||
|
|
||||||
|
static void set_ext_input_callback(device_t &device, cem3394_ext_input_delegate callback) { downcast<cem3394_device &>(device).m_ext_cb = callback; }
|
||||||
|
static void set_vco_zero_freq(device_t &device, double freq) { downcast<cem3394_device &>(device).m_vco_zero_freq = freq; }
|
||||||
|
static void set_filter_zero_freq(device_t &device, double freq) { downcast<cem3394_device &>(device).m_filter_zero_freq = freq; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// device-level overrides
|
// device-level overrides
|
||||||
virtual void device_start();
|
virtual void device_start();
|
||||||
@ -73,7 +79,7 @@ private:
|
|||||||
UINT32 compute_db_volume(double voltage);
|
UINT32 compute_db_volume(double voltage);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void (*m_external)(device_t*, int, short*);/* callback to generate external samples */
|
cem3394_ext_input_delegate m_ext_cb; /* callback to generate external samples */
|
||||||
|
|
||||||
sound_stream *m_stream; /* our stream */
|
sound_stream *m_stream; /* our stream */
|
||||||
double m_vco_zero_freq; /* frequency of VCO at 0.0V */
|
double m_vco_zero_freq; /* frequency of VCO at 0.0V */
|
||||||
|
@ -1177,22 +1177,6 @@ static INPUT_PORTS_START( shrike )
|
|||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************
|
|
||||||
*
|
|
||||||
* Sound definitions
|
|
||||||
*
|
|
||||||
*************************************/
|
|
||||||
|
|
||||||
static const cem3394_interface cem_interface =
|
|
||||||
{
|
|
||||||
431.894,
|
|
||||||
1300.0,
|
|
||||||
balsente_noise_gen
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
*
|
*
|
||||||
* Machine driver
|
* Machine driver
|
||||||
@ -1233,27 +1217,39 @@ static MACHINE_CONFIG_START( balsente, balsente_state )
|
|||||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||||
|
|
||||||
MCFG_CEM3394_ADD("cem1", 0)
|
MCFG_CEM3394_ADD("cem1", 0)
|
||||||
MCFG_SOUND_CONFIG(cem_interface)
|
MCFG_CEM3394_EXT_INPUT_CB(balsente_state, noise_gen_0)
|
||||||
|
MCFG_CEM3394_VCO_ZERO(431.894)
|
||||||
|
MCFG_CEM3394_FILTER_ZERO(1300.0)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
||||||
|
|
||||||
MCFG_CEM3394_ADD("cem2", 0)
|
MCFG_CEM3394_ADD("cem2", 0)
|
||||||
MCFG_SOUND_CONFIG(cem_interface)
|
MCFG_CEM3394_EXT_INPUT_CB(balsente_state, noise_gen_1)
|
||||||
|
MCFG_CEM3394_VCO_ZERO(431.894)
|
||||||
|
MCFG_CEM3394_FILTER_ZERO(1300.0)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
||||||
|
|
||||||
MCFG_CEM3394_ADD("cem3", 0)
|
MCFG_CEM3394_ADD("cem3", 0)
|
||||||
MCFG_SOUND_CONFIG(cem_interface)
|
MCFG_CEM3394_EXT_INPUT_CB(balsente_state, noise_gen_2)
|
||||||
|
MCFG_CEM3394_VCO_ZERO(431.894)
|
||||||
|
MCFG_CEM3394_FILTER_ZERO(1300.0)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
||||||
|
|
||||||
MCFG_CEM3394_ADD("cem4", 0)
|
MCFG_CEM3394_ADD("cem4", 0)
|
||||||
MCFG_SOUND_CONFIG(cem_interface)
|
MCFG_CEM3394_EXT_INPUT_CB(balsente_state, noise_gen_3)
|
||||||
|
MCFG_CEM3394_VCO_ZERO(431.894)
|
||||||
|
MCFG_CEM3394_FILTER_ZERO(1300.0)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
||||||
|
|
||||||
MCFG_CEM3394_ADD("cem5", 0)
|
MCFG_CEM3394_ADD("cem5", 0)
|
||||||
MCFG_SOUND_CONFIG(cem_interface)
|
MCFG_CEM3394_EXT_INPUT_CB(balsente_state, noise_gen_4)
|
||||||
|
MCFG_CEM3394_VCO_ZERO(431.894)
|
||||||
|
MCFG_CEM3394_FILTER_ZERO(1300.0)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
||||||
|
|
||||||
MCFG_CEM3394_ADD("cem6", 0)
|
MCFG_CEM3394_ADD("cem6", 0)
|
||||||
MCFG_SOUND_CONFIG(cem_interface)
|
MCFG_CEM3394_EXT_INPUT_CB(balsente_state, noise_gen_5)
|
||||||
|
MCFG_CEM3394_VCO_ZERO(431.894)
|
||||||
|
MCFG_CEM3394_FILTER_ZERO(1300.0)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.90)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
@ -215,6 +215,13 @@ public:
|
|||||||
void update_grudge_steering();
|
void update_grudge_steering();
|
||||||
void expand_roms(UINT8 cd_rom_mask);
|
void expand_roms(UINT8 cd_rom_mask);
|
||||||
inline void config_shooter_adc(UINT8 shooter, UINT8 adc_shift);
|
inline void config_shooter_adc(UINT8 shooter, UINT8 adc_shift);
|
||||||
|
inline void noise_gen_chip(int chip, int count, short *buffer);
|
||||||
|
CEM3394_EXT_INPUT(noise_gen_0);
|
||||||
|
CEM3394_EXT_INPUT(noise_gen_1);
|
||||||
|
CEM3394_EXT_INPUT(noise_gen_2);
|
||||||
|
CEM3394_EXT_INPUT(noise_gen_3);
|
||||||
|
CEM3394_EXT_INPUT(noise_gen_4);
|
||||||
|
CEM3394_EXT_INPUT(noise_gen_5);
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<cpu_device> m_audiocpu;
|
required_device<cpu_device> m_audiocpu;
|
||||||
optional_device<cpu_device> m_68k;
|
optional_device<cpu_device> m_68k;
|
||||||
|
@ -206,32 +206,28 @@ void balsente_state::poly17_init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void balsente_noise_gen(device_t *device, int count, short *buffer)
|
inline void balsente_state::noise_gen_chip(int chip, int count, short *buffer)
|
||||||
{
|
{
|
||||||
balsente_state *state = device->machine().driver_data<balsente_state>();
|
|
||||||
int chip;
|
|
||||||
UINT32 step, noise_counter;
|
|
||||||
|
|
||||||
/* find the chip we are referring to */
|
|
||||||
for (chip = 0; chip < ARRAY_LENGTH(state->m_cem_device); chip++)
|
|
||||||
if (device == state->m_cem_device[chip])
|
|
||||||
break;
|
|
||||||
assert(chip < ARRAY_LENGTH(state->m_cem_device));
|
|
||||||
|
|
||||||
/* noise generator runs at 100kHz */
|
/* noise generator runs at 100kHz */
|
||||||
step = (100000 << 14) / CEM3394_SAMPLE_RATE;
|
UINT32 step = (100000 << 14) / CEM3394_SAMPLE_RATE;
|
||||||
noise_counter = state->m_noise_position[chip];
|
UINT32 noise_counter = m_noise_position[chip];
|
||||||
|
|
||||||
while (count--)
|
while (count--)
|
||||||
{
|
{
|
||||||
*buffer++ = state->m_poly17[(noise_counter >> 14) & POLY17_SIZE] << 12;
|
*buffer++ = m_poly17[(noise_counter >> 14) & POLY17_SIZE] << 12;
|
||||||
noise_counter += step;
|
noise_counter += step;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remember the noise position */
|
/* remember the noise position */
|
||||||
state->m_noise_position[chip] = noise_counter;
|
m_noise_position[chip] = noise_counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CEM3394_EXT_INPUT(balsente_state::noise_gen_0) { noise_gen_chip(0, count, buffer); }
|
||||||
|
CEM3394_EXT_INPUT(balsente_state::noise_gen_1) { noise_gen_chip(1, count, buffer); }
|
||||||
|
CEM3394_EXT_INPUT(balsente_state::noise_gen_2) { noise_gen_chip(2, count, buffer); }
|
||||||
|
CEM3394_EXT_INPUT(balsente_state::noise_gen_3) { noise_gen_chip(3, count, buffer); }
|
||||||
|
CEM3394_EXT_INPUT(balsente_state::noise_gen_4) { noise_gen_chip(4, count, buffer); }
|
||||||
|
CEM3394_EXT_INPUT(balsente_state::noise_gen_5) { noise_gen_chip(5, count, buffer); }
|
||||||
|
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
@ -930,8 +926,7 @@ WRITE8_MEMBER(balsente_state::balsente_counter_control_w)
|
|||||||
/* bit D0 enables/disables audio */
|
/* bit D0 enables/disables audio */
|
||||||
if (diff_counter_control & 0x01)
|
if (diff_counter_control & 0x01)
|
||||||
{
|
{
|
||||||
int ch;
|
for (int ch = 0; ch < 6; ch++)
|
||||||
for (ch = 0; ch < 6; ch++)
|
|
||||||
m_cem_device[ch]->set_output_gain(0, (data & 0x01) ? 1.0 : 0);
|
m_cem_device[ch]->set_output_gain(0, (data & 0x01) ? 1.0 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user