summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/audio/segag80r.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/audio/segag80r.c')
-rw-r--r--src/mame/audio/segag80r.c139
1 files changed, 75 insertions, 64 deletions
diff --git a/src/mame/audio/segag80r.c b/src/mame/audio/segag80r.c
index 714d150fcb2..f271c780967 100644
--- a/src/mame/audio/segag80r.c
+++ b/src/mame/audio/segag80r.c
@@ -16,7 +16,6 @@
#include "sound/samples.h"
#include "sound/tms36xx.h"
#include "sound/dac.h"
-#include "sound/custom.h"
@@ -29,6 +28,9 @@
#define SEGA005_555_TIMER_FREQ (1.44 / ((15000 + 2 * 4700) * 1.5e-6))
#define SEGA005_COUNTER_FREQ (100000) /* unknown, just a guess */
+static DEVICE_GET_INFO( sega005_sound );
+#define SOUND_005 DEVICE_GET_INFO_NAME(sega005_sound)
+
/*************************************
@@ -242,6 +244,7 @@ WRITE8_HANDLER( astrob_sound_w )
{
120.0f, 82.0f, 62.0f, 56.0f, 47.0f, 39.0f, 33.0f, 27.0f, 24.0f, 22.0f
};
+ const device_config *samples = devtag_get_device(space->machine, SOUND, "samples");
float freq_factor;
UINT8 diff = data ^ sound_state[offset];
@@ -251,54 +254,54 @@ WRITE8_HANDLER( astrob_sound_w )
{
case 0:
/* INVADER-1: channel 0 */
- if ((diff & 0x01) && !(data & 0x01)) sample_start(0, (data & 0x80) ? 0 : 1, TRUE);
- if ((data & 0x01) && sample_playing(0)) sample_stop(0);
+ if ((diff & 0x01) && !(data & 0x01)) sample_start(samples, 0, (data & 0x80) ? 0 : 1, TRUE);
+ if ((data & 0x01) && sample_playing(samples, 0)) sample_stop(samples, 0);
/* INVADER-2: channel 1 */
- if ((diff & 0x02) && !(data & 0x02)) sample_start(1, (data & 0x80) ? 2 : 3, TRUE);
- if ((data & 0x02) && sample_playing(1)) sample_stop(1);
+ if ((diff & 0x02) && !(data & 0x02)) sample_start(samples, 1, (data & 0x80) ? 2 : 3, TRUE);
+ if ((data & 0x02) && sample_playing(samples, 1)) sample_stop(samples, 1);
/* INVADER-3: channel 2 */
- if ((diff & 0x04) && !(data & 0x04)) sample_start(2, (data & 0x80) ? 4 : 5, TRUE);
- if ((data & 0x04) && sample_playing(2)) sample_stop(2);
+ if ((diff & 0x04) && !(data & 0x04)) sample_start(samples, 2, (data & 0x80) ? 4 : 5, TRUE);
+ if ((data & 0x04) && sample_playing(samples, 2)) sample_stop(samples, 2);
/* INVADER-4: channel 3 */
- if ((diff & 0x08) && !(data & 0x08)) sample_start(3, (data & 0x80) ? 6 : 7, TRUE);
- if ((data & 0x08) && sample_playing(3)) sample_stop(3);
+ if ((diff & 0x08) && !(data & 0x08)) sample_start(samples, 3, (data & 0x80) ? 6 : 7, TRUE);
+ if ((data & 0x08) && sample_playing(samples, 3)) sample_stop(samples, 3);
/* ASTROIDS: channel 4 */
- if ((diff & 0x10) && !(data & 0x10)) sample_start(4, 8, TRUE);
- if ((data & 0x10) && sample_playing(4)) sample_stop(4);
+ if ((diff & 0x10) && !(data & 0x10)) sample_start(samples, 4, 8, TRUE);
+ if ((data & 0x10) && sample_playing(samples, 4)) sample_stop(samples, 4);
/* MUTE */
sound_global_enable(!(data & 0x20));
/* REFILL: channel 5 */
- if (!(data & 0x40) && !sample_playing(5)) sample_start(5, 9, FALSE);
- if ( (data & 0x40) && sample_playing(5)) sample_stop(5);
+ if (!(data & 0x40) && !sample_playing(samples, 5)) sample_start(samples, 5, 9, FALSE);
+ if ( (data & 0x40) && sample_playing(samples, 5)) sample_stop(samples, 5);
/* WARP: changes which sample is played for the INVADER samples above */
if (diff & 0x80)
{
- if (sample_playing(0)) sample_start(0, (data & 0x80) ? 0 : 1, TRUE);
- if (sample_playing(1)) sample_start(1, (data & 0x80) ? 2 : 3, TRUE);
- if (sample_playing(2)) sample_start(2, (data & 0x80) ? 4 : 5, TRUE);
- if (sample_playing(3)) sample_start(3, (data & 0x80) ? 6 : 7, TRUE);
+ if (sample_playing(samples, 0)) sample_start(samples, 0, (data & 0x80) ? 0 : 1, TRUE);
+ if (sample_playing(samples, 1)) sample_start(samples, 1, (data & 0x80) ? 2 : 3, TRUE);
+ if (sample_playing(samples, 2)) sample_start(samples, 2, (data & 0x80) ? 4 : 5, TRUE);
+ if (sample_playing(samples, 3)) sample_start(samples, 3, (data & 0x80) ? 6 : 7, TRUE);
}
break;
case 1:
/* LASER #1: channel 6 */
- if ((diff & 0x01) && !(data & 0x01)) sample_start(6, 10, FALSE);
+ if ((diff & 0x01) && !(data & 0x01)) sample_start(samples, 6, 10, FALSE);
/* LASER #2: channel 7 */
- if ((diff & 0x02) && !(data & 0x02)) sample_start(7, 11, FALSE);
+ if ((diff & 0x02) && !(data & 0x02)) sample_start(samples, 7, 11, FALSE);
/* SHORT EXPL: channel 8 */
- if ((diff & 0x04) && !(data & 0x04)) sample_start(8, 12, FALSE);
+ if ((diff & 0x04) && !(data & 0x04)) sample_start(samples, 8, 12, FALSE);
/* LONG EXPL: channel 8 */
- if ((diff & 0x08) && !(data & 0x08)) sample_start(8, 13, FALSE);
+ if ((diff & 0x08) && !(data & 0x08)) sample_start(samples, 8, 13, FALSE);
/* ATTACK RATE */
if ((diff & 0x10) && !(data & 0x10)) sound_rate = (sound_rate + 1) % 10;
@@ -307,10 +310,10 @@ WRITE8_HANDLER( astrob_sound_w )
if (!(data & 0x20)) sound_rate = 0;
/* BONUS: channel 9 */
- if ((diff & 0x40) && !(data & 0x40)) sample_start(9, 14, FALSE);
+ if ((diff & 0x40) && !(data & 0x40)) sample_start(samples, 9, 14, FALSE);
/* SONAR: channel 10 */
- if ((diff & 0x80) && !(data & 0x80)) sample_start(10, 15, FALSE);
+ if ((diff & 0x80) && !(data & 0x80)) sample_start(samples, 10, 15, FALSE);
break;
}
@@ -324,10 +327,10 @@ WRITE8_HANDLER( astrob_sound_w )
/* adjust the sample rate of invader sounds based the sound_rate */
/* this is an approximation */
- if (sample_playing(0)) sample_set_freq(0, sample_get_base_freq(0) * freq_factor);
- if (sample_playing(1)) sample_set_freq(1, sample_get_base_freq(1) * freq_factor);
- if (sample_playing(2)) sample_set_freq(2, sample_get_base_freq(2) * freq_factor);
- if (sample_playing(3)) sample_set_freq(3, sample_get_base_freq(3) * freq_factor);
+ if (sample_playing(samples, 0)) sample_set_freq(samples, 0, sample_get_base_freq(samples, 0) * freq_factor);
+ if (sample_playing(samples, 1)) sample_set_freq(samples, 1, sample_get_base_freq(samples, 1) * freq_factor);
+ if (sample_playing(samples, 2)) sample_set_freq(samples, 2, sample_get_base_freq(samples, 2) * freq_factor);
+ if (sample_playing(samples, 3)) sample_set_freq(samples, 3, sample_get_base_freq(samples, 3) * freq_factor);
}
@@ -339,7 +342,6 @@ WRITE8_HANDLER( astrob_sound_w )
*************************************/
static SOUND_START( 005 );
-static CUSTOM_START( sega005_custom_start );
static STREAM_UPDATE( sega005_stream_update );
static TIMER_CALLBACK( sega005_auto_timer );
static WRITE8_DEVICE_HANDLER( sega005_sound_a_w );
@@ -421,12 +423,6 @@ static const samples_interface sega005_samples_interface =
};
-static const custom_sound_interface sega005_custom_interface =
-{
- sega005_custom_start
-};
-
-
static const ppi8255_interface ppi8255_005_intf =
{
DEVCB_NULL,
@@ -449,8 +445,7 @@ MACHINE_DRIVER_START( 005_sound_board )
MDRV_SOUND_CONFIG(sega005_samples_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
- MDRV_SOUND_ADD("005", CUSTOM, 0)
- MDRV_SOUND_CONFIG(sega005_custom_interface)
+ MDRV_SOUND_ADD("005", 005, 0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_DRIVER_END
@@ -481,31 +476,32 @@ static SOUND_START( 005 )
static WRITE8_DEVICE_HANDLER( sega005_sound_a_w )
{
+ const device_config *samples = devtag_get_device(device->machine, SOUND, "samples");
UINT8 diff = data ^ sound_state[0];
sound_state[0] = data;
/* LARGE EXPL: channel 0 */
- if ((diff & 0x01) && !(data & 0x01)) sample_start(0, 0, FALSE);
+ if ((diff & 0x01) && !(data & 0x01)) sample_start(samples, 0, 0, FALSE);
/* SMALL EXPL: channel 1 */
- if ((diff & 0x02) && !(data & 0x02)) sample_start(1, 1, FALSE);
+ if ((diff & 0x02) && !(data & 0x02)) sample_start(samples, 1, 1, FALSE);
/* DROP BOMB: channel 2 */
- if ((diff & 0x04) && !(data & 0x04)) sample_start(2, 2, FALSE);
+ if ((diff & 0x04) && !(data & 0x04)) sample_start(samples, 2, 2, FALSE);
/* SHOOT PISTOL: channel 3 */
- if ((diff & 0x08) && !(data & 0x08)) sample_start(3, 3, FALSE);
+ if ((diff & 0x08) && !(data & 0x08)) sample_start(samples, 3, 3, FALSE);
/* MISSILE: channel 4 */
- if ((diff & 0x10) && !(data & 0x10)) sample_start(4, 4, FALSE);
+ if ((diff & 0x10) && !(data & 0x10)) sample_start(samples, 4, 4, FALSE);
/* HELICOPTER: channel 5 */
- if ((diff & 0x20) && !(data & 0x20) && !sample_playing(5)) sample_start(5, 5, TRUE);
- if ((diff & 0x20) && (data & 0x20)) sample_stop(5);
+ if ((diff & 0x20) && !(data & 0x20) && !sample_playing(samples, 5)) sample_start(samples, 5, 5, TRUE);
+ if ((diff & 0x20) && (data & 0x20)) sample_stop(samples, 5);
/* WHISTLE: channel 6 */
- if ((diff & 0x40) && !(data & 0x40) && !sample_playing(6)) sample_start(6, 6, TRUE);
- if ((diff & 0x40) && (data & 0x40)) sample_stop(6);
+ if ((diff & 0x40) && !(data & 0x40) && !sample_playing(samples, 6)) sample_start(samples, 6, 6, TRUE);
+ if ((diff & 0x40) && (data & 0x40)) sample_stop(samples, 6);
}
@@ -577,7 +573,7 @@ static WRITE8_DEVICE_HANDLER( sega005_sound_b_w )
*
*************************************/
-static CUSTOM_START( sega005_custom_start )
+static DEVICE_START( sega005_sound )
{
running_machine *machine = device->machine;
@@ -590,8 +586,20 @@ static CUSTOM_START( sega005_custom_start )
/* set the initial sound data */
sound_data = 0x00;
sega005_update_sound_data(machine);
+}
- return auto_malloc(1);
+
+static DEVICE_GET_INFO( sega005_sound )
+{
+ switch (state)
+ {
+ /* --- the following bits of info are returned as pointers to data or functions --- */
+ case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(sega005_sound); break;
+
+ /* --- the following bits of info are returned as NULL-terminated strings --- */
+ case DEVINFO_STR_NAME: strcpy(info->s, "005 Custom"); break;
+ case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break;
+ }
}
@@ -696,6 +704,7 @@ static SOUND_START( spaceod )
WRITE8_HANDLER( spaceod_sound_w )
{
+ const device_config *samples = devtag_get_device(space->machine, SOUND, "samples");
UINT8 diff = data ^ sound_state[offset];
sound_state[offset] = data;
@@ -703,40 +712,40 @@ WRITE8_HANDLER( spaceod_sound_w )
{
case 0:
/* BACK G: channel 0 */
- if ((diff & 0x01) && !(data & 0x01) && !sample_playing(0)) sample_start(0, 7, TRUE);
- if ((diff & 0x01) && (data & 0x01)) sample_stop(0);
+ if ((diff & 0x01) && !(data & 0x01) && !sample_playing(samples, 0)) sample_start(samples, 0, 7, TRUE);
+ if ((diff & 0x01) && (data & 0x01)) sample_stop(samples, 0);
/* SHORT EXP: channel 1 */
- if ((diff & 0x04) && !(data & 0x04)) sample_start(1, 2, FALSE);
+ if ((diff & 0x04) && !(data & 0x04)) sample_start(samples, 1, 2, FALSE);
/* ACCELERATE: channel 2 */
- if ((diff & 0x10) && !(data & 0x10)) sample_start(2, 8, FALSE);
+ if ((diff & 0x10) && !(data & 0x10)) sample_start(samples, 2, 8, FALSE);
/* BATTLE STAR: channel 3 */
- if ((diff & 0x20) && !(data & 0x20)) sample_start(3, 10, FALSE);
+ if ((diff & 0x20) && !(data & 0x20)) sample_start(samples, 3, 10, FALSE);
/* D BOMB: channel 4 */
- if ((diff & 0x40) && !(data & 0x40)) sample_start(4, 1, FALSE);
+ if ((diff & 0x40) && !(data & 0x40)) sample_start(samples, 4, 1, FALSE);
/* LONG EXP: channel 5 */
- if ((diff & 0x80) && !(data & 0x80)) sample_start(5, 3, FALSE);
+ if ((diff & 0x80) && !(data & 0x80)) sample_start(samples, 5, 3, FALSE);
break;
case 1:
/* SHOT: channel 6 */
- if ((diff & 0x01) && !(data & 0x01)) sample_start(6, 0, FALSE);
+ if ((diff & 0x01) && !(data & 0x01)) sample_start(samples, 6, 0, FALSE);
/* BONUS UP: channel 7 */
- if ((diff & 0x02) && !(data & 0x02)) sample_start(7, 6, FALSE);
+ if ((diff & 0x02) && !(data & 0x02)) sample_start(samples, 7, 6, FALSE);
/* WARP: channel 8 */
- if ((diff & 0x08) && !(data & 0x08)) sample_start(8, 4, FALSE);
+ if ((diff & 0x08) && !(data & 0x08)) sample_start(samples, 8, 4, FALSE);
/* APPEARANCE UFO: channel 9 */
- if ((diff & 0x40) && !(data & 0x40)) sample_start(9, 5, FALSE);
+ if ((diff & 0x40) && !(data & 0x40)) sample_start(samples, 9, 5, FALSE);
/* BLACK HOLE: channel 10 */
- if ((diff & 0x80) && !(data & 0x80)) sample_start(10, 9, FALSE);
+ if ((diff & 0x80) && !(data & 0x80)) sample_start(samples, 10, 9, FALSE);
break;
}
}
@@ -805,7 +814,7 @@ static ADDRESS_MAP_START( monsterb_7751_portmap, ADDRESS_SPACE_IO, 8 )
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(n7751_t1_r)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READ(n7751_command_r)
AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READ(n7751_rom_r)
- AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(dac_0_data_w)
+ AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_DEVWRITE(SOUND, "dac", dac_w)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_DEVWRITE(I8243, "audio_8243", n7751_p2_w)
AM_RANGE(MCS48_PORT_PROG, MCS48_PORT_PROG) AM_DEVWRITE(I8243, "audio_8243", i8243_prog_w)
ADDRESS_MAP_END
@@ -880,14 +889,15 @@ static SOUND_START( monsterb )
static WRITE8_DEVICE_HANDLER( monsterb_sound_a_w )
{
+ const device_config *tms = devtag_get_device(device->machine, SOUND, "music");
int enable_val;
/* Lower four data lines get decoded into 13 control lines */
- tms36xx_note_w(0, 0, data & 15);
+ tms36xx_note_w(tms, 0, data & 15);
/* Top four data lines address an 82S123 ROM that enables/disables voices */
enable_val = memory_region(device->machine, "prom")[(data & 0xF0) >> 4];
- tms3617_enable_w(0, enable_val >> 2);
+ tms3617_enable_w(tms, enable_val >> 2);
}
@@ -900,14 +910,15 @@ static WRITE8_DEVICE_HANDLER( monsterb_sound_a_w )
static WRITE8_DEVICE_HANDLER( monsterb_sound_b_w )
{
+ const device_config *samples = devtag_get_device(device->machine, SOUND, "samples");
UINT8 diff = data ^ sound_state[1];
sound_state[1] = data;
/* SHOT: channel 0 */
- if ((diff & 0x01) && !(data & 0x01)) sample_start(0, 0, FALSE);
+ if ((diff & 0x01) && !(data & 0x01)) sample_start(samples, 0, 0, FALSE);
/* DIVE: channel 1 */
- if ((diff & 0x02) && !(data & 0x02)) sample_start(1, 1, FALSE);
+ if ((diff & 0x02) && !(data & 0x02)) sample_start(samples, 1, 1, FALSE);
/* TODO: D7 on Port B might affect TMS3617 output (mute?) */
}