es5506.cpp, Sync sample rate with esqpump.cpp (#4582)

* es5506.cpp, Sync sample rate with esqpump.cpp
esqpump.cpp : Use required_device for m_esp, Add device_clock_changed, Add notes, Change timer frequency related to sample rate(clock)

* esqpump.cpp : Minor correction
This commit is contained in:
cam900 2019-02-03 02:17:03 +09:00 committed by R. Belmont
parent e8afd930a5
commit 08259f27dd
9 changed files with 77 additions and 21 deletions

View File

@ -156,7 +156,8 @@ es550x_device::es550x_device(const machine_config &mconfig, device_type type, co
m_region3(nullptr), m_region3(nullptr),
m_channels(0), m_channels(0),
m_irq_cb(*this), m_irq_cb(*this),
m_read_port_cb(*this) m_read_port_cb(*this),
m_sample_rate_changed_cb(*this)
{ {
for (auto & elem : m_region_base) for (auto & elem : m_region_base)
{ {
@ -230,6 +231,7 @@ void es5506_device::device_start()
m_master_clock = clock(); m_master_clock = clock();
m_irq_cb.resolve(); m_irq_cb.resolve();
m_read_port_cb.resolve(); m_read_port_cb.resolve();
m_sample_rate_changed_cb.resolve();
m_irqv = 0x80; m_irqv = 0x80;
m_channels = channels; m_channels = channels;
@ -309,6 +311,8 @@ void es550x_device::device_clock_changed()
m_master_clock = clock(); m_master_clock = clock();
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1)); m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate); m_stream->set_sample_rate(m_sample_rate);
if (!m_sample_rate_changed_cb.isnull())
m_sample_rate_changed_cb(m_sample_rate);
} }
//------------------------------------------------- //-------------------------------------------------
@ -378,6 +382,7 @@ void es5505_device::device_start()
m_master_clock = clock(); m_master_clock = clock();
m_irq_cb.resolve(); m_irq_cb.resolve();
m_read_port_cb.resolve(); m_read_port_cb.resolve();
m_sample_rate_changed_cb.resolve();
m_irqv = 0x80; m_irqv = 0x80;
m_channels = channels; m_channels = channels;
@ -1215,6 +1220,8 @@ inline void es5506_device::reg_write_low(es550x_voice *voice, offs_t offset, uin
m_active_voices = data & 0x1f; m_active_voices = data & 0x1f;
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1)); m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate); m_stream->set_sample_rate(m_sample_rate);
if (!m_sample_rate_changed_cb.isnull())
m_sample_rate_changed_cb(m_sample_rate);
LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate); LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate);
break; break;
@ -1749,6 +1756,8 @@ inline void es5505_device::reg_write_low(es550x_voice *voice, offs_t offset, uin
m_active_voices = data & 0x1f; m_active_voices = data & 0x1f;
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1)); m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate); m_stream->set_sample_rate(m_sample_rate);
if (!m_sample_rate_changed_cb.isnull())
m_sample_rate_changed_cb(m_sample_rate);
LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate); LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate);
} }
@ -1847,6 +1856,8 @@ inline void es5505_device::reg_write_high(es550x_voice *voice, offs_t offset, ui
m_active_voices = data & 0x1f; m_active_voices = data & 0x1f;
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1)); m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate); m_stream->set_sample_rate(m_sample_rate);
if (!m_sample_rate_changed_cb.isnull())
m_sample_rate_changed_cb(m_sample_rate);
LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate); LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate);
} }
@ -1890,6 +1901,8 @@ inline void es5505_device::reg_write_test(es550x_voice *voice, offs_t offset, ui
m_active_voices = data & 0x1f; m_active_voices = data & 0x1f;
m_sample_rate = m_master_clock / (16 * (m_active_voices + 1)); m_sample_rate = m_master_clock / (16 * (m_active_voices + 1));
m_stream->set_sample_rate(m_sample_rate); m_stream->set_sample_rate(m_sample_rate);
if (!m_sample_rate_changed_cb.isnull())
m_sample_rate_changed_cb(m_sample_rate);
LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate); LOG("active voices=%d, sample_rate=%d\n", m_active_voices, m_sample_rate);
} }

