summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/audio/gridlee.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/audio/gridlee.cpp')
-rw-r--r--src/mame/audio/gridlee.cpp168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/mame/audio/gridlee.cpp b/src/mame/audio/gridlee.cpp
new file mode 100644
index 00000000000..e91a0e38758
--- /dev/null
+++ b/src/mame/audio/gridlee.cpp
@@ -0,0 +1,168 @@
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+/*************************************************************************
+
+ Basic Gridlee sound driver
+
+*************************************************************************/
+
+#include "emu.h"
+#include "includes/gridlee.h"
+
+
+// device type definition
+const device_type GRIDLEE = &device_creator<gridlee_sound_device>;
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// gridlee_sound_device - constructor
+//-------------------------------------------------
+
+gridlee_sound_device::gridlee_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, GRIDLEE, "Gridlee Audio Custom", tag, owner, clock, "gridlee_sound", __FILE__),
+ device_sound_interface(mconfig, *this),
+ m_tone_step(0),
+ m_tone_fraction(0),
+ m_tone_volume(0),
+ m_stream(NULL),
+ m_samples(NULL),
+ m_freq_to_step(0.0)
+{
+ memset(m_sound_data, 0, sizeof(UINT8)*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 *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
+}