From 4e5169fd0b26a1e8afa52117ad5af65182a04f73 Mon Sep 17 00:00:00 2001 From: cam900 Date: Thu, 12 Jul 2018 03:39:01 +0900 Subject: [PATCH] vgmplay.cpp : Add GA20 Support iremga20.cpp : Minor cleanups, Remove MCFGs --- src/devices/sound/iremga20.cpp | 43 ++++++++++++++++++++++++---------- src/devices/sound/iremga20.h | 20 ++++++---------- src/mame/drivers/m107.cpp | 6 ++--- src/mame/drivers/m92.cpp | 4 ++-- src/mame/drivers/vgmplay.cpp | 36 +++++++++++++++++++++++++++- src/mame/layout/vgmplay.lay | 4 ++++ 6 files changed, 81 insertions(+), 32 deletions(-) diff --git a/src/devices/sound/iremga20.cpp b/src/devices/sound/iremga20.cpp index da12101b320..5b9d5f050bb 100644 --- a/src/devices/sound/iremga20.cpp +++ b/src/devices/sound/iremga20.cpp @@ -31,6 +31,8 @@ Revisions: #include "emu.h" #include "iremga20.h" +#include + #define MAX_VOL 256 @@ -46,11 +48,11 @@ DEFINE_DEVICE_TYPE(IREMGA20, iremga20_device, "iremga20", "Irem GA20") // iremga20_device - constructor //------------------------------------------------- -iremga20_device::iremga20_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, IREMGA20, tag, owner, clock), - device_sound_interface(mconfig, *this), - m_rom(*this, DEVICE_SELF), - m_stream(nullptr) +iremga20_device::iremga20_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, IREMGA20, tag, owner, clock), + device_sound_interface(mconfig, *this), + device_rom_interface(mconfig, *this, 20), + m_stream(nullptr) { } @@ -65,8 +67,7 @@ void iremga20_device::device_start() iremga20_reset(); - for ( i = 0; i < 0x40; i++ ) - m_regs[i] = 0; + std::fill(std::begin(m_regs), std::end(m_regs), 0); m_stream = stream_alloc(0, 2, clock()/4); @@ -96,6 +97,24 @@ void iremga20_device::device_reset() iremga20_reset(); } +//------------------------------------------------- +// device_clock_changed - called if the clock +// changes +//------------------------------------------------- + +void iremga20_device::device_clock_changed() +{ + m_stream->set_sample_rate(clock()/4); +} + +//------------------------------------------------- +// rom_bank_updated - the rom bank has changed +//------------------------------------------------- + +void iremga20_device::rom_bank_updated() +{ + m_stream->update(); +} //------------------------------------------------- // sound_stream_update - handle a stream update @@ -104,7 +123,6 @@ void iremga20_device::device_reset() void iremga20_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) { uint32_t rate[4], pos[4], frac[4], end[4], vol[4], play[4]; - uint8_t *pSamples; stream_sample_t *outL, *outR; int i, sampleout; @@ -120,7 +138,6 @@ void iremga20_device::sound_stream_update(sound_stream &stream, stream_sample_t } i = samples; - pSamples = &m_rom[0]; outL = outputs[0]; outR = outputs[1]; @@ -131,7 +148,7 @@ void iremga20_device::sound_stream_update(sound_stream &stream, stream_sample_t // update the 4 channels inline if (play[0]) { - sampleout += (pSamples[pos[0]] - 0x80) * vol[0]; + sampleout += (read_byte(pos[0]) - 0x80) * vol[0]; frac[0] += rate[0]; pos[0] += frac[0] >> 24; frac[0] &= 0xffffff; @@ -139,7 +156,7 @@ void iremga20_device::sound_stream_update(sound_stream &stream, stream_sample_t } if (play[1]) { - sampleout += (pSamples[pos[1]] - 0x80) * vol[1]; + sampleout += (read_byte(pos[1]) - 0x80) * vol[1]; frac[1] += rate[1]; pos[1] += frac[1] >> 24; frac[1] &= 0xffffff; @@ -147,7 +164,7 @@ void iremga20_device::sound_stream_update(sound_stream &stream, stream_sample_t } if (play[2]) { - sampleout += (pSamples[pos[2]] - 0x80) * vol[2]; + sampleout += (read_byte(pos[2]) - 0x80) * vol[2]; frac[2] += rate[2]; pos[2] += frac[2] >> 24; frac[2] &= 0xffffff; @@ -155,7 +172,7 @@ void iremga20_device::sound_stream_update(sound_stream &stream, stream_sample_t } if (play[3]) { - sampleout += (pSamples[pos[3]] - 0x80) * vol[3]; + sampleout += (read_byte(pos[3]) - 0x80) * vol[3]; frac[3] += rate[3]; pos[3] += frac[3] >> 24; frac[3] &= 0xffffff; diff --git a/src/devices/sound/iremga20.h b/src/devices/sound/iremga20.h index ee0607496bd..bf673714eaf 100644 --- a/src/devices/sound/iremga20.h +++ b/src/devices/sound/iremga20.h @@ -11,16 +11,6 @@ #pragma once -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_IREMGA20_ADD(_tag, _clock) \ - MCFG_DEVICE_ADD(_tag, IREMGA20, _clock) -#define MCFG_IREMGA20_REPLACE(_tag, _clock) \ - MCFG_DEVICE_REPLACE(_tag, IREMGA20, _clock) - - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -29,7 +19,8 @@ // ======================> iremga20_device class iremga20_device : public device_t, - public device_sound_interface + public device_sound_interface, + public device_rom_interface { public: iremga20_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -41,10 +32,14 @@ protected: // device-level overrides virtual void device_start() override; virtual void device_reset() override; + virtual void device_clock_changed() override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; + // device_rom_interface overrides + virtual void rom_bank_updated() override; + private: struct channel_def { @@ -62,9 +57,8 @@ private: void iremga20_reset(); - required_region_ptr m_rom; sound_stream *m_stream; - uint16_t m_regs[0x40]; + uint8_t m_regs[0x40/2]; channel_def m_channel[4]; }; diff --git a/src/mame/drivers/m107.cpp b/src/mame/drivers/m107.cpp index f525567a51b..f6d98af46b8 100644 --- a/src/mame/drivers/m107.cpp +++ b/src/mame/drivers/m107.cpp @@ -764,9 +764,9 @@ MACHINE_CONFIG_START(m107_state::firebarr) MCFG_SOUND_ROUTE(0, "lspeaker", 0.40) MCFG_SOUND_ROUTE(1, "rspeaker", 0.40) - MCFG_IREMGA20_ADD("irem", XTAL(14'318'181)/4) - MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) - MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + iremga20_device &ga20(IREMGA20(config, "irem", XTAL(14'318'181)/4)); + ga20.add_route(0, "lspeaker", 1.0); + ga20.add_route(1, "rspeaker", 1.0); MACHINE_CONFIG_END MACHINE_CONFIG_START(m107_state::dsoccr94) diff --git a/src/mame/drivers/m92.cpp b/src/mame/drivers/m92.cpp index ccc87fa15c8..aa7e089a72f 100644 --- a/src/mame/drivers/m92.cpp +++ b/src/mame/drivers/m92.cpp @@ -964,8 +964,8 @@ MACHINE_CONFIG_START(m92_state::m92) MCFG_SOUND_ROUTE(0, "mono", 0.40) MCFG_SOUND_ROUTE(1, "mono", 0.40) - MCFG_IREMGA20_ADD("irem", XTAL(14'318'181)/4) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + iremga20_device &ga20(IREMGA20(config, "irem", XTAL(14'318'181)/4)); + ga20.add_route(ALL_OUTPUTS, "mono", 1.0); MACHINE_CONFIG_END diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index fa58d367d19..ed883385e89 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -20,6 +20,7 @@ #include "sound/c352.h" #include "sound/c6280.h" #include "sound/gb.h" +#include "sound/iremga20.h" #include "sound/k051649.h" #include "sound/k053260.h" #include "sound/k054539.h" @@ -93,7 +94,8 @@ public: A_K054539A = 0x00014000, A_K054539B = 0x00014400, A_QSOUND = 0x00013070, - A_K051649 = 0x00013080 + A_K051649 = 0x00013080, + A_GA20 = 0x000130a0 }; enum io16_t @@ -126,6 +128,7 @@ public: template DECLARE_READ8_MEMBER(k054539_rom_r); DECLARE_READ8_MEMBER(c352_rom_r); DECLARE_READ8_MEMBER(qsound_rom_r); + DECLARE_READ8_MEMBER(ga20_rom_r); template DECLARE_WRITE8_MEMBER(multipcm_bank_hi_w); template DECLARE_WRITE8_MEMBER(multipcm_bank_lo_w); @@ -182,6 +185,8 @@ private: LED_K053260, LED_K054539, + LED_GA20, + LED_COUNT }; @@ -268,6 +273,7 @@ public: void vgmplay(machine_config &config); void c352_map(address_map &map); void file_map(address_map &map); + void ga20_map(address_map &map); void h6280_io_map(address_map &map); void h6280_map(address_map &map); void k053260_map(address_map &map); @@ -316,6 +322,7 @@ private: required_device m_ym2608; required_device m_qsound; required_device m_k051649; + required_device m_ga20; uint32_t m_okim6295_clock[2]; uint32_t m_okim6295_pin7[2]; @@ -726,6 +733,13 @@ void vgmplay_device::execute_run() break; } + case 0xbf: { + pulse_act_led(LED_GA20); + m_io->write_byte(A_GA20 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + } + case 0xc0: pulse_act_led(LED_SEGAPCM); m_io->write_byte(A_SEGAPCM + (m_file->read_word(m_pc+1) & 0x7ff), m_file->read_byte(m_pc+3)); @@ -1253,6 +1267,11 @@ READ8_MEMBER(vgmplay_device::c352_rom_r) return rom_r(0, 0x92, offset); } +READ8_MEMBER(vgmplay_device::ga20_rom_r) +{ + return rom_r(0, 0x93, offset); +} + vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_file(*this, "file") @@ -1284,6 +1303,7 @@ vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, co , m_ym2608(*this, "ym2608") , m_qsound(*this, "qsound") , m_k051649(*this, "k051649") + , m_ga20(*this, "ga20") { } @@ -1547,6 +1567,9 @@ void vgmplay_state::machine_start() if(version >= 0x171 && r32(0xdc)) { m_c352->set_unscaled_clock(r32(0xdc)); } + if(version >= 0x171 && r32(0xe0)) { + m_ga20->set_unscaled_clock(r32(0xe0)); + } } } } @@ -1758,6 +1781,7 @@ void vgmplay_state::soundchips_map(address_map &map) map(vgmplay_device::A_K054539B, vgmplay_device::A_K054539B+0x22f).w("k054539b", FUNC(k054539_device::write)); map(vgmplay_device::A_QSOUND, vgmplay_device::A_QSOUND+0x2).w(m_qsound, FUNC(qsound_device::qsound_w)); map(vgmplay_device::A_K051649, vgmplay_device::A_K051649+0xf).w(FUNC(vgmplay_state::scc_w)); + map(vgmplay_device::A_GA20, vgmplay_device::A_GA20+0x1f).w(m_ga20, FUNC(iremga20_device::irem_ga20_w)); } void vgmplay_state::segapcm_map(address_map &map) @@ -1820,6 +1844,11 @@ void vgmplay_state::ymz280b_map(address_map &map) map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ymz280b_rom_r)); } +void vgmplay_state::ga20_map(address_map &map) +{ + map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::ga20_rom_r)); +} + void vgmplay_state::nescpu_map(address_map &map) { map(0, 0xffff).ram().share("nesapu_ram"); @@ -1989,6 +2018,11 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) MCFG_K051649_ADD("k051649", 3579545) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.33) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33) + + IREMGA20(config, m_ga20, 3579545); + m_ga20->set_addrmap(0, &vgmplay_state::ga20_map); + m_ga20->add_route(0, "lspeaker", 1); + m_ga20->add_route(1, "rspeaker", 1); MACHINE_CONFIG_END ROM_START( vgmplay ) diff --git a/src/mame/layout/vgmplay.lay b/src/mame/layout/vgmplay.lay index c78ee0fcb51..5e4b50b7f55 100644 --- a/src/mame/layout/vgmplay.lay +++ b/src/mame/layout/vgmplay.lay @@ -25,6 +25,7 @@ 20: K051649 21: K053260 22: K054539 + 23: GA20 --> @@ -57,6 +58,7 @@ + @@ -113,6 +115,7 @@ + @@ -139,6 +142,7 @@ +