summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/vgmplay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/vgmplay.cpp')
-rw-r--r--src/mame/drivers/vgmplay.cpp415
1 files changed, 144 insertions, 271 deletions
diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp
index 47d62edbb17..6b3f7d34bba 100644
--- a/src/mame/drivers/vgmplay.cpp
+++ b/src/mame/drivers/vgmplay.cpp
@@ -110,33 +110,22 @@ public:
virtual util::disasm_interface *create_disassembler() override;
- READ8_MEMBER(segapcm_rom_r);
- READ8_MEMBER(ymf271_rom_r);
- READ8_MEMBER(ymz280b_rom_r);
- READ8_MEMBER(multipcma_rom_r);
- READ8_MEMBER(multipcmb_rom_r);
- READ8_MEMBER(k053260_rom_r);
- READ8_MEMBER(okim6295a_rom_r);
- READ8_MEMBER(okim6295b_rom_r);
- READ8_MEMBER(k054539a_rom_r);
- READ8_MEMBER(k054539b_rom_r);
- READ8_MEMBER(c352_rom_r);
- READ8_MEMBER(qsound_rom_r);
-
- DECLARE_WRITE8_MEMBER(multipcm_bank_lo_a_w);
- DECLARE_WRITE8_MEMBER(multipcm_bank_hi_a_w);
- DECLARE_WRITE8_MEMBER(multipcm_bank_lo_b_w);
- DECLARE_WRITE8_MEMBER(multipcm_bank_hi_b_w);
- DECLARE_WRITE8_MEMBER(okim6295_clock_a_w);
- DECLARE_WRITE8_MEMBER(okim6295_pin7_a_w);
- DECLARE_WRITE8_MEMBER(okim6295_nmk112_enable_a_w);
- DECLARE_WRITE8_MEMBER(okim6295_bank_a_w);
- DECLARE_WRITE8_MEMBER(okim6295_nmk112_bank_a_w);
- DECLARE_WRITE8_MEMBER(okim6295_clock_b_w);
- DECLARE_WRITE8_MEMBER(okim6295_pin7_b_w);
- DECLARE_WRITE8_MEMBER(okim6295_nmk112_enable_b_w);
- DECLARE_WRITE8_MEMBER(okim6295_bank_b_w);
- DECLARE_WRITE8_MEMBER(okim6295_nmk112_bank_b_w);
+ DECLARE_READ8_MEMBER(segapcm_rom_r);
+ DECLARE_READ8_MEMBER(ymf271_rom_r);
+ DECLARE_READ8_MEMBER(ymz280b_rom_r);
+ template<int chip> DECLARE_READ8_MEMBER(multipcm_rom_r);
+ DECLARE_READ8_MEMBER(k053260_rom_r);
+ template<int chip> DECLARE_READ8_MEMBER(okim6295_rom_r);
+ template<int chip> DECLARE_READ8_MEMBER(k054539_rom_r);
+ DECLARE_READ8_MEMBER(c352_rom_r);
+ DECLARE_READ8_MEMBER(qsound_rom_r);
+
+ template<int chip> DECLARE_WRITE8_MEMBER(multipcm_bank_hi_w);
+ template<int chip> DECLARE_WRITE8_MEMBER(multipcm_bank_lo_w);
+
+ template<int chip> DECLARE_WRITE8_MEMBER(okim6295_nmk112_enable_w);
+ template<int chip> DECLARE_WRITE8_MEMBER(okim6295_bank_w);
+ template<int chip> DECLARE_WRITE8_MEMBER(okim6295_nmk112_bank_w);
private:
struct rom_block {
@@ -164,22 +153,13 @@ private:
uint32_t m_ym2612_stream_offset;
- uint32_t m_multipcma_bank_l;
- uint32_t m_multipcma_bank_r;
- uint32_t m_multipcma_banked;
- uint32_t m_multipcmb_bank_l;
- uint32_t m_multipcmb_bank_r;
- uint32_t m_multipcmb_banked;
- uint32_t m_okim6295a_clock;
- uint32_t m_okim6295a_pin7;
- uint32_t m_okim6295a_nmk112_enable;
- uint32_t m_okim6295a_bank;
- uint32_t m_okim6295a_nmk112_bank[4];
- uint32_t m_okim6295b_clock;
- uint32_t m_okim6295b_pin7;
- uint32_t m_okim6295b_nmk112_enable;
- uint32_t m_okim6295b_bank;
- uint32_t m_okim6295b_nmk112_bank[4];
+ uint32_t m_multipcm_bank_l[2];
+ uint32_t m_multipcm_bank_r[2];
+ uint32_t m_multipcm_banked[2];
+
+ uint32_t m_okim6295_nmk112_enable[2];
+ uint32_t m_okim6295_bank[2];
+ uint32_t m_okim6295_nmk112_bank[2][4];
uint8_t rom_r(int chip, uint8_t type, offs_t offset);
uint32_t handle_data_block(uint32_t address);
@@ -198,6 +178,9 @@ public:
DECLARE_READ8_MEMBER(file_r);
DECLARE_READ8_MEMBER(file_size_r);
+ template<int chip> DECLARE_WRITE8_MEMBER(okim6295_clock_w);
+ template<int chip> DECLARE_WRITE8_MEMBER(okim6295_pin7_w);
+
void vgmplay(machine_config &config);
private:
std::vector<uint8_t> m_file_data;
@@ -205,34 +188,31 @@ private:
required_device<ym2612_device> m_ym2612;
required_device<ym2151_device> m_ym2151;
required_device<ym2413_device> m_ym2413;
- required_device<ym2203_device> m_ym2203a;
- required_device<ym2203_device> m_ym2203b;
+ required_device_array<ym2203_device, 2> m_ym2203;
required_device<ym3526_device> m_ym3526;
required_device<ym3812_device> m_ym3812;
- required_device<ay8910_device> m_ay8910a;
- required_device<ay8910_device> m_ay8910b;
+ required_device_array<ay8910_device, 2> m_ay8910;
required_device<sn76496_device> m_sn76496;
required_device<segapcm_device> m_segapcm;
- required_device<multipcm_device> m_multipcma;
- required_device<multipcm_device> m_multipcmb;
+ required_device_array<multipcm_device, 2> m_multipcm;
required_device<gameboy_sound_device> m_dmg;
required_device<n2a03_device> m_nescpu;
required_shared_ptr<uint8_t> m_nesram;
required_device<k053260_device> m_k053260;
- required_device<k054539_device> m_k054539a;
- required_device<k054539_device> m_k054539b;
+ required_device_array<k054539_device, 2> m_k054539;
required_device<c6280_device> m_c6280;
required_device<h6280_device> m_h6280;
- required_device<pokey_device> m_pokeya;
- required_device<pokey_device> m_pokeyb;
+ required_device_array<pokey_device, 2> m_pokey;
required_device<c352_device> m_c352;
- required_device<okim6295_device> m_okim6295a;
- required_device<okim6295_device> m_okim6295b;
+ required_device_array<okim6295_device, 2> m_okim6295;
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_okim6295_clock[2];
+ uint32_t m_okim6295_pin7[2];
+
uint32_t r32(int offset) const;
uint8_t r8(int offset) const;
};
@@ -987,108 +967,59 @@ READ8_MEMBER(vgmplay_device::ymz280b_rom_r)
return rom_r(0, 0x86, offset);
}
-READ8_MEMBER(vgmplay_device::multipcma_rom_r)
+template<int chip>
+READ8_MEMBER(vgmplay_device::multipcm_rom_r)
{
- if (m_multipcma_banked == 1)
+ if (m_multipcm_banked[chip] == 1)
{
offset &= 0x1fffff;
if (offset & 0x100000)
{
- if (m_multipcma_bank_l == m_multipcma_bank_r)
+ if (m_multipcm_bank_l[chip] == m_multipcm_bank_r[chip])
{
- offset = ((m_multipcma_bank_r & ~0xf) << 16) | (offset & 0xfffff);
+ offset = ((m_multipcm_bank_r[chip] & ~0xf) << 16) | (offset & 0xfffff);
}
else
{
if (offset & 0x80000)
{
- offset = ((m_multipcma_bank_l & ~0x7) << 16) | (offset & 0x7ffff);
+ offset = ((m_multipcm_bank_l[chip] & ~0x7) << 16) | (offset & 0x7ffff);
}
else
{
- offset = ((m_multipcma_bank_r & ~0x7) << 16) | (offset & 0x7ffff);
+ offset = ((m_multipcm_bank_r[chip] & ~0x7) << 16) | (offset & 0x7ffff);
}
}
}
}
- return rom_r(0, 0x89, offset);
+ return rom_r(chip, 0x89, offset);
}
-READ8_MEMBER(vgmplay_device::multipcmb_rom_r)
+template<int chip>
+READ8_MEMBER(vgmplay_device::okim6295_rom_r)
{
- if (m_multipcmb_banked == 1)
+ if (m_okim6295_nmk112_enable[chip])
{
- offset &= 0x1fffff;
- if (offset & 0x100000)
+ if ((offset < 0x400) && (m_okim6295_nmk112_enable[chip] & 0x80))
{
- if (m_multipcmb_bank_l == m_multipcmb_bank_r)
- {
- offset = ((m_multipcmb_bank_r & ~0xf) << 16) | (offset & 0xfffff);
- }
- else
- {
- if (offset & 0x80000)
- {
- offset = ((m_multipcmb_bank_l & ~0x7) << 16) | (offset & 0x7ffff);
- }
- else
- {
- offset = ((m_multipcmb_bank_r & ~0x7) << 16) | (offset & 0x7ffff);
- }
- }
- }
- }
- return rom_r(1, 0x89, offset);
-}
-
-READ8_MEMBER(vgmplay_device::okim6295a_rom_r)
-{
- if (m_okim6295a_nmk112_enable)
- {
- if (offset < 0x400) && (m_okim6295a_nmk112_enable & 0x80)
- {
- offset = (m_okim6295a_nmk112_bank[(offset >> 8) & 0x3] << 16) | (offset & 0xff);
- }
- else
- {
- offset = (m_okim6295a_nmk112_bank[(offset >> 16) & 0x3] << 16) | (offset & 0xffff);
- }
- }
- else
- {
- offset = (m_okim6295a_bank * 0x40000) | offset;
- }
- return rom_r(0, 0x8b, offset);
-}
-
-READ8_MEMBER(vgmplay_device::okim6295b_rom_r)
-{
- if (m_okim6295b_nmk112_enable)
- {
- if (offset < 0x400) && (m_okim6295b_nmk112_enable & 0x80)
- {
- offset = (m_okim6295b_nmk112_bank[(offset >> 8) & 0x3] << 16) | (offset & 0x3ff);
+ offset = (m_okim6295_nmk112_bank[chip][(offset >> 8) & 0x3] << 16) | (offset & 0xff);
}
else
{
- offset = (m_okim6295b_nmk112_bank[(offset >> 16) & 0x3] << 16) | (offset & 0xffff);
+ offset = (m_okim6295_nmk112_bank[chip][(offset >> 16) & 0x3] << 16) | (offset & 0xffff);
}
}
else
{
- offset = (m_okim6295b_bank * 0x40000) | offset;
+ offset = (m_okim6295_bank[chip] * 0x40000) | offset;
}
- return rom_r(1, 0x8b, offset);
-}
-
-READ8_MEMBER(vgmplay_device::k054539a_rom_r)
-{
- return rom_r(0, 0x8c, offset);
+ return rom_r(chip, 0x8b, offset);
}
-READ8_MEMBER(vgmplay_device::k054539b_rom_r)
+template<int chip>
+READ8_MEMBER(vgmplay_device::k054539_rom_r)
{
- return rom_r(1, 0x8c, offset);
+ return rom_r(chip, 0x8c, offset);
}
READ8_MEMBER(vgmplay_device::k053260_rom_r)
@@ -1112,29 +1043,23 @@ vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, co
, m_ym2612(*this, "ym2612")
, m_ym2151(*this, "ym2151")
, m_ym2413(*this, "ym2413")
- , m_ym2203a(*this, "ym2203a")
- , m_ym2203b(*this, "ym2203b")
+ , m_ym2203(*this, "ym2203%c", 'a')
, m_ym3526(*this, "ym3526")
, m_ym3812(*this, "ym3812")
- , m_ay8910a(*this, "ay8910a")
- , m_ay8910b(*this, "ay8910b")
+ , m_ay8910(*this, "ay8910%c", 'a')
, m_sn76496(*this, "sn76496")
, m_segapcm(*this, "segapcm")
- , m_multipcma(*this, "multipcma")
- , m_multipcmb(*this, "multipcmb")
+ , m_multipcm(*this, "multipcm%c", 'a')
, m_dmg(*this, "dmg")
, m_nescpu(*this, "nescpu")
, m_nesram(*this, "nesapu_ram")
, m_k053260(*this, "k053260")
- , m_k054539a(*this, "k054539a")
- , m_k054539b(*this, "k054539b")
+ , m_k054539(*this, "k054539%c", 'a')
, m_c6280(*this, "c6280")
, m_h6280(*this, "h6280")
- , m_pokeya(*this, "pokeya")
- , m_pokeyb(*this, "pokeyb")
+ , m_pokey(*this, "pokey%c", 'a')
, m_c352(*this, "c352")
- , m_okim6295a(*this, "okim6295a")
- , m_okim6295b(*this, "okim6295b")
+ , m_okim6295(*this, "okim6295%c", 'a')
, m_ymf271(*this, "ymf271")
, m_ymz280b(*this, "ymz280b")
, m_ym2608(*this, "ym2608")
@@ -1244,11 +1169,11 @@ void vgmplay_state::machine_start()
logerror("Warning: file requests an unsupported RF5C68\n");
if(version >= 0x151 && r32(0x44)) {
uint32_t clock = r32(0x44);
- m_ym2203a->set_unscaled_clock(clock & ~0x40000000);
+ m_ym2203[0]->set_unscaled_clock(clock & ~0x40000000);
if (clock & 0x40000000)
{
clock &= ~0x40000000;
- m_ym2203b->set_unscaled_clock(clock);
+ m_ym2203[1]->set_unscaled_clock(clock);
}
}
if(version >= 0x151 && r32(0x48))
@@ -1279,18 +1204,18 @@ void vgmplay_state::machine_start()
logerror("Warning: file requests an unsupported PWM\n");
if(version >= 0x151 && r32(0x74)) {
uint32_t clock = r32(0x74);
- m_ay8910a->set_unscaled_clock(clock & ~0x40000000);
+ m_ay8910[0]->set_unscaled_clock(clock & ~0x40000000);
if (clock & 0x40000000) {
clock &= ~0x40000000;
- m_ay8910b->set_unscaled_clock(clock);
+ m_ay8910[1]->set_unscaled_clock(clock);
}
}
if(version >= 0x151 && r8(0x78)) {
uint8_t type = r8(0x78);
if (type & 0x10)
{
- ay8910_device::set_psg_type(*m_ay8910a, ay8910_device::PSG_TYPE_YM);
- ay8910_device::set_psg_type(*m_ay8910b, ay8910_device::PSG_TYPE_YM);
+ ay8910_device::set_psg_type(*m_ay8910[0], ay8910_device::PSG_TYPE_YM);
+ ay8910_device::set_psg_type(*m_ay8910[1], ay8910_device::PSG_TYPE_YM);
}
}
if(version >= 0x151 && r8(0x79)) {
@@ -1302,8 +1227,8 @@ void vgmplay_state::machine_start()
to_set |= AY8910_SINGLE_OUTPUT;
if (flags & 4)
to_set |= AY8910_DISCRETE_OUTPUT;
- ay8910_device::set_flags(*m_ay8910a, to_set);
- ay8910_device::set_flags(*m_ay8910b, to_set);
+ ay8910_device::set_flags(*m_ay8910[0], to_set);
+ ay8910_device::set_flags(*m_ay8910[1], to_set);
}
if(version >= 0x151 && r8(0x7a)) {
uint8_t flags = r8(0x7a);
@@ -1314,8 +1239,8 @@ void vgmplay_state::machine_start()
to_set |= AY8910_SINGLE_OUTPUT;
if (flags & 4)
to_set |= AY8910_DISCRETE_OUTPUT;
- ay8910_device::set_flags(*m_ym2203a, to_set);
- ay8910_device::set_flags(*m_ym2203b, to_set);
+ ay8910_device::set_flags(*m_ym2203[0], to_set);
+ ay8910_device::set_flags(*m_ym2203[1], to_set);
}
}
@@ -1330,39 +1255,39 @@ void vgmplay_state::machine_start()
}
if(version >= 0x161 && r32(0x88)) {
uint32_t clock = r32(0x88);
- m_multipcma->set_unscaled_clock(clock & ~0x40000000);
+ m_multipcm[0]->set_unscaled_clock(clock & ~0x40000000);
if (clock & 0x40000000) {
clock &= ~0x40000000;
- m_multipcmb->set_unscaled_clock(clock);
+ m_multipcm[1]->set_unscaled_clock(clock);
}
}
if(version >= 0x161 && r8(0x95)) {
- m_k054539a->init_flags(r8(0x95));
- m_k054539b->init_flags(r8(0x95));
+ m_k054539[0]->init_flags(r8(0x95));
+ m_k054539[1]->init_flags(r8(0x95));
}
if(version >= 0x161 && r32(0x98)) {
- m_okim6295a_clock = r32(0x98);
- m_okim6295a_pin7 = 0;
- if (m_okim6295a_clock & 0x80000000) {
- m_okim6295a_clock &= ~0x80000000;
- m_okim6295a_pin7 = 1;
+ m_okim6295_clock[0] = r32(0x98);
+ m_okim6295_pin7[0] = 0;
+ if (m_okim6295_clock[0] & 0x80000000) {
+ m_okim6295_clock[0] &= ~0x80000000;
+ m_okim6295_pin7[0] = 1;
}
- okim6295_device::static_set_pin7(*m_okim6295a, m_okim6295a_pin7);
- m_okim6295a->set_unscaled_clock(m_okim6295a_clock & ~0xc0000000);
- if (m_okim6295a_clock & 0x40000000) {
- m_okim6295a_clock &= ~0x40000000;
- m_okim6295b_clock = m_okim6295a_clock;
- m_okim6295b_pin7 = m_okim6295a_pin7;
- okim6295_device::static_set_pin7(*m_okim6295b, m_okim6295b_pin7);
- m_okim6295b->set_unscaled_clock(m_okim6295b_clock);
+ okim6295_device::static_set_pin7(*m_okim6295[0], m_okim6295_pin7[0]);
+ m_okim6295[0]->set_unscaled_clock(m_okim6295_clock[0] & ~0xc0000000);
+ if (m_okim6295_clock[0] & 0x40000000) {
+ m_okim6295_clock[0] &= ~0x40000000;
+ m_okim6295_clock[1] = m_okim6295_clock[0];
+ m_okim6295_pin7[1] = m_okim6295_pin7[0];
+ okim6295_device::static_set_pin7(*m_okim6295[1], m_okim6295_pin7[1]);
+ m_okim6295[1]->set_unscaled_clock(m_okim6295_clock[1]);
}
}
if(version >= 0x161 && r32(0xa0)) {
uint32_t clock = r32(0xa0);
- m_k054539a->set_unscaled_clock(clock & ~0x40000000);
+ m_k054539[0]->set_unscaled_clock(clock & ~0x40000000);
if (clock & 0x40000000) {
clock &= ~0x40000000;
- m_k054539b->set_unscaled_clock(clock);
+ m_k054539[1]->set_unscaled_clock(clock);
}
}
if(version >= 0x161 && r32(0xac)) {
@@ -1373,10 +1298,10 @@ void vgmplay_state::machine_start()
}
if(version >= 0x161 && r32(0xb0)) {
uint32_t clock = r32(0xb0);
- m_pokeya->set_unscaled_clock(clock & ~0x40000000);
+ m_pokey[0]->set_unscaled_clock(clock & ~0x40000000);
if (clock & 0x40000000) {
clock &= ~0x40000000;
- m_pokeyb->set_unscaled_clock(clock);
+ m_pokey[1]->set_unscaled_clock(clock);
}
}
if(version >= 0x161 && r32(0xb4)) {
@@ -1409,121 +1334,69 @@ READ8_MEMBER(vgmplay_state::file_size_r)
return size >> (8*offset);
}
-WRITE8_MEMBER(vgmplay_device::multipcm_bank_hi_a_w)
-{
- if (offset & 1)
- m_multipcma_bank_l = (m_multipcma_bank_l & 0xff) | (data << 16);
- if (offset & 2)
- m_multipcma_bank_r = (m_multipcma_bank_r & 0xff) | (data << 16);
-}
-
-WRITE8_MEMBER(vgmplay_device::multipcm_bank_lo_a_w)
+template<int chip>
+WRITE8_MEMBER(vgmplay_device::multipcm_bank_hi_w)
{
if (offset & 1)
- m_multipcma_bank_l = (m_multipcma_bank_l & 0xff00) | data;
+ m_multipcm_bank_l[chip] = (m_multipcm_bank_l[chip] & 0xff) | (data << 16);
if (offset & 2)
- m_multipcma_bank_r = (m_multipcma_bank_r & 0xff00) | data;
-
- m_multipcma_banked = 1;
+ m_multipcm_bank_r[chip] = (m_multipcm_bank_r[chip] & 0xff) | (data << 16);
}
-WRITE8_MEMBER(vgmplay_device::multipcm_bank_hi_b_w)
+template<int chip>
+WRITE8_MEMBER(vgmplay_device::multipcm_bank_lo_w)
{
if (offset & 1)
- m_multipcmb_bank_l = (m_multipcmb_bank_l & 0xff) | (data << 16);
+ m_multipcm_bank_l[chip] = (m_multipcm_bank_l[chip] & 0xff00) | data;
if (offset & 2)
- m_multipcmb_bank_r = (m_multipcmb_bank_r & 0xff) | (data << 16);
-}
+ m_multipcm_bank_r[chip] = (m_multipcm_bank_r[chip] & 0xff00) | data;
-WRITE8_MEMBER(vgmplay_device::multipcm_bank_lo_b_w)
-{
- if (offset & 1)
- m_multipcmb_bank_l = (m_multipcmb_bank_l & 0xff00) | data;
- if (offset & 2)
- m_multipcmb_bank_r = (m_multipcmb_bank_r & 0xff00) | data;
-
- m_multipcmb_banked = 1;
-}
-
-WRITE8_MEMBER(vgmplay_device::okim6295_clock_a_w)
-{
- uint32_t old = m_okim6295a_clock;
- int shift = ((offset & 3) << 3);
- m_okim6295a_clock = (m_okim6295a_clock & ~(mem_mask << shift)) | ((data & mem_mask) << shift);
- if (old != m_okim6295a_clock)
- m_okim6295a->set_unscaled_clock(m_okim6295a_clock);
-
-}
-
-WRITE8_MEMBER(vgmplay_device::okim6295_pin7_a_w)
-{
- if ((data & mem_mask) != (m_okim6295a_pin7 & mem_mask))
- {
- COMBINE_DATA(&m_okim6295a_pin7);
- okim6295_device::static_set_pin7(*m_okim6295a, m_okim6295a_pin7);
- }
-}
-
-WRITE8_MEMBER(vgmplay_device::okim6295_nmk112_enable_a_w)
-{
- COMBINE_DATA(&m_okim6295a_nmk112_enable);
-}
-
-WRITE8_MEMBER(vgmplay_device::okim6295_bank_a_w)
-{
- if ((data & mem_mask) != (m_okim6295a_bank & mem_mask))
- {
- COMBINE_DATA(&m_okim6295a_bank);
- }
-}
-
-WRITE8_MEMBER(vgmplay_device::okim6295_nmk112_bank_a_w)
-{
- offset &= 3;
- if ((data & mem_mask) != (m_okim6295a_nmk112_bank[offset] & mem_mask))
- {
- COMBINE_DATA(&m_okim6295a_nmk112_bank[offset]);
- }
+ m_multipcm_banked[chip] = 1;
}
-WRITE8_MEMBER(vgmplay_device::okim6295_clock_b_w)
+template<int chip>
+WRITE8_MEMBER(vgmplay_state::okim6295_clock_w)
{
- uint32_t old = m_okim6295b_clock;
+ uint32_t old = m_okim6295_clock[chip];
int shift = ((offset & 3) << 3);
- m_okim6295b_clock = (m_okim6295b_clock & ~(mem_mask << shift)) | ((data & mem_mask) << shift);
- if (old != m_okim6295b_clock)
- m_okim6295b->set_unscaled_clock(m_okim6295b_clock);
+ m_okim6295_clock[chip] = (m_okim6295_clock[chip] & ~(mem_mask << shift)) | ((data & mem_mask) << shift);
+ if (old != m_okim6295_clock[chip])
+ m_okim6295[chip]->set_unscaled_clock(m_okim6295_clock[chip]);
}
-WRITE8_MEMBER(vgmplay_device::okim6295_pin7_b_w)
+template<int chip>
+WRITE8_MEMBER(vgmplay_state::okim6295_pin7_w)
{
- if ((data & mem_mask) != (m_okim6295b_pin7 & mem_mask))
+ if ((data & mem_mask) != (m_okim6295_pin7[chip] & mem_mask))
{
- COMBINE_DATA(&m_okim6295b_pin7);
- okim6295_device::static_set_pin7(*m_okim6295b, m_okim6295b_pin7);
+ COMBINE_DATA(&m_okim6295_pin7[chip]);
+ okim6295_device::static_set_pin7(*m_okim6295[chip], m_okim6295_pin7[chip]);
}
}
-WRITE8_MEMBER(vgmplay_device::okim6295_nmk112_enable_b_w)
+template<int chip>
+WRITE8_MEMBER(vgmplay_device::okim6295_nmk112_enable_w)
{
- COMBINE_DATA(&m_okim6295b_nmk112_enable);
+ COMBINE_DATA(&m_okim6295_nmk112_enable[chip]);
}
-WRITE8_MEMBER(vgmplay_device::okim6295_bank_b_w)
+template<int chip>
+WRITE8_MEMBER(vgmplay_device::okim6295_bank_w)
{
- if ((data & mem_mask) != (m_okim6295b_bank & mem_mask))
+ if ((data & mem_mask) != (m_okim6295_bank[chip] & mem_mask))
{
- COMBINE_DATA(&m_okim6295b_bank);
+ COMBINE_DATA(&m_okim6295_bank[chip]);
}
}
-WRITE8_MEMBER(vgmplay_device::okim6295_nmk112_bank_b_w)
+template<int chip>
+WRITE8_MEMBER(vgmplay_device::okim6295_nmk112_bank_w)
{
offset &= 3;
- if ((data & mem_mask) != (m_okim6295b_nmk112_bank[offset] & mem_mask))
+ if ((data & mem_mask) != (m_okim6295_nmk112_bank[chip][offset] & mem_mask))
{
- COMBINE_DATA(&m_okim6295b_nmk112_bank[offset]);
+ COMBINE_DATA(&m_okim6295_nmk112_bank[chip][offset]);
}
}
@@ -1556,28 +1429,28 @@ static ADDRESS_MAP_START( soundchips_map, AS_IO, 8, vgmplay_state )
AM_RANGE(vgmplay_device::A_K053260, vgmplay_device::A_K053260+0x2f) AM_DEVWRITE ("k053260", k053260_device, write)
AM_RANGE(vgmplay_device::A_C6280, vgmplay_device::A_C6280+0xf) AM_DEVWRITE ("c6280", c6280_device, c6280_w)
AM_RANGE(vgmplay_device::A_OKIM6295A, vgmplay_device::A_OKIM6295A) AM_DEVWRITE ("okim6295a", okim6295_device, write)
- AM_RANGE(vgmplay_device::A_OKIM6295A+0x8, vgmplay_device::A_OKIM6295A+0xb) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_clock_a_w)
- AM_RANGE(vgmplay_device::A_OKIM6295A+0xc, vgmplay_device::A_OKIM6295A+0xc) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_pin7_a_w)
- AM_RANGE(vgmplay_device::A_OKIM6295A+0xe, vgmplay_device::A_OKIM6295A+0xe) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_nmk112_enable_a_w)
- AM_RANGE(vgmplay_device::A_OKIM6295A+0xf, vgmplay_device::A_OKIM6295A+0xf) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_bank_a_w)
- AM_RANGE(vgmplay_device::A_OKIM6295A+0x10, vgmplay_device::A_OKIM6295A+0x13) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_nmk112_bank_a_w)
+ AM_RANGE(vgmplay_device::A_OKIM6295A+0x8, vgmplay_device::A_OKIM6295A+0xb) AM_WRITE (okim6295_clock_w<0>)
+ AM_RANGE(vgmplay_device::A_OKIM6295A+0xc, vgmplay_device::A_OKIM6295A+0xc) AM_WRITE (okim6295_pin7_w<0>)
+ AM_RANGE(vgmplay_device::A_OKIM6295A+0xe, vgmplay_device::A_OKIM6295A+0xe) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_nmk112_enable_w<0>)
+ AM_RANGE(vgmplay_device::A_OKIM6295A+0xf, vgmplay_device::A_OKIM6295A+0xf) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_bank_w<0>)
+ AM_RANGE(vgmplay_device::A_OKIM6295A+0x10, vgmplay_device::A_OKIM6295A+0x13) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_nmk112_bank_w<0>)
AM_RANGE(vgmplay_device::A_OKIM6295B, vgmplay_device::A_OKIM6295B) AM_DEVWRITE ("okim6295b", okim6295_device, write)
- AM_RANGE(vgmplay_device::A_OKIM6295B+0x8, vgmplay_device::A_OKIM6295B+0xb) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_clock_b_w)
- AM_RANGE(vgmplay_device::A_OKIM6295B+0xc, vgmplay_device::A_OKIM6295B+0xc) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_pin7_b_w)
- AM_RANGE(vgmplay_device::A_OKIM6295B+0xe, vgmplay_device::A_OKIM6295B+0xe) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_nmk112_enable_b_w)
- AM_RANGE(vgmplay_device::A_OKIM6295B+0xf, vgmplay_device::A_OKIM6295B+0xf) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_bank_b_w)
- AM_RANGE(vgmplay_device::A_OKIM6295B+0x10, vgmplay_device::A_OKIM6295B+0x13) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_nmk112_bank_b_w)
+ AM_RANGE(vgmplay_device::A_OKIM6295B+0x8, vgmplay_device::A_OKIM6295B+0xb) AM_WRITE (okim6295_clock_w<1>)
+ AM_RANGE(vgmplay_device::A_OKIM6295B+0xc, vgmplay_device::A_OKIM6295B+0xc) AM_WRITE (okim6295_pin7_w<1>)
+ AM_RANGE(vgmplay_device::A_OKIM6295B+0xe, vgmplay_device::A_OKIM6295B+0xe) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_nmk112_enable_w<1>)
+ AM_RANGE(vgmplay_device::A_OKIM6295B+0xf, vgmplay_device::A_OKIM6295B+0xf) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_bank_w<1>)
+ AM_RANGE(vgmplay_device::A_OKIM6295B+0x10, vgmplay_device::A_OKIM6295B+0x13) AM_DEVWRITE ("vgmplay", vgmplay_device, okim6295_nmk112_bank_w<1>)
AM_RANGE(vgmplay_device::A_SEGAPCM, vgmplay_device::A_SEGAPCM+0x7ff) AM_DEVWRITE ("segapcm", segapcm_device, sega_pcm_w)
AM_RANGE(vgmplay_device::A_GAMEBOY, vgmplay_device::A_GAMEBOY+0x16) AM_DEVWRITE ("dmg", gameboy_sound_device, sound_w)
AM_RANGE(vgmplay_device::A_GAMEBOY+0x20, vgmplay_device::A_GAMEBOY+0x2f) AM_DEVWRITE ("dmg", gameboy_sound_device, wave_w)
AM_RANGE(vgmplay_device::A_NESAPU, vgmplay_device::A_NESAPU+0x1f) AM_DEVWRITE ("nescpu:nesapu", nesapu_device, write)
AM_RANGE(vgmplay_device::A_NESRAM, vgmplay_device::A_NESRAM+0xffff) AM_RAM AM_SHARE("nesapu_ram")
- AM_RANGE(vgmplay_device::A_MULTIPCMA, vgmplay_device::A_MULTIPCMA+3) AM_DEVWRITE ("multipcma", multipcm_device, write )
- AM_RANGE(vgmplay_device::A_MULTIPCMA+4, vgmplay_device::A_MULTIPCMA+7) AM_DEVWRITE ("vgmplay", vgmplay_device, multipcm_bank_hi_a_w)
- AM_RANGE(vgmplay_device::A_MULTIPCMA+8, vgmplay_device::A_MULTIPCMA+11) AM_DEVWRITE ("vgmplay", vgmplay_device, multipcm_bank_lo_a_w)
- AM_RANGE(vgmplay_device::A_MULTIPCMB, vgmplay_device::A_MULTIPCMB+3) AM_DEVWRITE ("multipcmb", multipcm_device, write )
- AM_RANGE(vgmplay_device::A_MULTIPCMB+4, vgmplay_device::A_MULTIPCMB+7) AM_DEVWRITE ("vgmplay", vgmplay_device, multipcm_bank_hi_b_w)
- AM_RANGE(vgmplay_device::A_MULTIPCMB+8, vgmplay_device::A_MULTIPCMB+11) AM_DEVWRITE ("vgmplay", vgmplay_device, multipcm_bank_lo_b_w)
+ AM_RANGE(vgmplay_device::A_MULTIPCMA, vgmplay_device::A_MULTIPCMA+3) AM_DEVWRITE ("multipcma", multipcm_device, write)
+ AM_RANGE(vgmplay_device::A_MULTIPCMA+4, vgmplay_device::A_MULTIPCMA+7) AM_DEVWRITE ("vgmplay", vgmplay_device, multipcm_bank_hi_w<0>)
+ AM_RANGE(vgmplay_device::A_MULTIPCMA+8, vgmplay_device::A_MULTIPCMA+11) AM_DEVWRITE ("vgmplay", vgmplay_device, multipcm_bank_lo_w<0>)
+ AM_RANGE(vgmplay_device::A_MULTIPCMB, vgmplay_device::A_MULTIPCMB+3) AM_DEVWRITE ("multipcmb", multipcm_device, write)
+ AM_RANGE(vgmplay_device::A_MULTIPCMB+4, vgmplay_device::A_MULTIPCMB+7) AM_DEVWRITE ("vgmplay", vgmplay_device, multipcm_bank_hi_w<1>)
+ AM_RANGE(vgmplay_device::A_MULTIPCMB+8, vgmplay_device::A_MULTIPCMB+11) AM_DEVWRITE ("vgmplay", vgmplay_device, multipcm_bank_lo_w<1>)
AM_RANGE(vgmplay_device::A_POKEYA, vgmplay_device::A_POKEYA+0xf) AM_DEVWRITE ("pokeya", pokey_device, write)
AM_RANGE(vgmplay_device::A_POKEYB, vgmplay_device::A_POKEYB+0xf) AM_DEVWRITE ("pokeyb", pokey_device, write)
AM_RANGE(vgmplay_device::A_YMF271, vgmplay_device::A_YMF271+0xf) AM_DEVWRITE ("ymf271", ymf271_device, write)
@@ -1593,11 +1466,11 @@ static ADDRESS_MAP_START( segapcm_map, 0, 8, vgmplay_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( multipcma_map, 0, 8, vgmplay_state )
- AM_RANGE(0, 0x3fffff) AM_DEVREAD("vgmplay", vgmplay_device, multipcma_rom_r)
+ AM_RANGE(0, 0x3fffff) AM_DEVREAD("vgmplay", vgmplay_device, multipcm_rom_r<0>)
ADDRESS_MAP_END
static ADDRESS_MAP_START( multipcmb_map, 0, 8, vgmplay_state )
- AM_RANGE(0, 0x3fffff) AM_DEVREAD("vgmplay", vgmplay_device, multipcmb_rom_r)
+ AM_RANGE(0, 0x3fffff) AM_DEVREAD("vgmplay", vgmplay_device, multipcm_rom_r<1>)
ADDRESS_MAP_END
static ADDRESS_MAP_START( k053260_map, 0, 8, vgmplay_state )
@@ -1605,19 +1478,19 @@ static ADDRESS_MAP_START( k053260_map, 0, 8, vgmplay_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( okim6295a_map, 0, 8, vgmplay_state )
- AM_RANGE(0, 0x3ffff) AM_DEVREAD("vgmplay", vgmplay_device, okim6295a_rom_r)
+ AM_RANGE(0, 0x3ffff) AM_DEVREAD("vgmplay", vgmplay_device, okim6295_rom_r<0>)
ADDRESS_MAP_END
static ADDRESS_MAP_START( okim6295b_map, 0, 8, vgmplay_state )
- AM_RANGE(0, 0x3ffff) AM_DEVREAD("vgmplay", vgmplay_device, okim6295b_rom_r)
+ AM_RANGE(0, 0x3ffff) AM_DEVREAD("vgmplay", vgmplay_device, okim6295_rom_r<1>)
ADDRESS_MAP_END
static ADDRESS_MAP_START( k054539a_map, 0, 8, vgmplay_state )
- AM_RANGE(0, 0xffffff) AM_DEVREAD("vgmplay", vgmplay_device, k054539a_rom_r)
+ AM_RANGE(0, 0xffffff) AM_DEVREAD("vgmplay", vgmplay_device, k054539_rom_r<0>)
ADDRESS_MAP_END
static ADDRESS_MAP_START( k054539b_map, 0, 8, vgmplay_state )
- AM_RANGE(0, 0xffffff) AM_DEVREAD("vgmplay", vgmplay_device, k054539b_rom_r)
+ AM_RANGE(0, 0xffffff) AM_DEVREAD("vgmplay", vgmplay_device, k054539_rom_r<1>)
ADDRESS_MAP_END
static ADDRESS_MAP_START( c352_map, 0, 8, vgmplay_state )