From 4ebee5fd3ff9ae296a3f666b5a939a457f68bd2f Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Sat, 11 Oct 2014 09:24:04 +0000 Subject: given to a couple of sound devices their own include. nw. --- src/mess/audio/vc4000.c | 72 --------- src/mess/audio/vc4000snd.c | 72 +++++++++ src/mess/audio/vc4000snd.h | 45 ++++++ src/mess/audio/wswan.c | 372 --------------------------------------------- src/mess/audio/wswan_snd.c | 372 +++++++++++++++++++++++++++++++++++++++++++++ src/mess/audio/wswan_snd.h | 89 +++++++++++ src/mess/drivers/vc4000.c | 2 +- src/mess/drivers/wswan.c | 2 +- src/mess/includes/vc4000.h | 36 +---- src/mess/includes/wswan.h | 81 +--------- src/mess/mess.mak | 4 +- 11 files changed, 584 insertions(+), 563 deletions(-) delete mode 100644 src/mess/audio/vc4000.c create mode 100644 src/mess/audio/vc4000snd.c create mode 100644 src/mess/audio/vc4000snd.h delete mode 100644 src/mess/audio/wswan.c create mode 100644 src/mess/audio/wswan_snd.c create mode 100644 src/mess/audio/wswan_snd.h (limited to 'src/mess') diff --git a/src/mess/audio/vc4000.c b/src/mess/audio/vc4000.c deleted file mode 100644 index d914930c44e..00000000000 --- a/src/mess/audio/vc4000.c +++ /dev/null @@ -1,72 +0,0 @@ -/*************************************************************************** - - PeT mess@utanet.at - main part in video/ - -***************************************************************************/ - -#include "includes/vc4000.h" - - -const device_type VC4000 = &device_creator; - -vc4000_sound_device::vc4000_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, VC4000, "Intertion Electronic VC 4000 Audio Custom", tag, owner, clock, "vc4000_sound", __FILE__), - device_sound_interface(mconfig, *this), - m_channel(NULL), - m_size(0), - m_pos(0), - m_level(0) -{ - memset(m_reg, 0, sizeof(UINT8)*1); -} - - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void vc4000_sound_device::device_start() -{ - m_channel = stream_alloc(0, 1, machine().sample_rate()); -} - - -//------------------------------------------------- -// sound_stream_update - handle a stream update -//------------------------------------------------- - -void vc4000_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) -{ - int i; - stream_sample_t *buffer = outputs[0]; - - for (i = 0; i < samples; i++, buffer++) - { - *buffer = 0; - if (m_reg[0] && m_pos <= m_size / 2) - { - *buffer = 0x7fff; - } - if (m_pos <= m_size) - m_pos++; - if (m_pos > m_size) - m_pos = 0; - } -} - - -void vc4000_sound_device::soundport_w(int offset, int data) -{ - m_channel->update(); - m_reg[offset] = data; - switch (offset) - { - case 0: - m_pos = 0; - m_level = TRUE; - // frequency 7874/(data+1) - m_size = machine().sample_rate() * (data + 1) /7874; - break; - } -} diff --git a/src/mess/audio/vc4000snd.c b/src/mess/audio/vc4000snd.c new file mode 100644 index 00000000000..6fc29ed200f --- /dev/null +++ b/src/mess/audio/vc4000snd.c @@ -0,0 +1,72 @@ +/*************************************************************************** + + PeT mess@utanet.at + main part in video/ + +***************************************************************************/ + +#include "vc4000snd.h" + + +const device_type VC4000_SND = &device_creator; + +vc4000_sound_device::vc4000_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, VC4000_SND, "Intertion Electronic VC 4000 Audio Custom", tag, owner, clock, "vc4000_sound", __FILE__), + device_sound_interface(mconfig, *this), + m_channel(NULL), + m_size(0), + m_pos(0), + m_level(0) +{ + memset(m_reg, 0, sizeof(UINT8)*1); +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void vc4000_sound_device::device_start() +{ + m_channel = stream_alloc(0, 1, machine().sample_rate()); +} + + +//------------------------------------------------- +// sound_stream_update - handle a stream update +//------------------------------------------------- + +void vc4000_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +{ + int i; + stream_sample_t *buffer = outputs[0]; + + for (i = 0; i < samples; i++, buffer++) + { + *buffer = 0; + if (m_reg[0] && m_pos <= m_size / 2) + { + *buffer = 0x7fff; + } + if (m_pos <= m_size) + m_pos++; + if (m_pos > m_size) + m_pos = 0; + } +} + + +void vc4000_sound_device::soundport_w(int offset, int data) +{ + m_channel->update(); + m_reg[offset] = data; + switch (offset) + { + case 0: + m_pos = 0; + m_level = TRUE; + // frequency 7874/(data+1) + m_size = machine().sample_rate() * (data + 1) /7874; + break; + } +} diff --git a/src/mess/audio/vc4000snd.h b/src/mess/audio/vc4000snd.h new file mode 100644 index 00000000000..531556084f0 --- /dev/null +++ b/src/mess/audio/vc4000snd.h @@ -0,0 +1,45 @@ +/***************************************************************************** + * + * includes/vc4000snd.h + * + ****************************************************************************/ + +#ifndef _VC4000SND_H_ +#define _VC4000SND_H_ + +#include "emu.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> vc4000_sound_device + +class vc4000_sound_device : public device_t, + public device_sound_interface +{ +public: + vc4000_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + ~vc4000_sound_device() { } + +protected: + // device-level overrides + 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); + +public: + void soundport_w(int mode, int data); + +private: + sound_stream *m_channel; + UINT8 m_reg[1]; + int m_size; + int m_pos; + unsigned m_level; +}; + +extern const device_type VC4000_SND; + +#endif /* _VC4000SND_H_ */ diff --git a/src/mess/audio/wswan.c b/src/mess/audio/wswan.c deleted file mode 100644 index 68c0b6a9a5d..00000000000 --- a/src/mess/audio/wswan.c +++ /dev/null @@ -1,372 +0,0 @@ -/************************************************************************************** - - Wonderswan sound emulation - - Wilbert Pol - - Sound emulation is preliminary and not complete - - -The noise taps and behavior are the same as the Virtual Boy. - -**************************************************************************************/ - -#include "includes/wswan.h" - - -// device type definition -const device_type WSWAN = &device_creator; - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// wswan_sound_device - constructor -//------------------------------------------------- - -wswan_sound_device::wswan_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, WSWAN, "WonderSwan Audio Custom", tag, owner, clock, "wswan_sound", __FILE__), - device_sound_interface(mconfig, *this), - m_channel(NULL), - m_sweep_step(0), - m_sweep_time(0), - m_sweep_count(0), - m_noise_type(0), - m_noise_reset(0), - m_noise_enable(0), - m_sample_address(0), - m_audio2_voice(0), - m_audio3_sweep(0), - m_audio4_noise(0), - m_mono(0), - m_voice_data(0), - m_output_volume(0), - m_external_stereo(0), - m_external_speaker(0), - m_noise_shift(0), - m_master_volume(0) -{ -} - - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void wswan_sound_device::device_start() -{ - m_channel = stream_alloc(0, 2, machine().sample_rate()); - - save_item(NAME(m_sweep_step)); - save_item(NAME(m_sweep_time)); - save_item(NAME(m_sweep_count)); - save_item(NAME(m_noise_type)); - save_item(NAME(m_noise_reset)); - save_item(NAME(m_noise_enable)); - save_item(NAME(m_sample_address)); - save_item(NAME(m_audio2_voice)); - save_item(NAME(m_audio3_sweep)); - save_item(NAME(m_audio4_noise)); - save_item(NAME(m_mono)); - save_item(NAME(m_voice_data)); - save_item(NAME(m_output_volume)); - save_item(NAME(m_external_stereo)); - save_item(NAME(m_external_speaker)); - save_item(NAME(m_noise_shift)); - save_item(NAME(m_master_volume)); - - save_item(NAME(m_audio1.freq)); - save_item(NAME(m_audio1.period)); - save_item(NAME(m_audio1.pos)); - save_item(NAME(m_audio1.vol_left)); - save_item(NAME(m_audio1.vol_right)); - save_item(NAME(m_audio1.on)); - save_item(NAME(m_audio1.signal)); - - save_item(NAME(m_audio2.freq)); - save_item(NAME(m_audio2.period)); - save_item(NAME(m_audio2.pos)); - save_item(NAME(m_audio2.vol_left)); - save_item(NAME(m_audio2.vol_right)); - save_item(NAME(m_audio2.on)); - save_item(NAME(m_audio2.signal)); - - save_item(NAME(m_audio3.freq)); - save_item(NAME(m_audio3.period)); - save_item(NAME(m_audio3.pos)); - save_item(NAME(m_audio3.vol_left)); - save_item(NAME(m_audio3.vol_right)); - save_item(NAME(m_audio3.on)); - save_item(NAME(m_audio3.signal)); - - save_item(NAME(m_audio4.freq)); - save_item(NAME(m_audio4.period)); - save_item(NAME(m_audio4.pos)); - save_item(NAME(m_audio4.vol_left)); - save_item(NAME(m_audio4.vol_right)); - save_item(NAME(m_audio4.on)); - save_item(NAME(m_audio4.signal)); -} - - -//------------------------------------------------- -// device_reset -//------------------------------------------------- - -void wswan_sound_device::device_reset() -{ - m_audio1.on = 0; - m_audio1.signal = 16; - m_audio1.pos = 0; - m_audio2.on = 0; - m_audio2.signal = 16; - m_audio2.pos = 0; - m_audio3.on = 0; - m_audio3.signal = 16; - m_audio3.pos = 0; - m_audio4.on = 0; - m_audio4.signal = 16; - m_audio4.pos = 0; -} - - -//------------------------------------------------- -// sound_stream_update - handle a stream update -//------------------------------------------------- - -void wswan_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) -{ - stream_sample_t sample, left, right; - - while( samples-- > 0 ) - { - left = right = 0; - - if ( m_audio1.on ) - { - sample = m_audio1.signal; - m_audio1.pos++; - if ( m_audio1.pos >= m_audio1.period / 2 ) - { - m_audio1.pos = 0; - m_audio1.signal = -m_audio1.signal; - } - left += m_audio1.vol_left * sample; - right += m_audio1.vol_right * sample; - } - - if ( m_audio2.on ) - { - if ( m_audio2_voice ) - { - left += (m_voice_data - 128)*(m_master_volume & 0x0f); - right += (m_voice_data - 128)*(m_master_volume & 0x0f); - } - else - { - sample = m_audio2.signal; - m_audio2.pos++; - if ( m_audio2.pos >= m_audio2.period / 2 ) - { - m_audio2.pos = 0; - m_audio2.signal = -m_audio2.signal; - } - left += m_audio2.vol_left * sample; - right += m_audio2.vol_right * sample; - } - } - - if ( m_audio3.on ) - { - sample = m_audio3.signal; - m_audio3.pos++; - if ( m_audio3.pos >= m_audio3.period / 2 ) - { - m_audio3.pos = 0; - m_audio3.signal = -m_audio3.signal; - } - if ( m_audio3_sweep && m_sweep_time ) - { - m_sweep_count++; - if ( m_sweep_count >= m_sweep_time ) - { - m_sweep_count = 0; - m_audio3.freq += m_sweep_step; - m_audio3.period = machine().sample_rate() / (3072000 / ((2048 - (m_audio3.freq & 0x7ff)) << 5)); - } - } - left += m_audio3.vol_left * sample; - right += m_audio3.vol_right * sample; - } - - if ( m_audio4.on ) - { - sample = m_audio4.signal; - m_audio4.pos++; - if ( m_audio4.pos >= m_audio4.period / 2 ) - { - m_audio4.signal = -m_audio4.signal; - m_audio4.pos = 0; - - if (m_noise_enable) - { - UINT16 new_bit = 0; - - if (m_noise_type == 0) - { - new_bit = (m_noise_shift ^ (m_noise_shift >> 5) ^ (m_noise_shift >> 8)) & 1; - } - else - { - static int shift_bit[] = { 0, 10, 13, 4, 8, 6, 9, 11 }; - - new_bit = (1 ^ (m_noise_shift >> 7) ^ (m_noise_shift >> shift_bit[m_noise_type])) & 1; - } - m_noise_shift = (m_noise_shift << 1) | new_bit; - - if (m_audio4_noise) - { - m_audio4.signal = (m_noise_shift & 0x8000) ? 16 : -16; - } - - m_noise_shift &= 0x7fff; - - if (m_noise_shift == 0x7fff) - { - m_noise_shift = (m_noise_type == 0) ? 0x80 : 0; - } - } - } - left += m_audio4.vol_left * sample; - right += m_audio4.vol_right * sample; - } - - left <<= 5; - right <<= 5; - - *(outputs[0]++) = left; - *(outputs[1]++) = right; - } -} - - -void wswan_sound_device::wswan_ch_set_freq( CHAN *ch, UINT16 freq ) -{ - freq &= 0x7ff; // docs say freq is 11bits and a few games (Morita Shougi, World Stadium + others) write 0x800 causing a divide by 0 crash - ch->freq = freq; - ch->period = machine().sample_rate() / (3072000 / ((2048 - freq) << 5)); -} - -WRITE8_MEMBER( wswan_sound_device::port_w ) -{ - m_channel->update(); - - switch( offset ) - { - case 0x80: /* Audio 1 freq (lo) */ - wswan_ch_set_freq(&m_audio1, (m_audio1.freq & 0xff00) | data); - break; - - case 0x81: /* Audio 1 freq (hi) */ - wswan_ch_set_freq(&m_audio1, (data << 8 ) | (m_audio1.freq & 0x00ff)); - break; - - case 0x82: /* Audio 2 freq (lo) */ - wswan_ch_set_freq(&m_audio2, (m_audio2.freq & 0xff00) | data); - break; - - case 0x83: /* Audio 2 freq (hi) */ - wswan_ch_set_freq(&m_audio2, (data << 8 ) | (m_audio2.freq & 0x00ff)); - break; - - case 0x84: /* Audio 3 freq (lo) */ - wswan_ch_set_freq(&m_audio3, (m_audio3.freq & 0xff00) | data); - break; - - case 0x85: /* Audio 3 freq (hi) */ - wswan_ch_set_freq(&m_audio3, (data << 8) | (m_audio3.freq & 0x00ff)); - break; - - case 0x86: /* Audio 4 freq (lo) */ - wswan_ch_set_freq(&m_audio4, (m_audio4.freq & 0xff00) | data); - break; - - case 0x87: /* Audio 4 freq (hi) */ - wswan_ch_set_freq(&m_audio4, (data << 8) | (m_audio4.freq & 0x00ff)); - break; - - case 0x88: /* Audio 1 volume */ - m_audio1.vol_left = ( data & 0xF0 ) >> 4; - m_audio1.vol_right = data & 0x0F; - break; - - case 0x89: /* Audio 2 volume */ - m_voice_data = data; - m_audio2.vol_left = ( data & 0xF0 ) >> 4; - m_audio2.vol_right = data & 0x0F; - break; - - case 0x8A: /* Audio 3 volume */ - m_audio3.vol_left = ( data & 0xF0 ) >> 4; - m_audio3.vol_right = data & 0x0F; - break; - - case 0x8B: /* Audio 4 volume */ - m_audio4.vol_left = ( data & 0xF0 ) >> 4; - m_audio4.vol_right = data & 0x0F; - break; - - case 0x8C: /* Sweep step */ - m_sweep_step = (INT8)data; - break; - - case 0x8D: /* Sweep time */ - m_sweep_time = space.machine().sample_rate() / ( 3072000 / ( 8192 * (data + 1) ) ); - break; - - case 0x8E: /* Noise control */ - m_noise_type = data & 0x07; - m_noise_reset = ( data & 0x08 ) >> 3; - m_noise_enable = ( data & 0x10 ) >> 4; - if (m_noise_reset) - { - m_noise_shift = (m_noise_type == 0) ? 0x80 : 0; - } - break; - - case 0x8F: /* Sample location */ - m_sample_address = data << 6; - break; - - case 0x90: /* Audio control */ - m_audio1.on = data & 0x01; - m_audio2.on = ( data & 0x02 ) >> 1; - m_audio3.on = ( data & 0x04 ) >> 2; - m_audio4.on = ( data & 0x08 ) >> 3; - m_audio2_voice = ( data & 0x20 ) >> 5; - m_audio3_sweep = ( data & 0x40 ) >> 6; - m_audio4_noise = ( data & 0x80 ) >> 7; - break; - - case 0x91: /* Audio output */ - m_mono = data & 0x01; - m_output_volume = ( data & 0x06 ) >> 1; - m_external_stereo = ( data & 0x08 ) >> 3; - m_external_speaker = 1; - break; - - case 0x92: /* Noise counter shift register (lo) */ - m_noise_shift = ( m_noise_shift & 0xFF00 ) | data; - break; - - case 0x93: /* Noise counter shift register (hi) */ - m_noise_shift = ( ( data & 0x7f ) << 8 ) | ( m_noise_shift & 0x00FF ); - break; - - case 0x94: /* Master volume */ - m_master_volume = data; - break; - } -} diff --git a/src/mess/audio/wswan_snd.c b/src/mess/audio/wswan_snd.c new file mode 100644 index 00000000000..e24f060dfda --- /dev/null +++ b/src/mess/audio/wswan_snd.c @@ -0,0 +1,372 @@ +/************************************************************************************** + + Wonderswan sound emulation + + Wilbert Pol + + Sound emulation is preliminary and not complete + + +The noise taps and behavior are the same as the Virtual Boy. + +**************************************************************************************/ + +#include "wswan_snd.h" + + +// device type definition +const device_type WSWAN_SND = &device_creator; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// wswan_sound_device - constructor +//------------------------------------------------- + +wswan_sound_device::wswan_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, WSWAN_SND, "WonderSwan Audio Custom", tag, owner, clock, "wswan_sound", __FILE__), + device_sound_interface(mconfig, *this), + m_channel(NULL), + m_sweep_step(0), + m_sweep_time(0), + m_sweep_count(0), + m_noise_type(0), + m_noise_reset(0), + m_noise_enable(0), + m_sample_address(0), + m_audio2_voice(0), + m_audio3_sweep(0), + m_audio4_noise(0), + m_mono(0), + m_voice_data(0), + m_output_volume(0), + m_external_stereo(0), + m_external_speaker(0), + m_noise_shift(0), + m_master_volume(0) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void wswan_sound_device::device_start() +{ + m_channel = stream_alloc(0, 2, machine().sample_rate()); + + save_item(NAME(m_sweep_step)); + save_item(NAME(m_sweep_time)); + save_item(NAME(m_sweep_count)); + save_item(NAME(m_noise_type)); + save_item(NAME(m_noise_reset)); + save_item(NAME(m_noise_enable)); + save_item(NAME(m_sample_address)); + save_item(NAME(m_audio2_voice)); + save_item(NAME(m_audio3_sweep)); + save_item(NAME(m_audio4_noise)); + save_item(NAME(m_mono)); + save_item(NAME(m_voice_data)); + save_item(NAME(m_output_volume)); + save_item(NAME(m_external_stereo)); + save_item(NAME(m_external_speaker)); + save_item(NAME(m_noise_shift)); + save_item(NAME(m_master_volume)); + + save_item(NAME(m_audio1.freq)); + save_item(NAME(m_audio1.period)); + save_item(NAME(m_audio1.pos)); + save_item(NAME(m_audio1.vol_left)); + save_item(NAME(m_audio1.vol_right)); + save_item(NAME(m_audio1.on)); + save_item(NAME(m_audio1.signal)); + + save_item(NAME(m_audio2.freq)); + save_item(NAME(m_audio2.period)); + save_item(NAME(m_audio2.pos)); + save_item(NAME(m_audio2.vol_left)); + save_item(NAME(m_audio2.vol_right)); + save_item(NAME(m_audio2.on)); + save_item(NAME(m_audio2.signal)); + + save_item(NAME(m_audio3.freq)); + save_item(NAME(m_audio3.period)); + save_item(NAME(m_audio3.pos)); + save_item(NAME(m_audio3.vol_left)); + save_item(NAME(m_audio3.vol_right)); + save_item(NAME(m_audio3.on)); + save_item(NAME(m_audio3.signal)); + + save_item(NAME(m_audio4.freq)); + save_item(NAME(m_audio4.period)); + save_item(NAME(m_audio4.pos)); + save_item(NAME(m_audio4.vol_left)); + save_item(NAME(m_audio4.vol_right)); + save_item(NAME(m_audio4.on)); + save_item(NAME(m_audio4.signal)); +} + + +//------------------------------------------------- +// device_reset +//------------------------------------------------- + +void wswan_sound_device::device_reset() +{ + m_audio1.on = 0; + m_audio1.signal = 16; + m_audio1.pos = 0; + m_audio2.on = 0; + m_audio2.signal = 16; + m_audio2.pos = 0; + m_audio3.on = 0; + m_audio3.signal = 16; + m_audio3.pos = 0; + m_audio4.on = 0; + m_audio4.signal = 16; + m_audio4.pos = 0; +} + + +//------------------------------------------------- +// sound_stream_update - handle a stream update +//------------------------------------------------- + +void wswan_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +{ + stream_sample_t sample, left, right; + + while( samples-- > 0 ) + { + left = right = 0; + + if ( m_audio1.on ) + { + sample = m_audio1.signal; + m_audio1.pos++; + if ( m_audio1.pos >= m_audio1.period / 2 ) + { + m_audio1.pos = 0; + m_audio1.signal = -m_audio1.signal; + } + left += m_audio1.vol_left * sample; + right += m_audio1.vol_right * sample; + } + + if ( m_audio2.on ) + { + if ( m_audio2_voice ) + { + left += (m_voice_data - 128)*(m_master_volume & 0x0f); + right += (m_voice_data - 128)*(m_master_volume & 0x0f); + } + else + { + sample = m_audio2.signal; + m_audio2.pos++; + if ( m_audio2.pos >= m_audio2.period / 2 ) + { + m_audio2.pos = 0; + m_audio2.signal = -m_audio2.signal; + } + left += m_audio2.vol_left * sample; + right += m_audio2.vol_right * sample; + } + } + + if ( m_audio3.on ) + { + sample = m_audio3.signal; + m_audio3.pos++; + if ( m_audio3.pos >= m_audio3.period / 2 ) + { + m_audio3.pos = 0; + m_audio3.signal = -m_audio3.signal; + } + if ( m_audio3_sweep && m_sweep_time ) + { + m_sweep_count++; + if ( m_sweep_count >= m_sweep_time ) + { + m_sweep_count = 0; + m_audio3.freq += m_sweep_step; + m_audio3.period = machine().sample_rate() / (3072000 / ((2048 - (m_audio3.freq & 0x7ff)) << 5)); + } + } + left += m_audio3.vol_left * sample; + right += m_audio3.vol_right * sample; + } + + if ( m_audio4.on ) + { + sample = m_audio4.signal; + m_audio4.pos++; + if ( m_audio4.pos >= m_audio4.period / 2 ) + { + m_audio4.signal = -m_audio4.signal; + m_audio4.pos = 0; + + if (m_noise_enable) + { + UINT16 new_bit = 0; + + if (m_noise_type == 0) + { + new_bit = (m_noise_shift ^ (m_noise_shift >> 5) ^ (m_noise_shift >> 8)) & 1; + } + else + { + static int shift_bit[] = { 0, 10, 13, 4, 8, 6, 9, 11 }; + + new_bit = (1 ^ (m_noise_shift >> 7) ^ (m_noise_shift >> shift_bit[m_noise_type])) & 1; + } + m_noise_shift = (m_noise_shift << 1) | new_bit; + + if (m_audio4_noise) + { + m_audio4.signal = (m_noise_shift & 0x8000) ? 16 : -16; + } + + m_noise_shift &= 0x7fff; + + if (m_noise_shift == 0x7fff) + { + m_noise_shift = (m_noise_type == 0) ? 0x80 : 0; + } + } + } + left += m_audio4.vol_left * sample; + right += m_audio4.vol_right * sample; + } + + left <<= 5; + right <<= 5; + + *(outputs[0]++) = left; + *(outputs[1]++) = right; + } +} + + +void wswan_sound_device::wswan_ch_set_freq( CHAN *ch, UINT16 freq ) +{ + freq &= 0x7ff; // docs say freq is 11bits and a few games (Morita Shougi, World Stadium + others) write 0x800 causing a divide by 0 crash + ch->freq = freq; + ch->period = machine().sample_rate() / (3072000 / ((2048 - freq) << 5)); +} + +WRITE8_MEMBER( wswan_sound_device::port_w ) +{ + m_channel->update(); + + switch( offset ) + { + case 0x80: /* Audio 1 freq (lo) */ + wswan_ch_set_freq(&m_audio1, (m_audio1.freq & 0xff00) | data); + break; + + case 0x81: /* Audio 1 freq (hi) */ + wswan_ch_set_freq(&m_audio1, (data << 8 ) | (m_audio1.freq & 0x00ff)); + break; + + case 0x82: /* Audio 2 freq (lo) */ + wswan_ch_set_freq(&m_audio2, (m_audio2.freq & 0xff00) | data); + break; + + case 0x83: /* Audio 2 freq (hi) */ + wswan_ch_set_freq(&m_audio2, (data << 8 ) | (m_audio2.freq & 0x00ff)); + break; + + case 0x84: /* Audio 3 freq (lo) */ + wswan_ch_set_freq(&m_audio3, (m_audio3.freq & 0xff00) | data); + break; + + case 0x85: /* Audio 3 freq (hi) */ + wswan_ch_set_freq(&m_audio3, (data << 8) | (m_audio3.freq & 0x00ff)); + break; + + case 0x86: /* Audio 4 freq (lo) */ + wswan_ch_set_freq(&m_audio4, (m_audio4.freq & 0xff00) | data); + break; + + case 0x87: /* Audio 4 freq (hi) */ + wswan_ch_set_freq(&m_audio4, (data << 8) | (m_audio4.freq & 0x00ff)); + break; + + case 0x88: /* Audio 1 volume */ + m_audio1.vol_left = ( data & 0xF0 ) >> 4; + m_audio1.vol_right = data & 0x0F; + break; + + case 0x89: /* Audio 2 volume */ + m_voice_data = data; + m_audio2.vol_left = ( data & 0xF0 ) >> 4; + m_audio2.vol_right = data & 0x0F; + break; + + case 0x8A: /* Audio 3 volume */ + m_audio3.vol_left = ( data & 0xF0 ) >> 4; + m_audio3.vol_right = data & 0x0F; + break; + + case 0x8B: /* Audio 4 volume */ + m_audio4.vol_left = ( data & 0xF0 ) >> 4; + m_audio4.vol_right = data & 0x0F; + break; + + case 0x8C: /* Sweep step */ + m_sweep_step = (INT8)data; + break; + + case 0x8D: /* Sweep time */ + m_sweep_time = space.machine().sample_rate() / ( 3072000 / ( 8192 * (data + 1) ) ); + break; + + case 0x8E: /* Noise control */ + m_noise_type = data & 0x07; + m_noise_reset = ( data & 0x08 ) >> 3; + m_noise_enable = ( data & 0x10 ) >> 4; + if (m_noise_reset) + { + m_noise_shift = (m_noise_type == 0) ? 0x80 : 0; + } + break; + + case 0x8F: /* Sample location */ + m_sample_address = data << 6; + break; + + case 0x90: /* Audio control */ + m_audio1.on = data & 0x01; + m_audio2.on = ( data & 0x02 ) >> 1; + m_audio3.on = ( data & 0x04 ) >> 2; + m_audio4.on = ( data & 0x08 ) >> 3; + m_audio2_voice = ( data & 0x20 ) >> 5; + m_audio3_sweep = ( data & 0x40 ) >> 6; + m_audio4_noise = ( data & 0x80 ) >> 7; + break; + + case 0x91: /* Audio output */ + m_mono = data & 0x01; + m_output_volume = ( data & 0x06 ) >> 1; + m_external_stereo = ( data & 0x08 ) >> 3; + m_external_speaker = 1; + break; + + case 0x92: /* Noise counter shift register (lo) */ + m_noise_shift = ( m_noise_shift & 0xFF00 ) | data; + break; + + case 0x93: /* Noise counter shift register (hi) */ + m_noise_shift = ( ( data & 0x7f ) << 8 ) | ( m_noise_shift & 0x00FF ); + break; + + case 0x94: /* Master volume */ + m_master_volume = data; + break; + } +} diff --git a/src/mess/audio/wswan_snd.h b/src/mess/audio/wswan_snd.h new file mode 100644 index 00000000000..a586a002cd3 --- /dev/null +++ b/src/mess/audio/wswan_snd.h @@ -0,0 +1,89 @@ +/***************************************************************************** + * + * includes/wswan_snd.h + * + ****************************************************************************/ + +#pragma once + +#ifndef _WSWAN_SND_H_ +#define _WSWAN_SND_H_ + +#include "emu.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +struct CHAN +{ + CHAN() : + freq(0), + period(0), + pos(0), + vol_left(0), + vol_right(0), + on(0), + signal(0) { } + + UINT16 freq; /* frequency */ + UINT32 period; /* period */ + UINT32 pos; /* position */ + UINT8 vol_left; /* volume left */ + UINT8 vol_right; /* volume right */ + UINT8 on; /* on/off */ + INT8 signal; /* signal */ +}; + + +// ======================> wswan_sound_device + +class wswan_sound_device : public device_t, + public device_sound_interface +{ +public: + wswan_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + ~wswan_sound_device() { } + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + // sound stream update overrides + virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); + +public: + DECLARE_WRITE8_MEMBER( port_w ); + +private: + void wswan_ch_set_freq( CHAN *ch, UINT16 freq ); + +private: + sound_stream *m_channel; + CHAN m_audio1; /* Audio channel 1 */ + CHAN m_audio2; /* Audio channel 2 */ + CHAN m_audio3; /* Audio channel 3 */ + CHAN m_audio4; /* Audio channel 4 */ + INT8 m_sweep_step; /* Sweep step */ + UINT32 m_sweep_time; /* Sweep time */ + UINT32 m_sweep_count; /* Sweep counter */ + UINT8 m_noise_type; /* Noise generator type */ + UINT8 m_noise_reset; /* Noise reset */ + UINT8 m_noise_enable; /* Noise enable */ + UINT16 m_sample_address; /* Sample address */ + UINT8 m_audio2_voice; /* Audio 2 voice */ + UINT8 m_audio3_sweep; /* Audio 3 sweep */ + UINT8 m_audio4_noise; /* Audio 4 noise */ + UINT8 m_mono; /* mono */ + UINT8 m_voice_data; /* voice data */ + UINT8 m_output_volume; /* output volume */ + UINT8 m_external_stereo; /* external stereo */ + UINT8 m_external_speaker; /* external speaker */ + UINT16 m_noise_shift; /* Noise counter shift register */ + UINT8 m_master_volume; /* Master volume */ +}; + +extern const device_type WSWAN_SND; + +#endif diff --git a/src/mess/drivers/vc4000.c b/src/mess/drivers/vc4000.c index ce5f7c490d2..085fb44ec62 100644 --- a/src/mess/drivers/vc4000.c +++ b/src/mess/drivers/vc4000.c @@ -539,7 +539,7 @@ static MACHINE_CONFIG_START( vc4000, vc4000_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("custom", VC4000, 0) + MCFG_SOUND_ADD("custom", VC4000_SND, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) /* quickload */ diff --git a/src/mess/drivers/wswan.c b/src/mess/drivers/wswan.c index edbc4eab746..a4c7c1ed4a2 100644 --- a/src/mess/drivers/wswan.c +++ b/src/mess/drivers/wswan.c @@ -126,7 +126,7 @@ static MACHINE_CONFIG_START( wswan, wswan_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") - MCFG_SOUND_ADD("custom", WSWAN, 0) + MCFG_SOUND_ADD("custom", WSWAN_SND, 0) MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) diff --git a/src/mess/includes/vc4000.h b/src/mess/includes/vc4000.h index bdba708b86c..82c59b38809 100644 --- a/src/mess/includes/vc4000.h +++ b/src/mess/includes/vc4000.h @@ -8,6 +8,7 @@ #define VC4000_H_ #include "emu.h" +#include "audio/vc4000snd.h" #include "cpu/s2650/s2650.h" #include "imagedev/snapquik.h" #include "imagedev/cassette.h" @@ -148,39 +149,4 @@ protected: inline void vc4000_draw_grid(UINT8 *collision); }; -/*----------- defined in audio/vc4000.c -----------*/ - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> vc4000_sound_device - -class vc4000_sound_device : public device_t, - public device_sound_interface -{ -public: - vc4000_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - ~vc4000_sound_device() { } - -protected: - // device-level overrides - 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); - -public: - void soundport_w(int mode, int data); - -private: - sound_stream *m_channel; - UINT8 m_reg[1]; - int m_size; - int m_pos; - unsigned m_level; -}; - -extern const device_type VC4000; - #endif /* VC4000_H_ */ diff --git a/src/mess/includes/wswan.h b/src/mess/includes/wswan.h index 3cf394adebf..c92c9d95e31 100644 --- a/src/mess/includes/wswan.h +++ b/src/mess/includes/wswan.h @@ -17,6 +17,7 @@ #include "emu.h" #include "cpu/v30mz/v30mz.h" +#include "audio/wswan_snd.h" #include "machine/nvram.h" #include "bus/wswan/slot.h" #include "bus/wswan/rom.h" @@ -75,8 +76,6 @@ struct VDP emu_timer *timer; }; -class wswan_sound_device; - class wswan_state : public driver_device { @@ -161,82 +160,4 @@ protected: }; -/*----------- defined in audio/wswan.c -----------*/ - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -struct CHAN -{ - CHAN() : - freq(0), - period(0), - pos(0), - vol_left(0), - vol_right(0), - on(0), - signal(0) { } - - UINT16 freq; /* frequency */ - UINT32 period; /* period */ - UINT32 pos; /* position */ - UINT8 vol_left; /* volume left */ - UINT8 vol_right; /* volume right */ - UINT8 on; /* on/off */ - INT8 signal; /* signal */ -}; - - -// ======================> wswan_sound_device - -class wswan_sound_device : public device_t, - public device_sound_interface -{ -public: - wswan_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - ~wswan_sound_device() { } - -protected: - // device-level overrides - virtual void device_start(); - virtual void device_reset(); - - // sound stream update overrides - virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); - -public: - DECLARE_WRITE8_MEMBER( port_w ); - -private: - void wswan_ch_set_freq( CHAN *ch, UINT16 freq ); - -private: - sound_stream *m_channel; - CHAN m_audio1; /* Audio channel 1 */ - CHAN m_audio2; /* Audio channel 2 */ - CHAN m_audio3; /* Audio channel 3 */ - CHAN m_audio4; /* Audio channel 4 */ - INT8 m_sweep_step; /* Sweep step */ - UINT32 m_sweep_time; /* Sweep time */ - UINT32 m_sweep_count; /* Sweep counter */ - UINT8 m_noise_type; /* Noise generator type */ - UINT8 m_noise_reset; /* Noise reset */ - UINT8 m_noise_enable; /* Noise enable */ - UINT16 m_sample_address; /* Sample address */ - UINT8 m_audio2_voice; /* Audio 2 voice */ - UINT8 m_audio3_sweep; /* Audio 3 sweep */ - UINT8 m_audio4_noise; /* Audio 4 noise */ - UINT8 m_mono; /* mono */ - UINT8 m_voice_data; /* voice data */ - UINT8 m_output_volume; /* output volume */ - UINT8 m_external_stereo; /* external stereo */ - UINT8 m_external_speaker; /* external speaker */ - UINT16 m_noise_shift; /* Noise counter shift register */ - UINT8 m_master_volume; /* Master volume */ -}; - -extern const device_type WSWAN; - - #endif /* WSWAN_H_ */ diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 7821e176761..37f2bcf3574 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -1026,7 +1026,7 @@ $(MESSOBJ)/bally.a: \ $(MESSOBJ)/bandai.a: \ $(MESS_DRIVERS)/sv8000.o \ $(MESS_DRIVERS)/rx78.o \ - $(MESS_DRIVERS)/wswan.o $(MESS_AUDIO)/wswan.o $(MESS_MACHINE)/wswan.o $(MESS_VIDEO)/wswan.o \ + $(MESS_DRIVERS)/wswan.o $(MESS_AUDIO)/wswan_snd.o $(MESS_MACHINE)/wswan.o $(MESS_VIDEO)/wswan.o \ $(MESSOBJ)/be.a: \ $(MESS_DRIVERS)/bebox.o $(MESS_MACHINE)/bebox.o \ @@ -1308,7 +1308,7 @@ $(MESSOBJ)/imp.a: \ $(MESS_DRIVERS)/tim100.o \ $(MESSOBJ)/interton.a: \ - $(MESS_DRIVERS)/vc4000.o $(MESS_AUDIO)/vc4000.o $(MESS_VIDEO)/vc4000.o \ + $(MESS_DRIVERS)/vc4000.o $(MESS_AUDIO)/vc4000snd.o $(MESS_VIDEO)/vc4000.o \ $(MESSOBJ)/intv.a: \ $(MESS_DRIVERS)/intv.o $(MESS_MACHINE)/intv.o $(MESS_VIDEO)/intv.o $(MESS_VIDEO)/stic.o \ -- cgit v1.2.3