mirror of
https://github.com/holub/mame
synced 2025-06-10 14:52:42 +03:00
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:
parent
5aac500dee
commit
be9efeee59
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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];
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user