diff options
Diffstat (limited to 'src/devices/sound/sidvoice.cpp')
-rw-r--r-- | src/devices/sound/sidvoice.cpp | 205 |
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; |