diff options
| author | 2021-04-14 02:17:35 -0700 | |
|---|---|---|
| committer | 2021-04-14 02:17:35 -0700 | |
| commit | d27be276f3dd64fd8a4719e34f7e755b01df8bde (patch) | |
| tree | 70d60a8230203eb065c79c0f028bab4a94a6efd7 | |
| parent | 6bfb3d997605a4dd1ed4274dd076bc478d570985 (diff) | |
Convert STRUCT_MEMBERs into proper struct saves for devices/sound/*
47 files changed, 893 insertions, 596 deletions
diff --git a/src/devices/sound/c140.cpp b/src/devices/sound/c140.cpp index 62e32707f6c..2c79b04a9f2 100644 --- a/src/devices/sound/c140.cpp +++ b/src/devices/sound/c140.cpp @@ -145,23 +145,12 @@ void c140_device::device_start() /* allocate a pair of buffers to mix into - 1 second's worth should be more than enough */ m_mixer_buffer_left = std::make_unique<s16[]>(m_sample_rate); m_mixer_buffer_right = std::make_unique<s16[]>(m_sample_rate); +} - save_item(NAME(m_REG)); - - save_item(STRUCT_MEMBER(m_voi, ptoffset)); - save_item(STRUCT_MEMBER(m_voi, pos)); - save_item(STRUCT_MEMBER(m_voi, key)); - save_item(STRUCT_MEMBER(m_voi, lastdt)); - save_item(STRUCT_MEMBER(m_voi, prevdt)); - save_item(STRUCT_MEMBER(m_voi, dltdt)); - save_item(STRUCT_MEMBER(m_voi, rvol)); - save_item(STRUCT_MEMBER(m_voi, lvol)); - save_item(STRUCT_MEMBER(m_voi, frequency)); - save_item(STRUCT_MEMBER(m_voi, bank)); - save_item(STRUCT_MEMBER(m_voi, mode)); - save_item(STRUCT_MEMBER(m_voi, sample_start)); - save_item(STRUCT_MEMBER(m_voi, sample_end)); - save_item(STRUCT_MEMBER(m_voi, sample_loop)); +void c140_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_REG)) + .reg(NAME(m_voi)); } void c219_device::device_start() @@ -188,8 +177,13 @@ void c219_device::device_start() m_pcmtbl[i + 128] = (~m_pcmtbl[i]) & 0xffe0; m_lfsr = 0x1234; +} + +void c219_device::device_register_save(save_registrar &save) +{ + c140_device::device_register_save(save); - save_item(NAME(m_lfsr)); + save.reg(NAME(m_lfsr)); } void c140_device::device_clock_changed() diff --git a/src/devices/sound/c140.h b/src/devices/sound/c140.h index 3008d964a9d..d954ef41f40 100644 --- a/src/devices/sound/c140.h +++ b/src/devices/sound/c140.h @@ -39,6 +39,7 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; virtual void rom_bank_updated() override; @@ -71,6 +72,24 @@ protected: s32 sample_start = 0; s32 sample_end = 0; s32 sample_loop = 0; + + void register_save(save_registrar &save) + { + save.reg(NAME(ptoffset)) + .reg(NAME(pos)) + .reg(NAME(key)) + .reg(NAME(lastdt)) + .reg(NAME(prevdt)) + .reg(NAME(dltdt)) + .reg(NAME(rvol)) + .reg(NAME(lvol)) + .reg(NAME(frequency)) + .reg(NAME(bank)) + .reg(NAME(mode)) + .reg(NAME(sample_start)) + .reg(NAME(sample_end)) + .reg(NAME(sample_loop)); + } }; void init_voice(C140_VOICE *v); @@ -114,6 +133,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; diff --git a/src/devices/sound/c352.cpp b/src/devices/sound/c352.cpp index bea5a561b59..9ee01bc1628 100644 --- a/src/devices/sound/c352.cpp +++ b/src/devices/sound/c352.cpp @@ -385,24 +385,14 @@ void c352_device::device_start() } for (int i = 0; i < 128; i++) m_mulawtab[i + 128] = (~m_mulawtab[i]) & 0xffe0; +} +void c352_device::device_register_save(save_registrar &save) +{ // register save state info - save_item(STRUCT_MEMBER(m_c352_v, pos)); - save_item(STRUCT_MEMBER(m_c352_v, counter)); - save_item(STRUCT_MEMBER(m_c352_v, sample)); - save_item(STRUCT_MEMBER(m_c352_v, last_sample)); - save_item(STRUCT_MEMBER(m_c352_v, vol_f)); - save_item(STRUCT_MEMBER(m_c352_v, vol_r)); - save_item(STRUCT_MEMBER(m_c352_v, curr_vol)); - save_item(STRUCT_MEMBER(m_c352_v, freq)); - save_item(STRUCT_MEMBER(m_c352_v, flags)); - save_item(STRUCT_MEMBER(m_c352_v, wave_bank)); - save_item(STRUCT_MEMBER(m_c352_v, wave_start)); - save_item(STRUCT_MEMBER(m_c352_v, wave_end)); - save_item(STRUCT_MEMBER(m_c352_v, wave_loop)); - - save_item(NAME(m_random)); - save_item(NAME(m_control)); + save.reg(NAME(m_c352_v)) + .reg(NAME(m_random)) + .reg(NAME(m_control)); } void c352_device::device_reset() diff --git a/src/devices/sound/c352.h b/src/devices/sound/c352.h index d21ac96cd86..026d8c8e6b7 100644 --- a/src/devices/sound/c352.h +++ b/src/devices/sound/c352.h @@ -36,6 +36,7 @@ protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; // device_sound_interface overrides @@ -86,6 +87,22 @@ private: u16 wave_end; u16 wave_loop; + void register_save(save_registrar &save) + { + save.reg(NAME(pos)) + .reg(NAME(counter)) + .reg(NAME(sample)) + .reg(NAME(last_sample)) + .reg(NAME(vol_f)) + .reg(NAME(vol_r)) + .reg(NAME(curr_vol)) + .reg(NAME(freq)) + .reg(NAME(flags)) + .reg(NAME(wave_bank)) + .reg(NAME(wave_start)) + .reg(NAME(wave_end)) + .reg(NAME(wave_loop)); + } }; void fetch_sample(c352_voice_t &v); diff --git a/src/devices/sound/c6280.cpp b/src/devices/sound/c6280.cpp index 1b6666455c9..4d59c145a31 100644 --- a/src/devices/sound/c6280.cpp +++ b/src/devices/sound/c6280.cpp @@ -330,22 +330,15 @@ void c6280_device::device_start() level /= pow(10.0, step / 20.0); } m_volume_table[30] = m_volume_table[31] = 0; +} - save_item(NAME(m_select)); - save_item(NAME(m_balance)); - save_item(NAME(m_lfo_frequency)); - save_item(NAME(m_lfo_control)); - - save_item(STRUCT_MEMBER(m_channel, frequency)); - save_item(STRUCT_MEMBER(m_channel, control)); - save_item(STRUCT_MEMBER(m_channel, balance)); - save_item(STRUCT_MEMBER(m_channel, waveform)); - save_item(STRUCT_MEMBER(m_channel, index)); - save_item(STRUCT_MEMBER(m_channel, dda)); - save_item(STRUCT_MEMBER(m_channel, noise_control)); - save_item(STRUCT_MEMBER(m_channel, noise_counter)); - save_item(STRUCT_MEMBER(m_channel, noise_seed)); - save_item(STRUCT_MEMBER(m_channel, tick)); +void c6280_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_select)) + .reg(NAME(m_balance)) + .reg(NAME(m_lfo_frequency)) + .reg(NAME(m_lfo_control)) + .reg(NAME(m_channel)); } void c6280_device::device_reset() diff --git a/src/devices/sound/c6280.h b/src/devices/sound/c6280.h index 60ea993f71b..748d8517cdf 100644 --- a/src/devices/sound/c6280.h +++ b/src/devices/sound/c6280.h @@ -19,6 +19,7 @@ protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; // sound stream update overrides @@ -37,6 +38,20 @@ private: u32 noise_frequency; u32 noise_seed; s32 tick; + + void register_save(save_registrar &save) + { + save.reg(NAME(frequency)) + .reg(NAME(control)) + .reg(NAME(balance)) + .reg(NAME(waveform)) + .reg(NAME(index)) + .reg(NAME(dda)) + .reg(NAME(noise_control)) + .reg(NAME(noise_counter)) + .reg(NAME(noise_seed)) + .reg(NAME(tick)); + } }; // internal state diff --git a/src/devices/sound/es5503.cpp b/src/devices/sound/es5503.cpp index f22d11473fc..43a14268dcc 100644 --- a/src/devices/sound/es5503.cpp +++ b/src/devices/sound/es5503.cpp @@ -219,17 +219,6 @@ void es5503_device::device_start() rege0 = 0xff; - save_pointer(STRUCT_MEMBER(oscillators, freq), 32); - save_pointer(STRUCT_MEMBER(oscillators, wtsize), 32); - save_pointer(STRUCT_MEMBER(oscillators, control), 32); - save_pointer(STRUCT_MEMBER(oscillators, vol), 32); - save_pointer(STRUCT_MEMBER(oscillators, data), 32); - save_pointer(STRUCT_MEMBER(oscillators, wavetblpointer), 32); - save_pointer(STRUCT_MEMBER(oscillators, wavetblsize), 32); - save_pointer(STRUCT_MEMBER(oscillators, resolution), 32); - save_pointer(STRUCT_MEMBER(oscillators, accumulator), 32); - save_pointer(STRUCT_MEMBER(oscillators, irqpend), 32); - output_rate = (clock() / 8) / (2 + oscsenabled); m_stream = stream_alloc(0, output_channels, output_rate); @@ -238,6 +227,11 @@ void es5503_device::device_start() m_timer->adjust(update_rate, 0, update_rate); } +void es5503_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(oscillators)); +} + void es5503_device::device_clock_changed() { output_rate = (clock() / 8) / (2 + oscsenabled); diff --git a/src/devices/sound/es5503.h b/src/devices/sound/es5503.h index 2fd316aad8e..8c286e0e7c9 100644 --- a/src/devices/sound/es5503.h +++ b/src/devices/sound/es5503.h @@ -31,6 +31,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr) override; @@ -70,6 +71,20 @@ private: uint32_t accumulator; uint8_t irqpend; + + void register_save(save_registrar &save) + { + save.reg(NAME(freq)) + .reg(NAME(wtsize)) + .reg(NAME(control)) + .reg(NAME(vol)) + .reg(NAME(data)) + .reg(NAME(wavetblpointer)) + .reg(NAME(wavetblsize)) + .reg(NAME(resolution)) + .reg(NAME(accumulator)) + .reg(NAME(irqpend)); + } }; ES5503Osc oscillators[32]; diff --git a/src/devices/sound/es5506.cpp b/src/devices/sound/es5506.cpp index 3ea90a97261..14c19b4dc0d 100644 --- a/src/devices/sound/es5506.cpp +++ b/src/devices/sound/es5506.cpp @@ -203,31 +203,19 @@ void es550x_device::device_start() m_read_port_cb.resolve(); m_sample_rate_changed_cb.resolve(); m_irqv = 0x80; +} +void es550x_device::device_register_save(save_registrar &save) +{ // register save - save_item(NAME(m_sample_rate)); - - save_item(NAME(m_current_page)); - save_item(NAME(m_active_voices)); - save_item(NAME(m_mode)); - save_item(NAME(m_irqv)); - save_item(NAME(m_voice_index)); - - save_item(STRUCT_MEMBER(m_voice, control)); - save_item(STRUCT_MEMBER(m_voice, freqcount)); - save_item(STRUCT_MEMBER(m_voice, start)); - save_item(STRUCT_MEMBER(m_voice, end)); - save_item(STRUCT_MEMBER(m_voice, accum)); - save_item(STRUCT_MEMBER(m_voice, lvol)); - save_item(STRUCT_MEMBER(m_voice, rvol)); - save_item(STRUCT_MEMBER(m_voice, k2)); - save_item(STRUCT_MEMBER(m_voice, k1)); - save_item(STRUCT_MEMBER(m_voice, o4n1)); - save_item(STRUCT_MEMBER(m_voice, o3n1)); - save_item(STRUCT_MEMBER(m_voice, o3n2)); - save_item(STRUCT_MEMBER(m_voice, o2n1)); - save_item(STRUCT_MEMBER(m_voice, o2n2)); - save_item(STRUCT_MEMBER(m_voice, o1n1)); + save.reg(NAME(m_sample_rate)) + + .reg(NAME(m_current_page)) + .reg(NAME(m_active_voices)) + .reg(NAME(m_mode)) + .reg(NAME(m_irqv)) + .reg(NAME(m_voice_index)) + .reg(NAME(m_voice)); } void es5506_device::device_start() @@ -272,22 +260,19 @@ void es5506_device::device_start() // 21 bit integer and 11 bit fraction get_accum_mask(ADDRESS_INTEGER_BIT_ES5506, ADDRESS_FRAC_BIT_ES5506); - // register save - save_item(NAME(m_write_latch)); - save_item(NAME(m_read_latch)); - - save_item(NAME(m_wst)); - save_item(NAME(m_wend)); - save_item(NAME(m_lrend)); + // success +} - save_item(STRUCT_MEMBER(m_voice, ecount)); - save_item(STRUCT_MEMBER(m_voice, lvramp)); - save_item(STRUCT_MEMBER(m_voice, rvramp)); - save_item(STRUCT_MEMBER(m_voice, k2ramp)); - save_item(STRUCT_MEMBER(m_voice, k1ramp)); - save_item(STRUCT_MEMBER(m_voice, filtcount)); +void es5506_device::device_register_save(save_registrar &save) +{ + es550x_device::device_register_save(save); - // success + // register save + save.reg(NAME(m_write_latch)) + .reg(NAME(m_read_latch)) + .reg(NAME(m_wst)) + .reg(NAME(m_wend)) + .reg(NAME(m_lrend)); } //------------------------------------------------- diff --git a/src/devices/sound/es5506.h b/src/devices/sound/es5506.h index 4e45617c8b7..1fb8aff36bb 100644 --- a/src/devices/sound/es5506.h +++ b/src/devices/sound/es5506.h @@ -73,12 +73,38 @@ protected: // internal state u8 index = 0; // index of this voice u8 filtcount = 0; // filter count + + void register_save(save_registrar &save) + { + save.reg(NAME(control)) + .reg(NAME(freqcount)) + .reg(NAME(start)) + .reg(NAME(lvol)) + .reg(NAME(end)) + .reg(NAME(lvramp)) + .reg(NAME(accum)) + .reg(NAME(rvol)) + .reg(NAME(rvramp)) + .reg(NAME(ecount)) + .reg(NAME(k2)) + .reg(NAME(k2ramp)) + .reg(NAME(k1)) + .reg(NAME(k1ramp)) + .reg(NAME(o4n1)) + .reg(NAME(o3n1)) + .reg(NAME(o3n2)) + .reg(NAME(o2n1)) + .reg(NAME(o2n2)) + .reg(NAME(o1n1)) + .reg(NAME(filtcount)); + } }; es550x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; virtual void device_stop() override; virtual void device_reset() override; @@ -168,6 +194,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_reset() override; // device_memory_interface configuration diff --git a/src/devices/sound/ics2115.cpp b/src/devices/sound/ics2115.cpp index 868bcb70bc4..c7747c58313 100644 --- a/src/devices/sound/ics2115.cpp +++ b/src/devices/sound/ics2115.cpp @@ -92,46 +92,23 @@ void ics2115_device::device_start() s16 value = lut[exponent] + (mantissa << (exponent + 3)); m_ulaw[i] = (i & 0x80) ? -value : value; } +} - save_item(NAME(m_timer[0].period)); - save_item(NAME(m_timer[0].scale)); - save_item(NAME(m_timer[0].preset)); - save_item(NAME(m_timer[1].period)); - save_item(NAME(m_timer[1].scale)); - save_item(NAME(m_timer[1].preset)); - save_item(NAME(m_reg_select)); - save_item(NAME(m_osc_select)); - save_item(NAME(m_irq_enabled)); - save_item(NAME(m_irq_pending)); - save_item(NAME(m_irq_on)); - save_item(NAME(m_active_osc)); - save_item(NAME(m_vmode)); - save_item(NAME(m_regs)); - save_item(STRUCT_MEMBER(m_voice, regs)); - - for (int i = 0; i < 32; i++) - { - save_item(NAME(m_voice[i].osc_conf.value), i); - save_item(NAME(m_voice[i].state.on), i); - save_item(NAME(m_voice[i].state.ramp), i); - save_item(NAME(m_voice[i].vol_ctrl.value), i); - save_item(NAME(m_voice[i].osc.left), i); - save_item(NAME(m_voice[i].osc.acc), i); - save_item(NAME(m_voice[i].osc.start), i); - save_item(NAME(m_voice[i].osc.end), i); - save_item(NAME(m_voice[i].osc.fc), i); - save_item(NAME(m_voice[i].osc.ctl), i); - save_item(NAME(m_voice[i].osc.saddr), i); - save_item(NAME(m_voice[i].vol.left), i); - save_item(NAME(m_voice[i].vol.add), i); - save_item(NAME(m_voice[i].vol.start), i); - save_item(NAME(m_voice[i].vol.end), i); - save_item(NAME(m_voice[i].vol.acc), i); - save_item(NAME(m_voice[i].vol.regacc), i); - save_item(NAME(m_voice[i].vol.incr), i); - save_item(NAME(m_voice[i].vol.pan), i); - save_item(NAME(m_voice[i].vol.mode), i); - } +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void ics2115_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_timer)) + .reg(NAME(m_reg_select)) + .reg(NAME(m_osc_select)) + .reg(NAME(m_irq_enabled)) + .reg(NAME(m_irq_pending)) + .reg(NAME(m_irq_on)) + .reg(NAME(m_active_osc)) + .reg(NAME(m_vmode)) + .reg(NAME(m_regs)); } //------------------------------------------------- diff --git a/src/devices/sound/ics2115.h b/src/devices/sound/ics2115.h index 5dd18fcf4ed..e3bfcbafde6 100644 --- a/src/devices/sound/ics2115.h +++ b/src/devices/sound/ics2115.h @@ -36,6 +36,7 @@ protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; // device_sound_interface overrides @@ -55,6 +56,17 @@ private: u32 acc, start, end; // address counters (20.9 fixed point) u16 fc; // frequency (6.9 fixed point) u8 ctl, saddr; + + void register_save(save_registrar &save) + { + save.reg(NAME(left)) + .reg(NAME(acc)) + .reg(NAME(start)) + .reg(NAME(end)) + .reg(NAME(fc)) + .reg(NAME(ctl)) + .reg(NAME(saddr)); + } } osc; struct { @@ -65,6 +77,19 @@ private: u16 regacc; u8 incr; u8 pan, mode; + + void register_save(save_registrar &save) + { + save.reg(NAME(left)) + .reg(NAME(add)) + .reg(NAME(start)) + .reg(NAME(end)) + .reg(NAME(acc)) + .reg(NAME(regacc)) + .reg(NAME(incr)) + .reg(NAME(pan)) + .reg(NAME(mode)); + } } vol; union { @@ -80,6 +105,8 @@ private: // IRQ on variable? } bitflags; u8 value; + + void register_save(save_registrar &save) { save.reg(NAME(value)); } } osc_conf; union { @@ -95,6 +122,8 @@ private: // noenvelope == (done | stop) } bitflags; u8 value; + + void register_save(save_registrar &save) { save.reg(NAME(value)); } } vol_ctrl; // Possibly redundant state. => improvements of wavetable logic @@ -102,6 +131,8 @@ private: struct { bool on; int ramp; // 100 0000 = 0x40 maximum + + void register_save(save_registrar &save) { save.reg(NAME(on)).reg(NAME(ramp)); } } state; u16 regs[0x20]; // channel registers @@ -109,6 +140,16 @@ private: int update_volume_envelope(); int update_oscillator(); void update_ramp(); + + void register_save(save_registrar &save) + { + save.reg(NAME(osc_conf)) + .reg(NAME(state)) + .reg(NAME(vol_ctrl)) + .reg(NAME(osc)) + .reg(NAME(vol)) + .reg(NAME(regs)); + } }; // internal register helper functions @@ -139,6 +180,8 @@ private: u8 scale, preset; emu_timer *timer; u64 period; /* in nsec */ + + void register_save(save_registrar &save) { save.reg(NAME(period)).reg(NAME(scale)).reg(NAME(preset)); } } m_timer[2]; u8 m_active_osc; diff --git a/src/devices/sound/k007232.cpp b/src/devices/sound/k007232.cpp index 32623f187df..2113257adba 100644 --- a/src/devices/sound/k007232.cpp +++ b/src/devices/sound/k007232.cpp @@ -90,15 +90,16 @@ void k007232_device::device_start() elem = 0; m_stream = stream_alloc(0, 2, clock()/128); +} - save_item(STRUCT_MEMBER(m_channel, vol)); - save_item(STRUCT_MEMBER(m_channel, addr)); - save_item(STRUCT_MEMBER(m_channel, counter)); - save_item(STRUCT_MEMBER(m_channel, start)); - save_item(STRUCT_MEMBER(m_channel, step)); - save_item(STRUCT_MEMBER(m_channel, bank)); - save_item(STRUCT_MEMBER(m_channel, play)); - save_item(NAME(m_wreg)); +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void k007232_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_channel)) + .reg(NAME(m_wreg)); } //------------------------------------------------- diff --git a/src/devices/sound/k007232.h b/src/devices/sound/k007232.h index f467670fc9b..ad9b29d6156 100644 --- a/src/devices/sound/k007232.h +++ b/src/devices/sound/k007232.h @@ -34,6 +34,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; // sound stream update overrides @@ -60,6 +61,17 @@ private: u16 step; u32 bank; bool play; + + void register_save(save_registrar &save) + { + save.reg(NAME(vol)) + .reg(NAME(addr)) + .reg(NAME(counter)) + .reg(NAME(start)) + .reg(NAME(step)) + .reg(NAME(bank)) + .reg(NAME(play)); + } }; u8 read_rom_default(offs_t offset) { return m_rom[(m_bank + (offset & 0x1ffff)) & (m_rom.length() - 1)]; } diff --git a/src/devices/sound/k051649.cpp b/src/devices/sound/k051649.cpp index 9a1f748580e..8e1aa25075f 100644 --- a/src/devices/sound/k051649.cpp +++ b/src/devices/sound/k051649.cpp @@ -77,15 +77,17 @@ void k051649_device::device_start() // build the mixer table make_mixer_table(5); +} +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void k051649_device::device_register_save(save_registrar &save) +{ // save states - save_item(STRUCT_MEMBER(m_channel_list, counter)); - save_item(STRUCT_MEMBER(m_channel_list, clock)); - save_item(STRUCT_MEMBER(m_channel_list, frequency)); - save_item(STRUCT_MEMBER(m_channel_list, volume)); - save_item(STRUCT_MEMBER(m_channel_list, key)); - save_item(STRUCT_MEMBER(m_channel_list, waveram)); - save_item(NAME(m_test)); + save.reg(NAME(m_channel_list)) + .reg(NAME(m_test)); } diff --git a/src/devices/sound/k051649.h b/src/devices/sound/k051649.h index 368ef6c58a9..7e4036c0ea2 100644 --- a/src/devices/sound/k051649.h +++ b/src/devices/sound/k051649.h @@ -33,6 +33,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_reset() override; virtual void device_post_load() override; virtual void device_clock_changed() override; @@ -60,6 +61,16 @@ private: int volume; // volume bool key; // keyon/off s8 waveram[32]; // 32 byte wavetable + + void register_save(save_registrar &save) + { + save.reg(NAME(counter)) + .reg(NAME(clock)) + .reg(NAME(frequency)) + .reg(NAME(volume)) + .reg(NAME(key)) + .reg(NAME(waveram)); + } }; void make_mixer_table(int voices); diff --git a/src/devices/sound/l7a1045_l6028_dsp_a.cpp b/src/devices/sound/l7a1045_l6028_dsp_a.cpp index a9db61b5deb..61421a71998 100644 --- a/src/devices/sound/l7a1045_l6028_dsp_a.cpp +++ b/src/devices/sound/l7a1045_l6028_dsp_a.cpp @@ -121,18 +121,20 @@ void l7a1045_sound_device::device_start() // Allocate the stream m_stream = stream_alloc(0, 2, 66150); //clock() / 384); +} + + +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- - save_item(STRUCT_MEMBER(m_voice, start)); - save_item(STRUCT_MEMBER(m_voice, end)); - save_item(STRUCT_MEMBER(m_voice, mode)); - save_item(STRUCT_MEMBER(m_voice, pos)); - save_item(STRUCT_MEMBER(m_voice, frac)); - save_item(STRUCT_MEMBER(m_voice, l_volume)); - save_item(STRUCT_MEMBER(m_voice, r_volume)); - save_item(NAME(m_key)); - save_item(NAME(m_audiochannel)); - save_item(NAME(m_audioregister)); - save_item(STRUCT_MEMBER(m_audiodat, dat)); +void l7a1045_sound_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_voice)) + .reg(NAME(m_key)) + .reg(NAME(m_audiochannel)) + .reg(NAME(m_audioregister)) + .reg(NAME(m_audiodat)); } diff --git a/src/devices/sound/l7a1045_l6028_dsp_a.h b/src/devices/sound/l7a1045_l6028_dsp_a.h index 4fff2caa465..a3ddcdecb11 100644 --- a/src/devices/sound/l7a1045_l6028_dsp_a.h +++ b/src/devices/sound/l7a1045_l6028_dsp_a.h @@ -31,6 +31,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; @@ -47,6 +48,17 @@ private: uint32_t frac = 0; uint16_t l_volume = 0; uint16_t r_volume = 0; + + void register_save(save_registrar &save) + { + save.reg(NAME(start)) + .reg(NAME(end)) + .reg(NAME(mode)) + .reg(NAME(pos)) + .reg(NAME(frac)) + .reg(NAME(l_volume)) + .reg(NAME(r_volume)); + } }; sound_stream *m_stream; @@ -59,6 +71,7 @@ private: struct l7a1045_48bit_data { uint16_t dat[3]; + void register_save(save_registrar &save) { save.reg(NAME(dat)); } }; l7a1045_48bit_data m_audiodat[0x10][0x20]; diff --git a/src/devices/sound/multipcm.cpp b/src/devices/sound/multipcm.cpp index b3dd084580f..7243340c9fe 100644 --- a/src/devices/sound/multipcm.cpp +++ b/src/devices/sound/multipcm.cpp @@ -584,45 +584,24 @@ void multipcm_device::device_start() m_linear_to_exp_volume[i] = value_to_fixed(TL_SHIFT, exp_volume); } - save_item(NAME(m_cur_slot)); - save_item(NAME(m_address)); - // Slots m_slots = std::make_unique<slot_t []>(28); - save_pointer(STRUCT_MEMBER(m_slots, m_regs), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_playing), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_base), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_offset), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_step), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_pan), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_total_level), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_dest_total_level), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_total_level_step), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_prev_sample), 28); - save_pointer(STRUCT_MEMBER(m_slots, m_format), 28); - - for (int32_t slot = 0; slot < 28; ++slot) - { - m_slots[slot].m_playing = false; - - save_item(NAME(m_slots[slot].m_envelope_gen.m_volume), slot); - save_item(NAME(m_slots[slot].m_envelope_gen.m_state), slot); - save_item(NAME(m_slots[slot].m_envelope_gen.step), slot); - save_item(NAME(m_slots[slot].m_envelope_gen.m_attack_rate), slot); - save_item(NAME(m_slots[slot].m_envelope_gen.m_decay1_rate), slot); - save_item(NAME(m_slots[slot].m_envelope_gen.m_decay2_rate), slot); - save_item(NAME(m_slots[slot].m_envelope_gen.m_release_rate), slot); - save_item(NAME(m_slots[slot].m_envelope_gen.m_decay_level), slot); - save_item(NAME(m_slots[slot].m_pitch_lfo.m_phase), slot); - save_item(NAME(m_slots[slot].m_pitch_lfo.m_phase_step), slot); - save_item(NAME(m_slots[slot].m_amplitude_lfo.m_phase), slot); - save_item(NAME(m_slots[slot].m_amplitude_lfo.m_phase_step), slot); - } - lfo_init(); } + +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void multipcm_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_slots), 28) + .reg(NAME(m_cur_slot)) + .reg(NAME(m_address)); +} + //------------------------------------------------- // device_clock_changed - called if the clock // changes diff --git a/src/devices/sound/multipcm.h b/src/devices/sound/multipcm.h index 27f5f6d5de0..b09534f11e9 100644 --- a/src/devices/sound/multipcm.h +++ b/src/devices/sound/multipcm.h @@ -26,6 +26,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; // sound stream update overrides @@ -70,6 +71,18 @@ private: int32_t m_decay2_rate = 0; // Decay2 int32_t m_release_rate = 0; // Release int32_t m_decay_level = 0; // Decay level + + void register_save(save_registrar &save) + { + save.reg(NAME(m_volume)) + .reg(NAME(m_state)) + .reg(NAME(step)) + .reg(NAME(m_attack_rate)) + .reg(NAME(m_decay1_rate)) + .reg(NAME(m_decay2_rate)) + .reg(NAME(m_release_rate)) + .reg(NAME(m_decay_level)); + } }; struct lfo_t @@ -78,6 +91,8 @@ private: uint32_t m_phase_step = 0; int32_t *m_table = nullptr; int32_t *m_scale = nullptr; + + void register_save(save_registrar &save) { save.reg(NAME(m_phase)).reg(NAME(m_phase_step)); } }; struct slot_t @@ -97,6 +112,24 @@ private: lfo_t m_pitch_lfo; // Pitch lfo lfo_t m_amplitude_lfo; // AM lfo uint8_t m_format; + + void register_save(save_registrar &save) + { + save.reg(NAME(m_regs)) + .reg(NAME(m_playing)) + .reg(NAME(m_base)) + .reg(NAME(m_offset)) + .reg(NAME(m_step)) + .reg(NAME(m_pan)) + .reg(NAME(m_total_level)) + .reg(NAME(m_dest_total_level)) + .reg(NAME(m_total_level_step)) + .reg(NAME(m_prev_sample)) + .reg(NAME(m_format)) + .reg(NAME(m_envelope_gen)) + .reg(NAME(m_pitch_lfo)) + .reg(NAME(m_amplitude_lfo)); + } }; // internal state diff --git a/src/devices/sound/okiadpcm.h b/src/devices/sound/okiadpcm.h index b89e3ab8db7..d7af277eea6 100644 --- a/src/devices/sound/okiadpcm.h +++ b/src/devices/sound/okiadpcm.h @@ -34,6 +34,14 @@ public: int32_t m_loop_step; bool m_saved; + void register_save(save_registrar &save) + { + save.reg(NAME(m_signal)) + .reg(NAME(m_step)) + .reg(NAME(m_loop_signal)) + .reg(NAME(m_loop_step)); + } + private: static const int8_t s_index_shift[8]; static int s_diff_lookup[49*16]; @@ -64,6 +72,14 @@ public: int32_t m_loop_step; bool m_saved; + void register_save(save_registrar &save) + { + save.reg(NAME(m_signal)) + .reg(NAME(m_step)) + .reg(NAME(m_loop_signal)) + .reg(NAME(m_loop_step)); + } + private: static const int8_t s_index_shift[8]; static int s_diff_lookup[49*16]; diff --git a/src/devices/sound/okim9810.cpp b/src/devices/sound/okim9810.cpp index 21e2624cd80..e7223dbfc41 100644 --- a/src/devices/sound/okim9810.cpp +++ b/src/devices/sound/okim9810.cpp @@ -113,53 +113,36 @@ void okim9810_device::device_start() { // create the stream m_stream = stream_alloc(0, 2, clock()); +} - // save state stuff - save_item(NAME(m_TMP_register)); - save_item(NAME(m_global_volume)); - save_item(NAME(m_filter_type)); - save_item(NAME(m_output_level)); - - save_item(NAME(m_dadr)); - save_item(NAME(m_dadr_start_offset)); - save_item(NAME(m_dadr_end_offset)); - save_item(NAME(m_dadr_flags)); - - save_item(NAME(m_serial)); - save_item(NAME(m_serial_read_latch)); - save_item(NAME(m_serial_write_latch)); - save_item(NAME(m_serial_bits)); - save_item(NAME(m_ud)); - save_item(NAME(m_si)); - save_item(NAME(m_sd)); - save_item(NAME(m_cmd)); - - for (int i = 0; i < OKIM9810_VOICES; i++) - { - okim_voice *voice = &m_voice[i]; - // can't use STRUCT_MEMBER on nested structs - save_item(NAME(voice->m_adpcm.m_signal), i); - save_item(NAME(voice->m_adpcm.m_step), i); - save_item(NAME(voice->m_adpcm2.m_signal), i); - save_item(NAME(voice->m_adpcm2.m_step), i); - } +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- - save_item(STRUCT_MEMBER(m_voice, m_playbackAlgo)); - save_item(STRUCT_MEMBER(m_voice, m_looping)); - save_item(STRUCT_MEMBER(m_voice, m_startFlags)); - save_item(STRUCT_MEMBER(m_voice, m_endFlags)); - save_item(STRUCT_MEMBER(m_voice, m_base_offset)); - save_item(STRUCT_MEMBER(m_voice, m_count)); - save_item(STRUCT_MEMBER(m_voice, m_samplingFreq)); - save_item(STRUCT_MEMBER(m_voice, m_playing)); - save_item(STRUCT_MEMBER(m_voice, m_sample)); - save_item(STRUCT_MEMBER(m_voice, m_channel_volume)); - save_item(STRUCT_MEMBER(m_voice, m_pan_volume_left)); - save_item(STRUCT_MEMBER(m_voice, m_pan_volume_right)); - save_item(STRUCT_MEMBER(m_voice, m_startSample)); - save_item(STRUCT_MEMBER(m_voice, m_endSample)); - save_item(STRUCT_MEMBER(m_voice, m_interpSampleNum)); +void okim9810_device::device_register_save(save_registrar &save) +{ + // save state stuff + save.reg(NAME(m_TMP_register)) + .reg(NAME(m_global_volume)) + .reg(NAME(m_filter_type)) + .reg(NAME(m_output_level)) + + .reg(NAME(m_dadr)) + .reg(NAME(m_dadr_start_offset)) + .reg(NAME(m_dadr_end_offset)) + .reg(NAME(m_dadr_flags)) + + .reg(NAME(m_serial)) + .reg(NAME(m_serial_read_latch)) + .reg(NAME(m_serial_write_latch)) + .reg(NAME(m_serial_bits)) + .reg(NAME(m_ud)) + .reg(NAME(m_si)) + .reg(NAME(m_sd)) + .reg(NAME(m_cmd)) + + .reg(NAME(m_voice)); } diff --git a/src/devices/sound/okim9810.h b/src/devices/sound/okim9810.h index 01977b23e2b..3cf05867821 100644 --- a/src/devices/sound/okim9810.h +++ b/src/devices/sound/okim9810.h @@ -82,6 +82,7 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_reset() override; virtual void device_post_load() override; virtual void device_clock_changed() override; @@ -129,6 +130,27 @@ protected: uint32_t m_interpSampleNum; // interpolation state - fraction between start & end static const uint8_t s_volume_table[16]; + + void register_save(save_registrar &save) + { + save.reg(NAME(m_adpcm)) + .reg(NAME(m_adpcm2)) + .reg(NAME(m_playbackAlgo)) + .reg(NAME(m_looping)) + .reg(NAME(m_startFlags)) + .reg(NAME(m_endFlags)) + .reg(NAME(m_base_offset)) + .reg(NAME(m_count)) + .reg(NAME(m_samplingFreq)) + .reg(NAME(m_playing)) + .reg(NAME(m_sample)) + .reg(NAME(m_channel_volume)) + .reg(NAME(m_pan_volume_left)) + .reg(NAME(m_pan_volume_right)) + .reg(NAME(m_startSample)) + .reg(NAME(m_endSample)) + .reg(NAME(m_interpSampleNum)); + } }; // internal state diff --git a/src/devices/sound/pokey.cpp b/src/devices/sound/pokey.cpp index f749afad2ae..1586195f74e 100644 --- a/src/devices/sound/pokey.cpp +++ b/src/devices/sound/pokey.cpp @@ -263,35 +263,6 @@ void pokey_device::device_start() timer_alloc(SYNC_POT); timer_alloc(SYNC_SET_IRQST); - save_item(STRUCT_MEMBER(m_channel, m_borrow_cnt)); - save_item(STRUCT_MEMBER(m_channel, m_counter)); - save_item(STRUCT_MEMBER(m_channel, m_filter_sample)); - save_item(STRUCT_MEMBER(m_channel, m_output)); - save_item(STRUCT_MEMBER(m_channel, m_AUDF)); - save_item(STRUCT_MEMBER(m_channel, m_AUDC)); - - save_item(NAME(m_clock_cnt)); - save_item(NAME(m_p4)); - save_item(NAME(m_p5)); - save_item(NAME(m_p9)); - save_item(NAME(m_p17)); - - save_item(NAME(m_POTx)); - save_item(NAME(m_AUDCTL)); - save_item(NAME(m_ALLPOT)); - save_item(NAME(m_KBCODE)); - save_item(NAME(m_SERIN)); - save_item(NAME(m_SEROUT)); - save_item(NAME(m_IRQST)); - save_item(NAME(m_IRQEN)); - save_item(NAME(m_SKSTAT)); - save_item(NAME(m_SKCTL)); - - save_item(NAME(m_pot_counter)); - save_item(NAME(m_kbd_cnt)); - save_item(NAME(m_kbd_latch)); - save_item(NAME(m_kbd_state)); - // State support state_add(AUDF1_C, "AUDF1", m_channel[0].m_AUDF); @@ -316,6 +287,38 @@ void pokey_device::device_start() set_icountptr(m_icount); } + +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void pokey_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_channel)) + + .reg(NAME(m_clock_cnt)) + .reg(NAME(m_p4)) + .reg(NAME(m_p5)) + .reg(NAME(m_p9)) + .reg(NAME(m_p17)) + + .reg(NAME(m_POTx)) + .reg(NAME(m_AUDCTL)) + .reg(NAME(m_ALLPOT)) + .reg(NAME(m_KBCODE)) + .reg(NAME(m_SERIN)) + .reg(NAME(m_SEROUT)) + .reg(NAME(m_IRQST)) + .reg(NAME(m_IRQEN)) + .reg(NAME(m_SKSTAT)) + .reg(NAME(m_SKCTL)) + + .reg(NAME(m_pot_counter)) + .reg(NAME(m_kbd_cnt)) + .reg(NAME(m_kbd_latch)) + .reg(NAME(m_kbd_state)); +} + //------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- diff --git a/src/devices/sound/pokey.h b/src/devices/sound/pokey.h index 0717429aff3..f0947292a7c 100644 --- a/src/devices/sound/pokey.h +++ b/src/devices/sound/pokey.h @@ -187,6 +187,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_reset() override; virtual void device_post_load() override; virtual void device_clock_changed() override; @@ -242,6 +243,10 @@ private: } return 0; } + + void register_save(save_registrar &save) + { + } }; static constexpr int POKEY_CHANNELS = 4; diff --git a/src/devices/sound/qsoundhle.cpp b/src/devices/sound/qsoundhle.cpp index 913d22baed1..14766603f68 100644 --- a/src/devices/sound/qsoundhle.cpp +++ b/src/devices/sound/qsoundhle.cpp @@ -67,72 +67,42 @@ void qsound_hle_device::device_start() m_stream = stream_alloc(0, 2, clock() / 2 / 1248); // DSP program uses 1248 machine cycles per iteration init_register_map(); +} +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void qsound_hle_device::device_register_save(save_registrar &save) +{ // state save // PCM registers // PCM voices - save_item(STRUCT_MEMBER(m_voice, m_bank)); - save_item(STRUCT_MEMBER(m_voice, m_addr)); - save_item(STRUCT_MEMBER(m_voice, m_phase)); - save_item(STRUCT_MEMBER(m_voice, m_rate)); - save_item(STRUCT_MEMBER(m_voice, m_loop_len)); - save_item(STRUCT_MEMBER(m_voice, m_end_addr)); - save_item(STRUCT_MEMBER(m_voice, m_volume)); - save_item(STRUCT_MEMBER(m_voice, m_echo)); + save.reg(NAME(m_voice)) // ADPCM voices - save_item(STRUCT_MEMBER(m_adpcm, m_start_addr)); - save_item(STRUCT_MEMBER(m_adpcm, m_end_addr)); - save_item(STRUCT_MEMBER(m_adpcm, m_bank)); - save_item(STRUCT_MEMBER(m_adpcm, m_volume)); - save_item(STRUCT_MEMBER(m_adpcm, m_flag)); - save_item(STRUCT_MEMBER(m_adpcm, m_cur_vol)); - save_item(STRUCT_MEMBER(m_adpcm, m_step_size)); - save_item(STRUCT_MEMBER(m_adpcm, m_cur_addr)); + .reg(NAME(m_adpcm)) // PCM voices - save_item(NAME(m_voice_pan)); + .reg(NAME(m_voice_pan)) // QSound registers - save_item(NAME(m_echo.m_end_pos)); - save_item(NAME(m_echo.m_feedback)); - save_item(NAME(m_echo.m_length)); - save_item(NAME(m_echo.m_last_sample)); - save_item(NAME(m_echo.m_delay_line)); - save_item(NAME(m_echo.m_delay_pos)); + .reg(NAME(m_echo)) // left, right - save_item(STRUCT_MEMBER(m_filter, m_tap_count)); - save_item(STRUCT_MEMBER(m_filter, m_delay_pos)); - save_item(STRUCT_MEMBER(m_filter, m_table_pos)); - save_item(STRUCT_MEMBER(m_filter, m_taps)); - save_item(STRUCT_MEMBER(m_filter, m_delay_line)); - - save_item(STRUCT_MEMBER(m_alt_filter, m_tap_count)); - save_item(STRUCT_MEMBER(m_alt_filter, m_delay_pos)); - save_item(STRUCT_MEMBER(m_alt_filter, m_table_pos)); - save_item(STRUCT_MEMBER(m_alt_filter, m_taps)); - save_item(STRUCT_MEMBER(m_alt_filter, m_delay_line)); - - save_item(STRUCT_MEMBER(m_wet, m_delay)); - save_item(STRUCT_MEMBER(m_wet, m_volume)); - save_item(STRUCT_MEMBER(m_wet, m_write_pos)); - save_item(STRUCT_MEMBER(m_wet, m_read_pos)); - save_item(STRUCT_MEMBER(m_wet, m_delay_line)); - - save_item(STRUCT_MEMBER(m_dry, m_delay)); - save_item(STRUCT_MEMBER(m_dry, m_volume)); - save_item(STRUCT_MEMBER(m_dry, m_write_pos)); - save_item(STRUCT_MEMBER(m_dry, m_read_pos)); - save_item(STRUCT_MEMBER(m_dry, m_delay_line)); - - save_item(NAME(m_state)); - save_item(NAME(m_next_state)); - save_item(NAME(m_delay_update)); - save_item(NAME(m_state_counter)); - save_item(NAME(m_ready_flag)); - save_item(NAME(m_data_latch)); - save_item(NAME(m_out)); + .reg(NAME(m_filter)) + .reg(NAME(m_alt_filter)) + + .reg(NAME(m_wet)) + .reg(NAME(m_dry)) + + .reg(NAME(m_state)) + .reg(NAME(m_next_state)) + .reg(NAME(m_delay_update)) + .reg(NAME(m_state_counter)) + .reg(NAME(m_ready_flag)) + .reg(NAME(m_data_latch)) + .reg(NAME(m_out)); } //------------------------------------------------- diff --git a/src/devices/sound/qsoundhle.h b/src/devices/sound/qsoundhle.h index 4d6f61e0c7d..be052d3be38 100644 --- a/src/devices/sound/qsoundhle.h +++ b/src/devices/sound/qsoundhle.h @@ -27,6 +27,7 @@ protected: // device_t implementation tiny_rom_entry const *device_rom_region() const override; virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_reset() override; // device_sound_interface implementation @@ -71,6 +72,17 @@ private: int16_t m_echo = 0; int16_t update(qsound_hle_device &dsp, int32_t *echo_out); + void register_save(save_registrar &save) + { + save.reg(NAME(m_bank)) + .reg(NAME(m_addr)) + .reg(NAME(m_phase)) + .reg(NAME(m_rate)) + .reg(NAME(m_loop_len)) + .reg(NAME(m_end_addr)) + .reg(NAME(m_volume)) + .reg(NAME(m_echo)); + } }; struct qsound_adpcm { @@ -84,6 +96,17 @@ private: uint16_t m_cur_addr = 0; int16_t update(qsound_hle_device &dsp, int16_t curr_sample, int nibble); + void register_save(save_registrar &save) + { + save.reg(NAME(m_start_addr)) + .reg(NAME(m_end_addr)) + .reg(NAME(m_bank)) + .reg(NAME(m_volume)) + .reg(NAME(m_flag)) + .reg(NAME(m_cur_vol)) + .reg(NAME(m_step_size)) + .reg(NAME(m_cur_addr)); + } }; // Q1 Filter @@ -95,6 +118,14 @@ private: int16_t m_delay_line[95] = { 0 }; int32_t apply(int16_t input); + void register_save(save_registrar &save) + { + save.reg(NAME(m_tap_count)) + .reg(NAME(m_delay_pos)) + .reg(NAME(m_table_pos)) + .reg(NAME(m_taps)) + .reg(NAME(m_delay_line)); + } }; // Delay line @@ -107,6 +138,14 @@ private: int32_t apply(const int32_t input); void update(); + void register_save(save_registrar &save) + { + save.reg(NAME(m_delay)) + .reg(NAME(m_volume)) + .reg(NAME(m_write_pos)) + .reg(NAME(m_read_pos)) + .reg(NAME(m_delay_line)); + } }; struct qsound_echo { @@ -119,6 +158,15 @@ private: int16_t m_delay_pos = 0; int16_t apply(int32_t input); + void register_save(save_registrar &save) + { + save.reg(NAME(m_end_pos)) + .reg(NAME(m_feedback)) + .reg(NAME(m_length)) + .reg(NAME(m_last_sample)) + .reg(NAME(m_delay_line)) + .reg(NAME(m_delay_pos)); + } }; // MAME resources diff --git a/src/devices/sound/rf5c400.cpp b/src/devices/sound/rf5c400.cpp index f15b7923260..73d969e7f06 100644 --- a/src/devices/sound/rf5c400.cpp +++ b/src/devices/sound/rf5c400.cpp @@ -161,36 +161,23 @@ void rf5c400_device::device_start() m_req_channel = 0; - save_item(NAME(m_rf5c400_status)); - save_item(NAME(m_ext_mem_address)); - save_item(NAME(m_ext_mem_data)); - save_item(NAME(m_req_channel)); - - save_item(STRUCT_MEMBER(m_channels, startH)); - save_item(STRUCT_MEMBER(m_channels, startL)); - save_item(STRUCT_MEMBER(m_channels, freq)); - save_item(STRUCT_MEMBER(m_channels, endL)); - save_item(STRUCT_MEMBER(m_channels, endHloopH)); - save_item(STRUCT_MEMBER(m_channels, loopL)); - save_item(STRUCT_MEMBER(m_channels, pan)); - save_item(STRUCT_MEMBER(m_channels, effect)); - save_item(STRUCT_MEMBER(m_channels, volume)); - save_item(STRUCT_MEMBER(m_channels, attack)); - save_item(STRUCT_MEMBER(m_channels, decay)); - save_item(STRUCT_MEMBER(m_channels, release)); - save_item(STRUCT_MEMBER(m_channels, cutoff)); - save_item(STRUCT_MEMBER(m_channels, pos)); - save_item(STRUCT_MEMBER(m_channels, step)); - save_item(STRUCT_MEMBER(m_channels, keyon)); - save_item(STRUCT_MEMBER(m_channels, env_phase)); - save_item(STRUCT_MEMBER(m_channels, env_level)); - save_item(STRUCT_MEMBER(m_channels, env_step)); - save_item(STRUCT_MEMBER(m_channels, env_scale)); - m_stream = stream_alloc(0, 4, clock() / 384); } //------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void rf5c400_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_rf5c400_status)) + .reg(NAME(m_ext_mem_address)) + .reg(NAME(m_ext_mem_data)) + .reg(NAME(m_req_channel)) + .reg(NAME(m_channels)); +} + +//------------------------------------------------- // device_clock_changed - called if the clock // changes //------------------------------------------------- diff --git a/src/devices/sound/rf5c400.h b/src/devices/sound/rf5c400.h index 8f54d2bc8b3..11d22576943 100644 --- a/src/devices/sound/rf5c400.h +++ b/src/devices/sound/rf5c400.h @@ -31,6 +31,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; // sound stream update overrides @@ -68,6 +69,30 @@ private: double env_level = 0.0; double env_step = 0.0; double env_scale = 0.0; + + void register_save(save_registrar &save) + { + save.reg(NAME(startH)) + .reg(NAME(startL)) + .reg(NAME(freq)) + .reg(NAME(endL)) + .reg(NAME(endHloopH)) + .reg(NAME(loopL)) + .reg(NAME(pan)) + .reg(NAME(effect)) + .reg(NAME(volume)) + .reg(NAME(attack)) + .reg(NAME(decay)) + .reg(NAME(release)) + .reg(NAME(cutoff)) + .reg(NAME(pos)) + .reg(NAME(step)) + .reg(NAME(keyon)) + .reg(NAME(env_phase)) + .reg(NAME(env_level)) + .reg(NAME(env_step)) + .reg(NAME(env_scale)); + } }; class envelope_tables diff --git a/src/devices/sound/rf5c68.cpp b/src/devices/sound/rf5c68.cpp index 09fd397d4fb..cc8b38688a6 100644 --- a/src/devices/sound/rf5c68.cpp +++ b/src/devices/sound/rf5c68.cpp @@ -82,18 +82,18 @@ void rf5c68_device::device_start() /* allocate the stream */ m_stream = stream_alloc(0, 2, clock() / 384); +} - save_item(STRUCT_MEMBER(m_chan, enable)); - save_item(STRUCT_MEMBER(m_chan, env)); - save_item(STRUCT_MEMBER(m_chan, pan)); - save_item(STRUCT_MEMBER(m_chan, start)); - save_item(STRUCT_MEMBER(m_chan, addr)); - save_item(STRUCT_MEMBER(m_chan, step)); - save_item(STRUCT_MEMBER(m_chan, loopst)); - - save_item(NAME(m_cbank)); - save_item(NAME(m_wbank)); - save_item(NAME(m_enable)); +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void rf5c68_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_chan)) + .reg(NAME(m_cbank)) + .reg(NAME(m_wbank)) + .reg(NAME(m_enable)); } //------------------------------------------------- diff --git a/src/devices/sound/rf5c68.h b/src/devices/sound/rf5c68.h index d78f378faaf..b7fb30058a5 100644 --- a/src/devices/sound/rf5c68.h +++ b/src/devices/sound/rf5c68.h @@ -42,6 +42,7 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; // sound stream update overrides @@ -66,6 +67,17 @@ private: u32 addr = 0; u16 step = 0; u16 loopst = 0; + + void register_save(save_registrar &save) + { + save.reg(NAME(enable)) + .reg(NAME(env)) + .reg(NAME(pan)) + .reg(NAME(start)) + .reg(NAME(addr)) + .reg(NAME(step)) + .reg(NAME(loopst)); + } }; memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache m_cache; diff --git a/src/devices/sound/saa1099.cpp b/src/devices/sound/saa1099.cpp index 080ebabe89c..963ac50e010 100644 --- a/src/devices/sound/saa1099.cpp +++ b/src/devices/sound/saa1099.cpp @@ -162,30 +162,27 @@ void saa1099_device::device_start() { /* for each chip allocate one stream */ m_stream = stream_alloc(0, 2, clock()/clock_divider); +} + + +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- - save_item(NAME(m_noise_params)); - save_item(NAME(m_env_enable)); - save_item(NAME(m_env_reverse_right)); - save_item(NAME(m_env_mode)); - save_item(NAME(m_env_bits)); - save_item(NAME(m_env_clock)); - save_item(NAME(m_env_step)); - save_item(NAME(m_all_ch_enable)); - save_item(NAME(m_sync_state)); - save_item(NAME(m_selected_reg)); - - save_item(STRUCT_MEMBER(m_channels, frequency)); - save_item(STRUCT_MEMBER(m_channels, freq_enable)); - save_item(STRUCT_MEMBER(m_channels, noise_enable)); - save_item(STRUCT_MEMBER(m_channels, octave)); - save_item(STRUCT_MEMBER(m_channels, amplitude)); - save_item(STRUCT_MEMBER(m_channels, envelope)); - save_item(STRUCT_MEMBER(m_channels, counter)); - save_item(STRUCT_MEMBER(m_channels, level)); - - save_item(STRUCT_MEMBER(m_noise, counter)); - save_item(STRUCT_MEMBER(m_noise, freq)); - save_item(STRUCT_MEMBER(m_noise, level)); +void saa1099_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_noise_params)) + .reg(NAME(m_env_enable)) + .reg(NAME(m_env_reverse_right)) + .reg(NAME(m_env_mode)) + .reg(NAME(m_env_bits)) + .reg(NAME(m_env_clock)) + .reg(NAME(m_env_step)) + .reg(NAME(m_all_ch_enable)) + .reg(NAME(m_sync_state)) + .reg(NAME(m_selected_reg)) + .reg(NAME(m_channels)) + .reg(NAME(m_noise)); } diff --git a/src/devices/sound/saa1099.h b/src/devices/sound/saa1099.h index 87f5b58f48a..183198028e2 100644 --- a/src/devices/sound/saa1099.h +++ b/src/devices/sound/saa1099.h @@ -29,6 +29,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; // sound stream update overrides @@ -50,6 +51,18 @@ private: inline u32 freq() const { return (511 - frequency) << (8 - octave); } // clock / ((511 - frequency) * 2^(8 - octave)) int counter = 0; u8 level = 0; + + void register_save(save_registrar &save) + { + save.reg(NAME(frequency)) + .reg(NAME(freq_enable)) + .reg(NAME(noise_enable)) + .reg(NAME(octave)) + .reg(NAME(amplitude)) + .reg(NAME(envelope)) + .reg(NAME(counter)) + .reg(NAME(level)); + } }; struct saa1099_noise @@ -60,6 +73,13 @@ private: int counter = 0; int freq = 0; u32 level = 0xffffffffU; // noise polynomial shifter + + void register_save(save_registrar &save) + { + save.reg(NAME(counter)) + .reg(NAME(freq)) + .reg(NAME(level)); + } }; void envelope_w(int ch); diff --git a/src/devices/sound/setapcm.cpp b/src/devices/sound/setapcm.cpp index 61346643216..5ff26716bf4 100644 --- a/src/devices/sound/setapcm.cpp +++ b/src/devices/sound/setapcm.cpp @@ -107,22 +107,17 @@ void setapcm_device<MaxVoices, Divider>::device_start() // set host device to each voices for (auto & elem : m_voice) elem.m_host = this; +} + +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- - save_item(STRUCT_MEMBER(m_voice, m_start)); - save_item(STRUCT_MEMBER(m_voice, m_flags)); - save_item(STRUCT_MEMBER(m_voice, m_freq)); - save_item(STRUCT_MEMBER(m_voice, m_lpstart)); - save_item(STRUCT_MEMBER(m_voice, m_lpend)); - save_item(STRUCT_MEMBER(m_voice, m_end)); - save_item(STRUCT_MEMBER(m_voice, m_vol_r)); - save_item(STRUCT_MEMBER(m_voice, m_vol_l)); - save_item(STRUCT_MEMBER(m_voice, m_pos)); - save_item(STRUCT_MEMBER(m_voice, m_frac)); - save_item(STRUCT_MEMBER(m_voice, m_lponce)); - save_item(STRUCT_MEMBER(m_voice, m_keyon)); - save_item(STRUCT_MEMBER(m_voice, m_out)); - - save_item(NAME(m_keyctrl)); +template<unsigned MaxVoices, unsigned Divider> +void setapcm_device<MaxVoices, Divider>::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_voice)) + .reg(NAME(m_keyctrl)); } //------------------------------------------------- diff --git a/src/devices/sound/setapcm.h b/src/devices/sound/setapcm.h index 8c406c7076f..4ab362b4480 100644 --- a/src/devices/sound/setapcm.h +++ b/src/devices/sound/setapcm.h @@ -35,6 +35,7 @@ protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_clock_changed() override; // sound stream update overrides @@ -69,6 +70,23 @@ private: bool m_lponce = false; // Is looped once? bool m_keyon = false; // Keyon status s32 m_out = 0; // output value + + void register_save(save_registrar &save) + { + save.reg(NAME(m_start)) + .reg(NAME(m_flags)) + .reg(NAME(m_freq)) + .reg(NAME(m_lpstart)) + .reg(NAME(m_lpend)) + .reg(NAME(m_end)) + .reg(NAME(m_vol_r)) + .reg(NAME(m_vol_l)) + .reg(NAME(m_pos)) + .reg(NAME(m_frac)) + .reg(NAME(m_lponce)) + .reg(NAME(m_keyon)) + .reg(NAME(m_out)); + } }; sound_stream *m_stream; diff --git a/src/devices/sound/sp0250.cpp b/src/devices/sound/sp0250.cpp index 862b3781a7c..f42bfc61598 100644 --- a/src/devices/sound/sp0250.cpp +++ b/src/devices/sound/sp0250.cpp @@ -74,29 +74,32 @@ void sp0250_device::device_start() attotime period = attotime::from_hz(frame_rate); timer_alloc()->adjust(period, 0, period); } +} +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void sp0250_device::device_register_save(save_registrar &save) +{ // PWM state - save_item(NAME(m_pwm_index)); - save_item(NAME(m_pwm_count)); - save_item(NAME(m_pwm_counts)); + save.reg(NAME(m_pwm_index)) + .reg(NAME(m_pwm_count)) + .reg(NAME(m_pwm_counts)) // LPC state - save_item(NAME(m_voiced)); - save_item(NAME(m_amp)); - save_item(NAME(m_lfsr)); - save_item(NAME(m_pitch)); - save_item(NAME(m_pcount)); - save_item(NAME(m_repeat)); - save_item(NAME(m_rcount)); - - save_item(STRUCT_MEMBER(m_filter, F)); - save_item(STRUCT_MEMBER(m_filter, B)); - save_item(STRUCT_MEMBER(m_filter, z1)); - save_item(STRUCT_MEMBER(m_filter, z2)); + .reg(NAME(m_voiced)) + .reg(NAME(m_amp)) + .reg(NAME(m_lfsr)) + .reg(NAME(m_pitch)) + .reg(NAME(m_pcount)) + .reg(NAME(m_repeat)) + .reg(NAME(m_rcount)) + .reg(NAME(m_filter)) // FIFO state - save_item(NAME(m_fifo)); - save_item(NAME(m_fifo_pos)); + .reg(NAME(m_fifo)) + .reg(NAME(m_fifo_pos)); } void sp0250_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) diff --git a/src/devices/sound/sp0250.h b/src/devices/sound/sp0250.h index d51ab2286bd..3fac364e347 100644 --- a/src/devices/sound/sp0250.h +++ b/src/devices/sound/sp0250.h @@ -19,6 +19,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; // sound stream update overrides @@ -44,6 +45,14 @@ private: } int16_t F, B; int16_t z1, z2; + + void register_save(save_registrar &save) + { + save.reg(NAME(F)) + .reg(NAME(B)) + .reg(NAME(z1)) + .reg(NAME(z2)); + } }; // PWM state diff --git a/src/devices/sound/tt5665.cpp b/src/devices/sound/tt5665.cpp index 0bd163f18df..dd57d62b3ea 100644 --- a/src/devices/sound/tt5665.cpp +++ b/src/devices/sound/tt5665.cpp @@ -152,23 +152,21 @@ void tt5665_device::device_start() // create the stream m_stream = stream_alloc(0, 2, clock() / freq_divider()); +} - save_item(NAME(m_command)); - save_item(NAME(m_ss_state)); - save_item(NAME(m_s0_s1_state)); - save_item(NAME(m_daol_output)); - save_item(NAME(m_daol_timing)); - - save_item(STRUCT_MEMBER(m_voice, m_playing)); - save_item(STRUCT_MEMBER(m_voice, m_sample)); - save_item(STRUCT_MEMBER(m_voice, m_count)); - save_item(STRUCT_MEMBER(m_voice, m_volume)); - save_item(STRUCT_MEMBER(m_voice, m_base_offset)); - for (int voicenum = 0; voicenum < TT5665_VOICES * 2; voicenum++) - { - save_item(NAME(m_voice[voicenum].m_adpcm.m_signal), voicenum); - save_item(NAME(m_voice[voicenum].m_adpcm.m_step), voicenum); - } + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void tt5665_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_voice)) + .reg(NAME(m_command)) + .reg(NAME(m_ss_state)) + .reg(NAME(m_s0_s1_state)) + .reg(NAME(m_daol_output)) + .reg(NAME(m_daol_timing)); } diff --git a/src/devices/sound/tt5665.h b/src/devices/sound/tt5665.h index 37a0a712e27..875cdac53d0 100644 --- a/src/devices/sound/tt5665.h +++ b/src/devices/sound/tt5665.h @@ -58,6 +58,7 @@ protected: // device-level overrides virtual void device_validity_check(validity_checker &valid) const override; virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_reset() override; virtual void device_post_load() override; virtual void device_clock_changed() override; @@ -82,6 +83,16 @@ private: u32 m_sample; // current sample number u32 m_count; // total samples to play stream_buffer::sample_t m_volume; // output volume + + void register_save(save_registrar &save) + { + save.reg(NAME(m_adpcm)) + .reg(NAME(m_playing)) + .reg(NAME(m_sample)) + .reg(NAME(m_count)) + .reg(NAME(m_volume)) + .reg(NAME(m_base_offset)); + } }; // configuration state diff --git a/src/devices/sound/vrender0.cpp b/src/devices/sound/vrender0.cpp index fd86b56adea..65e926eb63a 100644 --- a/src/devices/sound/vrender0.cpp +++ b/src/devices/sound/vrender0.cpp @@ -149,29 +149,26 @@ void vr0sound_device::device_start() elem.Cache = &m_fbcache; m_stream = stream_alloc(0, 2, clock() / 972); // TODO : Correct source / divider? +} + - save_item(STRUCT_MEMBER(m_channel, CurSAddr)); - save_item(STRUCT_MEMBER(m_channel, EnvVol)); - save_item(STRUCT_MEMBER(m_channel, EnvStage)); - save_item(STRUCT_MEMBER(m_channel, dSAddr)); - save_item(STRUCT_MEMBER(m_channel, Modes)); - save_item(STRUCT_MEMBER(m_channel, LD)); - save_item(STRUCT_MEMBER(m_channel, LoopBegin)); - save_item(STRUCT_MEMBER(m_channel, LoopEnd)); - save_item(STRUCT_MEMBER(m_channel, LChnVol)); - save_item(STRUCT_MEMBER(m_channel, RChnVol)); - save_item(STRUCT_MEMBER(m_channel, EnvRate)); - save_item(STRUCT_MEMBER(m_channel, EnvTarget)); - save_item(NAME(m_Status)); - save_item(NAME(m_NoteOn)); - save_item(NAME(m_RevFactor)); - save_item(NAME(m_BufferAddr)); - save_item(NAME(m_BufferSize)); - save_item(NAME(m_IntMask)); - save_item(NAME(m_IntPend)); - save_item(NAME(m_MaxChn)); - save_item(NAME(m_ChnClkNum)); - save_item(NAME(m_Ctrl)); +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void vr0sound_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_channel)) + .reg(NAME(m_Status)) + .reg(NAME(m_NoteOn)) + .reg(NAME(m_RevFactor)) + .reg(NAME(m_BufferAddr)) + .reg(NAME(m_BufferSize)) + .reg(NAME(m_IntMask)) + .reg(NAME(m_IntPend)) + .reg(NAME(m_MaxChn)) + .reg(NAME(m_ChnClkNum)) + .reg(NAME(m_Ctrl)); } //------------------------------------------------- diff --git a/src/devices/sound/vrender0.h b/src/devices/sound/vrender0.h index 1e234232c69..90ce2b3be38 100644 --- a/src/devices/sound/vrender0.h +++ b/src/devices/sound/vrender0.h @@ -74,6 +74,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_post_load() override; virtual void device_clock_changed() override; @@ -130,6 +131,22 @@ private: u8 EnvTarget[4]; // Envelope Target Volume per Each stages, High 7 Bits u16 read(offs_t offset); void write(offs_t offset, u16 data, u16 mem_mask); + + void register_save(save_registrar &save) + { + save.reg(NAME(CurSAddr)) + .reg(NAME(EnvVol)) + .reg(NAME(EnvStage)) + .reg(NAME(dSAddr)) + .reg(NAME(Modes)) + .reg(NAME(LD)) + .reg(NAME(LoopBegin)) + .reg(NAME(LoopEnd)) + .reg(NAME(LChnVol)) + .reg(NAME(RChnVol)) + .reg(NAME(EnvRate)) + .reg(NAME(EnvTarget)); + } }; memory_access<23, 1, 0, ENDIANNESS_LITTLE>::cache m_texcache; diff --git a/src/devices/sound/ymf271.cpp b/src/devices/sound/ymf271.cpp index a473705b065..a07d885d13b 100644 --- a/src/devices/sound/ymf271.cpp +++ b/src/devices/sound/ymf271.cpp @@ -1661,70 +1661,25 @@ void ymf271_device::calculate_clock_correction() } } -void ymf271_device::init_state() +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void ymf271_device::device_register_save(save_registrar &save) { - save_item(STRUCT_MEMBER(m_slots, ext_en)); - save_item(STRUCT_MEMBER(m_slots, ext_out)); - save_item(STRUCT_MEMBER(m_slots, lfoFreq)); - save_item(STRUCT_MEMBER(m_slots, pms)); - save_item(STRUCT_MEMBER(m_slots, ams)); - save_item(STRUCT_MEMBER(m_slots, detune)); - save_item(STRUCT_MEMBER(m_slots, multiple)); - save_item(STRUCT_MEMBER(m_slots, tl)); - save_item(STRUCT_MEMBER(m_slots, keyscale)); - save_item(STRUCT_MEMBER(m_slots, ar)); - save_item(STRUCT_MEMBER(m_slots, decay1rate)); - save_item(STRUCT_MEMBER(m_slots, decay2rate)); - save_item(STRUCT_MEMBER(m_slots, decay1lvl)); - save_item(STRUCT_MEMBER(m_slots, relrate)); - save_item(STRUCT_MEMBER(m_slots, block)); - save_item(STRUCT_MEMBER(m_slots, fns_hi)); - save_item(STRUCT_MEMBER(m_slots, fns)); - save_item(STRUCT_MEMBER(m_slots, feedback)); - save_item(STRUCT_MEMBER(m_slots, waveform)); - save_item(STRUCT_MEMBER(m_slots, accon)); - save_item(STRUCT_MEMBER(m_slots, algorithm)); - save_item(STRUCT_MEMBER(m_slots, ch0_level)); - save_item(STRUCT_MEMBER(m_slots, ch1_level)); - save_item(STRUCT_MEMBER(m_slots, ch2_level)); - save_item(STRUCT_MEMBER(m_slots, ch3_level)); - save_item(STRUCT_MEMBER(m_slots, startaddr)); - save_item(STRUCT_MEMBER(m_slots, loopaddr)); - save_item(STRUCT_MEMBER(m_slots, endaddr)); - save_item(STRUCT_MEMBER(m_slots, altloop)); - save_item(STRUCT_MEMBER(m_slots, fs)); - save_item(STRUCT_MEMBER(m_slots, srcnote)); - save_item(STRUCT_MEMBER(m_slots, srcb)); - save_item(STRUCT_MEMBER(m_slots, step)); - save_item(STRUCT_MEMBER(m_slots, stepptr)); - save_item(STRUCT_MEMBER(m_slots, active)); - save_item(STRUCT_MEMBER(m_slots, bits)); - save_item(STRUCT_MEMBER(m_slots, volume)); - save_item(STRUCT_MEMBER(m_slots, env_state)); - save_item(STRUCT_MEMBER(m_slots, env_attack_step)); - save_item(STRUCT_MEMBER(m_slots, env_decay1_step)); - save_item(STRUCT_MEMBER(m_slots, env_decay2_step)); - save_item(STRUCT_MEMBER(m_slots, env_release_step)); - save_item(STRUCT_MEMBER(m_slots, feedback_modulation0)); - save_item(STRUCT_MEMBER(m_slots, feedback_modulation1)); - save_item(STRUCT_MEMBER(m_slots, lfo_phase)); - save_item(STRUCT_MEMBER(m_slots, lfo_step)); - save_item(STRUCT_MEMBER(m_slots, lfo_amplitude)); - - save_item(STRUCT_MEMBER(m_groups, sync)); - save_item(STRUCT_MEMBER(m_groups, pfm)); - - save_item(NAME(m_regs_main)); - save_item(NAME(m_timerA)); - save_item(NAME(m_timerB)); - save_item(NAME(m_irqstate)); - save_item(NAME(m_status)); - save_item(NAME(m_end_status)); - save_item(NAME(m_enable)); - save_item(NAME(m_ext_address)); - save_item(NAME(m_ext_rw)); - save_item(NAME(m_ext_readlatch)); - save_item(NAME(m_master_clock)); + save.reg(NAME(m_slots)) + .reg(NAME(m_groups)) + .reg(NAME(m_regs_main)) + .reg(NAME(m_timerA)) + .reg(NAME(m_timerB)) + .reg(NAME(m_irqstate)) + .reg(NAME(m_status)) + .reg(NAME(m_end_status)) + .reg(NAME(m_enable)) + .reg(NAME(m_ext_address)) + .reg(NAME(m_ext_rw)) + .reg(NAME(m_ext_readlatch)) + .reg(NAME(m_master_clock)); } //------------------------------------------------- @@ -1740,7 +1695,6 @@ void ymf271_device::device_start() m_master_clock = clock(); init_tables(); - init_state(); m_mix_buffer.resize(m_master_clock/(384/4)); m_stream = stream_alloc(0, 4, m_master_clock/384); diff --git a/src/devices/sound/ymf271.h b/src/devices/sound/ymf271.h index 1c628f34cf1..78e4e22045f 100644 --- a/src/devices/sound/ymf271.h +++ b/src/devices/sound/ymf271.h @@ -23,6 +23,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void device_clock_changed() override; @@ -85,14 +86,65 @@ private: int lfo_phase, lfo_step; int lfo_amplitude; double lfo_phasemod; + + void register_save(save_registrar &save) + { + save.reg(NAME(ext_en)) + .reg(NAME(ext_out)) + .reg(NAME(lfoFreq)) + .reg(NAME(pms)) + .reg(NAME(ams)) + .reg(NAME(detune)) + .reg(NAME(multiple)) + .reg(NAME(tl)) + .reg(NAME(keyscale)) + .reg(NAME(ar)) + .reg(NAME(decay1rate)) + .reg(NAME(decay2rate)) + .reg(NAME(decay1lvl)) + .reg(NAME(relrate)) + .reg(NAME(block)) + .reg(NAME(fns_hi)) + .reg(NAME(fns)) + .reg(NAME(feedback)) + .reg(NAME(waveform)) + .reg(NAME(accon)) + .reg(NAME(algorithm)) + .reg(NAME(ch0_level)) + .reg(NAME(ch1_level)) + .reg(NAME(ch2_level)) + .reg(NAME(ch3_level)) + .reg(NAME(startaddr)) + .reg(NAME(loopaddr)) + .reg(NAME(endaddr)) + .reg(NAME(altloop)) + .reg(NAME(fs)) + .reg(NAME(srcnote)) + .reg(NAME(srcb)) + .reg(NAME(step)) + .reg(NAME(stepptr)) + .reg(NAME(active)) + .reg(NAME(bits)) + .reg(NAME(volume)) + .reg(NAME(env_state)) + .reg(NAME(env_attack_step)) + .reg(NAME(env_decay1_step)) + .reg(NAME(env_decay2_step)) + .reg(NAME(env_release_step)) + .reg(NAME(feedback_modulation0)) + .reg(NAME(feedback_modulation1)) + .reg(NAME(lfo_phase)) + .reg(NAME(lfo_step)) + .reg(NAME(lfo_amplitude)); + } }; struct YMF271Group { uint8_t sync, pfm; + void register_save(save_registrar &save) { save.reg(NAME(sync)).reg(NAME(pfm)); } }; - void init_state(); void init_tables(); void calculate_clock_correction(); void calculate_step(YMF271Slot *slot); diff --git a/src/devices/sound/ymz280b.cpp b/src/devices/sound/ymz280b.cpp index a9a87eb558f..1510d4543af 100644 --- a/src/devices/sound/ymz280b.cpp +++ b/src/devices/sound/ymz280b.cpp @@ -566,50 +566,32 @@ void ymz280b_device::device_start() assert(MAX_SAMPLE_CHUNK < 0x10000); m_scratch = std::make_unique<s16[]>(MAX_SAMPLE_CHUNK); - /* state save */ - save_item(NAME(m_current_register)); - save_item(NAME(m_status_register)); - save_item(NAME(m_irq_state)); - save_item(NAME(m_irq_mask)); - save_item(NAME(m_irq_enable)); - save_item(NAME(m_keyon_enable)); - save_item(NAME(m_ext_mem_enable)); - save_item(NAME(m_ext_mem_address)); - save_item(NAME(m_ext_readlatch)); - save_item(NAME(m_ext_mem_address_hi)); - save_item(NAME(m_ext_mem_address_mid)); - - save_item(STRUCT_MEMBER(m_voice, playing)); - save_item(STRUCT_MEMBER(m_voice, ended)); - save_item(STRUCT_MEMBER(m_voice, keyon)); - save_item(STRUCT_MEMBER(m_voice, looping)); - save_item(STRUCT_MEMBER(m_voice, mode)); - save_item(STRUCT_MEMBER(m_voice, fnum)); - save_item(STRUCT_MEMBER(m_voice, level)); - save_item(STRUCT_MEMBER(m_voice, pan)); - save_item(STRUCT_MEMBER(m_voice, start)); - save_item(STRUCT_MEMBER(m_voice, stop)); - save_item(STRUCT_MEMBER(m_voice, loop_start)); - save_item(STRUCT_MEMBER(m_voice, loop_end)); - save_item(STRUCT_MEMBER(m_voice, position)); - save_item(STRUCT_MEMBER(m_voice, signal)); - save_item(STRUCT_MEMBER(m_voice, step)); - save_item(STRUCT_MEMBER(m_voice, loop_signal)); - save_item(STRUCT_MEMBER(m_voice, loop_step)); - save_item(STRUCT_MEMBER(m_voice, loop_count)); - save_item(STRUCT_MEMBER(m_voice, output_left)); - save_item(STRUCT_MEMBER(m_voice, output_right)); - save_item(STRUCT_MEMBER(m_voice, output_pos)); - save_item(STRUCT_MEMBER(m_voice, last_sample)); - save_item(STRUCT_MEMBER(m_voice, curr_sample)); - save_item(STRUCT_MEMBER(m_voice, irq_schedule)); - #if YMZ280B_MAKE_WAVS m_wavresample = wav_open("resamp.wav", INTERNAL_SAMPLE_RATE, 2); #endif } //------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- + +void ymz280b_device::device_register_save(save_registrar &save) +{ + save.reg(NAME(m_voice)) + .reg(NAME(m_current_register)) + .reg(NAME(m_status_register)) + .reg(NAME(m_irq_state)) + .reg(NAME(m_irq_mask)) + .reg(NAME(m_irq_enable)) + .reg(NAME(m_keyon_enable)) + .reg(NAME(m_ext_mem_enable)) + .reg(NAME(m_ext_mem_address)) + .reg(NAME(m_ext_readlatch)) + .reg(NAME(m_ext_mem_address_hi)) + .reg(NAME(m_ext_mem_address_mid)); +} + +//------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- diff --git a/src/devices/sound/ymz280b.h b/src/devices/sound/ymz280b.h index 5da3ea46cc3..5994a33b0ee 100644 --- a/src/devices/sound/ymz280b.h +++ b/src/devices/sound/ymz280b.h @@ -30,6 +30,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_post_load() override; virtual void device_reset() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; @@ -77,6 +78,34 @@ private: u8 irq_schedule; /* 1 if the IRQ state is updated by timer */ emu_timer *timer; + + void register_save(save_registrar &save) + { + save.reg(NAME(playing)) + .reg(NAME(ended)) + .reg(NAME(keyon)) + .reg(NAME(looping)) + .reg(NAME(mode)) + .reg(NAME(fnum)) + .reg(NAME(level)) + .reg(NAME(pan)) + .reg(NAME(start)) + .reg(NAME(stop)) + .reg(NAME(loop_start)) + .reg(NAME(loop_end)) + .reg(NAME(position)) + .reg(NAME(signal)) + .reg(NAME(step)) + .reg(NAME(loop_signal)) + .reg(NAME(loop_step)) + .reg(NAME(loop_count)) + .reg(NAME(output_left)) + .reg(NAME(output_right)) + .reg(NAME(output_pos)) + .reg(NAME(last_sample)) + .reg(NAME(curr_sample)) + .reg(NAME(irq_schedule)); + } }; void update_irq_state(); diff --git a/src/devices/sound/ymz770.cpp b/src/devices/sound/ymz770.cpp index 9d489d8a89d..918a749c3d7 100644 --- a/src/devices/sound/ymz770.cpp +++ b/src/devices/sound/ymz770.cpp @@ -88,50 +88,26 @@ void ymz770_device::device_start() sequence.is_playing = false; for (auto & sqc : m_sqcs) sqc.is_playing = false; +} + + +//------------------------------------------------- +// device_register_save - register for save states +//------------------------------------------------- +void ymz770_device::device_register_save(save_registrar &save) +{ // register for save states - save_item(NAME(m_cur_reg)); - save_item(NAME(m_mute)); - save_item(NAME(m_doen)); - save_item(NAME(m_vlma)); - save_item(NAME(m_vlma1)); - save_item(NAME(m_bsl)); - save_item(NAME(m_cpl)); - - save_item(STRUCT_MEMBER(m_channels, phrase)); - save_item(STRUCT_MEMBER(m_channels, pan)); - save_item(STRUCT_MEMBER(m_channels, pan_delay)); - save_item(STRUCT_MEMBER(m_channels, pan1)); - save_item(STRUCT_MEMBER(m_channels, pan1_delay)); - save_item(STRUCT_MEMBER(m_channels, volume)); - save_item(STRUCT_MEMBER(m_channels, volume_target)); - save_item(STRUCT_MEMBER(m_channels, volume_delay)); - save_item(STRUCT_MEMBER(m_channels, volume2)); - save_item(STRUCT_MEMBER(m_channels, loop)); - save_item(STRUCT_MEMBER(m_channels, is_playing)); - save_item(STRUCT_MEMBER(m_channels, last_block)); - save_item(STRUCT_MEMBER(m_channels, is_paused)); - save_item(STRUCT_MEMBER(m_channels, output_remaining)); - save_item(STRUCT_MEMBER(m_channels, output_ptr)); - save_item(STRUCT_MEMBER(m_channels, atbl)); - save_item(STRUCT_MEMBER(m_channels, pptr)); - save_item(STRUCT_MEMBER(m_channels, output_data)); - - save_item(STRUCT_MEMBER(m_sequences, delay)); - save_item(STRUCT_MEMBER(m_sequences, sequence)); - save_item(STRUCT_MEMBER(m_sequences, timer)); - save_item(STRUCT_MEMBER(m_sequences, stopchan)); - save_item(STRUCT_MEMBER(m_sequences, loop)); - save_item(STRUCT_MEMBER(m_sequences, bank)); - save_item(STRUCT_MEMBER(m_sequences, is_playing)); - save_item(STRUCT_MEMBER(m_sequences, is_paused)); - save_item(STRUCT_MEMBER(m_sequences, offset)); - - save_item(STRUCT_MEMBER(m_sqcs, sqc)); - save_item(STRUCT_MEMBER(m_sqcs, loop)); - save_item(STRUCT_MEMBER(m_sqcs, is_playing)); - save_item(STRUCT_MEMBER(m_sqcs, is_waiting)); - save_item(STRUCT_MEMBER(m_sqcs, offset)); + save.reg(NAME(m_cur_reg)) + .reg(NAME(m_mute)) + .reg(NAME(m_doen)) + .reg(NAME(m_vlma)) + .reg(NAME(m_vlma1)) + .reg(NAME(m_bsl)) + .reg(NAME(m_cpl)) + .reg(NAME(m_channels)) + .reg(NAME(m_sequences)) + .reg(NAME(m_sqcs)); } diff --git a/src/devices/sound/ymz770.h b/src/devices/sound/ymz770.h index 6c87cef8de4..f312323bea7 100644 --- a/src/devices/sound/ymz770.h +++ b/src/devices/sound/ymz770.h @@ -31,6 +31,7 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_register_save(save_registrar &save) override; virtual void device_reset() override; virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; @@ -78,6 +79,28 @@ protected: int output_ptr; int atbl; int pptr; + + void register_save(save_registrar &save) + { + save.reg(NAME(phrase)) + .reg(NAME(pan)) + .reg(NAME(pan_delay)) + .reg(NAME(pan1)) + .reg(NAME(pan1_delay)) + .reg(NAME(volume)) + .reg(NAME(volume_target)) + .reg(NAME(volume_delay)) + .reg(NAME(volume2)) + .reg(NAME(loop)) + .reg(NAME(is_playing)) + .reg(NAME(last_block)) + .reg(NAME(is_paused)) + .reg(NAME(output_remaining)) + .reg(NAME(output_ptr)) + .reg(NAME(atbl)) + .reg(NAME(pptr)) + .reg(NAME(output_data)); + } }; struct ymz_sequence { @@ -90,6 +113,19 @@ protected: uint8_t bank; bool is_playing; bool is_paused; + + void register_save(save_registrar &save) + { + save.reg(NAME(delay)) + .reg(NAME(sequence)) + .reg(NAME(timer)) + .reg(NAME(stopchan)) + .reg(NAME(loop)) + .reg(NAME(bank)) + .reg(NAME(is_playing)) + .reg(NAME(is_paused)) + .reg(NAME(offset)); + } }; struct ymz_sqc { @@ -98,6 +134,15 @@ protected: uint32_t offset; bool is_playing; bool is_waiting; + + void register_save(save_registrar &save) + { + save.reg(NAME(sqc)) + .reg(NAME(loop)) + .reg(NAME(is_playing)) + .reg(NAME(is_waiting)) + .reg(NAME(offset)); + } }; ymz_channel m_channels[16]; |
