diff options
Diffstat (limited to 'trunk/src/mame/audio/gridlee.c')
-rw-r--r-- | trunk/src/mame/audio/gridlee.c | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/trunk/src/mame/audio/gridlee.c b/trunk/src/mame/audio/gridlee.c new file mode 100644 index 00000000000..4fd7597de1c --- /dev/null +++ b/trunk/src/mame/audio/gridlee.c @@ -0,0 +1,200 @@ +/************************************************************************* + + Basic Gridlee sound driver + +*************************************************************************/ + +#include "emu.h" +#include "includes/gridlee.h" +#include "sound/samples.h" + + +/************************************* + * + * Structures + * + *************************************/ + +struct gridlee_sound_state +{ + /* tone variables */ + UINT32 m_tone_step; + UINT32 m_tone_fraction; + UINT8 m_tone_volume; + + /* sound streaming variables */ + sound_stream *m_stream; + device_t *m_samples; + double m_freq_to_step; + UINT8 m_sound_data[24]; +}; + + +/************************************* + * + * Core sound generation + * + *************************************/ + +INLINE gridlee_sound_state *get_safe_token( device_t *device ) +{ + assert(device != NULL); + assert(device->type() == GRIDLEE); + + return (gridlee_sound_state *)downcast<legacy_device_base *>(device)->token(); +} + +static STREAM_UPDATE( gridlee_stream_update ) +{ + gridlee_sound_state *state = get_safe_token(device); + stream_sample_t *buffer = outputs[0]; + + /* loop over samples */ + while (samples--) + { + /* tone channel */ + state->m_tone_fraction += state->m_tone_step; + *buffer++ = (state->m_tone_fraction & 0x0800000) ? (state->m_tone_volume << 6) : 0; + } +} + + + +/************************************* + * + * Sound startup routines + * + *************************************/ + +static DEVICE_START( gridlee_sound ) +{ + gridlee_sound_state *state = get_safe_token(device); + running_machine &machine = device->machine(); + + /* allocate the stream */ + state->m_stream = device->machine().sound().stream_alloc(*device, 0, 1, machine.sample_rate(), NULL, gridlee_stream_update); + + state->m_samples = device->machine().device("samples"); + + state->m_freq_to_step = (double)(1 << 24) / (double)machine.sample_rate(); +} + + +DEVICE_GET_INFO( gridlee_sound ) +{ + switch (state) + { + /* --- the following bits of info are returned as 64-bit signed integers --- */ + case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(gridlee_sound_state); break; + + /* --- the following bits of info are returned as pointers to data or functions --- */ + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(gridlee_sound); break; + + /* --- the following bits of info are returned as NULL-terminated strings --- */ + case DEVINFO_STR_NAME: strcpy(info->s, "Gridlee Custom"); break; + case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; + } +} + + + +WRITE8_DEVICE_HANDLER( gridlee_sound_w ) +{ + gridlee_sound_state *state = get_safe_token(device); + UINT8 *sound_data = state->m_sound_data; + device_t *samples = state->m_samples; + + state->m_stream->update(); + + switch (offset) + { + case 0x04: + if (data == 0xef && sound_data[offset] != 0xef) + sample_start(samples, 4, 1, 0); + else if (data != 0xef && sound_data[offset] == 0xef) + sample_stop(samples, 4); +// if (!(data & 0x01) && (sound_data[offset] & 0x01)) +// sample_start(samples, 5, 1, 0); +// else if ((data & 0x01) && !(sound_data[offset] & 0x01)) +// sample_stop(samples, 5); + break; + + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + if ((data & 1) && !(sound_data[offset] & 1)) + sample_start(samples, offset - 0x0c, 1 - sound_data[offset - 4], 0); + else if (!(data & 1) && (sound_data[offset] & 1)) + sample_stop(samples, offset - 0x0c); + break; + + case 0x08+0x08: + if (data) + state->m_tone_step = state->m_freq_to_step * (double)(data * 5); + else + state->m_tone_step = 0; + break; + + case 0x09+0x08: + state->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 +} + + +DEFINE_LEGACY_SOUND_DEVICE(GRIDLEE, gridlee_sound); |