rf5c400.cpp: Modernized save states, Allow clock changed behavior

Add imperfect_features related to unemulated effects and unverified envelope issues
This commit is contained in:
cam900 2020-07-06 12:53:07 +09:00
parent 261fe5d3bd
commit 84689414be
2 changed files with 34 additions and 23 deletions

View File

@ -159,33 +159,41 @@ void rf5c400_device::device_start()
save_item(NAME(m_ext_mem_address)); save_item(NAME(m_ext_mem_address));
save_item(NAME(m_ext_mem_data)); save_item(NAME(m_ext_mem_data));
for (int i = 0; i < ARRAY_LENGTH(m_channels); i++) save_item(STRUCT_MEMBER(m_channels, startH));
{ save_item(STRUCT_MEMBER(m_channels, startL));
save_item(NAME(m_channels[i].startH), i); save_item(STRUCT_MEMBER(m_channels, freq));
save_item(NAME(m_channels[i].startL), i); save_item(STRUCT_MEMBER(m_channels, endL));
save_item(NAME(m_channels[i].freq), i); save_item(STRUCT_MEMBER(m_channels, endHloopH));
save_item(NAME(m_channels[i].endL), i); save_item(STRUCT_MEMBER(m_channels, loopL));
save_item(NAME(m_channels[i].endHloopH), i); save_item(STRUCT_MEMBER(m_channels, pan));
save_item(NAME(m_channels[i].loopL), i); save_item(STRUCT_MEMBER(m_channels, effect));
save_item(NAME(m_channels[i].pan), i); save_item(STRUCT_MEMBER(m_channels, volume));
save_item(NAME(m_channels[i].effect), i); save_item(STRUCT_MEMBER(m_channels, attack));
save_item(NAME(m_channels[i].volume), i); save_item(STRUCT_MEMBER(m_channels, decay));
save_item(NAME(m_channels[i].attack), i); save_item(STRUCT_MEMBER(m_channels, release));
save_item(NAME(m_channels[i].decay), i); save_item(STRUCT_MEMBER(m_channels, cutoff));
save_item(NAME(m_channels[i].release), i); save_item(STRUCT_MEMBER(m_channels, pos));
save_item(NAME(m_channels[i].cutoff), i); save_item(STRUCT_MEMBER(m_channels, step));
save_item(NAME(m_channels[i].pos), i); save_item(STRUCT_MEMBER(m_channels, keyon));
save_item(NAME(m_channels[i].step), i); save_item(STRUCT_MEMBER(m_channels, env_phase));
save_item(NAME(m_channels[i].keyon), i); save_item(STRUCT_MEMBER(m_channels, env_level));
save_item(NAME(m_channels[i].env_phase), i); save_item(STRUCT_MEMBER(m_channels, env_step));
save_item(NAME(m_channels[i].env_level), i); save_item(STRUCT_MEMBER(m_channels, env_scale));
save_item(NAME(m_channels[i].env_step), i);
save_item(NAME(m_channels[i].env_scale), i);
}
m_stream = stream_alloc(0, 2, clock() / 384); m_stream = stream_alloc(0, 2, clock() / 384);
} }
//-------------------------------------------------
// device_clock_changed - called if the clock
// changes
//-------------------------------------------------
void rf5c400_device::device_clock_changed()
{
m_env_tables.init(clock());
m_stream->set_sample_rate(clock() / 384);
}
//------------------------------------------------- //-------------------------------------------------
// sound_stream_update - handle a stream update // sound_stream_update - handle a stream update
//------------------------------------------------- //-------------------------------------------------

View File

@ -21,6 +21,8 @@ class rf5c400_device : public device_t,
public device_rom_interface<25, 1, 0, ENDIANNESS_LITTLE> public device_rom_interface<25, 1, 0, ENDIANNESS_LITTLE>
{ {
public: public:
static constexpr feature_type imperfect_features() { return feature::SOUND; } // unemulated and/or unverified effects and envelopes
rf5c400_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); rf5c400_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
uint16_t rf5c400_r(offs_t offset, uint16_t mem_mask = ~0); uint16_t rf5c400_r(offs_t offset, uint16_t mem_mask = ~0);
@ -29,6 +31,7 @@ public:
protected: protected:
// device-level overrides // device-level overrides
virtual void device_start() override; virtual void device_start() override;
virtual void device_clock_changed() override;
// sound stream update overrides // sound stream update 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;