summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/mos6581.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/mos6581.cpp')
-rw-r--r--src/devices/sound/mos6581.cpp146
1 files changed, 136 insertions, 10 deletions
diff --git a/src/devices/sound/mos6581.cpp b/src/devices/sound/mos6581.cpp
index 2e4cb1f3cfd..af195f6fa0c 100644
--- a/src/devices/sound/mos6581.cpp
+++ b/src/devices/sound/mos6581.cpp
@@ -41,11 +41,10 @@ DEFINE_DEVICE_TYPE(MOS8580, mos8580_device, "mos8580", "MOS 8580 SID")
mos6581_device::mos6581_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant)
: device_t(mconfig, type, tag, owner, clock)
, device_sound_interface(mconfig, *this)
- , m_read_potx(*this)
- , m_read_poty(*this)
+ , m_read_potx(*this, 0xff)
+ , m_read_poty(*this, 0xff)
, m_stream(nullptr)
, m_variant(variant)
- , m_token(make_unique_clear<SID6581_t>())
{
}
@@ -68,6 +67,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
@@ -75,14 +193,11 @@ mos8580_device::mos8580_device(const machine_config &mconfig, const char *tag, d
void mos6581_device::device_start()
{
- // resolve callbacks
- m_read_potx.resolve_safe(0xff);
- m_read_poty.resolve_safe(0xff);
-
// create sound stream
- m_stream = machine().sound().stream_alloc(*this, 0, 1, machine().sample_rate());
+ m_stream = stream_alloc(0, 1, machine().sample_rate());
// initialize SID engine
+ m_token = std::make_unique<SID6581_t>();
m_token->device = this;
m_token->mixer_channel = m_stream;
m_token->PCMfreq = machine().sample_rate();
@@ -91,6 +206,7 @@ void mos6581_device::device_start()
m_token->init();
sidInitWaveformTables(m_variant);
+ save_state(m_token.get());
}
@@ -105,13 +221,23 @@ 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
// our sound stream
//-------------------------------------------------
-void mos6581_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
+void mos6581_device::sound_stream_update(sound_stream &stream)
{
- m_token->fill_buffer(outputs[0], samples);
+ m_token->fill_buffer(stream);
}