diff options
author | cam900 <dbtlrchl@naver.com> | 2018-01-25 11:27:08 +0900 |
---|---|---|
committer | ajrhacker <ajrhacker@users.noreply.github.com> | 2018-01-24 21:27:08 -0500 |
commit | a2f2db6c3bfea635e8a5653f399a4de083bb9519 (patch) | |
tree | 4cda014148d9914f4ab79b5adabe2ff7ce958631 | |
parent | ddf792d9ae1cfcbb14644743f8d2e4000b004623 (diff) |
vgmplay : Add Qsound support (#3116)
vgmplay : Add Qsound support
-rw-r--r-- | src/devices/sound/qsound.cpp | 14 | ||||
-rw-r--r-- | src/devices/sound/qsound.h | 10 | ||||
-rw-r--r-- | src/mame/drivers/vgmplay.cpp | 46 |
3 files changed, 57 insertions, 13 deletions
diff --git a/src/devices/sound/qsound.cpp b/src/devices/sound/qsound.cpp index 6f9fcc3a017..8d11dc3d51b 100644 --- a/src/devices/sound/qsound.cpp +++ b/src/devices/sound/qsound.cpp @@ -74,8 +74,8 @@ ROM_END qsound_device::qsound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, QSOUND, tag, owner, clock), device_sound_interface(mconfig, *this), + device_rom_interface(mconfig, *this, 24), m_cpu(*this, "qsound"), - m_sample_rom(*this, DEVICE_SELF), m_data(0), m_stream(nullptr) { @@ -98,13 +98,23 @@ const tiny_rom_entry *qsound_device::device_rom_region() const //------------------------------------------------- MACHINE_CONFIG_START(qsound_device::device_add_mconfig) - MCFG_CPU_ADD("qsound", DSP16, QSOUND_CLOCK) + MCFG_CPU_ADD("qsound", DSP16, DERIVED_CLOCK(1, 1)) MCFG_CPU_PROGRAM_MAP(dsp16_program_map) MCFG_CPU_DATA_MAP(dsp16_data_map) MACHINE_CONFIG_END //------------------------------------------------- +// rom_bank_updated - the rom bank has changed +//------------------------------------------------- + +void qsound_device::rom_bank_updated() +{ + m_stream->update(); +} + + +//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- diff --git a/src/devices/sound/qsound.h b/src/devices/sound/qsound.h index 836f9a64eb5..b39260ad76a 100644 --- a/src/devices/sound/qsound.h +++ b/src/devices/sound/qsound.h @@ -28,7 +28,9 @@ // ======================> qsound_device -class qsound_device : public device_t, public device_sound_interface +class qsound_device : public device_t, + public device_sound_interface, + public device_rom_interface { public: qsound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); @@ -44,6 +46,9 @@ protected: // 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 qsound_channel @@ -63,13 +68,12 @@ private: } m_channel[16]; required_device<dsp16_device> m_cpu; - required_region_ptr<int8_t> m_sample_rom; int m_pan_table[33]; // pan volume table uint16_t m_data; // register latch data sound_stream *m_stream; // audio stream - inline int8_t read_sample(uint32_t offset) { return m_sample_rom[offset & m_sample_rom.mask()]; } + inline int8_t read_sample(uint32_t offset) { return (int8_t)read_byte(offset); } void write_data(uint8_t address, uint16_t data); }; diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index 39404afc759..e3ce23f29ee 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -22,6 +22,7 @@ #include "sound/multipcm.h" #include "sound/okim6295.h" #include "sound/pokey.h" +#include "sound/qsound.h" #include "sound/segapcm.h" #include "sound/sn76496.h" #include "sound/ym2151.h" @@ -77,7 +78,8 @@ public: A_POKEYB = 0x00013030, A_YMF271 = 0x00013040, A_YMZ280B = 0x00013050, - A_YM2608 = 0x00013060 + A_YM2608 = 0x00013060, + A_QSOUND = 0x00013070 }; enum io16_t @@ -103,7 +105,7 @@ public: virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; virtual util::disasm_interface *create_disassembler() override; - + READ8_MEMBER(segapcm_rom_r); READ8_MEMBER(ymf271_rom_r); READ8_MEMBER(ymz280b_rom_r); @@ -112,6 +114,7 @@ public: READ8_MEMBER(k053260_rom_r); READ8_MEMBER(okim6295_rom_r); READ8_MEMBER(c352_rom_r); + READ8_MEMBER(qsound_rom_r); private: struct rom_block { @@ -191,6 +194,7 @@ private: required_device<ymf271_device> m_ymf271; required_device<ymz280b_device> m_ymz280b; required_device<ym2608_device> m_ym2608; + required_device<qsound_device> m_qsound; uint32_t m_multipcma_bank_l; uint32_t m_multipcma_bank_r; @@ -463,12 +467,7 @@ void vgmplay_device::execute_run() m_io->write_byte(A_GAMEBOY + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); m_pc += 3; break; - - case 0xc0: - m_io->write_byte(A_SEGAPCM + (m_file->read_word(m_pc+1) & 0x7ff), m_file->read_byte(m_pc+3)); - m_pc += 4; - break; - + case 0xb4: m_io->write_byte(A_NESAPU + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); m_pc += 3; @@ -510,6 +509,11 @@ void vgmplay_device::execute_run() m_pc += 3; break; } + + case 0xc0: + m_io->write_byte(A_SEGAPCM + (m_file->read_word(m_pc+1) & 0x7ff), m_file->read_byte(m_pc+3)); + m_pc += 4; + break; case 0xc3: { @@ -527,6 +531,13 @@ void vgmplay_device::execute_run() m_pc += 4; break; } + + case 0xc4: + m_io->write_byte(A_QSOUND + 0, m_file->read_byte(m_pc+1)); + m_io->write_byte(A_QSOUND + 1, m_file->read_byte(m_pc+2)); + m_io->write_byte(A_QSOUND + 2, m_file->read_byte(m_pc+3)); + m_pc += 4; + break; case 0xd1: { @@ -947,6 +958,11 @@ READ8_MEMBER(vgmplay_device::k053260_rom_r) return rom_r(0, 0x8e, offset); } +READ8_MEMBER(vgmplay_device::qsound_rom_r) +{ + return rom_r(0, 0x8f, offset); +} + READ8_MEMBER(vgmplay_device::c352_rom_r) { return rom_r(0, 0x92, offset); @@ -981,6 +997,7 @@ vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, co , m_ymf271(*this, "ymf271") , m_ymz280b(*this, "ymz280b") , m_ym2608(*this, "ym2608") + , m_qsound(*this, "qsound") { } @@ -1202,6 +1219,9 @@ void vgmplay_state::machine_start() m_pokeyb->set_unscaled_clock(clock); } } + if(version >= 0x161 && r32(0xb4)) { + m_qsound->set_unscaled_clock(r32(0xb4)); + } } if (data_start > 0xc0) @@ -1310,6 +1330,7 @@ static ADDRESS_MAP_START( soundchips_map, AS_IO, 8, vgmplay_state ) AM_RANGE(vgmplay_device::A_YMF271, vgmplay_device::A_YMF271+0xf) AM_DEVWRITE ("ymf271", ymf271_device, write) AM_RANGE(vgmplay_device::A_YMZ280B, vgmplay_device::A_YMZ280B+0x1) AM_DEVWRITE ("ymz280b", ymz280b_device, write) AM_RANGE(vgmplay_device::A_YM2608, vgmplay_device::A_YM2608+0x3) AM_DEVWRITE ("ym2608", ym2608_device, write) + AM_RANGE(vgmplay_device::A_QSOUND, vgmplay_device::A_QSOUND+0x2) AM_DEVWRITE ("qsound", qsound_device, write) ADDRESS_MAP_END static ADDRESS_MAP_START( segapcm_map, 0, 8, vgmplay_state ) @@ -1336,6 +1357,10 @@ static ADDRESS_MAP_START( c352_map, 0, 8, vgmplay_state ) AM_RANGE(0, 0xffffff) AM_DEVREAD("vgmplay", vgmplay_device, c352_rom_r) ADDRESS_MAP_END +static ADDRESS_MAP_START( qsound_map, 0, 8, vgmplay_state ) + AM_RANGE(0, 0xffffff) AM_DEVREAD("vgmplay", vgmplay_device, qsound_rom_r) +ADDRESS_MAP_END + static ADDRESS_MAP_START( nescpu_map, AS_PROGRAM, 8, vgmplay_state ) AM_RANGE(0, 0xffff) AM_RAM AM_SHARE("nesapu_ram") ADDRESS_MAP_END @@ -1476,6 +1501,11 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) MCFG_SOUND_ROUTE(0, "rspeaker", 0.25) MCFG_SOUND_ROUTE(1, "lspeaker", 0.50) MCFG_SOUND_ROUTE(2, "rspeaker", 0.50) + + MCFG_QSOUND_ADD("qsound", 4000000) + MCFG_DEVICE_ADDRESS_MAP(0, qsound_map) + MCFG_SOUND_ROUTE(0, "lspeaker", 1) + MCFG_SOUND_ROUTE(1, "rspeaker", 1) MACHINE_CONFIG_END ROM_START( vgmplay ) |