summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/sound/c6280.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/sound/c6280.c')
-rw-r--r--src/emu/sound/c6280.c370
1 files changed, 185 insertions, 185 deletions
diff --git a/src/emu/sound/c6280.c b/src/emu/sound/c6280.c
index afc65da6516..b85cd54915b 100644
--- a/src/emu/sound/c6280.c
+++ b/src/emu/sound/c6280.c
@@ -62,92 +62,92 @@
void c6280_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
- static const int scale_tab[] = {
- 0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
- 0x10, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F
- };
-
- int lmal = (m_balance >> 4) & 0x0F;
- int rmal = (m_balance >> 0) & 0x0F;
-
- lmal = scale_tab[lmal];
- rmal = scale_tab[rmal];
-
- /* Clear buffer */
- for (int i = 0; i < samples; i++)
- {
- outputs[0][i] = 0;
- outputs[1][i] = 0;
- }
-
- for (int ch = 0; ch < 6; ch++)
- {
- /* Only look at enabled channels */
- if(m_channel[ch].m_control & 0x80)
- {
- int lal = (m_channel[ch].m_balance >> 4) & 0x0F;
- int ral = (m_channel[ch].m_balance >> 0) & 0x0F;
- int al = m_channel[ch].m_control & 0x1F;
-
- lal = scale_tab[lal];
- ral = scale_tab[ral];
-
- /* Calculate volume just as the patent says */
- int vll = (0x1F - lal) + (0x1F - al) + (0x1F - lmal);
- if(vll > 0x1F) vll = 0x1F;
-
- int vlr = (0x1F - ral) + (0x1F - al) + (0x1F - rmal);
- if(vlr > 0x1F) vlr = 0x1F;
-
- vll = m_volume_table[vll];
- vlr = m_volume_table[vlr];
-
- /* Check channel mode */
- if((ch >= 4) && (m_channel[ch].m_noise_control & 0x80))
- {
- /* Noise mode */
- UINT32 step = m_noise_freq_tab[(m_channel[ch].m_noise_control & 0x1F) ^ 0x1F];
- for (int i = 0; i < samples; i += 1)
- {
- static int data = 0;
- m_channel[ch].m_noise_counter += step;
- if(m_channel[ch].m_noise_counter >= 0x800)
- {
- data = (machine().rand() & 1) ? 0x1F : 0;
- }
- m_channel[ch].m_noise_counter &= 0x7FF;
- outputs[0][i] += (INT16)(vll * (data - 16));
- outputs[1][i] += (INT16)(vlr * (data - 16));
- }
- }
- else
- if(m_channel[ch].m_control & 0x40)
- {
- /* DDA mode */
- for (int i = 0; i < samples; i++)
- {
- outputs[0][i] += (INT16)(vll * (m_channel[ch].m_dda - 16));
- outputs[1][i] += (INT16)(vlr * (m_channel[ch].m_dda - 16));
- }
- }
- else
- {
- /* Waveform mode */
- UINT32 step = m_wave_freq_tab[m_channel[ch].m_frequency];
- for (int i = 0; i < samples; i += 1)
- {
- int offset;
- INT16 data;
- offset = (m_channel[ch].m_counter >> 12) & 0x1F;
- m_channel[ch].m_counter += step;
- m_channel[ch].m_counter &= 0x1FFFF;
- data = m_channel[ch].m_waveform[offset];
- outputs[0][i] += (INT16)(vll * (data - 16));
- outputs[1][i] += (INT16)(vlr * (data - 16));
- }
- }
- }
- }
+ static const int scale_tab[] = {
+ 0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
+ 0x10, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F
+ };
+
+ int lmal = (m_balance >> 4) & 0x0F;
+ int rmal = (m_balance >> 0) & 0x0F;
+
+ lmal = scale_tab[lmal];
+ rmal = scale_tab[rmal];
+
+ /* Clear buffer */
+ for (int i = 0; i < samples; i++)
+ {
+ outputs[0][i] = 0;
+ outputs[1][i] = 0;
+ }
+
+ for (int ch = 0; ch < 6; ch++)
+ {
+ /* Only look at enabled channels */
+ if(m_channel[ch].m_control & 0x80)
+ {
+ int lal = (m_channel[ch].m_balance >> 4) & 0x0F;
+ int ral = (m_channel[ch].m_balance >> 0) & 0x0F;
+ int al = m_channel[ch].m_control & 0x1F;
+
+ lal = scale_tab[lal];
+ ral = scale_tab[ral];
+
+ /* Calculate volume just as the patent says */
+ int vll = (0x1F - lal) + (0x1F - al) + (0x1F - lmal);
+ if(vll > 0x1F) vll = 0x1F;
+
+ int vlr = (0x1F - ral) + (0x1F - al) + (0x1F - rmal);
+ if(vlr > 0x1F) vlr = 0x1F;
+
+ vll = m_volume_table[vll];
+ vlr = m_volume_table[vlr];
+
+ /* Check channel mode */
+ if((ch >= 4) && (m_channel[ch].m_noise_control & 0x80))
+ {
+ /* Noise mode */
+ UINT32 step = m_noise_freq_tab[(m_channel[ch].m_noise_control & 0x1F) ^ 0x1F];
+ for (int i = 0; i < samples; i += 1)
+ {
+ static int data = 0;
+ m_channel[ch].m_noise_counter += step;
+ if(m_channel[ch].m_noise_counter >= 0x800)
+ {
+ data = (machine().rand() & 1) ? 0x1F : 0;
+ }
+ m_channel[ch].m_noise_counter &= 0x7FF;
+ outputs[0][i] += (INT16)(vll * (data - 16));
+ outputs[1][i] += (INT16)(vlr * (data - 16));
+ }
+ }
+ else
+ if(m_channel[ch].m_control & 0x40)
+ {
+ /* DDA mode */
+ for (int i = 0; i < samples; i++)
+ {
+ outputs[0][i] += (INT16)(vll * (m_channel[ch].m_dda - 16));
+ outputs[1][i] += (INT16)(vlr * (m_channel[ch].m_dda - 16));
+ }
+ }
+ else
+ {
+ /* Waveform mode */
+ UINT32 step = m_wave_freq_tab[m_channel[ch].m_frequency];
+ for (int i = 0; i < samples; i += 1)
+ {
+ int offset;
+ INT16 data;
+ offset = (m_channel[ch].m_counter >> 12) & 0x1F;
+ m_channel[ch].m_counter += step;
+ m_channel[ch].m_counter &= 0x1FFFF;
+ data = m_channel[ch].m_waveform[offset];
+ outputs[0][i] += (INT16)(vll * (data - 16));
+ outputs[1][i] += (INT16)(vlr * (data - 16));
+ }
+ }
+ }
+ }
}
@@ -164,91 +164,91 @@ WRITE8_MEMBER( c6280_device::c6280_w )
{
m_cpudevice->io_set_buffer(data);
- channel *chan = &m_channel[m_select];
+ channel *chan = &m_channel[m_select];
- /* Update stream */
- m_stream->update();
+ /* Update stream */
+ m_stream->update();
- switch(offset & 0x0F)
- {
- case 0x00: /* Channel select */
- m_select = data & 0x07;
- break;
+ switch(offset & 0x0F)
+ {
+ case 0x00: /* Channel select */
+ m_select = data & 0x07;
+ break;
- case 0x01: /* Global balance */
- m_balance = data;
- break;
+ case 0x01: /* Global balance */
+ m_balance = data;
+ break;
- case 0x02: /* Channel frequency (LSB) */
- chan->m_frequency = (chan->m_frequency & 0x0F00) | data;
- chan->m_frequency &= 0x0FFF;
- break;
+ case 0x02: /* Channel frequency (LSB) */
+ chan->m_frequency = (chan->m_frequency & 0x0F00) | data;
+ chan->m_frequency &= 0x0FFF;
+ break;
- case 0x03: /* Channel frequency (MSB) */
- chan->m_frequency = (chan->m_frequency & 0x00FF) | (data << 8);
- chan->m_frequency &= 0x0FFF;
- break;
+ case 0x03: /* Channel frequency (MSB) */
+ chan->m_frequency = (chan->m_frequency & 0x00FF) | (data << 8);
+ chan->m_frequency &= 0x0FFF;
+ break;
- case 0x04: /* Channel control (key-on, DDA mode, volume) */
+ case 0x04: /* Channel control (key-on, DDA mode, volume) */
- /* 1-to-0 transition of DDA bit resets waveform index */
- if((chan->m_control & 0x40) && ((data & 0x40) == 0))
- {
- chan->m_index = 0;
- }
- chan->m_control = data;
- break;
+ /* 1-to-0 transition of DDA bit resets waveform index */
+ if((chan->m_control & 0x40) && ((data & 0x40) == 0))
+ {
+ chan->m_index = 0;
+ }
+ chan->m_control = data;
+ break;
- case 0x05: /* Channel balance */
- chan->m_balance = data;
- break;
+ case 0x05: /* Channel balance */
+ chan->m_balance = data;
+ break;
- case 0x06: /* Channel waveform data */
+ case 0x06: /* Channel waveform data */
- switch(chan->m_control & 0xC0)
- {
- case 0x00:
- chan->m_waveform[chan->m_index & 0x1F] = data & 0x1F;
- chan->m_index = (chan->m_index + 1) & 0x1F;
- break;
+ switch(chan->m_control & 0xC0)
+ {
+ case 0x00:
+ chan->m_waveform[chan->m_index & 0x1F] = data & 0x1F;
+ chan->m_index = (chan->m_index + 1) & 0x1F;
+ break;
- case 0x40:
- break;
+ case 0x40:
+ break;
- case 0x80:
- chan->m_waveform[chan->m_index & 0x1F] = data & 0x1F;
- chan->m_index = (chan->m_index + 1) & 0x1F;
- break;
+ case 0x80:
+ chan->m_waveform[chan->m_index & 0x1F] = data & 0x1F;
+ chan->m_index = (chan->m_index + 1) & 0x1F;
+ break;
- case 0xC0:
- chan->m_dda = data & 0x1F;
- break;
- }
+ case 0xC0:
+ chan->m_dda = data & 0x1F;
+ break;
+ }
- break;
+ break;
- case 0x07: /* Noise control (enable, frequency) */
- chan->m_noise_control = data;
- break;
+ case 0x07: /* Noise control (enable, frequency) */
+ chan->m_noise_control = data;
+ break;
- case 0x08: /* LFO frequency */
- m_lfo_frequency = data;
- break;
+ case 0x08: /* LFO frequency */
+ m_lfo_frequency = data;
+ break;
- case 0x09: /* LFO control (enable, mode) */
- m_lfo_control = data;
- break;
+ case 0x09: /* LFO control (enable, mode) */
+ m_lfo_control = data;
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
}
const device_type C6280 = &device_creator<c6280_device>;
c6280_device::c6280_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, C6280, "HuC6280", tag, owner, clock),
- device_sound_interface(mconfig, *this)
+ device_sound_interface(mconfig, *this)
{
}
@@ -268,50 +268,50 @@ void c6280_device::device_config_complete()
void c6280_device::device_start()
{
- int rate = clock() / 16;
+ int rate = clock() / 16;
- /* Create stereo stream */
- m_stream = machine().sound().stream_alloc(*this, 0, 2, rate, this);
+ /* Create stereo stream */
+ m_stream = machine().sound().stream_alloc(*this, 0, 2, rate, this);
const c6280_interface *intf = (const c6280_interface *)static_config();
- /* Loudest volume level for table */
- double level = 65535.0 / 6.0 / 32.0;
+ /* Loudest volume level for table */
+ double level = 65535.0 / 6.0 / 32.0;
- /* Clear context */
- m_select = 0;
- m_balance = 0;
- m_lfo_frequency = 0;
- m_lfo_control = 0;
- memset(m_channel, 0, sizeof(channel) * 8);
+ /* Clear context */
+ m_select = 0;
+ m_balance = 0;
+ m_lfo_frequency = 0;
+ m_lfo_control = 0;
+ memset(m_channel, 0, sizeof(channel) * 8);
- m_cpudevice = machine().device<h6280_device>(intf->cpu);
- if (m_cpudevice == NULL)
- {
- fatalerror("c6280_init: no CPU found with tag of '%s'\n", tag());
+ m_cpudevice = machine().device<h6280_device>(intf->cpu);
+ if (m_cpudevice == NULL)
+ {
+ fatalerror("c6280_init: no CPU found with tag of '%s'\n", tag());
}
- /* Make waveform frequency table */
- for (int i = 0; i < 4096; i += 1)
- {
- double step = ((clock() / rate) * 4096) / (i + 1);
- m_wave_freq_tab[(1 + i) & 0xFFF] = (UINT32)step;
- }
-
- /* Make noise frequency table */
- for (int i = 0; i < 32; i += 1)
- {
- double step = ((clock() / rate) * 32) / (i+1);
- m_noise_freq_tab[i] = (UINT32)step;
- }
-
- /* Make volume table */
- /* PSG has 48dB volume range spread over 32 steps */
- double step = 48.0 / 32.0;
- for (int i = 0; i < 31; i++)
- {
- m_volume_table[i] = (UINT16)level;
- level /= pow(10.0, step / 20.0);
- }
- m_volume_table[31] = 0;
+ /* Make waveform frequency table */
+ for (int i = 0; i < 4096; i += 1)
+ {
+ double step = ((clock() / rate) * 4096) / (i + 1);
+ m_wave_freq_tab[(1 + i) & 0xFFF] = (UINT32)step;
+ }
+
+ /* Make noise frequency table */
+ for (int i = 0; i < 32; i += 1)
+ {
+ double step = ((clock() / rate) * 32) / (i+1);
+ m_noise_freq_tab[i] = (UINT32)step;
+ }
+
+ /* Make volume table */
+ /* PSG has 48dB volume range spread over 32 steps */
+ double step = 48.0 / 32.0;
+ for (int i = 0; i < 31; i++)
+ {
+ m_volume_table[i] = (UINT16)level;
+ level /= pow(10.0, step / 20.0);
+ }
+ m_volume_table[31] = 0;
}