View File

@ -25,6 +25,7 @@ public:
auto irq_cb() { return m_irq_cb.bind(); } auto irq_cb() { return m_irq_cb.bind(); }
auto read_port_cb() { return m_read_port_cb.bind(); } auto read_port_cb() { return m_read_port_cb.bind(); }
auto sample_rate_changed() { return m_sample_rate_changed_cb.bind(); }
protected: protected:
// struct describing a single playing voice // struct describing a single playing voice
@ -114,6 +115,7 @@ protected:
int m_channels; /* number of output channels: 1 .. 6 */ int m_channels; /* number of output channels: 1 .. 6 */
devcb_write_line m_irq_cb; /* irq callback */ devcb_write_line m_irq_cb; /* irq callback */
devcb_read16 m_read_port_cb; /* input port read */ devcb_read16 m_read_port_cb; /* input port read */
devcb_write32 m_sample_rate_changed_cb; /* callback for when sample rate is changed */
}; };

View File

@ -16,8 +16,12 @@ DEFINE_DEVICE_TYPE(ESQ_5505_5510_PUMP, esq_5505_5510_pump_device, "esq_5505_5510
esq_5505_5510_pump_device::esq_5505_5510_pump_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) esq_5505_5510_pump_device::esq_5505_5510_pump_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, ESQ_5505_5510_PUMP, tag, owner, clock) : device_t(mconfig, ESQ_5505_5510_PUMP, tag, owner, clock)
, device_sound_interface(mconfig, *this) , device_sound_interface(mconfig, *this)
, m_stream(nullptr), m_timer(nullptr), m_esp(nullptr) , m_stream(nullptr)
, m_esp_halted(true), ticks_spent_processing(0), samples_processed(0) , m_timer(nullptr)
, m_esp(*this, finder_base::DUMMY_TAG)
, m_esp_halted(true)
, ticks_spent_processing(0)
, samples_processed(0)
{ {
#if !PUMP_FAKE_ESP_PROCESSING && PUMP_REPLACE_ESP_PROGRAM #if !PUMP_FAKE_ESP_PROCESSING && PUMP_REPLACE_ESP_PROGRAM
e = nullptr; e = nullptr;
@ -59,14 +63,16 @@ void esq_5505_5510_pump_device::device_stop()
void esq_5505_5510_pump_device::device_reset() void esq_5505_5510_pump_device::device_reset()
{ {
int64_t nsec_per_sample = 100 * 16 * 21; m_timer->adjust(attotime::zero, 0, attotime::from_hz(clock()));
attotime sample_time(0, 1000000000 * nsec_per_sample);
attotime initial_delay(0, 0);
m_timer->adjust(initial_delay, 0, sample_time);
m_timer->enable(true); m_timer->enable(true);
} }
void esq_5505_5510_pump_device::device_clock_changed()
{
m_stream->set_sample_rate(clock());
m_timer->adjust(attotime::zero, 0, attotime::from_hz(clock()));
}
void esq_5505_5510_pump_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) void esq_5505_5510_pump_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{ {
if (samples != 1) { if (samples != 1) {

View File

@ -20,7 +20,7 @@ public:
esq_5505_5510_pump_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); esq_5505_5510_pump_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
void set_esp(es5510_device *esp) { m_esp = esp; } template <typename T> void set_esp(T &&tag) { m_esp.set_tag(std::forward<T>(tag)); }
void set_esp_halted(bool esp_halted) { void set_esp_halted(bool esp_halted) {
m_esp_halted = esp_halted; m_esp_halted = esp_halted;
logerror("ESP-halted -> %d\n", m_esp_halted); logerror("ESP-halted -> %d\n", m_esp_halted);
@ -72,6 +72,7 @@ protected:
virtual void device_start() override; virtual void device_start() override;
virtual void device_stop() override; virtual void device_stop() override;
virtual void device_reset() override; virtual void device_reset() 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;
@ -88,7 +89,7 @@ private:
emu_timer *m_timer; emu_timer *m_timer;
// ESP signal processor // ESP signal processor
es5510_device *m_esp; required_device<es5510_device> m_esp;
// Is the ESP halted by the CPU? // Is the ESP halted by the CPU?
bool m_esp_halted; bool m_esp_halted;

View File

@ -43,7 +43,6 @@ taito_en_device::taito_en_device(const machine_config &mconfig, const char *tag,
void taito_en_device::device_start() void taito_en_device::device_start()
{ {
// tell the pump about the ESP chips // tell the pump about the ESP chips
m_pump->set_esp(m_esp);
uint8_t *ROM = m_osrom->base(); uint8_t *ROM = m_osrom->base();
uint32_t max = (m_osrom->bytes() - 0x100000) / 0x20000; uint32_t max = (m_osrom->bytes() - 0x100000) / 0x20000;
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
@ -134,6 +133,18 @@ WRITE8_MEMBER(taito_en_device::mb87078_gain_changed)
} }
/*************************************
*
* ES5510 callback
*
*************************************/
void taito_en_device::es5505_clock_changed(u32 data)
{
m_pump->set_unscaled_clock(data);
}
/************************************* /*************************************
* *
* M68681 callback * M68681 callback
@ -213,10 +224,12 @@ void taito_en_device::device_add_mconfig(machine_config &config)
SPEAKER(config, "rspeaker").front_right(); SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, XTAL(30'476'100) / (2 * 16 * 32)); ESQ_5505_5510_PUMP(config, m_pump, XTAL(30'476'100) / (2 * 16 * 32));
m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0); m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0); m_pump->add_route(1, "rspeaker", 1.0);
ES5505(config, m_ensoniq, XTAL(30'476'100) / 2); ES5505(config, m_ensoniq, XTAL(30'476'100) / 2);
m_ensoniq->sample_rate_changed().set(FUNC(taito_en_device::es5505_clock_changed));
m_ensoniq->set_region0("ensoniq.0"); m_ensoniq->set_region0("ensoniq.0");
m_ensoniq->set_region1("ensoniq.0"); m_ensoniq->set_region1("ensoniq.0");
m_ensoniq->set_channels(4); m_ensoniq->set_channels(4);

View File

@ -58,6 +58,7 @@ private:
DECLARE_WRITE8_MEMBER(duart_output); DECLARE_WRITE8_MEMBER(duart_output);
DECLARE_WRITE8_MEMBER(mb87078_gain_changed); DECLARE_WRITE8_MEMBER(mb87078_gain_changed);
void es5505_clock_changed(u32 data);
}; };
DECLARE_DEVICE_TYPE(TAITO_EN, taito_en_device) DECLARE_DEVICE_TYPE(TAITO_EN, taito_en_device)

View File

@ -222,6 +222,8 @@ private:
DECLARE_WRITE_LINE_MEMBER(duart_tx_b); DECLARE_WRITE_LINE_MEMBER(duart_tx_b);
DECLARE_WRITE8_MEMBER(duart_output); DECLARE_WRITE8_MEMBER(duart_output);
void es5505_clock_changed(u32 data);
int m_system_type; int m_system_type;
uint8_t m_duart_io; uint8_t m_duart_io;
uint8_t otis_irq_state; uint8_t otis_irq_state;
@ -270,8 +272,6 @@ IRQ_CALLBACK_MEMBER(esq5505_state::maincpu_irq_acknowledge_callback)
void esq5505_state::machine_start() void esq5505_state::machine_start()
{ {
driver_device::machine_start(); driver_device::machine_start();
// tell the pump about the ESP chips
m_pump->set_esp(m_esp);
m_rom = (uint16_t *)(void *)memregion("osrom")->base(); m_rom = (uint16_t *)(void *)memregion("osrom")->base();
m_ram = (uint16_t *)(void *)memshare("osram")->ptr(); m_ram = (uint16_t *)(void *)memshare("osram")->ptr();
@ -435,6 +435,11 @@ WRITE_LINE_MEMBER(esq5505_state::esq5505_otis_irq)
update_irq_to_maincpu(); update_irq_to_maincpu();
} }
void esq5505_state::es5505_clock_changed(u32 data)
{
m_pump->set_unscaled_clock(data);
}
WRITE16_MEMBER(esq5505_state::analog_w) WRITE16_MEMBER(esq5505_state::analog_w)
{ {
offset &= 0x7; offset &= 0x7;
@ -644,10 +649,12 @@ void esq5505_state::vfx(machine_config &config)
SPEAKER(config, "rspeaker").front_right(); SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, 10_MHz_XTAL / (16 * 21)); ESQ_5505_5510_PUMP(config, m_pump, 10_MHz_XTAL / (16 * 21));
m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0); m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0); m_pump->add_route(1, "rspeaker", 1.0);
auto &es5505(ES5505(config, "otis", 10_MHz_XTAL)); auto &es5505(ES5505(config, "otis", 10_MHz_XTAL));
es5505.sample_rate_changed().set(FUNC(esq5505_state::es5505_clock_changed));
es5505.set_region0("waverom"); /* Bank 0 */ es5505.set_region0("waverom"); /* Bank 0 */
es5505.set_region1("waverom2"); /* Bank 1 */ es5505.set_region1("waverom2"); /* Bank 1 */
es5505.set_channels(4); /* channels */ es5505.set_channels(4); /* channels */
@ -733,10 +740,12 @@ void esq5505_state::vfx32(machine_config &config)
SPEAKER(config, "rspeaker").front_right(); SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, 30.4761_MHz_XTAL / (2 * 16 * 32)); ESQ_5505_5510_PUMP(config, m_pump, 30.4761_MHz_XTAL / (2 * 16 * 32));
m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0); m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0); m_pump->add_route(1, "rspeaker", 1.0);
auto &es5505(ES5505(config, "otis", 30.4761_MHz_XTAL / 2)); auto &es5505(ES5505(config, "otis", 30.4761_MHz_XTAL / 2));
es5505.sample_rate_changed().set(FUNC(esq5505_state::es5505_clock_changed));
es5505.set_region0("waverom"); /* Bank 0 */ es5505.set_region0("waverom"); /* Bank 0 */
es5505.set_region1("waverom2"); /* Bank 1 */ es5505.set_region1("waverom2"); /* Bank 1 */
es5505.set_channels(4); /* channels */ es5505.set_channels(4); /* channels */

View File

@ -76,18 +76,14 @@ private:
DECLARE_WRITE_LINE_MEMBER(esq5506_otto_irq); DECLARE_WRITE_LINE_MEMBER(esq5506_otto_irq);
DECLARE_READ16_MEMBER(esq5506_read_adc); DECLARE_READ16_MEMBER(esq5506_read_adc);
void es5506_clock_changed(u32 data);
void asr_map(address_map &map); void asr_map(address_map &map);
void asrx_map(address_map &map); void asrx_map(address_map &map);
}; };
void esqasr_state::machine_start() void esqasr_state::machine_start()
{ {
if (m_pump.found())
{
// tell the pump about the ESP chips
if (m_esp.found())
m_pump->set_esp(m_esp);
}
} }
void esqasr_state::machine_reset() void esqasr_state::machine_reset()
@ -116,6 +112,11 @@ READ16_MEMBER(esqasr_state::esq5506_read_adc)
return 0; return 0;
} }
void esqasr_state::es5506_clock_changed(u32 data)
{
m_pump->set_unscaled_clock(data);
}
void esqasr_state::asr(machine_config &config) void esqasr_state::asr(machine_config &config)
{ {
M68000(config, m_maincpu, XTAL(16'000'000)); // actually MC68302 M68000(config, m_maincpu, XTAL(16'000'000)); // actually MC68302
@ -130,10 +131,12 @@ void esqasr_state::asr(machine_config &config)
SPEAKER(config, "rspeaker").front_right(); SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, XTAL(16'000'000) / (16 * 32)); ESQ_5505_5510_PUMP(config, m_pump, XTAL(16'000'000) / (16 * 32));
m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0); m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0); m_pump->add_route(1, "rspeaker", 1.0);
es5506_device &ensoniq(ES5506(config, "ensoniq", XTAL(16'000'000))); es5506_device &ensoniq(ES5506(config, "ensoniq", XTAL(16'000'000)));
ensoniq.sample_rate_changed().set(FUNC(esqasr_state::es5506_clock_changed));
ensoniq.set_region0("waverom"); /* Bank 0 */ ensoniq.set_region0("waverom"); /* Bank 0 */
ensoniq.set_region1("waverom2"); /* Bank 1 */ ensoniq.set_region1("waverom2"); /* Bank 1 */
ensoniq.set_region2("waverom3"); /* Bank 0 */ ensoniq.set_region2("waverom3"); /* Bank 0 */
@ -165,10 +168,12 @@ void esqasr_state::asrx(machine_config &config)
SPEAKER(config, "rspeaker").front_right(); SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, XTAL(16'000'000) / (16 * 32)); // Actually ES5511 ESQ_5505_5510_PUMP(config, m_pump, XTAL(16'000'000) / (16 * 32)); // Actually ES5511
m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0); m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0); m_pump->add_route(1, "rspeaker", 1.0);
es5506_device &ensoniq(ES5506(config, "ensoniq", XTAL(16'000'000))); es5506_device &ensoniq(ES5506(config, "ensoniq", XTAL(16'000'000)));
ensoniq.sample_rate_changed().set(FUNC(esqasr_state::es5506_clock_changed));
ensoniq.set_region0("waverom"); /* Bank 0 */ ensoniq.set_region0("waverom"); /* Bank 0 */
ensoniq.set_region1("waverom2"); /* Bank 1 */ ensoniq.set_region1("waverom2"); /* Bank 1 */
ensoniq.set_region2("waverom3"); /* Bank 0 */ ensoniq.set_region2("waverom3"); /* Bank 0 */

