diff options
Diffstat (limited to 'src/mame/machine/taitocchip.cpp')
-rw-r--r-- | src/mame/machine/taitocchip.cpp | 187 |
1 files changed, 56 insertions, 131 deletions
diff --git a/src/mame/machine/taitocchip.cpp b/src/mame/machine/taitocchip.cpp index 406200eac16..a532c034d9a 100644 --- a/src/mame/machine/taitocchip.cpp +++ b/src/mame/machine/taitocchip.cpp @@ -99,10 +99,13 @@ This chip *ALWAYS* has a bypass capacitor (ceramic, 104, 0.10 uF) soldered on to #include "emu.h" #include "machine/taitocchip.h" +#include "cpu/upd7810/upd7811.h" + + DEFINE_DEVICE_TYPE(TAITO_CCHIP, taito_cchip_device, "cchip", "Taito TC0030CMD (C-Chip)") -taito_cchip_device::taito_cchip_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, TAITO_CCHIP, tag, owner, clock), +taito_cchip_device::taito_cchip_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, TAITO_CCHIP, tag, owner, clock), m_upd7811(*this, "upd7811"), m_upd4464_bank(*this, "upd4464_bank"), m_upd4464_bank68(*this, "upd4464_bank68"), @@ -157,7 +160,9 @@ WRITE8_MEMBER(taito_cchip_device::asic_w) m_upd4464_bank->set_bank(data & 0x7); } else - m_asic_ram[offset&3] = data; + { + m_asic_ram[offset & 3] = data; + } } WRITE8_MEMBER(taito_cchip_device::asic68_w) @@ -169,160 +174,88 @@ WRITE8_MEMBER(taito_cchip_device::asic68_w) m_upd4464_bank68->set_bank(data & 0x7); } else - m_asic_ram[offset&3] = data; + { + m_asic_ram[offset & 3] = data; + } } READ8_MEMBER(taito_cchip_device::mem_r) { - offset &= 0x3ff; - return m_upd4464_bank->read8(space,offset); + return m_upd4464_bank->read8(space, offset & 0x03ff); } WRITE8_MEMBER(taito_cchip_device::mem_w) { - offset &= 0x3ff; - return m_upd4464_bank->write8(space,offset,data); + return m_upd4464_bank->write8(space, offset & 0x03ff, data); } READ8_MEMBER(taito_cchip_device::mem68_r) { - offset &= 0x3ff; - return m_upd4464_bank68->read8(space,offset); + return m_upd4464_bank68->read8(space, offset & 0x03ff); } WRITE8_MEMBER(taito_cchip_device::mem68_w) { - offset &= 0x3ff; - return m_upd4464_bank68->write8(space,offset,data); + return m_upd4464_bank68->write8(space, offset & 0x03ff, data); } void taito_cchip_device::cchip_map(address_map &map) { //AM_RANGE(0x0000, 0x0fff) AM_ROM // internal ROM of uPD7811 - map(0x1000, 0x13ff).m("upd4464_bank", FUNC(address_map_bank_device::amap8)); + map(0x1000, 0x13ff).m(m_upd4464_bank, FUNC(address_map_bank_device::amap8)); map(0x1400, 0x17ff).rw(FUNC(taito_cchip_device::asic_r), FUNC(taito_cchip_device::asic_w)); map(0x2000, 0x3fff).rom().region("cchip_eprom", 0); } - -WRITE8_MEMBER(taito_cchip_device::porta_w) -{ - m_out_pa_cb(data); -} - -WRITE8_MEMBER(taito_cchip_device::portb_w) -{ - m_out_pb_cb(data); -} - -WRITE8_MEMBER(taito_cchip_device::portc_w) -{ - m_out_pc_cb(data); -} - -WRITE8_MEMBER(taito_cchip_device::portf_w) +void taito_cchip_device::device_add_mconfig(machine_config &config) { - // internal? related to locking out the 68k? - logerror("%s port F written %.2x\n", machine().describe_context(), data); -} + upd7811_device &upd(UPD7811(config, m_upd7811, DERIVED_CLOCK(1, 1))); + upd.set_addrmap(AS_PROGRAM, &taito_cchip_device::cchip_map); + upd.pa_in_cb().set([this] { return m_in_pa_cb(); }); + upd.pb_in_cb().set([this] { return m_in_pb_cb(); }); + upd.pc_in_cb().set([this] { return m_in_pc_cb(); }); + upd.pa_out_cb().set([this] (u8 data) { m_out_pa_cb(data); }); + upd.pb_out_cb().set([this] (u8 data) { m_out_pb_cb(data); }); + upd.pc_out_cb().set([this] (u8 data) { m_out_pc_cb(data); }); + upd.pf_out_cb().set([this] (u8 data) { logerror("%s port F written %.2x\n", machine().describe_context(), data); }); // internal? related to locking out the 68k? + upd.an0_func().set([this] { return BIT(m_in_ad_cb(), 0); }); + upd.an1_func().set([this] { return BIT(m_in_ad_cb(), 1); }); + upd.an2_func().set([this] { return BIT(m_in_ad_cb(), 2); }); + upd.an3_func().set([this] { return BIT(m_in_ad_cb(), 3); }); + upd.an4_func().set([this] { return BIT(m_in_ad_cb(), 4); }); + upd.an5_func().set([this] { return BIT(m_in_ad_cb(), 5); }); + upd.an6_func().set([this] { return BIT(m_in_ad_cb(), 6); }); + upd.an7_func().set([this] { return BIT(m_in_ad_cb(), 7); }); + + ADDRESS_MAP_BANK(config, m_upd4464_bank, 0); + m_upd4464_bank->set_map(&taito_cchip_device::cchip_ram_bank); + m_upd4464_bank->set_endianness(ENDIANNESS_LITTLE); + m_upd4464_bank->set_data_width(8); + m_upd4464_bank->set_addr_width(13); + m_upd4464_bank->set_stride(0x400); -READ8_MEMBER(taito_cchip_device::porta_r) -{ - return m_in_pa_cb(); -} - -READ8_MEMBER(taito_cchip_device::portb_r) -{ - return m_in_pb_cb(); -} - -READ8_MEMBER(taito_cchip_device::portc_r) -{ - return m_in_pc_cb(); -} - - -READ_LINE_MEMBER( taito_cchip_device::an0_r ) -{ - return BIT(m_in_ad_cb(), 0); -} - -READ_LINE_MEMBER( taito_cchip_device::an1_r ) -{ - return BIT(m_in_ad_cb(), 1); -} - -READ_LINE_MEMBER( taito_cchip_device::an2_r ) -{ - return BIT(m_in_ad_cb(), 2); -} - - -READ_LINE_MEMBER( taito_cchip_device::an3_r ) -{ - return BIT(m_in_ad_cb(), 3); -} - -READ_LINE_MEMBER( taito_cchip_device::an4_r ) -{ - return BIT(m_in_ad_cb(), 4); -} - -READ_LINE_MEMBER( taito_cchip_device::an5_r ) -{ - return BIT(m_in_ad_cb(), 5); -} - -READ_LINE_MEMBER( taito_cchip_device::an6_r ) -{ - return BIT(m_in_ad_cb(), 6); + // the 68k has a different view into the banked memory? + ADDRESS_MAP_BANK(config, m_upd4464_bank68, 0); + m_upd4464_bank68->set_map(&taito_cchip_device::cchip_ram_bank68); + m_upd4464_bank68->set_endianness(ENDIANNESS_LITTLE); + m_upd4464_bank68->set_data_width(8); + m_upd4464_bank68->set_addr_width(13); + m_upd4464_bank68->set_stride(0x400); } -READ_LINE_MEMBER( taito_cchip_device::an7_r ) +void taito_cchip_device::device_resolve_objects() { - return BIT(m_in_ad_cb(), 7); + m_in_pa_cb.resolve_safe(0); + m_in_pb_cb.resolve_safe(0); + m_in_pc_cb.resolve_safe(0); + m_in_ad_cb.resolve_safe(0); + m_out_pa_cb.resolve_safe(); + m_out_pb_cb.resolve_safe(); + m_out_pc_cb.resolve_safe(); } - - -MACHINE_CONFIG_START(taito_cchip_device::device_add_mconfig) - MCFG_DEVICE_ADD("upd7811", UPD7811, DERIVED_CLOCK(1,1)) - MCFG_DEVICE_PROGRAM_MAP(cchip_map) - MCFG_UPD7810_PORTA_READ_CB(READ8(*this, taito_cchip_device, porta_r)) - MCFG_UPD7810_PORTB_READ_CB(READ8(*this, taito_cchip_device, portb_r)) - MCFG_UPD7810_PORTC_READ_CB(READ8(*this, taito_cchip_device, portc_r)) - MCFG_UPD7810_PORTA_WRITE_CB(WRITE8(*this, taito_cchip_device, porta_w)) - MCFG_UPD7810_PORTB_WRITE_CB(WRITE8(*this, taito_cchip_device, portb_w)) - MCFG_UPD7810_PORTC_WRITE_CB(WRITE8(*this, taito_cchip_device, portc_w)) - MCFG_UPD7810_PORTF_WRITE_CB(WRITE8(*this, taito_cchip_device, portf_w)) - MCFG_UPD7810_AN0(READLINE(*this, taito_cchip_device, an0_r)) - MCFG_UPD7810_AN1(READLINE(*this, taito_cchip_device, an1_r)) - MCFG_UPD7810_AN2(READLINE(*this, taito_cchip_device, an2_r)) - MCFG_UPD7810_AN3(READLINE(*this, taito_cchip_device, an3_r)) - MCFG_UPD7810_AN4(READLINE(*this, taito_cchip_device, an4_r)) - MCFG_UPD7810_AN5(READLINE(*this, taito_cchip_device, an5_r)) - MCFG_UPD7810_AN6(READLINE(*this, taito_cchip_device, an6_r)) - MCFG_UPD7810_AN7(READLINE(*this, taito_cchip_device, an7_r)) - - MCFG_DEVICE_ADD("upd4464_bank", ADDRESS_MAP_BANK, 0) - MCFG_DEVICE_PROGRAM_MAP(cchip_ram_bank) - MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) - MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) - MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(13) - MCFG_ADDRESS_MAP_BANK_STRIDE(0x400) - - // the 68k has a different view into the banked memory? - MCFG_DEVICE_ADD("upd4464_bank68", ADDRESS_MAP_BANK, 0) - MCFG_DEVICE_PROGRAM_MAP(cchip_ram_bank68) - MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) - MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) - MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(13) - MCFG_ADDRESS_MAP_BANK_STRIDE(0x400) -MACHINE_CONFIG_END - - void taito_cchip_device::device_start() { m_upd4464_bank->set_bank(0); @@ -330,14 +263,6 @@ void taito_cchip_device::device_start() save_item(NAME(m_asic_ram)); m_asic_ram[0] = m_asic_ram[1] = m_asic_ram[2] = m_asic_ram[3] = 0; - - m_in_pa_cb.resolve_safe(0); - m_in_pb_cb.resolve_safe(0); - m_in_pc_cb.resolve_safe(0); - m_in_ad_cb.resolve_safe(0); - m_out_pa_cb.resolve_safe(); - m_out_pb_cb.resolve_safe(); - m_out_pc_cb.resolve_safe(); } void taito_cchip_device::device_reset() |