summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mame/oberheim/xpander.cpp59
1 files 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<float>(NUM_CVS, -1))
- , m_fast(NUM_VOICES, std::vector<bool>(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<bool> m_haltreq; // Halt request to the voice board (HALTREQ).
- std::vector<bool> m_encoder_dir;
- std::vector<bool> m_encoder_changed;
- std::vector<u64> m_vfd_anode_masks;
+ std::array<bool, 4> m_haltreq = { false, false, false, false }; // Halt request to the voice board (HALTREQ).
+ std::array<bool, 6> m_encoder_dir = { false, false, false, false, false, false };
+ std::array<bool, 6> m_encoder_changed = { false, false, false, false, false, false };
+ std::array<u64, 3> 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<std::vector<float>> m_cv;
- std::vector<std::vector<bool>> m_fast;
+ std::array<std::array<float, NUM_CVS>, NUM_VOICES> m_cv;
+ std::array<std::array<bool, NUM_CVS - 1>, 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<bool> &v)
+static u8 byte_from_array(const std::array<bool, 6> &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)