diff options
Diffstat (limited to 'src/mame/drivers/vgmplay.cpp')
-rw-r--r-- | src/mame/drivers/vgmplay.cpp | 415 |
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 ) |