From de2430a6e1324cdb5f4176e6ba668fd31eb2e026 Mon Sep 17 00:00:00 2001 From: m1macrophage <168948267+m1macrophage@users.noreply.github.com> Date: Fri, 28 Feb 2025 00:09:48 -0800 Subject: oberheim/xpander: Added save state support. (#13426) --- src/mame/oberheim/xpander.cpp | 59 ++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/mame/oberheim/xpander.cpp b/src/mame/oberheim/xpander.cpp index f5b21a97967..988e7e8d815 100644 --- a/src/mame/oberheim/xpander.cpp +++ b/src/mame/oberheim/xpander.cpp @@ -94,7 +94,6 @@ constexpr const char NVRAM_A_TAG[] = "nvram_a"; constexpr const char NVRAM_B_TAG[] = "nvram_b"; constexpr const char VOICERAM_TAG[] = "voiceram"; -constexpr const int NUM_ENCODERS = 6; constexpr const int NUM_ENCODER_POSITIONS = 30; class xpander_state : public driver_device @@ -129,18 +128,22 @@ public: , m_tri2(*this, "voice_%d_tri2", 1U) , m_vcofm(*this, "voice_%d_vcofm", 1U) , m_sync(*this, "voice_%d_sync", 1U) - , m_haltreq(4, false) - , m_encoder_dir(NUM_ENCODERS, false) - , m_encoder_changed(NUM_ENCODERS, false) - , m_vfd_anode_masks(3, 0) - , m_cv(NUM_VOICES, std::vector(NUM_CVS, -1)) - , m_fast(NUM_VOICES, std::vector(NUM_CVS - 1, false)) // `-1` because RES does not support fast updates. { for (int i = 0; i < m_vfd_devices.size(); ++i) { std::string format = "vfd_" + std::to_string(i + 1) + "_char_%d"; m_vfd_outputs.push_back(output_finder<40>(*this, std::move(format), 1U)); } + + for (int voice = 0; voice < NUM_VOICES; ++voice) + { + for (int cv = 0; cv < NUM_CVS; ++cv) + { + m_cv[voice][cv] = 0; + if (cv < m_fast[voice].size()) + m_fast[voice][cv] = false; + } + } } void xpander(machine_config &config) ATTR_COLD; @@ -240,10 +243,10 @@ private: u8 m_firq_timer_preset = 0xff; // Preset for 40103 timer. Pulled high. u8 m_selected_cv_in = 0x07; // MUX A-C inputs. Pulled high. bool m_inhibit_cv_in = true; // MUX INHibit input. Pulled high. - std::vector m_haltreq; // Halt request to the voice board (HALTREQ). - std::vector m_encoder_dir; - std::vector m_encoder_changed; - std::vector m_vfd_anode_masks; + std::array m_haltreq = { false, false, false, false }; // Halt request to the voice board (HALTREQ). + std::array m_encoder_dir = { false, false, false, false, false, false }; + std::array m_encoder_changed = { false, false, false, false, false, false }; + std::array m_vfd_anode_masks = { 0, 0, 0 }; // Voice computer state. bool m_haltdis = 0; // Halt disable (HALTDS). @@ -253,8 +256,8 @@ private: float m_dac_fine_v = 0; float m_dac_vref = 4.865F; // Sampled in C806 and buffered and scaled by U815. bool m_allow_fast = false; - std::vector> m_cv; - std::vector> m_fast; + std::array, NUM_VOICES> m_cv; + std::array, NUM_VOICES> m_fast; // `-1` because RES does not support fast updates. }; TIMER_DEVICE_CALLBACK_MEMBER(xpander_state::firq_timer_elapsed) @@ -344,11 +347,10 @@ u8 xpander_state::switch_r(offs_t offset) return data; } -static u8 byte_from_vector(const std::vector &v) +static u8 byte_from_array(const std::array &v) { - assert(v.size() <= 8); u8 data = 0; - for (int i = 0; i < v.size(); ++i) + for (int i = 0; i < 6; ++i) if (v[i]) data |= 1U << i; return data; @@ -361,14 +363,14 @@ u8 xpander_state::encoder_dir_r() for (int i = 0; i < m_encoder_changed.size(); ++i) m_encoder_changed[i] = false; - const u8 data = byte_from_vector(m_encoder_dir); + const u8 data = byte_from_array(m_encoder_dir); LOGMASKED(LOG_ENCODERS, "Encoder dir_r: %02x\n", data); return data; } u8 xpander_state::encoder_sw_r() { - const u8 data = byte_from_vector(m_encoder_changed); + const u8 data = byte_from_array(m_encoder_changed); if (data != 0) LOGMASKED(LOG_ENCODERS, "Encoder sw_r: %02x\n", data); return data; @@ -848,6 +850,23 @@ void xpander_state::machine_start() m_tri2.resolve(); m_vcofm.resolve(); m_sync.resolve(); + + save_item(NAME(m_firq_timer_preset)); + save_item(NAME(m_selected_cv_in)); + save_item(NAME(m_inhibit_cv_in)); + save_item(NAME(m_haltreq)); + save_item(NAME(m_encoder_dir)); + save_item(NAME(m_encoder_changed)); + save_item(NAME(m_vfd_anode_masks)); + save_item(NAME(m_haltdis)); + save_item(NAME(m_haltack)); + save_item(NAME(m_autodone)); + save_item(NAME(m_dac_data)); + save_item(NAME(m_dac_fine_v)); + save_item(NAME(m_dac_vref)); + save_item(NAME(m_allow_fast)); + save_item(NAME(m_cv)); + save_item(NAME(m_fast)); } void xpander_state::xpander(machine_config &config) @@ -951,7 +970,7 @@ DECLARE_INPUT_CHANGED_MEMBER(xpander_state::encoder_moved) m_encoder_dir[encoder] = ((newval > oldval) || overflowed) && !underflowed; LOGMASKED(LOG_ENCODERS, "Encoder %d changed from: %d to: %d (o: %d, u: %d), dir: %d\n", - encoder, oldval, newval, overflowed, underflowed, bool(m_encoder_dir[encoder])); + encoder, oldval, newval, overflowed, underflowed, m_encoder_dir[encoder]); } DECLARE_INPUT_CHANGED_MEMBER(xpander_state::memory_protect_changed) @@ -1144,4 +1163,4 @@ ROM_END } // anonymous namespace // In production from 1984 to 1988. -SYST(1984, xpander, 0, 0, xpander, xpander, xpander_state, empty_init, "Oberheim", "Xpander", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) +SYST(1984, xpander, 0, 0, xpander, xpander, xpander_state, empty_init, "Oberheim", "Xpander", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING | MACHINE_NO_SOUND) -- cgit v1.2.3-70-g09d2