summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/audio/gamate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/audio/gamate.c')
-rw-r--r--src/mess/audio/gamate.c221
1 files changed, 121 insertions, 100 deletions
diff --git a/src/mess/audio/gamate.c b/src/mess/audio/gamate.c
index 369dac9df57..c49aeb72680 100644
--- a/src/mess/audio/gamate.c
+++ b/src/mess/audio/gamate.c
@@ -26,11 +26,10 @@ const int EnvelopeVolumes[]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
//-------------------------------------------------
gamate_sound_device::gamate_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, GAMATE_SND, "Gamate Audio Custom", tag, owner, clock, "gamate_sound", __FILE__),
- device_sound_interface(mconfig, *this),
- m_mixer_channel(NULL)
-{
-}
+ : device_t(mconfig, GAMATE_SND, "Gamate Audio Custom", tag, owner, clock, "gamate_sound", __FILE__)
+ , device_sound_interface(mconfig, *this)
+ , m_mixer_channel(NULL)
+ {}
//-------------------------------------------------
// device_start - device-specific startup
@@ -61,36 +60,39 @@ void gamate_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
for (i = 0; i < samples; i++, left++, right++)
{
noise.pos += noise.step;
- while (noise.pos >= 1.0) {
- // guess (white noise register taken from supervision)
- noise.level = noise.state & 0x40 ? 1 : 0;
- bool b1 = (noise.state & 0x40) != 0, b2 = (noise.state & 0x20) != 0;
- noise.state=(noise.state<<1)+(b1!=b2?1:0);
- noise.pos -= 1;
+ while (noise.pos >= 1.0)
+ {
+ // guess (white noise register taken from supervision)
+ noise.level = noise.state & 0x40 ? 1 : 0;
+ bool b1 = (noise.state & 0x40) != 0, b2 = (noise.state & 0x20) != 0;
+ noise.state=(noise.state<<1)+(b1!=b2?1:0);
+ noise.pos -= 1;
}
envelope.pos += envelope.step;
while (envelope.pos >= 1.0) {
- envelope.pos -= 1;
- envelope.index++;
- switch (envelope.control) {
- case 0: case 1: case 2: case 3:
- case 4: case 5: case 6: case 7:
- case 8: case 9: case 0xb:
- case 0xd: case 0xf:
- if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes)/2) {
- envelope.index=0;
- envelope.first=false;
- }
- break;
- default:
- if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes)) {
- envelope.index=0;
- envelope.first=false;
- }
- break;
- }
-
+ envelope.pos -= 1;
+ envelope.index++;
+ switch (envelope.control)
+ {
+ case 0: case 1: case 2: case 3:
+ case 4: case 5: case 6: case 7:
+ case 8: case 9: case 0xb:
+ case 0xd: case 0xf:
+ if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes)/2)
+ {
+ envelope.index=0;
+ envelope.first=false;
+ }
+ break;
+ default:
+ if (envelope.index>=ARRAY_LENGTH(EnvelopeVolumes))
+ {
+ envelope.index=0;
+ envelope.first=false;
+ }
+ break;
+ }
}
*left = 0;
@@ -99,51 +101,67 @@ void gamate_sound_device::sound_stream_update(sound_stream &stream, stream_sampl
{
if (channel->size != 0)
{
- channel->level= channel->pos <= channel->size / 2;
+ channel->level= channel->pos <= channel->size / 2;
bool l= channel->full_cycle? true: channel->level;
- if (!channel->tone) l= l && noise.level;
+ if (!channel->tone)
+ l= l && noise.level;
int volume=0;
- if (l) {
- if (channel->envelope_on) {
- switch (envelope.control) {
- case 0: case 1: case 2: case 3:
- case 0x9: // one time falling, low
- if (envelope.first && channel->level) volume=0xf-EnvelopeVolumes[envelope.index];
- break;
- case 4: case 5: case 6: case 7:
- case 0xf: // one time rising, low
- if (envelope.first && channel->level) volume=EnvelopeVolumes[envelope.index];
- break;
- case 8: // falling
- if (channel->level) volume=0xf-EnvelopeVolumes[envelope.index];
- break;
- case 0xa: // rising, falling
- if (channel->level) volume=0xf-EnvelopeVolumes[envelope.index]; // cube up
- break;
- case 0xb: // one time falling, high
- if (channel->level) volume=envelope.first? 0xf-EnvelopeVolumes[envelope.index]: 0xf;
- break;
- case 0xc: // rising, low
- if (channel->level) volume=envelope.index<ARRAY_LENGTH(EnvelopeVolumes)/2? EnvelopeVolumes[envelope.index]: 0;
- break;
- case 0xd: // one time rising, high
- if (channel->level) volume=envelope.first? EnvelopeVolumes[envelope.index]: 0xf;
- break;
- case 0xe: // falling, rising
- if (channel->level) volume=0xf-EnvelopeVolumes[envelope.index];
- break;
- }
- } else {
- volume=channel->volume;
- }
+ if (l)
+ {
+ if (channel->envelope_on)
+ {
+ switch (envelope.control)
+ {
+ case 0: case 1: case 2: case 3:
+ case 0x9: // one time falling, low
+ if (envelope.first && channel->level)
+ volume=0xf-EnvelopeVolumes[envelope.index];
+ break;
+ case 4: case 5: case 6: case 7:
+ case 0xf: // one time rising, low
+ if (envelope.first && channel->level)
+ volume=EnvelopeVolumes[envelope.index];
+ break;
+ case 8: // falling
+ if (channel->level)
+ volume=0xf-EnvelopeVolumes[envelope.index];
+ break;
+ case 0xa: // rising, falling
+ if (channel->level)
+ volume=0xf-EnvelopeVolumes[envelope.index]; // cube up
+ break;
+ case 0xb: // one time falling, high
+ if (channel->level)
+ volume=envelope.first ? 0xf-EnvelopeVolumes[envelope.index] : 0xf;
+ break;
+ case 0xc: // rising, low
+ if (channel->level)
+ volume=envelope.index<ARRAY_LENGTH(EnvelopeVolumes)/2 ? EnvelopeVolumes[envelope.index] : 0;
+ break;
+ case 0xd: // one time rising, high
+ if (channel->level)
+ volume=envelope.first ? EnvelopeVolumes[envelope.index] : 0xf;
+ break;
+ case 0xe: // falling, rising
+ if (channel->level)
+ volume=0xf-EnvelopeVolumes[envelope.index];
+ break;
+ }
+ }
+ else
+ {
+ volume=channel->volume;
+ }
}
if (j == Right)
- *right += Value2Volume(volume);
- else if (j==Left)
- *left += Value2Volume(volume);
- else {
- *right += Value2Volume(volume);
- *left += Value2Volume(volume);
+ *right += Value2Volume(volume);
+ else
+ if (j==Left)
+ *left += Value2Volume(volume);
+ else
+ {
+ *right += Value2Volume(volume);
+ *left += Value2Volume(volume);
}
channel->pos++;
if (channel->pos >= channel->size)
@@ -169,7 +187,7 @@ WRITE8_MEMBER( gamate_sound_device::device_w )
case 3:
case 4:
case 5:
- chan=offset/2;
+ chan=offset/2;
size = reg[chan*2] | ((reg[chan*2+1] & 0xf) << 8);
if (size)
{
@@ -182,40 +200,42 @@ WRITE8_MEMBER( gamate_sound_device::device_w )
m_channels[chan].pos = 0;
break;
case 6:
- size=data&0x1f;
- if (size==0) size=1;
- noise.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size);
- break;
+ size=data&0x1f;
+ if (size==0)
+ size=1;
+ noise.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size);
+ break;
case 7:
- m_channels[Right].full_cycle=data&1;
- m_channels[Right].tone=data&8;
- m_channels[Left].full_cycle=data&2;
- m_channels[Left].tone=data&0x10;
- m_channels[Both].full_cycle=data&4;
- m_channels[Both].tone=data&0x20;
- noise.state=1;
- noise.pos=0.0;
- noise.level=false;
- break;
+ m_channels[Right].full_cycle=data&1;
+ m_channels[Right].tone=data&8;
+ m_channels[Left].full_cycle=data&2;
+ m_channels[Left].tone=data&0x10;
+ m_channels[Both].full_cycle=data&4;
+ m_channels[Both].tone=data&0x20;
+ noise.state=1;
+ noise.pos=0.0;
+ noise.level=false;
+ break;
case 8:
case 9:
case 0xa:
- chan=offset-8;
+ chan=offset-8;
m_channels[chan].envelope_on = data & 0x10; // buggy aussetzer cube up
m_channels[chan].volume = data & 0xf;
break;
case 0xb: case 0xc:
size = reg[0xb] | ((reg[0xc]) << 8);
- if (size==0) size=1;
- envelope.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size);
- break;
+ if (size==0)
+ size=1;
+ envelope.step= machine().device("maincpu")->unscaled_clock() / (1.0*ClockDelay*machine().sample_rate()*size);
+ break;
case 0xd:
- envelope.control=data&0xf;
- envelope.pos=0;
- envelope.index=0;
- envelope.first=true;
- break;
-
+ envelope.control=data&0xf;
+ envelope.pos=0;
+ envelope.index=0;
+ envelope.first=true;
+ break;
+
}
envelope.pos=0; // guess
envelope.index=0;
@@ -224,7 +244,8 @@ WRITE8_MEMBER( gamate_sound_device::device_w )
READ8_MEMBER( gamate_sound_device::device_r )
{
- UINT8 data=0;
- if ((offset&0xf)<ARRAY_LENGTH(Mask)) data=reg[offset&0xf]&Mask[offset&0xf]; // unused bits set to last write value? in this area
- return data;
+ UINT8 data=0;
+ if ((offset&0xf)<ARRAY_LENGTH(Mask))
+ data=reg[offset&0xf]&Mask[offset&0xf]; // unused bits set to last write value? in this area
+ return data;
}