// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/*************************************************************************
Basic Gridlee sound driver
*************************************************************************/
#include "emu.h"
#include "includes/gridlee.h"
// device type definition
DEFINE_DEVICE_TYPE(GRIDLEE, gridlee_sound_device, "gridlee_sound", "Gridlee Custom Sound")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// gridlee_sound_device - constructor
//-------------------------------------------------
gridlee_sound_device::gridlee_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, GRIDLEE, tag, owner, clock),
device_sound_interface(mconfig, *this),
m_tone_step(0),
m_tone_fraction(0),
m_tone_volume(0),
m_stream(nullptr),
m_samples(nullptr),
m_freq_to_step(0.0)
{
memset(m_sound_data, 0, sizeof(uint8_t)*24);
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void gridlee_sound_device::device_start()
{
/* allocate the stream */
m_stream = stream_alloc(0, 1, machine().sample_rate());
m_samples = machine().device<samples_device>("samples");
m_freq_to_step = (double)(1 << 24) / (double)machine().sample_rate();
}
//-------------------------------------------------
// sound_stream_update - handle a stream update
//-------------------------------------------------
void gridlee_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
stream_sample_t *buffer = outputs[0];
/* loop over samples */
while (samples--)
{
/* tone channel */
m_tone_fraction += m_tone_step;
*buffer++ = (m_tone_fraction & 0x0800000) ? (m_tone_volume << 6) : 0;
}
}
WRITE8_MEMBER( gridlee_sound_device::gridlee_sound_w )
{
uint8_t *sound_data = m_sound_data;
samples_device *samples = m_samples;
m_stream->update();
switch (offset)
{
case 0x04:
if (data == 0xef && sound_data[offset] != 0xef)
samples->start(4, 1);
else if (data != 0xef && sound_data[offset] == 0xef)
samples->stop(4);
// if (!(data & 0x01) && (sound_data[offset] & 0x01))
// samples->start(5, 1);
// else if ((data & 0x01) && !(sound_data[offset] & 0x01))
// samples->stop(5);
break;
case 0x0c:
case 0x0d:
case 0x0e:
case 0x0f:
if ((data & 1) && !(sound_data[offset] & 1))
samples->start(offset - 0x0c, 1 - sound_data[offset - 4]);
else if (!(data & 1) && (sound_data[offset] & 1))
samples->stop(offset - 0x0c);
break;
case 0x08+0x08:
if (data)
m_tone_step = m_freq_to_step * (double)(data * 5);
else
m_tone_step = 0;
break;
case 0x09+0x08:
m_tone_volume = data;
break;
case 0x0b+0x08:
// tone_volume = (data | sound_data[0x0c+0x08]) ? 0xff : 0x00;
break;
case 0x0c+0x08:
// tone_volume = (data | sound_data[0x0b+0x08]) ? 0xff : 0x00;
break;
case 0x0d+0x08:
// if (data)
// tone_step = freq_to_step * (double)(data * 11);
// else
// tone_step = 0;
break;
}
sound_data[offset] = data;
#if 0
{
static int first = 1;
FILE *f;
f = fopen("sound.log", first ? "w" : "a");
first = 0;
fprintf(f, "[%02x=%02x] %02x %02x %02x %02x %02x %02x %02x %02x - %02x %02x %02x %02x %02x %02x %02x %02x - %02x %02x %02x %02x %02x %02x %02x %02x\n",
offset,data,
sound_data[0],
sound_data[1],
sound_data[2],
sound_data[3],
sound_data[4],
sound_data[5],
sound_data[6],
sound_data[7],
sound_data[8],
sound_data[9],
sound_data[10],
sound_data[11],
sound_data[12],
sound_data[13],
sound_data[14],
sound_data[15],
sound_data[16],
sound_data[17],
sound_data[18],
sound_data[19],
sound_data[20],
sound_data[21],
sound_data[22],
sound_data[23]);
fclose(f);
}
#endif
}