diff options
Diffstat (limited to 'src/mess/audio/gamate.c')
-rw-r--r-- | src/mess/audio/gamate.c | 221 |
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; } |