diff options
Diffstat (limited to 'src/mame/audio/astrof.c')
-rw-r--r-- | src/mame/audio/astrof.c | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/src/mame/audio/astrof.c b/src/mame/audio/astrof.c new file mode 100644 index 00000000000..6e480a2d8a9 --- /dev/null +++ b/src/mame/audio/astrof.c @@ -0,0 +1,255 @@ +/*************************************************************************** + + Astro Fighter hardware + +****************************************************************************/ + +#include "driver.h" +#include "sound/samples.h" +#include "sound/sn76477.h" +#include "includes/astrof.h" + + + +/************************************* + * + * Globals + * + *************************************/ + +static UINT8 port_1_last; +static UINT8 port_2_last; +static UINT8 astrof_start_explosion; +static UINT8 astrof_death_playing; +static UINT8 astrof_bosskill_playing; + + + +/************************************* + * + * Machine setup + * + *************************************/ + + +MACHINE_START( astrof_audio ) +{ + /* setup for save states */ + state_save_register_global(port_1_last); + state_save_register_global(port_2_last); + state_save_register_global(astrof_start_explosion); + state_save_register_global(astrof_death_playing); + state_save_register_global(astrof_bosskill_playing); +} + + + +/************************************* + * + * Astro Fighter + * + *************************************/ + +#define SAMPLE_FIRE 0 +#define SAMPLE_EKILLED 1 +#define SAMPLE_WAVE 2 +#define SAMPLE_BOSSFIRE 6 +#define SAMPLE_FUEL 7 +#define SAMPLE_DEATH 8 +#define SAMPLE_BOSSHIT 9 +#define SAMPLE_BOSSKILL 10 + +#define CHANNEL_FIRE 0 +#define CHANNEL_EXPLOSION 1 +#define CHANNEL_WAVE 2 /* background humm */ +#define CHANNEL_BOSSFIRE 2 /* there is no background humm on the boss level */ +#define CHANNEL_FUEL 3 + + +WRITE8_HANDLER( astrof_audio_1_w ) +{ + UINT8 rising_bits = data & ~port_1_last; + + if (astrof_death_playing) + astrof_death_playing = sample_playing(CHANNEL_EXPLOSION); + + if (astrof_bosskill_playing) + astrof_bosskill_playing = sample_playing(CHANNEL_EXPLOSION); + + /* D2 - explosion */ + if (rising_bits & 0x04) + { + /* I *know* that the effect select port will be written shortly + after this one, so this works */ + astrof_start_explosion = 1; + } + + /* D0,D1,D3 - background noise */ + if ((data & 0x08) && (~port_1_last & 0x08)) + { + int sample = SAMPLE_WAVE + (data & 3); + sample_start(CHANNEL_WAVE, sample, 1); + } + + if ((~data & 0x08) && (port_1_last & 0x08)) + sample_stop(CHANNEL_WAVE); + + /* D4 - boss laser */ + if ((rising_bits & 0x10) && !astrof_bosskill_playing) + sample_start(CHANNEL_BOSSFIRE, SAMPLE_BOSSFIRE, 0); + + /* D5 - fire */ + if ((rising_bits & 0x20) && !astrof_bosskill_playing) + sample_start(CHANNEL_FIRE, SAMPLE_FIRE, 0); + + /* D6 - don't know. Probably something to do with the explosion sounds */ + + /* D7 - sound enable bit */ + sound_global_enable(data & 0x80); + + port_1_last = data; +} + + +WRITE8_HANDLER( astrof_audio_2_w ) +{ + UINT8 rising_bits = data & ~port_2_last; + + /* D0-D2 - explosion select (triggered by D2 of the other port */ + if (astrof_start_explosion) + { + /* this is really a compound effect, made up of I believe 3 sound + effects, but since our sample contains them all, disable playing + the other effects while the explosion is playing */ +logerror("Explosion: %x\n", data); + if (data & 0x04) + { + if (!astrof_bosskill_playing) + { + sample_start(CHANNEL_EXPLOSION, SAMPLE_BOSSKILL, 0); + + astrof_bosskill_playing = 1; + } + } + else if (data & 0x02) + sample_start(CHANNEL_EXPLOSION, SAMPLE_BOSSHIT, 0); + else if (data & 0x01) + sample_start(CHANNEL_EXPLOSION, SAMPLE_EKILLED, 0); + else + { + if (!astrof_death_playing) + { + sample_start(CHANNEL_EXPLOSION, SAMPLE_DEATH, 0); + + astrof_death_playing = 1; + } + } + + astrof_start_explosion = 0; + } + + /* D3 - low fuel warning */ + if (rising_bits & 0x08) + sample_start(CHANNEL_FUEL, SAMPLE_FUEL, 0); + + port_2_last = data; +} + + +static const char *astrof_sample_names[] = +{ + "*astrof", + "fire.wav", + "ekilled.wav", + "wave1.wav", + "wave2.wav", + "wave3.wav", + "wave4.wav", + "bossfire.wav", + "fuel.wav", + "death.wav", + "bosshit.wav", + "bosskill.wav", + 0 +}; + + +static struct Samplesinterface astrof_samples_interface = +{ + 4, /* 4 channels */ + astrof_sample_names +}; + + + +MACHINE_DRIVER_START( astrof_audio ) + MDRV_SPEAKER_STANDARD_MONO("mono") + MDRV_SOUND_ADD_TAG("samples", SAMPLES, 0) + MDRV_SOUND_CONFIG(astrof_samples_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) +MACHINE_DRIVER_END + + + +/************************************* + * + * Tomahawk + * + *************************************/ + +WRITE8_HANDLER( tomahawk_audio_w ) +{ + /* D0 - sonar */ + + /* D1 - UFO explosion */ + + /* D2 - morse */ + + /* D3 - missile */ + + /* D4 - UFO */ + + /* D5 - UFO under water */ + SN76477_enable_w(0, (~data >> 5) & 0x01); + + /* D6 - explosion */ + + /* D7 - sound enable bit */ + sound_global_enable(data & 0x80); +} + + +static struct SN76477interface tomahawk_sn76477_interface = +{ + 0, /* 4 noise_res (N/C) */ + 0, /* 5 filter_res (N/C) */ + 0, /* 6 filter_cap (N/C) */ + 0, /* 7 decay_res (N/C) */ + 0, /* 8 attack_decay_cap (N/C) */ + 0, /* 10 attack_res (N/C) */ + RES_K(47), /* 11 amplitude_res */ + RES_K(47), /* 12 feedback_res */ + 0, /* 16 vco_voltage (N/C) */ + CAP_U(0.033), /* 17 vco_cap */ + RES_K(33), /* 18 vco_res */ + 5.0, /* 19 pitch_voltage */ + RES_K(47), /* 20 slf_res */ + CAP_U(2.2), /* 21 slf_cap */ + 0, /* 23 oneshot_cap (N/C) */ + 0, /* 24 oneshot_res (N/C) */ + 1, /* 22 vco */ + 0, /* 26 mixer A */ + 0, /* 25 mixer B */ + 0, /* 27 mixer C */ + 0, /* 1 envelope 1 */ + 0, /* 28 envelope 2 */ + 1 /* 9 enable (variable) */ +}; + + +MACHINE_DRIVER_START( tomahawk_audio ) + MDRV_SPEAKER_STANDARD_MONO("mono") + MDRV_SOUND_ADD(SN76477, 0) + MDRV_SOUND_CONFIG(tomahawk_sn76477_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_DRIVER_END |