diff options
Diffstat (limited to 'src/devices/sound/snkwave.cpp')
-rw-r--r-- | src/devices/sound/snkwave.cpp | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/src/devices/sound/snkwave.cpp b/src/devices/sound/snkwave.cpp index 4a16946199b..d11db0dc957 100644 --- a/src/devices/sound/snkwave.cpp +++ b/src/devices/sound/snkwave.cpp @@ -18,15 +18,15 @@ DEFINE_DEVICE_TYPE(SNKWAVE, snkwave_device, "snkwave", "SNK Wave") // snkwave_device - constructor //------------------------------------------------- -snkwave_device::snkwave_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, SNKWAVE, tag, owner, clock), - device_sound_interface(mconfig, *this), - m_stream(nullptr), - m_external_clock(0), - m_sample_rate(0), - m_frequency(0), - m_counter(0), - m_waveform_position(0) +snkwave_device::snkwave_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, SNKWAVE, tag, owner, clock), + device_sound_interface(mconfig, *this), + m_stream(nullptr), + m_external_clock(0), + m_sample_rate(0), + m_frequency(0), + m_counter(0), + m_waveform_position(0) { std::fill(std::begin(m_waveform), std::end(m_waveform), 0); } @@ -64,13 +64,8 @@ void snkwave_device::device_start() // for our sound stream //------------------------------------------------- -void snkwave_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +void snkwave_device::sound_stream_update(sound_stream &stream) { - stream_sample_t *buffer = outputs[0]; - - /* zap the contents of the buffer */ - memset(buffer, 0, samples * sizeof(*buffer)); - assert(m_counter < 0x1000); assert(m_frequency < 0x1000); @@ -79,7 +74,7 @@ void snkwave_device::sound_stream_update(sound_stream &stream, stream_sample_t * return; /* generate sound into buffer while updating the counter */ - while (samples-- > 0) + for (int sampindex = 0; sampindex < stream.samples(); sampindex++) { int loops; int16_t out = 0; @@ -104,7 +99,7 @@ void snkwave_device::sound_stream_update(sound_stream &stream, stream_sample_t * } } - *buffer++ = out; + stream.put_int(0, sampindex, out, 32768); } } @@ -115,18 +110,15 @@ void snkwave_device::sound_stream_update(sound_stream &stream, stream_sample_t * 2-5 waveform (8 3-bit nibbles) */ -WRITE8_MEMBER( snkwave_device::snkwave_w ) +void snkwave_device::snkwave_w(offs_t offset, uint8_t data) { m_stream->update(); - // all registers are 6-bit - data &= 0x3f; - - if (offset == 0) - m_frequency = (m_frequency & 0x03f) | (data << 6); - else if (offset == 1) - m_frequency = (m_frequency & 0xfc0) | data; - else if (offset <= 5) + if (offset == 0) // F1, high 6 bits + m_frequency = (m_frequency & 0x03f) | ((data & 0xfc) << 4); + else if (offset == 1) // F2, low 6 bits + m_frequency = (m_frequency & 0xfc0) | (data & 0x3f); + else if (offset <= 5) // W3 thru W6, low 3 bits of each nybble update_waveform(offset - 2, data); } @@ -143,7 +135,7 @@ void snkwave_device::update_waveform(unsigned int offset, uint8_t data) { assert(offset < WAVEFORM_LENGTH/4); - m_waveform[offset * 2] = ((data & 0x38) >> 3) << (12-CLOCK_SHIFT); + m_waveform[offset * 2] = ((data & 0x70) >> 4) << (12-CLOCK_SHIFT); m_waveform[offset * 2 + 1] = ((data & 0x07) >> 0) << (12-CLOCK_SHIFT); m_waveform[WAVEFORM_LENGTH-2 - offset * 2] = ~m_waveform[offset * 2 + 1]; m_waveform[WAVEFORM_LENGTH-1 - offset * 2] = ~m_waveform[offset * 2]; |