mos6581.cpp : Add save states

sid.cpp : Reduce duplicates, Add postload function
sidvoice.cpp : Fix type value when DIRECT_FIXPOINT defined
sidenvel.cpp, sidvoice.cpp, sid.cpp : Fix spacings
This commit is contained in:
cam900 2019-10-07 00:22:57 +09:00
parent 5aac500dee
commit be9efeee59
7 changed files with 362 additions and 239 deletions

View File

@ -68,6 +68,125 @@ mos8580_device::mos8580_device(const machine_config &mconfig, const char *tag, d
{ {
} }
//-------------------------------------------------
// save_state - add save states
//-------------------------------------------------
void mos6581_device::save_state(SID6581_t *token)
{
save_item(NAME(token->type));
save_item(NAME(token->clock));
save_item(NAME(token->PCMfreq));
save_item(NAME(token->PCMsid));
save_item(NAME(token->PCMsidNoise));
save_item(NAME(token->reg));
//save_item(NAME(token->sidKeysOn));
//save_item(NAME(token->sidKeysOff));
save_item(NAME(token->masterVolume));
save_item(NAME(token->masterVolumeAmplIndex));
save_item(NAME(token->filter.Enabled));
save_item(NAME(token->filter.Type));
save_item(NAME(token->filter.CurType));
save_item(NAME(token->filter.Dy));
save_item(NAME(token->filter.ResDy));
save_item(NAME(token->filter.Value));
for (int v = 0; v < m_token->max_voices; v++)
{
save_item(NAME(token->optr[v].reg), v);
save_item(NAME(token->optr[v].SIDfreq), v);
save_item(NAME(token->optr[v].SIDpulseWidth), v);
save_item(NAME(token->optr[v].SIDctrl), v);
save_item(NAME(token->optr[v].SIDAD), v);
save_item(NAME(token->optr[v].SIDSR), v);
save_item(NAME(token->optr[v].sync), v);
save_item(NAME(token->optr[v].pulseIndex), v);
save_item(NAME(token->optr[v].newPulseIndex), v);
save_item(NAME(token->optr[v].curSIDfreq), v);
save_item(NAME(token->optr[v].curNoiseFreq), v);
save_item(NAME(token->optr[v].output), v);
//save_item(NAME(token->optr[v].outputMask), v);
save_item(NAME(token->optr[v].filtVoiceMask), v);
save_item(NAME(token->optr[v].filtEnabled), v);
save_item(NAME(token->optr[v].filtLow), v);
save_item(NAME(token->optr[v].filtRef), v);
save_item(NAME(token->optr[v].filtIO), v);
save_item(NAME(token->optr[v].cycleLenCount), v);
#if defined(DIRECT_FIXPOINT)
save_item(NAME(token->optr[v].cycleLen.l), v);
save_item(NAME(token->optr[v].cycleAddLen.l), v);
#else
save_item(NAME(token->optr[v].cycleAddLenPnt), v);
save_item(NAME(token->optr[v].cycleLen), v);
save_item(NAME(token->optr[v].cycleLenPnt), v);
#endif
#if defined(DIRECT_FIXPOINT)
save_item(NAME(token->optr[v].waveStep.l), v);
save_item(NAME(token->optr[v].waveStepAdd.l), v);
#else
save_item(NAME(token->optr[v].waveStep), v);
save_item(NAME(token->optr[v].waveStepAdd), v);
save_item(NAME(token->optr[v].waveStepPnt), v);
save_item(NAME(token->optr[v].waveStepAddPnt), v);
#endif
save_item(NAME(token->optr[v].waveStepOld), v);
for (int n = 0; n < 2; n++)
{
save_item(NAME(token->optr[v].wavePre[n].len), v | (n << 4));
#if defined(DIRECT_FIXPOINT)
save_item(NAME(token->optr[v].wavePre[n].stp), v | (n << 4));
#else
save_item(NAME(token->optr[v].wavePre[n].pnt), v | (n << 4));
save_item(NAME(token->optr[v].wavePre[n].stp), v | (n << 4));
#endif
}
#if defined(DIRECT_FIXPOINT)
save_item(NAME(token->optr[v].noiseReg.l), v);
#else
save_item(NAME(token->optr[v].noiseReg), v);
#endif
save_item(NAME(token->optr[v].noiseStep), v);
save_item(NAME(token->optr[v].noiseStepAdd), v);
save_item(NAME(token->optr[v].noiseOutput), v);
save_item(NAME(token->optr[v].noiseIsLocked), v);
save_item(NAME(token->optr[v].ADSRctrl), v);
//save_item(NAME(token->optr[v].gateOnCtrl), v);
//save_item(NAME(token->optr[v].gateOffCtrl), v);
#ifdef SID_FPUENVE
save_item(NAME(token->optr[v].fenveStep), v);
save_item(NAME(token->optr[v].fenveStepAdd), v);
save_item(NAME(token->optr[v].enveStep), v);
#elif defined(DIRECT_FIXPOINT)
save_item(NAME(token->optr[v].enveStep.l), v);
save_item(NAME(token->optr[v].enveStepAdd.l), v);
#else
save_item(NAME(token->optr[v].enveStep), v);
save_item(NAME(token->optr[v].enveStepAdd), v);
save_item(NAME(token->optr[v].enveStepPnt), v);
save_item(NAME(token->optr[v].enveStepAddPnt), v);
#endif
save_item(NAME(token->optr[v].enveVol), v);
save_item(NAME(token->optr[v].enveSusVol), v);
save_item(NAME(token->optr[v].enveShortAttackCount), v);
}
save_item(NAME(token->optr3_outputmask));
}
//------------------------------------------------- //-------------------------------------------------
// device_start - device-specific startup // device_start - device-specific startup
@ -91,6 +210,7 @@ void mos6581_device::device_start()
m_token->init(); m_token->init();
sidInitWaveformTables(m_variant); sidInitWaveformTables(m_variant);
save_state(m_token.get());
} }
@ -104,6 +224,16 @@ void mos6581_device::device_reset()
} }
//-------------------------------------------------
// device_post_load - device-specific post-load
//-------------------------------------------------
void mos6581_device::device_post_load()
{
m_token->postload();
}
//------------------------------------------------- //-------------------------------------------------
// sound_stream_update - handle update requests for // sound_stream_update - handle update requests for
// our sound stream // our sound stream

