Modernized the sega005 sound device. (nw)

This commit is contained in:
Ivan Vangelista 2013-11-03 08:58:11 +00:00
parent ac82fce12d
commit a802f7a99e
2 changed files with 80 additions and 85 deletions

View File

@ -17,8 +17,6 @@
#include "sound/samples.h"
#include "sound/tms36xx.h"
#include "sound/dac.h"
#include "devlegcy.h"
/*************************************
@ -30,29 +28,13 @@
#define SEGA005_555_TIMER_FREQ (1.44 / ((15000 + 2 * 4700) * 1.5e-6))
#define SEGA005_COUNTER_FREQ (100000) /* unknown, just a guess */
class sega005_sound_device : public device_t,
public device_sound_interface
{
public:
sega005_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
private:
// internal state
};
extern const device_type SEGA005;
const device_type SEGA005 = &device_creator<sega005_sound_device>;
sega005_sound_device::sega005_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, SEGA005, "005 Custom", tag, owner, clock, "sega005_sound", __FILE__),
device_sound_interface(mconfig, *this)
device_sound_interface(mconfig, *this),
m_sega005_sound_timer(NULL),
m_sega005_stream(NULL)
{
}
@ -70,10 +52,19 @@ void sega005_sound_device::device_config_complete()
// device_start - device-specific startup
//-------------------------------------------------
static DEVICE_START( sega005_sound );
void sega005_sound_device::device_start()
{
DEVICE_START_NAME( sega005_sound )(this);
segag80r_state *state = machine().driver_data<segag80r_state>();
/* create the stream */
m_sega005_stream = machine().sound().stream_alloc(*this, 0, 1, SEGA005_COUNTER_FREQ, this);
/* create a timer for the 555 */
m_sega005_sound_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sega005_sound_device::sega005_auto_timer), this));
/* set the initial sound data */
state->m_sound_data = 0x00;
state->sega005_update_sound_data();
}
//-------------------------------------------------
@ -82,8 +73,24 @@ void sega005_sound_device::device_start()
void sega005_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
// should never get here
fatalerror("sound_stream_update called; not applicable to legacy sound devices\n");
segag80r_state *state = machine().driver_data<segag80r_state>();
const UINT8 *sound_prom = state->memregion("proms")->base();
int i;
/* no implementation yet */
for (i = 0; i < samples; i++)
{
if (!(state->m_sound_state[1] & 0x10) && (++state->m_square_count & 0xff) == 0)
{
state->m_square_count = sound_prom[state->m_sound_data & 0x1f];
/* hack - the RC should filter this out */
if (state->m_square_count != 0xff)
state->m_square_state += 2;
}
outputs[0][i] = (state->m_square_state & 2) ? 0x7fff : 0x0000;
}
}
@ -355,9 +362,6 @@ WRITE8_MEMBER(segag80r_state::astrob_sound_w)
*
*************************************/
static STREAM_UPDATE( sega005_stream_update );
static TIMER_CALLBACK( sega005_auto_timer );
/*
005
@ -495,29 +499,28 @@ WRITE8_MEMBER(segag80r_state::sega005_sound_a_w)
}
INLINE void sega005_update_sound_data(running_machine &machine)
inline void segag80r_state::sega005_update_sound_data()
{
segag80r_state *state = machine.driver_data<segag80r_state>();
UINT8 newval = state->memregion("005")->base()[state->m_sound_addr];
UINT8 diff = newval ^ state->m_sound_data;
UINT8 newval = memregion("005")->base()[m_sound_addr];
UINT8 diff = newval ^ m_sound_data;
//mame_printf_debug(" [%03X] = %02X\n", state->m_sound_addr, newval);
//mame_printf_debug(" [%03X] = %02X\n", m_sound_addr, newval);
/* latch the new value */
state->m_sound_data = newval;
m_sound_data = newval;
/* if bit 5 goes high, we reset the timer */
if ((diff & 0x20) && !(newval & 0x20))
{
//mame_printf_debug("Stopping timer\n");
state->m_sega005_sound_timer->adjust(attotime::never);
m_005snd->m_sega005_sound_timer->adjust(attotime::never);
}
/* if bit 5 goes low, we start the timer again */
if ((diff & 0x20) && (newval & 0x20))
{
//mame_printf_debug("Starting timer\n");
state->m_sega005_sound_timer->adjust(attotime::from_hz(SEGA005_555_TIMER_FREQ), 0, attotime::from_hz(SEGA005_555_TIMER_FREQ));
m_005snd->m_sega005_sound_timer->adjust(attotime::from_hz(SEGA005_555_TIMER_FREQ), 0, attotime::from_hz(SEGA005_555_TIMER_FREQ));
}
}
@ -536,7 +539,7 @@ WRITE8_MEMBER(segag80r_state::sega005_sound_b_w)
//mame_printf_debug("sound[%d] = %02X\n", 1, data);
/* force a stream update */
m_sega005_stream->update();
m_005snd->m_sega005_stream->update();
/* ROM address */
m_sound_addr = ((data & 0x0f) << 7) | (m_sound_addr & 0x7f);
@ -553,7 +556,7 @@ WRITE8_MEMBER(segag80r_state::sega005_sound_b_w)
m_sound_addr = (m_sound_addr & 0x780) | ((m_sound_addr + 1) & 0x07f);
/* update the sound data */
sega005_update_sound_data(machine());
sega005_update_sound_data();
}
@ -564,55 +567,17 @@ WRITE8_MEMBER(segag80r_state::sega005_sound_b_w)
*
*************************************/
static DEVICE_START( sega005_sound )
TIMER_CALLBACK_MEMBER( sega005_sound_device::sega005_auto_timer )
{
segag80r_state *state = device->machine().driver_data<segag80r_state>();
running_machine &machine = device->machine();
/* create the stream */
state->m_sega005_stream = device->machine().sound().stream_alloc(*device, 0, 1, SEGA005_COUNTER_FREQ, NULL, sega005_stream_update);
/* create a timer for the 555 */
state->m_sega005_sound_timer = machine.scheduler().timer_alloc(FUNC(sega005_auto_timer));
/* set the initial sound data */
state->m_sound_data = 0x00;
sega005_update_sound_data(machine);
}
static STREAM_UPDATE( sega005_stream_update )
{
segag80r_state *state = device->machine().driver_data<segag80r_state>();
const UINT8 *sound_prom = state->memregion("proms")->base();
int i;
/* no implementation yet */
for (i = 0; i < samples; i++)
{
if (!(state->m_sound_state[1] & 0x10) && (++state->m_square_count & 0xff) == 0)
{
state->m_square_count = sound_prom[state->m_sound_data & 0x1f];
/* hack - the RC should filter this out */
if (state->m_square_count != 0xff)
state->m_square_state += 2;
}
outputs[0][i] = (state->m_square_state & 2) ? 0x7fff : 0x0000;
}
}
static TIMER_CALLBACK( sega005_auto_timer )
{
segag80r_state *state = machine.driver_data<segag80r_state>();
segag80r_state *state = machine().driver_data<segag80r_state>();
/* force an update then clock the sound address if not held in reset */
state->m_sega005_stream->update();
m_sega005_stream->update();
if ((state->m_sound_state[1] & 0x20) && !(state->m_sound_state[1] & 0x10))
{
state->m_sound_addr = (state->m_sound_addr & 0x780) | ((state->m_sound_addr + 1) & 0x07f);
sega005_update_sound_data(machine);
state->sega005_update_sound_data();
}
}