View File

@ -139,13 +139,12 @@ private:
DECLARE_WRITE_LINE_MEMBER(esq5506_otto_irq); DECLARE_WRITE_LINE_MEMBER(esq5506_otto_irq);
DECLARE_READ16_MEMBER(esq5506_read_adc); DECLARE_READ16_MEMBER(esq5506_read_adc);
void es5506_clock_changed(u32 data);
void kt_map(address_map &map); void kt_map(address_map &map);
}; };
void esqkt_state::machine_start() void esqkt_state::machine_start()
{ {
// tell the pump about the ESP chips
m_pump->set_esp(m_esp);
} }
void esqkt_state::machine_reset() void esqkt_state::machine_reset()
@ -194,6 +193,11 @@ READ16_MEMBER(esqkt_state::esq5506_read_adc)
} }
} }
void esqkt_state::es5506_clock_changed(u32 data)
{
m_pump->set_unscaled_clock(data);
}
WRITE_LINE_MEMBER(esqkt_state::duart_irq_handler) WRITE_LINE_MEMBER(esqkt_state::duart_irq_handler)
{ {
m_maincpu->set_input_line(M68K_IRQ_3, state); m_maincpu->set_input_line(M68K_IRQ_3, state);
@ -244,10 +248,12 @@ void esqkt_state::kt(machine_config &config)
SPEAKER(config, "rspeaker").front_right(); SPEAKER(config, "rspeaker").front_right();
ESQ_5505_5510_PUMP(config, m_pump, 16_MHz_XTAL / (16 * 32)); ESQ_5505_5510_PUMP(config, m_pump, 16_MHz_XTAL / (16 * 32));
m_pump->set_esp(m_esp);
m_pump->add_route(0, "lspeaker", 1.0); m_pump->add_route(0, "lspeaker", 1.0);
m_pump->add_route(1, "rspeaker", 1.0); m_pump->add_route(1, "rspeaker", 1.0);
auto &es5506a(ES5506(config, "ensoniq1", 16_MHz_XTAL)); auto &es5506a(ES5506(config, "ensoniq1", 16_MHz_XTAL));
es5506a.sample_rate_changed().set(FUNC(esqkt_state::es5506_clock_changed)); // TODO : Sync with 2 chips?
es5506a.set_region0("waverom"); /* Bank 0 */ es5506a.set_region0("waverom"); /* Bank 0 */
es5506a.set_region1("waverom2"); /* Bank 1 */ es5506a.set_region1("waverom2"); /* Bank 1 */
es5506a.set_region2("waverom3"); /* Bank 0 */ es5506a.set_region2("waverom3"); /* Bank 0 */