View File

@ -62,10 +62,12 @@ protected:
// device-level overrides // device-level overrides
virtual void device_start() override; virtual void device_start() override;
virtual void device_reset() override; virtual void device_reset() override;
virtual void device_post_load() override;
// device_sound_interface overrides // device_sound_interface overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
void save_state(SID6581_t *token);
private: private:
devcb_read8 m_read_potx; devcb_read8 m_read_potx;
devcb_read8 m_read_poty; devcb_read8 m_read_poty;

View File

@ -62,43 +62,25 @@ void MixerInit(int threeVoiceAmplify)
inline void SID6581_t::syncEm() inline void SID6581_t::syncEm()
{ {
bool const sync1(optr1.modulator->cycleLenCount <= 0); bool sync[3];
bool const sync2(optr2.modulator->cycleLenCount <= 0); for (int v = 0; v < max_voices; v++)
bool const sync3(optr3.modulator->cycleLenCount <= 0);
optr1.cycleLenCount--;
optr2.cycleLenCount--;
optr3.cycleLenCount--;
if (optr1.sync && sync1)
{ {
optr1.cycleLenCount = 0; sync[v] = optr[v].modulator->cycleLenCount <= 0;
optr1.outProc = &sidOperator::wave_calc_normal; optr[v].cycleLenCount--;
}
for (int v = 0; v < max_voices; v++)
{
if (optr[v].sync && sync[v])
{
optr[v].cycleLenCount = 0;
optr[v].outProc = &sidOperator::wave_calc_normal;
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
optr1.waveStep.l = 0; optr[v].waveStep.l = 0;
#else #else
optr1.waveStep = optr1.waveStepPnt = 0; optr[v].waveStep = optr[v].waveStepPnt = 0;
#endif #endif
} }
if (optr2.sync && sync2)
{
optr2.cycleLenCount = 0;
optr2.outProc = &sidOperator::wave_calc_normal;
#if defined(DIRECT_FIXPOINT)
optr2.waveStep.l = 0;
#else
optr2.waveStep = optr2.waveStepPnt = 0;
#endif
}
if (optr3.sync && sync3)
{
optr3.cycleLenCount = 0;
optr3.outProc = &sidOperator::wave_calc_normal;
#if defined(DIRECT_FIXPOINT)
optr3.waveStep.l = 0;
#else
optr3.waveStep = optr3.waveStepPnt = 0;
#endif
} }
} }
@ -110,9 +92,9 @@ void SID6581_t::fill_buffer(stream_sample_t *buffer, uint32_t bufferLen)
for (; bufferLen > 0; bufferLen--) for (; bufferLen > 0; bufferLen--)
{ {
*buffer++ = (int16_t) mix16mono[unsigned(mix16monoMiddleIndex *buffer++ = (int16_t) mix16mono[unsigned(mix16monoMiddleIndex
+(*optr1.outProc)(&optr1) +(*optr[0].outProc)(&optr[0])
+(*optr2.outProc)(&optr2) +(*optr[1].outProc)(&optr[1])
+(optr3.outProc(&optr3)&optr3_outputmask) +(optr[2].outProc(&optr[2])&optr3_outputmask)
/* hack for digi sounds /* hack for digi sounds
does n't seam to come from a tone operator does n't seam to come from a tone operator
ghostbusters and goldrunner everything except volume zeroed */ ghostbusters and goldrunner everything except volume zeroed */
@ -130,12 +112,11 @@ void SID6581_t::fill_buffer(stream_sample_t *buffer, uint32_t bufferLen)
bool SID6581_t::reset() bool SID6581_t::reset()
{ {
optr1.clear(); for (int v = 0; v < max_voices; v++)
enveEmuResetOperator( &optr1 ); {
optr2.clear(); optr[v].clear();
enveEmuResetOperator( &optr2 ); enveEmuResetOperator(&optr[v]);
optr3.clear(); }
enveEmuResetOperator( &optr3 );
optr3_outputmask = ~0; /* on */ optr3_outputmask = ~0; /* on */
//sampleEmuReset(); //sampleEmuReset();
@ -144,17 +125,24 @@ bool SID6581_t::reset()
filter.Value = 0; filter.Value = 0;
filter.Dy = filter.ResDy = 0; filter.Dy = filter.ResDy = 0;
optr1.set(); for (int v = 0; v < max_voices; v++)
optr2.set(); {
optr3.set(); optr[v].set();
optr[v].set2();
optr1.set2(); }
optr2.set2();
optr3.set2();
return true; return true;
} }
void SID6581_t::postload()
{
for (int v = 0; v < max_voices; v++)
{
optr[v].set();
optr[v].set2();
}
}
static void filterTableInit(running_machine &machine) static void filterTableInit(running_machine &machine)
{ {
@ -217,22 +205,15 @@ static void filterTableInit(running_machine &machine)
void SID6581_t::init() void SID6581_t::init()
{ {
optr1.sid = this; for (int v = 0; v < max_voices; v++)
optr2.sid = this; {
optr3.sid = this; optr[v].sid = this;
optr1.modulator = &optr3;
optr3.carrier = &optr1;
optr1.filtVoiceMask = 1;
optr2.modulator = &optr1;
optr1.carrier = &optr2;
optr2.filtVoiceMask = 2;
optr3.modulator = &optr2;
optr2.carrier = &optr3;
optr3.filtVoiceMask = 4;
int mod_voi = (v - 1) % max_voices;
optr[v].modulator = &optr[mod_voi];
optr[mod_voi].carrier = &optr[v];
optr[v].filtVoiceMask = 1 << v;
}
PCMsid = uint32_t(PCMfreq * (16777216.0 / clock)); PCMsid = uint32_t(PCMfreq * (16777216.0 / clock));
PCMsidNoise = uint32_t((clock * 256.0) / PCMfreq); PCMsidNoise = uint32_t((clock * 256.0) / PCMfreq);
@ -275,7 +256,7 @@ void SID6581_t::port_w(int offset, int data)
masterVolume = reg[0x18] & 15; masterVolume = reg[0x18] & 15;
masterVolumeAmplIndex = masterVolume << 8; masterVolumeAmplIndex = masterVolume << 8;
if ((reg[0x18] & 0x80) && !(reg[0x17] & optr3.filtVoiceMask)) if ((reg[0x18] & 0x80) && !(reg[0x17] & optr[2].filtVoiceMask))
optr3_outputmask = 0; /* off */ optr3_outputmask = 0; /* off */
else else
optr3_outputmask = ~0; /* on */ optr3_outputmask = ~0; /* on */
@ -284,9 +265,8 @@ void SID6581_t::port_w(int offset, int data)
if (filter.Type != filter.CurType) if (filter.Type != filter.CurType)
{ {
filter.CurType = filter.Type; filter.CurType = filter.Type;
optr1.filtLow = optr1.filtRef = 0; for (int v = 0; v < max_voices; v++)
optr2.filtLow = optr2.filtRef = 0; optr[v].filtLow = optr[v].filtRef = 0;
optr3.filtLow = optr3.filtRef = 0;
} }
if (filter.Enabled) if (filter.Enabled)
{ {
@ -300,14 +280,13 @@ void SID6581_t::port_w(int offset, int data)
filter.ResDy = 1.0f; filter.ResDy = 1.0f;
} }
optr1.set(); for (int v = 0; v < max_voices; v++)
optr3.set(); {
optr2.set(); optr[v].set();
// relies on sidEmuSet also for other channels! // relies on sidEmuSet also for other channels!
optr1.set2(); optr[v].set2();
optr2.set2(); }
optr3.set2();
break; break;
default: default:
@ -315,20 +294,19 @@ void SID6581_t::port_w(int offset, int data)
reg[offset] = data; reg[offset] = data;
if (offset < 7) if (offset < 7)
optr1.reg[offset] = data; optr[0].reg[offset] = data;
else if (offset < 14) else if (offset < 14)
optr2.reg[offset - 7] = data; optr[1].reg[offset - 7] = data;
else if (offset < 21) else if (offset < 21)
optr3.reg[offset - 14] = data; optr[2].reg[offset - 14] = data;
optr1.set(); for (int v = 0; v < max_voices; v++)
optr3.set(); {
optr2.set(); optr[v].set();
// relies on sidEmuSet also for other channels! // relies on sidEmuSet also for other channels!
optr1.set2(); optr[v].set2();
optr2.set2(); }
optr3.set2();
break; break;
} }
} }
@ -348,11 +326,11 @@ int SID6581_t::port_r(running_machine &machine, int offset)
break; break;
case 0x1b: case 0x1b:
mixer_channel->update(); mixer_channel->update();
data = optr3.output; data = optr[2].output;
break; break;
case 0x1c: case 0x1c:
mixer_channel->update(); mixer_channel->update();
data = optr3.enveVol; data = optr[2].enveVol;
break; break;
default: default:
data = reg[offset]; data = reg[offset];

View File

@ -15,6 +15,8 @@
/* private area */ /* private area */
struct SID6581_t struct SID6581_t
{ {
static constexpr uint8_t max_voices = 3;
device_t *device; device_t *device;
sound_stream *mixer_channel; // mame stream/ mixer channel sound_stream *mixer_channel; // mame stream/ mixer channel
@ -49,13 +51,15 @@ struct SID6581_t
uint16_t Value; uint16_t Value;
} filter; } filter;
sidOperator optr1, optr2, optr3; sidOperator optr[max_voices];
int optr3_outputmask; int optr3_outputmask;
void init(); void init();
bool reset(); bool reset();
void postload();
int port_r(running_machine &machine, int offset); int port_r(running_machine &machine, int offset);
void port_w(int offset, int data); void port_w(int offset, int data);

View File

@ -274,7 +274,7 @@ static inline uint16_t enveEmuRelease(sidOperator* pVoice)
pVoice->enveStep = (uint16_t)pVoice->fenveStep; pVoice->enveStep = (uint16_t)pVoice->fenveStep;
#endif #endif
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
if ( pVoice->enveStep.w[HI] >= releaseTabLen ) if (pVoice->enveStep.w.h >= releaseTabLen)
#else #else
if (pVoice->enveStep >= releaseTabLen) if (pVoice->enveStep >= releaseTabLen)
#endif #endif
@ -285,7 +285,7 @@ static inline uint16_t enveEmuRelease(sidOperator* pVoice)
else else
{ {
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
pVoice->enveVol = releaseTab[pVoice->enveStep.w[HI]]; pVoice->enveVol = releaseTab[pVoice->enveStep.w.h];
#else #else
pVoice->enveVol = releaseTab[pVoice->enveStep]; pVoice->enveVol = releaseTab[pVoice->enveStep];
#endif #endif
@ -315,8 +315,8 @@ static inline uint16_t enveEmuStartRelease(sidOperator* pVoice)
#ifdef SID_FPUENVE #ifdef SID_FPUENVE
pVoice->fenveStep = releasePos[pVoice->enveVol]; pVoice->fenveStep = releasePos[pVoice->enveVol];
#elif defined(DIRECT_FIXPOINT) #elif defined(DIRECT_FIXPOINT)
pVoice->enveStep.w[HI] = releasePos[pVoice->enveVol]; pVoice->enveStep.w.h = releasePos[pVoice->enveVol];
pVoice->enveStep.w[LO] = 0; pVoice->enveStep.w.l = 0;
#else #else
pVoice->enveStep = releasePos[pVoice->enveVol]; pVoice->enveStep = releasePos[pVoice->enveVol];
pVoice->enveStepPnt = 0; pVoice->enveStepPnt = 0;
@ -339,7 +339,7 @@ static inline uint16_t enveEmuSustainDecay(sidOperator* pVoice)
pVoice->enveStep = (uint16_t)pVoice->fenveStep; pVoice->enveStep = (uint16_t)pVoice->fenveStep;
#endif #endif
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
if ( pVoice->enveStep.w[HI] >= releaseTabLen ) if (pVoice->enveStep.w.h >= releaseTabLen)
#else #else
if (pVoice->enveStep >= releaseTabLen) if (pVoice->enveStep >= releaseTabLen)
#endif #endif
@ -350,7 +350,7 @@ static inline uint16_t enveEmuSustainDecay(sidOperator* pVoice)
else else
{ {
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
pVoice->enveVol = releaseTab[pVoice->enveStep.w[HI]]; pVoice->enveVol = releaseTab[pVoice->enveStep.w.h];
#else #else
pVoice->enveVol = releaseTab[pVoice->enveStep]; pVoice->enveVol = releaseTab[pVoice->enveStep];
#endif #endif
@ -411,7 +411,7 @@ static inline uint16_t enveEmuDecay(sidOperator* pVoice)
pVoice->enveStep = (uint16_t)pVoice->fenveStep; pVoice->enveStep = (uint16_t)pVoice->fenveStep;
#endif #endif
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
if ( pVoice->enveStep.w[HI] >= releaseTabLen ) if (pVoice->enveStep.w.h >= releaseTabLen)
#else #else
if (pVoice->enveStep >= releaseTabLen) if (pVoice->enveStep >= releaseTabLen)
#endif #endif
@ -422,7 +422,7 @@ static inline uint16_t enveEmuDecay(sidOperator* pVoice)
else else
{ {
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
pVoice->enveVol = releaseTab[pVoice->enveStep.w[HI]]; pVoice->enveVol = releaseTab[pVoice->enveStep.w.h];
#else #else
pVoice->enveVol = releaseTab[pVoice->enveStep]; pVoice->enveVol = releaseTab[pVoice->enveStep];
#endif #endif
@ -478,7 +478,7 @@ static inline uint16_t enveEmuAttack(sidOperator* pVoice)
pVoice->enveStep = (uint16_t)pVoice->fenveStep; pVoice->enveStep = (uint16_t)pVoice->fenveStep;
#endif #endif
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
if ( pVoice->enveStep.w[HI] > attackTabLen ) if (pVoice->enveStep.w.h > attackTabLen)
#else #else
if (pVoice->enveStep >= attackTabLen) if (pVoice->enveStep >= attackTabLen)
#endif #endif
@ -486,7 +486,7 @@ static inline uint16_t enveEmuAttack(sidOperator* pVoice)
else else
{ {
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
pVoice->enveVol = pVoice->enveStep.w[HI]; pVoice->enveVol = pVoice->enveStep.w.h;
#else #else
pVoice->enveVol = pVoice->enveStep; pVoice->enveVol = pVoice->enveStep;
#endif #endif
@ -516,8 +516,8 @@ static inline uint16_t enveEmuStartAttack(sidOperator* pVoice)
#ifdef SID_FPUENVE #ifdef SID_FPUENVE
pVoice->fenveStep = (float)pVoice->enveVol; pVoice->fenveStep = (float)pVoice->enveVol;
#elif defined(DIRECT_FIXPOINT) #elif defined(DIRECT_FIXPOINT)
pVoice->enveStep.w[HI] = pVoice->enveVol; pVoice->enveStep.w.h = pVoice->enveVol;
pVoice->enveStep.w[LO] = 0; pVoice->enveStep.w.l = 0;
#else #else
pVoice->enveStep = pVoice->enveVol; pVoice->enveStep = pVoice->enveVol;
pVoice->enveStepPnt = 0; pVoice->enveStepPnt = 0;
@ -538,7 +538,7 @@ static inline uint16_t enveEmuShortAttack(sidOperator* pVoice)
pVoice->enveStep = (uint16_t)pVoice->fenveStep; pVoice->enveStep = (uint16_t)pVoice->fenveStep;
#endif #endif
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
if ((pVoice->enveStep.w[HI] > attackTabLen) || if ((pVoice->enveStep.w.h > attackTabLen) ||
(pVoice->enveShortAttackCount == 0)) (pVoice->enveShortAttackCount == 0))
#else #else
if ((pVoice->enveStep >= attackTabLen) || if ((pVoice->enveStep >= attackTabLen) ||
@ -547,7 +547,7 @@ static inline uint16_t enveEmuShortAttack(sidOperator* pVoice)
/* return enveEmuStartRelease(pVoice); */ /* return enveEmuStartRelease(pVoice); */
return enveEmuStartDecay(pVoice); return enveEmuStartDecay(pVoice);
#if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE) #if defined(DIRECT_FIXPOINT) && !defined(SID_FPUENVE)
pVoice->enveVol = pVoice->enveStep.w[HI]; pVoice->enveVol = pVoice->enveStep.w.h;
#else #else
pVoice->enveVol = pVoice->enveStep; pVoice->enveVol = pVoice->enveStep;
#endif #endif
@ -578,8 +578,8 @@ static inline uint16_t enveEmuStartShortAttack(sidOperator* pVoice)
#ifdef SID_FPUENVE #ifdef SID_FPUENVE
pVoice->fenveStep = (float)pVoice->enveVol; pVoice->fenveStep = (float)pVoice->enveVol;
#elif defined(DIRECT_FIXPOINT) #elif defined(DIRECT_FIXPOINT)
pVoice->enveStep.w[HI] = pVoice->enveVol; pVoice->enveStep.w.h = pVoice->enveVol;
pVoice->enveStep.w[LO] = 0; pVoice->enveStep.w.l = 0;
#else #else
pVoice->enveStep = pVoice->enveVol; pVoice->enveStep = pVoice->enveVol;
pVoice->enveStepPnt = 0; pVoice->enveStepPnt = 0;

View File

@ -34,18 +34,15 @@ static const uint32_t noiseSeed = 0x7ffff8;
void sidInitMixerEngine(running_machine &machine) void sidInitMixerEngine(running_machine &machine)
{ {
uint16_t uk;
int32_t si, sj ;
/* 8-bit volume modulation tables. */ /* 8-bit volume modulation tables. */
float filterAmpl = 0.7f; float filterAmpl = 0.7f;
ampMod1x8 = std::make_unique<int8_t[]>(256*256); ampMod1x8 = std::make_unique<int8_t[]>(256*256);
uk = 0; uint16_t uk = 0;
for ( si = 0; si < 256; si++ ) 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); ampMod1x8[uk] = (int8_t)(((si*sj)/255)*filterAmpl);
} }
@ -57,7 +54,7 @@ static inline void waveAdvance(sidOperator* pVoice)
{ {
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
pVoice->waveStep.l += pVoice->waveStepAdd.l; pVoice->waveStep.l += pVoice->waveStepAdd.l;
pVoice->waveStep.w[HI] &= 4095; pVoice->waveStep.w.h &= 4095;
#else #else
pVoice->waveStepPnt += pVoice->waveStepAddPnt; pVoice->waveStepPnt += pVoice->waveStepAddPnt;
pVoice->waveStep += pVoice->waveStepAdd; pVoice->waveStep += pVoice->waveStepAdd;
@ -81,12 +78,12 @@ static inline void noiseAdvance(sidOperator* pVoice)
(((pVoice->noiseReg >> 22) ^ (pVoice->noiseReg >> 17)) & 1); (((pVoice->noiseReg >> 22) ^ (pVoice->noiseReg >> 17)) & 1);
#endif #endif
#if defined(DIRECT_FIXPOINT) && defined(LARGE_NOISE_TABLE) #if defined(DIRECT_FIXPOINT) && defined(LARGE_NOISE_TABLE)
pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.w[LO]] pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.w.l]
|noiseTableMSB[pVoice->noiseReg.w[HI]&0xff]); |noiseTableMSB[pVoice->noiseReg.w.h & 0xff]);
#elif defined(DIRECT_FIXPOINT) #elif defined(DIRECT_FIXPOINT)
pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.b[LOLO]] pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.b.l]
|noiseTableMID[pVoice->noiseReg.b[LOHI]] |noiseTableMID[pVoice->noiseReg.b.h]
|noiseTableMSB[pVoice->noiseReg.b[HILO]]); |noiseTableMSB[pVoice->noiseReg.b.h2]);
#else #else
pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg & 0xff] pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg & 0xff]
|noiseTableMID[pVoice->noiseReg >> 8 & 0xff] |noiseTableMID[pVoice->noiseReg >> 8 & 0xff]
@ -122,12 +119,12 @@ static inline void noiseAdvanceHp(sidOperator* pVoice)
#endif #endif
} }
#if defined(DIRECT_FIXPOINT) && defined(LARGE_NOISE_TABLE) #if defined(DIRECT_FIXPOINT) && defined(LARGE_NOISE_TABLE)
pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.w[LO]] pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.w.l]
|noiseTableMSB[pVoice->noiseReg.w[HI]&0xff]); |noiseTableMSB[pVoice->noiseReg.w.h & 0xff]);
#elif defined(DIRECT_FIXPOINT) #elif defined(DIRECT_FIXPOINT)
pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.b[LOLO]] pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg.b.l]
|noiseTableMID[pVoice->noiseReg.b[LOHI]] |noiseTableMID[pVoice->noiseReg.b.h]
|noiseTableMSB[pVoice->noiseReg.b[HILO]]); |noiseTableMSB[pVoice->noiseReg.b.h2]);
#else #else
pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg & 0xff] pVoice->noiseOutput = (noiseTableLSB[pVoice->noiseReg & 0xff]
|noiseTableMID[pVoice->noiseReg >> 8 & 0xff] |noiseTableMID[pVoice->noiseReg >> 8 & 0xff]
@ -137,13 +134,13 @@ static inline void noiseAdvanceHp(sidOperator* pVoice)
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
#define triangle triangleTable[pVoice->waveStep.w[HI]] #define triangle triangleTable[pVoice->waveStep.w.h]
#define sawtooth sawtoothTable[pVoice->waveStep.w[HI]] #define sawtooth sawtoothTable[pVoice->waveStep.w.h]
#define square squareTable[pVoice->waveStep.w[HI] + pVoice->pulseIndex] #define square squareTable[pVoice->waveStep.w.h + pVoice->pulseIndex]
#define triSaw waveform30[pVoice->waveStep.w[HI]] #define triSaw waveform30[pVoice->waveStep.w.h]
#define triSquare waveform50[pVoice->waveStep.w[HI] + pVoice->SIDpulseWidth] #define triSquare waveform50[pVoice->waveStep.w.h + pVoice->SIDpulseWidth]
#define sawSquare waveform60[pVoice->waveStep.w[HI] + pVoice->SIDpulseWidth] #define sawSquare waveform60[pVoice->waveStep.w.h + pVoice->SIDpulseWidth]
#define triSawSquare waveform70[pVoice->waveStep.w[HI] + pVoice->SIDpulseWidth] #define triSawSquare waveform70[pVoice->waveStep.w.h + pVoice->SIDpulseWidth]
#else #else
#define triangle triangleTable[pVoice->waveStep] #define triangle triangleTable[pVoice->waveStep]
#define sawtooth sawtoothTable[pVoice->waveStep] #define sawtooth sawtoothTable[pVoice->waveStep]
@ -155,61 +152,72 @@ static inline void noiseAdvanceHp(sidOperator* pVoice)
#endif #endif
static void sidMode00(sidOperator* pVoice) { static void sidMode00(sidOperator* pVoice)
{
pVoice->output = (pVoice->filtIO - 0x80); pVoice->output = (pVoice->filtIO - 0x80);
waveAdvance(pVoice); waveAdvance(pVoice);
} }
#if 0 #if 0
/* not used */ /* not used */
static void sidModeReal00(sidOperator* pVoice) { static void sidModeReal00(sidOperator* pVoice)
{
pVoice->output = 0; pVoice->output = 0;
waveAdvance(pVoice); waveAdvance(pVoice);
} }
#endif #endif
static void sidMode10(sidOperator* pVoice) { static void sidMode10(sidOperator* pVoice)
{
pVoice->output = triangle; pVoice->output = triangle;
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode20(sidOperator* pVoice) { static void sidMode20(sidOperator* pVoice)
{
pVoice->output = sawtooth; pVoice->output = sawtooth;
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode30(sidOperator* pVoice) { static void sidMode30(sidOperator* pVoice)
{
pVoice->output = triSaw; pVoice->output = triSaw;
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode40(sidOperator* pVoice) { static void sidMode40(sidOperator* pVoice)
{
pVoice->output = square; pVoice->output = square;
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode50(sidOperator* pVoice) { static void sidMode50(sidOperator* pVoice)
{
pVoice->output = triSquare; pVoice->output = triSquare;
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode60(sidOperator* pVoice) { static void sidMode60(sidOperator* pVoice)
{
pVoice->output = sawSquare; pVoice->output = sawSquare;
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode70(sidOperator* pVoice) { static void sidMode70(sidOperator* pVoice)
{
pVoice->output = triSawSquare; pVoice->output = triSawSquare;
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode80(sidOperator* pVoice) { static void sidMode80(sidOperator* pVoice)
{
pVoice->output = pVoice->noiseOutput; pVoice->output = pVoice->noiseOutput;
waveAdvance(pVoice); waveAdvance(pVoice);
noiseAdvance(pVoice); noiseAdvance(pVoice);
} }
static void sidMode80hp(sidOperator* pVoice) { static void sidMode80hp(sidOperator* pVoice)
{
pVoice->output = pVoice->noiseOutput; pVoice->output = pVoice->noiseOutput;
waveAdvance(pVoice); waveAdvance(pVoice);
noiseAdvanceHp(pVoice); noiseAdvanceHp(pVoice);
@ -229,7 +237,7 @@ static void sidModeLock(sidOperator* pVoice)
static void sidMode14(sidOperator* pVoice) static void sidMode14(sidOperator* pVoice)
{ {
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
if ( pVoice->modulator->waveStep.w[HI] < 2048 ) if (pVoice->modulator->waveStep.w.h < 2048)
#else #else
if (pVoice->modulator->waveStep < 2048) if (pVoice->modulator->waveStep < 2048)
#endif #endif
@ -239,9 +247,10 @@ static void sidMode14(sidOperator* pVoice)
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode34(sidOperator* pVoice) { static void sidMode34(sidOperator* pVoice)
{
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
if ( pVoice->modulator->waveStep.w[HI] < 2048 ) if (pVoice->modulator->waveStep.w.h < 2048)
#else #else
if (pVoice->modulator->waveStep < 2048) if (pVoice->modulator->waveStep < 2048)
#endif #endif
@ -251,9 +260,10 @@ static void sidMode34(sidOperator* pVoice) {
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode54(sidOperator* pVoice) { static void sidMode54(sidOperator* pVoice)
{
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
if ( pVoice->modulator->waveStep.w[HI] < 2048 ) if (pVoice->modulator->waveStep.w.h < 2048)
#else #else
if (pVoice->modulator->waveStep < 2048) if (pVoice->modulator->waveStep < 2048)
#endif #endif
@ -263,9 +273,10 @@ static void sidMode54(sidOperator* pVoice) {
waveAdvance(pVoice); waveAdvance(pVoice);
} }
static void sidMode74(sidOperator* pVoice) { static void sidMode74(sidOperator* pVoice)
{
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
if ( pVoice->modulator->waveStep.w[HI] < 2048 ) if (pVoice->modulator->waveStep.w.h < 2048)
#else #else
if (pVoice->modulator->waveStep < 2048) if (pVoice->modulator->waveStep < 2048)
#endif #endif
@ -358,9 +369,9 @@ static int8_t waveCalcMute(sidOperator* pVoice)
static int8_t waveCalcRangeCheck(sidOperator* pVoice) static int8_t waveCalcRangeCheck(sidOperator* pVoice)
{ {
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
pVoice->waveStepOld = pVoice->waveStep.w[HI]; pVoice->waveStepOld = pVoice->waveStep.w.h;
(*pVoice->waveProc)(pVoice); (*pVoice->waveProc)(pVoice);
if (pVoice->waveStep.w[HI] < pVoice->waveStepOld) if (pVoice->waveStep.w.h < pVoice->waveStepOld)
#else #else
pVoice->waveStepOld = pVoice->waveStep; pVoice->waveStepOld = pVoice->waveStep;
(*pVoice->waveProc)(pVoice); (*pVoice->waveProc)(pVoice);
@ -371,7 +382,7 @@ static int8_t waveCalcRangeCheck(sidOperator* pVoice)
pVoice->cycleLenCount = 0; pVoice->cycleLenCount = 0;
pVoice->outProc = &sidOperator::wave_calc_normal; pVoice->outProc = &sidOperator::wave_calc_normal;
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
pVoice->waveStep.w[HI] = 4095; pVoice->waveStep.w.h = 4095;
#else #else
pVoice->waveStep = 4095; pVoice->waveStep = 4095;
#endif #endif
@ -457,11 +468,11 @@ void sidOperator::set()
SIDpulseWidth = (reg[2] | (reg[3] << 8)) & 0x0FFF; SIDpulseWidth = (reg[2] | (reg[3] << 8)) & 0x0FFF;
newPulseIndex = 4096 - SIDpulseWidth; newPulseIndex = 4096 - SIDpulseWidth;
#if defined(DIRECT_FIXPOINT) #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; 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; pulseIndex = newPulseIndex;
} }
@ -629,7 +640,7 @@ int8_t sidOperator::wave_calc_normal(sidOperator* pVoice)
if (pVoice->pulseIndex > 2048) if (pVoice->pulseIndex > 2048)
{ {
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
pVoice->waveStep.w[HI] = 0; pVoice->waveStep.w.h = 0;
#else #else
pVoice->waveStep = 0; pVoice->waveStep = 0;
#endif #endif
@ -648,9 +659,9 @@ int8_t sidOperator::wave_calc_normal(sidOperator* pVoice)
inline void sidOperator::wave_calc_cycle_len() inline void sidOperator::wave_calc_cycle_len()
{ {
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
cycleAddLen.w[HI] = 0; cycleAddLen.w.h = 0;
cycleAddLen.l += cycleLen.l; cycleAddLen.l += cycleLen.l;
cycleLenCount = cycleAddLen.w[HI]; cycleLenCount = cycleAddLen.w.h;
#else #else
cycleAddLenPnt += cycleLenPnt; cycleAddLenPnt += cycleLenPnt;
cycleLenCount = cycleLen; cycleLenCount = cycleLen;
@ -673,7 +684,7 @@ inline void sidOperator::wave_calc_cycle_len()
#endif #endif
{ {
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
uint16_t diff = cycleLenCount - cycleLen.w[HI]; uint16_t diff = cycleLenCount - cycleLen.w.h;
#else #else
uint16_t diff = cycleLenCount - cycleLen; uint16_t diff = cycleLenCount - cycleLen;
#endif #endif

View File

@ -49,7 +49,7 @@ struct sidOperator
int32_t cycleLenCount; int32_t cycleLenCount;
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
cpuLword cycleLen, cycleAddLen; PAIR cycleLen, cycleAddLen;
#else #else
uint32_t cycleAddLenPnt; uint32_t cycleAddLenPnt;
uint16_t cycleLen, cycleLenPnt; uint16_t cycleLen, cycleLenPnt;
@ -59,7 +59,7 @@ struct sidOperator
void (*waveProc)(sidOperator *); void (*waveProc)(sidOperator *);
#if defined(DIRECT_FIXPOINT) #if defined(DIRECT_FIXPOINT)
cpuLword waveStep, waveStepAdd; PAIR waveStep, waveStepAdd;
#else #else
uint16_t waveStep, waveStepAdd; uint16_t waveStep, waveStepAdd;
uint32_t waveStepPnt, waveStepAddPnt; uint32_t waveStepPnt, waveStepAddPnt;
@ -67,10 +67,8 @@ struct sidOperator
uint16_t waveStepOld; uint16_t waveStepOld;
sw_storage wavePre[2]; sw_storage wavePre[2];
#if defined(DIRECT_FIXPOINT) && defined(LARGE_NOISE_TABLE) #if defined(DIRECT_FIXPOINT)
cpuLword noiseReg; PAIR noiseReg;
#elif defined(DIRECT_FIXPOINT)
cpuLBword noiseReg;
#else #else
uint32_t noiseReg; uint32_t noiseReg;
#endif #endif
@ -86,7 +84,7 @@ struct sidOperator
float fenveStep, fenveStepAdd; float fenveStep, fenveStepAdd;
uint32_t enveStep; uint32_t enveStep;
#elif defined(DIRECT_FIXPOINT) #elif defined(DIRECT_FIXPOINT)
cpuLword enveStep, enveStepAdd; PAIR enveStep, enveStepAdd;
#else #else
uint16_t enveStep, enveStepAdd; uint16_t enveStep, enveStepAdd;
uint32_t enveStepPnt, enveStepAddPnt; uint32_t enveStepPnt, enveStepAddPnt;