View File

@ -10,6 +10,9 @@
#include "sound/sn76496.h"
#include "audio/segasnd.h"
class sega005_sound_device;
class segag80r_state : public driver_device
{
public:
@ -28,7 +31,8 @@ public:
m_audiocpu(*this, "audiocpu"),
m_samples(*this, "samples"),
m_speech(*this, "segaspeech"),
m_usbsnd(*this, "usbsnd") { }
m_usbsnd(*this, "usbsnd"),
m_005snd(*this, "005") { }
required_shared_ptr<UINT8> m_mainram;
required_shared_ptr<UINT8> m_videoram;
@ -40,6 +44,7 @@ public:
optional_device<samples_device> m_samples;
optional_device<speech_sound_device> m_speech;
optional_device<usb_sound_device> m_usbsnd;
optional_device<sega005_sound_device> m_005snd;
UINT8 m_sound_state[2];
UINT8 m_sound_rate;
@ -47,8 +52,6 @@ public:
UINT8 m_sound_data;
UINT8 m_square_state;
UINT8 m_square_count;
emu_timer *m_sega005_sound_timer;
sound_stream *m_sega005_stream;
UINT8 m_n7751_command;
UINT8 m_n7751_busy;
segag80_decrypt_func m_decrypt;
@ -121,6 +124,7 @@ public:
INTERRUPT_GEN_MEMBER(sindbadm_vblank_start);
DECLARE_WRITE8_MEMBER(sega005_sound_a_w);
DECLARE_WRITE8_MEMBER(sega005_sound_b_w);
inline void sega005_update_sound_data();
DECLARE_WRITE8_MEMBER(monsterb_sound_a_w);
DECLARE_WRITE8_MEMBER(monsterb_sound_b_w);
DECLARE_READ8_MEMBER(n7751_status_r);
@ -145,6 +149,32 @@ protected:
/*----------- defined in audio/segag80r.c -----------*/
class sega005_sound_device : public device_t,
public device_sound_interface
{
public:
sega005_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
emu_timer *m_sega005_sound_timer;
sound_stream *m_sega005_stream;
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
private:
// internal state
TIMER_CALLBACK_MEMBER( sega005_auto_timer );
};
extern const device_type SEGA005;
MACHINE_CONFIG_EXTERN( astrob_sound_board );
MACHINE_CONFIG_EXTERN( 005_sound_board );
MACHINE_CONFIG_EXTERN( spaceod_sound_board );