summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commita2f2db6c3bfea635e8a5653f399a4de083bb9519 (patch)
tree4cda014148d9914f4ab79b5adabe2ff7ce958631
parentddf792d9ae1cfcbb14644743f8d2e4000b004623 (diff)
vgmplay : Add Qsound support (#3116)
vgmplay : Add Qsound support
-rw-r--r--src/devices/sound/qsound.cpp14
-rw-r--r--src/devices/sound/qsound.h10
-rw-r--r--src/mame/drivers/vgmplay.cpp46
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 )