summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/sidvoice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/sidvoice.cpp')
-rw-r--r--src/devices/sound/sidvoice.cpp205
1 files changed, 108 insertions, 97 deletions
diff --git a/src/devices/sound/sidvoice.cpp b/src/devices/sound/sidvoice.cpp
index 9bc9a720ca7..9135e36c6f8 100644
--- a/src/devices/sound/sidvoice.cpp
+++ b/src/devices/sound/sidvoice.cpp
@@ -34,18 +34,15 @@ static const uint32_t noiseSeed = 0x7ffff8;
void sidInitMixerEngine(running_machine &machine)
{
- uint16_t uk;
- int32_t si, sj ;
-
/* 8-bit volume modulation tables. */
float filterAmpl = 0.7f;
- ampMod1x8=std::make_unique<int8_t[]>(256*256);
+ ampMod1x8 = std::make_unique<int8_t[]>(256*256);
- uk = 0;
- for ( si = 0; si < 256; si++ )
+ uint16_t uk = 0;
+ for (int32_t si = 0; si < 256; si++)
{
- for ( sj = -128; sj < 128; sj++, uk++ )
+ for (int32_t sj = -128; sj < 128; sj++, uk++)
{
ampMod1x8[uk] = (int8_t)(((si*sj)/255)*filterAmpl);
}
@@ -57,11 +54,11 @@ static inline void waveAdvance(sidOperator* pVoice)
{
#if defined(DIRECT_FIXPOINT)
pVoice->waveStep.l += pVoice->waveStepAdd.l;
- pVoice->waveStep.w[HI] &= 4095;
+ pVoice->waveStep.w.h &= 4095;
#else
pVoice->waveStepPnt += pVoice->waveStepAddPnt;
pVoice->waveStep += pVoice->waveStepAdd;
- if (pVoice->waveStepPnt > 65535 ) pVoice->waveStep++;
+ if (pVoice->waveStepPnt > 65535) pVoice->waveStep++;
pVoice->waveStepPnt &= 0xFFFF;
pVoice->waveStep &= 4095;
#endif
@@ -70,9 +67,9 @@ static inline void waveAdvance(sidOperator* pVoice)
static inline void noiseAdvance(sidOperator* pVoice)
{
pVoice->noiseStep += pVoice->noiseStepAdd;
- if (pVoice->noiseStep >= (1L<<20))
+ if (pVoice->noiseStep >= (1L << 20))
{
- pVoice->noiseStep -= (1L<<20);
+ pVoice->noiseStep -= (1L << 20);
#if defined(DIRECT_FIXPOINT)
pVoice->noiseReg.l = (pVoice->noiseReg.l << 1) |
(((pVoice->noiseReg.l >> 22) ^ (pVoice->noiseReg.l >> 17)) & 1);
@@ -81,16 +78,16 @@ static inline void noiseAdvance(sidOperator* pVoice)
(((pVoice->noiseReg >> 22) ^ (pVoice->noiseReg >> 17)) & 1);
#endif
#if defined(DIRECT_FIXPOINT) && defined(LARGE_NOISE_TABLE)
- pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.w[LO]]
- |noiseTableMSB[pVoice->noiseReg.w[HI]&0xff]);
+ pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.w.l]
+ |noiseTableMSB[pVoice->noiseReg.w.h & 0xff]);
#elif defined(DIRECT_FIXPOINT)
- pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.b[LOLO]]
- |noiseTableMID[pVoice->noiseReg.b[LOHI]]
- |noiseTableMSB[pVoice->noiseReg.b[HILO]]);
+ pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.b.l]
+ |noiseTableMID[pVoice->noiseReg.b.h]
+ |noiseTableMSB[pVoice->noiseReg.b.h2]);
#else
- pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg&0xff]
- |noiseTableMID[pVoice->noiseReg>>8&0xff]
- |noiseTableMSB[pVoice->noiseReg>>16&0xff]);
+ pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg & 0xff]
+ |noiseTableMID[pVoice->noiseReg >> 8 & 0xff]
+ |noiseTableMSB[pVoice->noiseReg >> 16 & 0xff]);
#endif
}
}
@@ -98,9 +95,9 @@ static inline void noiseAdvance(sidOperator* pVoice)
static inline void noiseAdvanceHp(sidOperator* pVoice)
{
uint32_t tmp = pVoice->noiseStepAdd;
- while (tmp >= (1L<<20))
+ while (tmp >= (1L << 20))
{
- tmp -= (1L<<20);
+ tmp -= (1L << 20);
#if defined(DIRECT_FIXPOINT)
pVoice->noiseReg.l = (pVoice->noiseReg.l << 1) |
(((pVoice->noiseReg.l >> 22) ^ (pVoice->noiseReg.l >> 17)) & 1);
@@ -110,9 +107,9 @@ static inline void noiseAdvanceHp(sidOperator* pVoice)
#endif
}
pVoice->noiseStep += tmp;
- if (pVoice->noiseStep >= (1L<<20))
+ if (pVoice->noiseStep >= (1L << 20))
{
- pVoice->noiseStep -= (1L<<20);
+ pVoice->noiseStep -= (1L << 20);
#if defined(DIRECT_FIXPOINT)
pVoice->noiseReg.l = (pVoice->noiseReg.l << 1) |
(((pVoice->noiseReg.l >> 22) ^ (pVoice->noiseReg.l >> 17)) & 1);
@@ -122,28 +119,28 @@ static inline void noiseAdvanceHp(sidOperator* pVoice)
#endif
}
#if defined(DIRECT_FIXPOINT) && defined(LARGE_NOISE_TABLE)
- pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.w[LO]]
- |noiseTableMSB[pVoice->noiseReg.w[HI]&0xff]);
+ pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.w.l]
+ |noiseTableMSB[pVoice->noiseReg.w.h & 0xff]);
#elif defined(DIRECT_FIXPOINT)
- pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.b[LOLO]]
- |noiseTableMID[pVoice->noiseReg.b[LOHI]]
- |noiseTableMSB[pVoice->noiseReg.b[HILO]]);
+ pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.b.l]
+ |noiseTableMID[pVoice->noiseReg.b.h]
+ |noiseTableMSB[pVoice->noiseReg.b.h2]);
#else
- pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg&0xff]
- |noiseTableMID[pVoice->noiseReg>>8&0xff]
- |noiseTableMSB[pVoice->noiseReg>>16&0xff]);
+ pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg & 0xff]
+ |noiseTableMID[pVoice->noiseReg >> 8 & 0xff]
+ |noiseTableMSB[pVoice->noiseReg >> 16 & 0xff]);
#endif
}
#if defined(DIRECT_FIXPOINT)
- #define triangle triangleTable[pVoice->waveStep.w[HI]]
- #define sawtooth sawtoothTable[pVoice->waveStep.w[HI]]
- #define square squareTable[pVoice->waveStep.w[HI] + pVoice->pulseIndex]
- #define triSaw waveform30[pVoice->waveStep.w[HI]]
- #define triSquare waveform50[pVoice->waveStep.w[HI] + pVoice->SIDpulseWidth]
- #define sawSquare waveform60[pVoice->waveStep.w[HI] + pVoice->SIDpulseWidth]
- #define triSawSquare waveform70[pVoice->waveStep.w[HI] + pVoice->SIDpulseWidth]
+ #define triangle triangleTable[pVoice->waveStep.w.h]
+ #define sawtooth sawtoothTable[pVoice->waveStep.w.h]
+ #define square squareTable[pVoice->waveStep.w.h + pVoice->pulseIndex]
+ #define triSaw waveform30[pVoice->waveStep.w.h]
+ #define triSquare waveform50[pVoice->waveStep.w.h + pVoice->SIDpulseWidth]
+ #define sawSquare waveform60[pVoice->waveStep.w.h + pVoice->SIDpulseWidth]
+ #define triSawSquare waveform70[pVoice->waveStep.w.h + pVoice->SIDpulseWidth]
#else
#define triangle triangleTable[pVoice->waveStep]
#define sawtooth sawtoothTable[pVoice->waveStep]
@@ -155,61 +152,72 @@ static inline void noiseAdvanceHp(sidOperator* pVoice)
#endif
-static void sidMode00(sidOperator* pVoice) {
- pVoice->output = (pVoice->filtIO-0x80);
+static void sidMode00(sidOperator* pVoice)
+{
+ pVoice->output = (pVoice->filtIO - 0x80);
waveAdvance(pVoice);
}
#if 0
/* not used */
-static void sidModeReal00(sidOperator* pVoice) {
+static void sidModeReal00(sidOperator* pVoice)
+{
pVoice->output = 0;
waveAdvance(pVoice);
}
#endif
-static void sidMode10(sidOperator* pVoice) {
+static void sidMode10(sidOperator* pVoice)
+{
pVoice->output = triangle;
waveAdvance(pVoice);
}
-static void sidMode20(sidOperator* pVoice) {
+static void sidMode20(sidOperator* pVoice)
+{
pVoice->output = sawtooth;
waveAdvance(pVoice);
}
-static void sidMode30(sidOperator* pVoice) {
+static void sidMode30(sidOperator* pVoice)
+{
pVoice->output = triSaw;
waveAdvance(pVoice);
}
-static void sidMode40(sidOperator* pVoice) {
+static void sidMode40(sidOperator* pVoice)
+{
pVoice->output = square;
waveAdvance(pVoice);
}
-static void sidMode50(sidOperator* pVoice) {
+static void sidMode50(sidOperator* pVoice)
+{
pVoice->output = triSquare;
waveAdvance(pVoice);
}
-static void sidMode60(sidOperator* pVoice) {
+static void sidMode60(sidOperator* pVoice)
+{
pVoice->output = sawSquare;
waveAdvance(pVoice);
}
-static void sidMode70(sidOperator* pVoice) {
+static void sidMode70(sidOperator* pVoice)
+{
pVoice->output = triSawSquare;
waveAdvance(pVoice);
}
-static void sidMode80(sidOperator* pVoice) {
+static void sidMode80(sidOperator* pVoice)
+{
pVoice->output = pVoice->noiseOutput;
waveAdvance(pVoice);
noiseAdvance(pVoice);
}
-static void sidMode80hp(sidOperator* pVoice) {
+static void sidMode80hp(sidOperator* pVoice)
+{
pVoice->output = pVoice->noiseOutput;
waveAdvance(pVoice);
noiseAdvanceHp(pVoice);
@@ -218,7 +226,7 @@ static void sidMode80hp(sidOperator* pVoice) {
static void sidModeLock(sidOperator* pVoice)
{
pVoice->noiseIsLocked = true;
- pVoice->output = (pVoice->filtIO-0x80);
+ pVoice->output = (pVoice->filtIO - 0x80);
waveAdvance(pVoice);
}
@@ -229,9 +237,9 @@ static void sidModeLock(sidOperator* pVoice)
static void sidMode14(sidOperator* pVoice)
{
#if defined(DIRECT_FIXPOINT)
- if ( pVoice->modulator->waveStep.w[HI] < 2048 )
+ if (pVoice->modulator->waveStep.w.h < 2048)
#else
- if ( pVoice->modulator->waveStep < 2048 )
+ if (pVoice->modulator->waveStep < 2048)
#endif
pVoice->output = triangle;
else
@@ -239,11 +247,12 @@ static void sidMode14(sidOperator* pVoice)
waveAdvance(pVoice);
}
-static void sidMode34(sidOperator* pVoice) {
+static void sidMode34(sidOperator* pVoice)
+{
#if defined(DIRECT_FIXPOINT)
- if ( pVoice->modulator->waveStep.w[HI] < 2048 )
+ if (pVoice->modulator->waveStep.w.h < 2048)
#else
- if ( pVoice->modulator->waveStep < 2048 )
+ if (pVoice->modulator->waveStep < 2048)
#endif
pVoice->output = triSaw;
else
@@ -251,11 +260,12 @@ static void sidMode34(sidOperator* pVoice) {
waveAdvance(pVoice);
}
-static void sidMode54(sidOperator* pVoice) {
+static void sidMode54(sidOperator* pVoice)
+{
#if defined(DIRECT_FIXPOINT)
- if ( pVoice->modulator->waveStep.w[HI] < 2048 )
+ if (pVoice->modulator->waveStep.w.h < 2048)
#else
- if ( pVoice->modulator->waveStep < 2048 )
+ if (pVoice->modulator->waveStep < 2048)
#endif
pVoice->output = triSquare;
else
@@ -263,11 +273,12 @@ static void sidMode54(sidOperator* pVoice) {
waveAdvance(pVoice);
}
-static void sidMode74(sidOperator* pVoice) {
+static void sidMode74(sidOperator* pVoice)
+{
#if defined(DIRECT_FIXPOINT)
- if ( pVoice->modulator->waveStep.w[HI] < 2048 )
+ if (pVoice->modulator->waveStep.w.h < 2048)
#else
- if ( pVoice->modulator->waveStep < 2048 )
+ if (pVoice->modulator->waveStep < 2048)
#endif
pVoice->output = triSawSquare;
else
@@ -281,26 +292,26 @@ static void sidMode74(sidOperator* pVoice) {
static inline void waveCalcFilter(sidOperator* pVoice)
{
- if ( pVoice->filtEnabled )
+ if (pVoice->filtEnabled)
{
- if ( pVoice->sid->filter.Type != 0 )
+ if (pVoice->sid->filter.Type != 0)
{
- if ( pVoice->sid->filter.Type == 0x20 )
+ if (pVoice->sid->filter.Type == 0x20)
{
float tmp;
- pVoice->filtLow += ( pVoice->filtRef * pVoice->sid->filter.Dy );
+ pVoice->filtLow += (pVoice->filtRef * pVoice->sid->filter.Dy);
tmp = (float)pVoice->filtIO - pVoice->filtLow;
tmp -= pVoice->filtRef * pVoice->sid->filter.ResDy;
- pVoice->filtRef += ( tmp * (pVoice->sid->filter.Dy) );
+ pVoice->filtRef += (tmp * (pVoice->sid->filter.Dy));
pVoice->filtIO = (int8_t)(pVoice->filtRef-pVoice->filtLow/4);
}
else if (pVoice->sid->filter.Type == 0x40)
{
float tmp, tmp2;
- pVoice->filtLow += ( pVoice->filtRef * pVoice->sid->filter.Dy * 0.1f );
+ pVoice->filtLow += (pVoice->filtRef * pVoice->sid->filter.Dy * 0.1f);
tmp = (float)pVoice->filtIO - pVoice->filtLow;
tmp -= pVoice->filtRef * pVoice->sid->filter.ResDy;
- pVoice->filtRef += ( tmp * (pVoice->sid->filter.Dy) );
+ pVoice->filtRef += (tmp * (pVoice->sid->filter.Dy));
tmp2 = pVoice->filtRef - pVoice->filtIO/8;
if (tmp2 < -128)
tmp2 = -128;
@@ -312,30 +323,30 @@ static inline void waveCalcFilter(sidOperator* pVoice)
{
float sample, sample2;
int tmp;
- pVoice->filtLow += ( pVoice->filtRef * pVoice->sid->filter.Dy );
+ pVoice->filtLow += (pVoice->filtRef * pVoice->sid->filter.Dy);
sample = pVoice->filtIO;
sample2 = sample - pVoice->filtLow;
tmp = (int)sample2;
sample2 -= pVoice->filtRef * pVoice->sid->filter.ResDy;
- pVoice->filtRef += ( sample2 * pVoice->sid->filter.Dy );
+ pVoice->filtRef += (sample2 * pVoice->sid->filter.Dy);
- if ( pVoice->sid->filter.Type == 0x10 )
+ if (pVoice->sid->filter.Type == 0x10)
{
pVoice->filtIO = (int8_t)pVoice->filtLow;
}
- else if ( pVoice->sid->filter.Type == 0x30 )
+ else if (pVoice->sid->filter.Type == 0x30)
{
pVoice->filtIO = (int8_t)pVoice->filtLow;
}
- else if ( pVoice->sid->filter.Type == 0x50 )
+ else if (pVoice->sid->filter.Type == 0x50)
{
pVoice->filtIO = (int8_t)(sample - (tmp >> 1));
}
- else if ( pVoice->sid->filter.Type == 0x60 )
+ else if (pVoice->sid->filter.Type == 0x60)
{
pVoice->filtIO = (int8_t)tmp;
}
- else if ( pVoice->sid->filter.Type == 0x70 )
+ else if (pVoice->sid->filter.Type == 0x70)
{
pVoice->filtIO = (int8_t)(sample - (tmp >> 1));
}
@@ -358,9 +369,9 @@ static int8_t waveCalcMute(sidOperator* pVoice)
static int8_t waveCalcRangeCheck(sidOperator* pVoice)
{
#if defined(DIRECT_FIXPOINT)
- pVoice->waveStepOld = pVoice->waveStep.w[HI];
+ pVoice->waveStepOld = pVoice->waveStep.w.h;
(*pVoice->waveProc)(pVoice);
- if (pVoice->waveStep.w[HI] < pVoice->waveStepOld)
+ if (pVoice->waveStep.w.h < pVoice->waveStepOld)
#else
pVoice->waveStepOld = pVoice->waveStep;
(*pVoice->waveProc)(pVoice);
@@ -371,7 +382,7 @@ static int8_t waveCalcRangeCheck(sidOperator* pVoice)
pVoice->cycleLenCount = 0;
pVoice->outProc = &sidOperator::wave_calc_normal;
#if defined(DIRECT_FIXPOINT)
- pVoice->waveStep.w[HI] = 4095;
+ pVoice->waveStep.w.h = 4095;
#else
pVoice->waveStep = 4095;
#endif
@@ -457,11 +468,11 @@ void sidOperator::set()
SIDpulseWidth = (reg[2] | (reg[3] << 8)) & 0x0FFF;
newPulseIndex = 4096 - SIDpulseWidth;
#if defined(DIRECT_FIXPOINT)
- if (((waveStep.w[HI] + pulseIndex) >= 0x1000) && ((waveStep.w[HI] + newPulseIndex) >= 0x1000))
+ if (((waveStep.w.h + pulseIndex) >= 0x1000) && ((waveStep.w.h + newPulseIndex) >= 0x1000))
{
pulseIndex = newPulseIndex;
}
- else if (((waveStep.w[HI] + pulseIndex) < 0x1000) && ((waveStep.w[HI] + newPulseIndex) < 0x1000))
+ else if (((waveStep.w.h + pulseIndex) < 0x1000) && ((waveStep.w.h + newPulseIndex) < 0x1000))
{
pulseIndex = newPulseIndex;
}
@@ -598,7 +609,7 @@ void sidOperator::set2()
if (SIDctrl & 2)
{
- if (!modulator->SIDfreq || (modulator->SIDctrl & 8 ))
+ if (!modulator->SIDfreq || (modulator->SIDctrl & 8))
{
}
else if ((carrier->SIDctrl & 2) && (modulator->SIDfreq >= (SIDfreq << 1)))
@@ -610,7 +621,7 @@ void sidOperator::set2()
}
}
- if (((SIDctrl & 0x14 ) == 0x14) && modulator->SIDfreq)
+ if (((SIDctrl & 0x14) == 0x14) && modulator->SIDfreq)
waveProc = sidModeRingTable[SIDctrl >> 4];
else
waveProc = sidModeNormalTable[SIDctrl >> 4];
@@ -629,7 +640,7 @@ int8_t sidOperator::wave_calc_normal(sidOperator* pVoice)
if (pVoice->pulseIndex > 2048)
{
#if defined(DIRECT_FIXPOINT)
- pVoice->waveStep.w[HI] = 0;
+ pVoice->waveStep.w.h = 0;
#else
pVoice->waveStep = 0;
#endif
@@ -648,9 +659,9 @@ int8_t sidOperator::wave_calc_normal(sidOperator* pVoice)
inline void sidOperator::wave_calc_cycle_len()
{
#if defined(DIRECT_FIXPOINT)
- cycleAddLen.w[HI] = 0;
+ cycleAddLen.w.h = 0;
cycleAddLen.l += cycleLen.l;
- cycleLenCount = cycleAddLen.w[HI];
+ cycleLenCount = cycleAddLen.w.h;
#else
cycleAddLenPnt += cycleLenPnt;
cycleLenCount = cycleLen;
@@ -673,7 +684,7 @@ inline void sidOperator::wave_calc_cycle_len()
#endif
{
#if defined(DIRECT_FIXPOINT)
- uint16_t diff = cycleLenCount - cycleLen.w[HI];
+ uint16_t diff = cycleLenCount - cycleLen.w.h;
#else
uint16_t diff = cycleLenCount - cycleLen;
#endif
@@ -706,25 +717,25 @@ void sidInitWaveformTables(int type)
uint16_t k;
k = 0;
- for ( i = 0; i < 256; i++ )
- for ( j = 0; j < 8; j++ )
+ for (i = 0; i < 256; i++)
+ for (j = 0; j < 8; j++)
triangleTable[k++] = i;
- for ( i = 255; i >= 0; i-- )
- for ( j = 0; j < 8; j++ )
+ for (i = 255; i >= 0; i--)
+ for (j = 0; j < 8; j++)
triangleTable[k++] = i;
k = 0;
- for ( i = 0; i < 256; i++ )
- for ( j = 0; j < 16; j++ )
+ for (i = 0; i < 256; i++)
+ for (j = 0; j < 16; j++)
sawtoothTable[k++] = i;
k = 0;
- for ( i = 0; i < 4096; i++ )
+ for (i = 0; i < 4096; i++)
squareTable[k++] = 255; //0; my estimation; especial for digi sound
- for ( i = 0; i < 4096; i++ )
+ for (i = 0; i < 4096; i++)
squareTable[k++] = 0; //255;
- if ( type==mos6581_device::TYPE_8580 )
+ if (type == mos6581_device::TYPE_8580)
{
waveform30 = waveform30_8580;
waveform50 = waveform50_8580;
@@ -739,7 +750,7 @@ void sidInitWaveformTables(int type)
waveform70 = waveform70_6581; /* really audible? */
}
- if ( type==mos6581_device::TYPE_8580 )
+ if (type == mos6581_device::TYPE_8580)
{
sidModeNormalTable[3] = sidMode30;
sidModeNormalTable[6] = sidMode60;