summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/sound/cdp1869.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/sound/cdp1869.c')
-rw-r--r--src/emu/sound/cdp1869.c201
1 files changed, 201 insertions, 0 deletions
diff --git a/src/emu/sound/cdp1869.c b/src/emu/sound/cdp1869.c
new file mode 100644
index 00000000000..1e6cff1fb1c
--- /dev/null
+++ b/src/emu/sound/cdp1869.c
@@ -0,0 +1,201 @@
+/***************************************************************************
+
+ cdp1869.c
+
+ Sound handler
+
+ TODO:
+
+ - white noise
+
+****************************************************************************/
+
+#include "sndintrf.h"
+#include "sound/cdp1869.h"
+#include "streams.h"
+
+struct CDP1869
+{
+ sound_stream *stream; /* returned by stream_create() */
+ int clock; /* chip's base frequency */
+
+ int incr; /* initial wave state */
+ INT16 signal; /* current signal */
+
+ int toneoff;
+ int wnoff;
+
+ UINT8 tonediv;
+ UINT8 tonefreq;
+ UINT8 toneamp;
+
+ UINT8 wnfreq;
+ UINT8 wnamp;
+};
+
+/*************************************
+ *
+ * Stream update
+ *
+ *************************************/
+
+static void cdp1869_update(void *param, stream_sample_t **inputs, stream_sample_t **_buffer, int length)
+{
+ struct CDP1869 *info = (struct CDP1869 *) param;
+ INT16 signal = info->signal;
+ stream_sample_t *buffer = _buffer[0];
+
+ memset( buffer, 0, length * sizeof(*buffer) );
+
+ if (!info->toneoff && info->toneamp)
+ {
+ double frequency = (info->clock / 2) / (512 >> info->tonefreq) / (info->tonediv + 1);
+// double amplitude = info->toneamp * ((0.78*5) / 15);
+
+ int rate = Machine->sample_rate / 2;
+
+ /* get progress through wave */
+ int incr = info->incr;
+
+ if (signal < 0)
+ {
+ signal = -(info->toneamp * (0x07fff / 15));
+ }
+ else
+ {
+ signal = info->toneamp * (0x07fff / 15);
+ }
+
+ while( length-- > 0 )
+ {
+ *buffer++ = signal;
+ incr -= frequency;
+ while( incr < 0 )
+ {
+ incr += rate;
+ signal = -signal;
+ }
+ }
+
+ /* store progress through wave */
+ info->incr = incr;
+ info->signal = signal;
+ }
+/*
+ if (!info->wnoff)
+ {
+ double amplitude = info->wnamp * ((0.78*5) / 15);
+
+ for (int wndiv = 0; wndiv < 128; wndiv++)
+ {
+ double frequency = (info->clock / 2) / (4096 >> info->wnfreq) / (wndiv + 1):
+
+ cdp1869_sum_square_wave(buffer, frequency, amplitude);
+ }
+ }
+*/
+}
+
+/*************************************
+ *
+ * Sound handler start
+ *
+ *************************************/
+
+static void *cdp1869_start(int sndindex, int clock, const void *config)
+{
+ struct CDP1869 *info;
+
+ info = auto_malloc(sizeof(*info));
+ memset(info, 0, sizeof(*info));
+
+ info->stream = stream_create(0, 1, Machine->sample_rate, info, cdp1869_update );
+ info->incr = 0;
+ info->signal = 0x07fff;
+
+ info->clock = clock;
+ info->toneoff = 1;
+ info->wnoff = 1;
+ info->tonediv = 0;
+ info->tonefreq = 0;
+ info->toneamp = 0;
+ info->wnfreq = 0;
+ info->wnamp = 0;
+
+ return info;
+}
+
+void cdp1869_set_toneamp(int which, int value)
+{
+ struct CDP1869 *info = sndti_token(SOUND_CDP1869, which);
+ info->toneamp = value & 0x0f;
+}
+
+void cdp1869_set_tonefreq(int which, int value)
+{
+ struct CDP1869 *info = sndti_token(SOUND_CDP1869, which);
+ info->tonefreq = value & 0x07;
+}
+
+void cdp1869_set_toneoff(int which, int value)
+{
+ struct CDP1869 *info = sndti_token(SOUND_CDP1869, which);
+ info->toneoff = value & 0x01;
+}
+
+void cdp1869_set_tonediv(int which, int value)
+{
+ struct CDP1869 *info = sndti_token(SOUND_CDP1869, which);
+ info->tonediv = value & 0x7f;
+}
+
+void cdp1869_set_wnamp(int which, int value)
+{
+ struct CDP1869 *info = sndti_token(SOUND_CDP1869, which);
+ info->wnamp = value & 0x0f;
+}
+
+void cdp1869_set_wnfreq(int which, int value)
+{
+ struct CDP1869 *info = sndti_token(SOUND_CDP1869, which);
+ info->wnfreq = value & 0x07;
+}
+
+void cdp1869_set_wnoff(int which, int value)
+{
+ struct CDP1869 *info = sndti_token(SOUND_CDP1869, which);
+ info->wnoff = value & 0x01;
+}
+
+/**************************************************************************
+ * Generic get_info
+ **************************************************************************/
+
+static void cdp1869_set_info(void *token, UINT32 state, sndinfo *info)
+{
+ switch (state)
+ {
+ /* no parameters to set */
+ }
+}
+
+void cdp1869_get_info(void *token, UINT32 state, sndinfo *info)
+{
+ switch (state)
+ {
+ /* --- the following bits of info are returned as 64-bit signed integers --- */
+
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case SNDINFO_PTR_SET_INFO: info->set_info = cdp1869_set_info; break;
+ case SNDINFO_PTR_START: info->start = cdp1869_start; break;
+ case SNDINFO_PTR_STOP: /* nothing */ break;
+ case SNDINFO_PTR_RESET: /* nothing */ break;
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case SNDINFO_STR_NAME: info->s = "CDP1869"; break;
+ case SNDINFO_STR_CORE_FAMILY: info->s = "RCA CDP1869"; break;
+ case SNDINFO_STR_CORE_VERSION: info->s = "1.0"; break;
+ case SNDINFO_STR_CORE_FILE: info->s = __FILE__; break;
+ case SNDINFO_STR_CORE_CREDITS: info->s = "Copyright (c) 2007, The MAME Team"; break;
+ }
+}