diff --git a/src/devices/bus/electron/m2105.cpp b/src/devices/bus/electron/m2105.cpp index 4d00d0e3f56..228c0e006a6 100644 --- a/src/devices/bus/electron/m2105.cpp +++ b/src/devices/bus/electron/m2105.cpp @@ -58,7 +58,7 @@ MACHINE_CONFIG_MEMBER( electron_m2105_device::device_add_mconfig ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_INPUT_MERGER_ACTIVE_HIGH("irqs") + MCFG_INPUT_MERGER_ANY_HIGH("irqs") MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(electron_m2105_device, intrq_w)) /* system via */ @@ -67,7 +67,7 @@ MACHINE_CONFIG_MEMBER( electron_m2105_device::device_add_mconfig ) MCFG_VIA6522_READPB_HANDLER(READ8(electron_m2105_device, m2105_via_system_read_portb)) MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(electron_m2105_device, m2105_via_system_write_porta)) MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(electron_m2105_device, m2105_via_system_write_portb))*/ - MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in0_w)) + MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<0>)) /* user via */ MCFG_DEVICE_ADD("via6522_1", VIA6522, 1000000) @@ -75,11 +75,11 @@ MACHINE_CONFIG_MEMBER( electron_m2105_device::device_add_mconfig ) MCFG_VIA6522_WRITEPA_HANDLER(DEVWRITE8("cent_data_out", output_latch_device, write)) //MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(electron_m2105_device, m2105_via_user_write_portb)) MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("centronics", centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in1_w)) + MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<1>)) /* duart */ MCFG_MC68681_ADD("sc2681", XTAL_3_6864MHz) - MCFG_MC68681_IRQ_CALLBACK(DEVWRITELINE("irqs", input_merger_active_high_device, in2_w)) + MCFG_MC68681_IRQ_CALLBACK(DEVWRITELINE("irqs", input_merger_device, in_w<2>)) MCFG_MC68681_A_TX_CALLBACK(DEVWRITELINE("rs232", rs232_port_device, write_txd)) //MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(electron_m2105_device, sio_out_w)) diff --git a/src/devices/bus/electron/m2105.h b/src/devices/bus/electron/m2105.h index fab765cca1c..387b96f918d 100644 --- a/src/devices/bus/electron/m2105.h +++ b/src/devices/bus/electron/m2105.h @@ -49,7 +49,7 @@ private: required_device m_duart; required_device m_tms; required_device m_centronics; - required_device m_irqs; + required_device m_irqs; }; diff --git a/src/devices/machine/input_merger.cpp b/src/devices/machine/input_merger.cpp index d69b2aa9eae..de2790bff1b 100644 --- a/src/devices/machine/input_merger.cpp +++ b/src/devices/machine/input_merger.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Dirk Best +// copyright-holders:Dirk Best, Vas Crabb /*************************************************************************** Input Merger @@ -20,8 +20,10 @@ // DEVICE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(INPUT_MERGER_ACTIVE_HIGH, input_merger_active_high_device, "ipt_merger_hi", "Input Merger (active high)") -DEFINE_DEVICE_TYPE(INPUT_MERGER_ACTIVE_LOW, input_merger_active_low_device, "ipt_merger_lo", "Input Merger (active low)") +DEFINE_DEVICE_TYPE(INPUT_MERGER_ANY_HIGH, input_merger_any_high_device, "ipt_merge_any_hi", "Input Merger (any high)") +DEFINE_DEVICE_TYPE(INPUT_MERGER_ALL_HIGH, input_merger_all_high_device, "ipt_merge_all_hi", "Input Merger (all high)") +DEFINE_DEVICE_TYPE(INPUT_MERGER_ANY_LOW, input_merger_any_low_device, "ipt_merge_any_lo", "Input Merger (any low)") +DEFINE_DEVICE_TYPE(INPUT_MERGER_ALL_LOW, input_merger_all_low_device, "ipt_merge_all_lo", "Input Merger (all low)") //************************************************************************** @@ -32,9 +34,21 @@ DEFINE_DEVICE_TYPE(INPUT_MERGER_ACTIVE_LOW, input_merger_active_low_device, "i // input_merger_device - constructor //------------------------------------------------- -input_merger_device::input_merger_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, type, tag, owner, clock), - m_output_handler(*this) +input_merger_device::input_merger_device( + machine_config const &mconfig, + device_type type, + char const *tag, + device_t *owner, + uint32_t clock, + u32 initval, + u32 xorval, + int active) + : device_t(mconfig, type, tag, owner, clock) + , m_output_handler(*this) + , m_initval(initval) + , m_xorval(xorval) + , m_active(active) + , m_state(initval) { } @@ -54,72 +68,43 @@ void input_merger_device::device_start() { m_output_handler.resolve_safe(); save_item(NAME(m_state)); -} - - -//************************************************************************** -// INPUT ADAPTER ACTIVE HIGH -//************************************************************************** - -//------------------------------------------------- -// input_merger_active_high_device - constructor -//------------------------------------------------- - -input_merger_active_high_device::input_merger_active_high_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) - : input_merger_device(mconfig, INPUT_MERGER_ACTIVE_HIGH, tag, owner, clock) -{ -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void input_merger_active_high_device::device_start() -{ - input_merger_device::device_start(); - std::fill(std::begin(m_state), std::end(m_state), false); + m_state = m_initval; } //------------------------------------------------- // update_state - verify current input line state //------------------------------------------------- -void input_merger_active_high_device::update_state() +TIMER_CALLBACK_MEMBER(input_merger_device::update_state) { - bool state = std::any_of(std::begin(m_state), std::end(m_state), [&](bool state) { return state == true; }); - m_output_handler(state ? ASSERT_LINE : CLEAR_LINE); + if (BIT(m_state, param >> 1) != BIT(param, 0)) + { + m_state ^= u32(1) << (param >> 1); + m_output_handler((m_state ^ m_xorval) ? m_active : !m_active); + } } //************************************************************************** -// INPUT ADAPTER ACTIVE LOW +// SPECIALISATIONS //************************************************************************** -//------------------------------------------------- -// input_merger_active_low_device - constructor -//------------------------------------------------- - -input_merger_active_low_device::input_merger_active_low_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) - : input_merger_device(mconfig, INPUT_MERGER_ACTIVE_LOW, tag, owner, clock) +input_merger_any_high_device::input_merger_any_high_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) + : input_merger_device(mconfig, INPUT_MERGER_ANY_HIGH, tag, owner, clock, u32(0), u32(0), 1) { } -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void input_merger_active_low_device::device_start() +input_merger_all_high_device::input_merger_all_high_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) + : input_merger_device(mconfig, INPUT_MERGER_ALL_HIGH, tag, owner, clock, ~u32(0), ~u32(0), 0) { - input_merger_device::device_start(); - std::fill(std::begin(m_state), std::end(m_state), true); } -//------------------------------------------------- -// update_state - verify current input line state -//------------------------------------------------- - -void input_merger_active_low_device::update_state() +input_merger_any_low_device::input_merger_any_low_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) + : input_merger_device(mconfig, INPUT_MERGER_ANY_LOW, tag, owner, clock, ~u32(0), ~u32(0), 1) +{ +} + +input_merger_all_low_device::input_merger_all_low_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock) + : input_merger_device(mconfig, INPUT_MERGER_ALL_LOW, tag, owner, clock, u32(0), u32(0), 0) { - bool state = std::any_of(std::begin(m_state), std::end(m_state), [&](bool state) { return state == false; }); - m_output_handler(state ? ASSERT_LINE : CLEAR_LINE); } diff --git a/src/devices/machine/input_merger.h b/src/devices/machine/input_merger.h index 2668a8d8dbb..0ce9eb2ef62 100644 --- a/src/devices/machine/input_merger.h +++ b/src/devices/machine/input_merger.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Dirk Best +// copyright-holders:Dirk Best, Vas Crabb /*************************************************************************** Input Merger @@ -20,11 +20,17 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_INPUT_MERGER_ACTIVE_HIGH(_tag) \ - MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ACTIVE_HIGH, 0) +#define MCFG_INPUT_MERGER_ANY_HIGH(_tag) \ + MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ANY_HIGH, 0) -#define MCFG_INPUT_MERGER_ACTIVE_LOW(_tag) \ - MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ACTIVE_LOW, 0) +#define MCFG_INPUT_MERGER_ALL_HIGH(_tag) \ + MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ALL_HIGH, 0) + +#define MCFG_INPUT_MERGER_ANY_LOW(_tag) \ + MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ANY_LOW, 0) + +#define MCFG_INPUT_MERGER_ALL_LOW(_tag) \ + MCFG_DEVICE_ADD(_tag, INPUT_MERGER_ALL_LOW, 0) #define MCFG_INPUT_MERGER_OUTPUT_HANDLER(_devcb) \ devcb = &input_merger_device::set_output_handler(*device, DEVCB_##_devcb); @@ -34,8 +40,6 @@ // TYPE DEFINITIONS //************************************************************************** -// ======================> input_merger_device - class input_merger_device : public device_t { public: @@ -44,62 +48,68 @@ public: { return downcast(device).m_output_handler.set_callback(std::forward(cb)); } // input lines - DECLARE_WRITE_LINE_MEMBER( in0_w ) { if (bool(state) != m_state[0]) { m_state[0] = state; update_state(); } } - DECLARE_WRITE_LINE_MEMBER( in1_w ) { if (bool(state) != m_state[1]) { m_state[1] = state; update_state(); } } - DECLARE_WRITE_LINE_MEMBER( in2_w ) { if (bool(state) != m_state[2]) { m_state[2] = state; update_state(); } } - DECLARE_WRITE_LINE_MEMBER( in3_w ) { if (bool(state) != m_state[3]) { m_state[3] = state; update_state(); } } - DECLARE_WRITE_LINE_MEMBER( in4_w ) { if (bool(state) != m_state[4]) { m_state[4] = state; update_state(); } } - DECLARE_WRITE_LINE_MEMBER( in5_w ) { if (bool(state) != m_state[5]) { m_state[5] = state; update_state(); } } - DECLARE_WRITE_LINE_MEMBER( in6_w ) { if (bool(state) != m_state[6]) { m_state[6] = state; update_state(); } } - DECLARE_WRITE_LINE_MEMBER( in7_w ) { if (bool(state) != m_state[7]) { m_state[7] = state; update_state(); } } + template DECLARE_WRITE_LINE_MEMBER(in_w) { static_assert(Bit < 32, "invalid bit"); machine().scheduler().synchronize(timer_expired_delegate(FUNC(input_merger_device::update_state), this), (Bit << 1) | (state ? 1U : 0U)); } + template DECLARE_WRITE8_MEMBER(in_set) { in_w(1); } + template DECLARE_WRITE8_MEMBER(in_clear) { in_w(0); } protected: // constructor/destructor - input_merger_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock); + input_merger_device( + machine_config const &mconfig, + device_type type, + char const *tag, + device_t *owner, + uint32_t clock, + u32 initval, + u32 xorval, + int active); virtual ~input_merger_device() override; // device-level overrides virtual void device_start() override; - virtual void update_state() = 0; + TIMER_CALLBACK_MEMBER(update_state); devcb_write_line m_output_handler; - bool m_state[8]; + + u32 const m_initval, m_xorval; + int const m_active; + u32 m_state; }; -// ======================> input_merger_active_high_device -class input_merger_active_high_device : public input_merger_device +class input_merger_any_high_device : public input_merger_device { public: - input_merger_active_high_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - -protected: - // device-level overrides - virtual void device_start() override; - - // input_merger device overrides - virtual void update_state() override; + input_merger_any_high_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; -// ======================> input_merger_active_low_device -class input_merger_active_low_device : public input_merger_device +class input_merger_all_high_device : public input_merger_device { public: - input_merger_active_low_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + input_merger_all_high_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; -protected: - // device-level overrides - virtual void device_start() override; - // input_merger device overrides - virtual void update_state() override; +class input_merger_any_low_device : public input_merger_device +{ +public: + input_merger_any_low_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; + + +class input_merger_all_low_device : public input_merger_device +{ +public: + input_merger_all_low_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; // device type definition -DECLARE_DEVICE_TYPE(INPUT_MERGER_ACTIVE_HIGH, input_merger_active_high_device) -DECLARE_DEVICE_TYPE(INPUT_MERGER_ACTIVE_LOW, input_merger_active_low_device) +DECLARE_DEVICE_TYPE(INPUT_MERGER_ANY_HIGH, input_merger_any_high_device) +DECLARE_DEVICE_TYPE(INPUT_MERGER_ALL_HIGH, input_merger_all_high_device) +DECLARE_DEVICE_TYPE(INPUT_MERGER_ANY_LOW, input_merger_any_low_device) +DECLARE_DEVICE_TYPE(INPUT_MERGER_ALL_LOW, input_merger_all_low_device) #endif // MAME_MACHINE_INPUT_MERGER_H diff --git a/src/mame/audio/efo_zsu.cpp b/src/mame/audio/efo_zsu.cpp index 4a590b85695..698ea12f819 100644 --- a/src/mame/audio/efo_zsu.cpp +++ b/src/mame/audio/efo_zsu.cpp @@ -194,13 +194,13 @@ MACHINE_CONFIG_MEMBER( efo_zsu_device::device_add_mconfig ) MCFG_Z80_DAISY_CHAIN(daisy_chain) MCFG_DEVICE_ADD("ctc0", Z80CTC, 4000000) - MCFG_Z80CTC_INTR_CB(DEVWRITELINE("soundirq", input_merger_device, in0_w)) + MCFG_Z80CTC_INTR_CB(DEVWRITELINE("soundirq", input_merger_device, in_w<0>)) MCFG_Z80CTC_ZC0_CB(WRITELINE(efo_zsu_device, ctc0_z0_w)) MCFG_Z80CTC_ZC1_CB(WRITELINE(efo_zsu_device, ctc0_z1_w)) MCFG_Z80CTC_ZC2_CB(WRITELINE(efo_zsu_device, ctc0_z2_w)) MCFG_DEVICE_ADD("ctc1", Z80CTC, 4000000) - MCFG_Z80CTC_INTR_CB(DEVWRITELINE("soundirq", input_merger_device, in0_w)) + MCFG_Z80CTC_INTR_CB(DEVWRITELINE("soundirq", input_merger_device, in_w<1>)) MCFG_Z80CTC_ZC0_CB(WRITELINE(efo_zsu_device, ctc1_z0_w)) MCFG_Z80CTC_ZC1_CB(WRITELINE(efo_zsu_device, ctc1_z1_w)) MCFG_Z80CTC_ZC2_CB(WRITELINE(efo_zsu_device, ctc1_z2_w)) @@ -213,9 +213,9 @@ MACHINE_CONFIG_MEMBER( efo_zsu_device::device_add_mconfig ) #endif MCFG_GENERIC_LATCH_8_ADD("soundlatch") - MCFG_GENERIC_LATCH_DATA_PENDING_CB(DEVWRITELINE("soundirq", input_merger_device, in1_w)) + MCFG_GENERIC_LATCH_DATA_PENDING_CB(DEVWRITELINE("soundirq", input_merger_device, in_w<2>)) - MCFG_INPUT_MERGER_ACTIVE_HIGH("soundirq") // 74HC03 NAND gate + MCFG_INPUT_MERGER_ANY_HIGH("soundirq") // 74HC03 NAND gate MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("soundcpu", INPUT_LINE_IRQ0)) MCFG_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mame/drivers/apricotf.cpp b/src/mame/drivers/apricotf.cpp index b342ab66c0b..81456f2311c 100644 --- a/src/mame/drivers/apricotf.cpp +++ b/src/mame/drivers/apricotf.cpp @@ -88,7 +88,7 @@ public: required_device m_floppy1; required_device m_centronics; required_device m_cent_data_out; - required_device m_irqs; + required_device m_irqs; required_shared_ptr m_p_scrollram; required_shared_ptr m_p_paletteram; required_device m_palette; @@ -335,7 +335,7 @@ static MACHINE_CONFIG_START( act_f1 ) MCFG_CPU_PROGRAM_MAP(act_f1_mem) MCFG_CPU_IO_MAP(act_f1_io) - MCFG_INPUT_MERGER_ACTIVE_HIGH("irqs") + MCFG_INPUT_MERGER_ANY_HIGH("irqs") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE(I8086_TAG, INPUT_LINE_IRQ0)) /* video hardware */ @@ -354,10 +354,10 @@ static MACHINE_CONFIG_START( act_f1 ) MCFG_DEVICE_ADD(APRICOT_KEYBOARD_TAG, APRICOT_KEYBOARD, 0) MCFG_Z80SIO2_ADD(Z80SIO2_TAG, 2500000, 0, 0, 0, 0) - MCFG_Z80DART_OUT_INT_CB(DEVWRITELINE("irqs", input_merger_active_high_device, in0_w)) + MCFG_Z80DART_OUT_INT_CB(DEVWRITELINE("irqs", input_merger_device, in_w<0>)) MCFG_DEVICE_ADD(Z80CTC_TAG, Z80CTC, 2500000) - MCFG_Z80CTC_INTR_CB(DEVWRITELINE("irqs", input_merger_active_high_device, in1_w)) + MCFG_Z80CTC_INTR_CB(DEVWRITELINE("irqs", input_merger_device, in_w<1>)) MCFG_Z80CTC_ZC1_CB(WRITELINE(f1_state, ctc_z1_w)) MCFG_Z80CTC_ZC2_CB(WRITELINE(f1_state, ctc_z2_w)) diff --git a/src/mame/drivers/aristmk5.cpp b/src/mame/drivers/aristmk5.cpp index e7cf85e05d1..46acebed542 100644 --- a/src/mame/drivers/aristmk5.cpp +++ b/src/mame/drivers/aristmk5.cpp @@ -1927,15 +1927,15 @@ static MACHINE_CONFIG_START( aristmk5 ) // TL16C452FN U71 MCFG_DEVICE_ADD("uart_0a", NS16450, MASTER_CLOCK / 9) - MCFG_INS8250_OUT_INT_CB(DEVWRITELINE("uart_irq", input_merger_device, in0_w)) + MCFG_INS8250_OUT_INT_CB(DEVWRITELINE("uart_irq", input_merger_device, in_w<0>)) MCFG_DEVICE_ADD("uart_0b", NS16450, MASTER_CLOCK / 9) - MCFG_INS8250_OUT_INT_CB(DEVWRITELINE("uart_irq", input_merger_device, in1_w)) + MCFG_INS8250_OUT_INT_CB(DEVWRITELINE("uart_irq", input_merger_device, in_w<1>)) // TL16C452FN U72 MCFG_DEVICE_ADD("uart_1a", NS16450, MASTER_CLOCK / 9) - MCFG_INS8250_OUT_INT_CB(DEVWRITELINE("uart_irq", input_merger_device, in2_w)) + MCFG_INS8250_OUT_INT_CB(DEVWRITELINE("uart_irq", input_merger_device, in_w<2>)) MCFG_DEVICE_ADD("uart_1b", NS16450, MASTER_CLOCK / 9) - MCFG_INS8250_OUT_INT_CB(DEVWRITELINE("uart_irq", input_merger_device, in3_w)) + MCFG_INS8250_OUT_INT_CB(DEVWRITELINE("uart_irq", input_merger_device, in_w<3>)) // COMM port 4 - 5 MCFG_DEVICE_ADD("uart_2a", NS16450, MASTER_CLOCK / 9) @@ -1949,7 +1949,7 @@ static MACHINE_CONFIG_START( aristmk5 ) MCFG_DEVICE_ADD("uart_3b", NS16450, MASTER_CLOCK / 9) // MCFG_INS8250_OUT_INT_CB(WRITELINE(aristmk5_state, uart_irq_callback)) - MCFG_INPUT_MERGER_ACTIVE_HIGH("uart_irq") + MCFG_INPUT_MERGER_ANY_HIGH("uart_irq") MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(aristmk5_state, uart_irq_callback)) MCFG_DS1302_ADD("rtc", XTAL_32_768kHz) diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index 0281c51f33b..1abca73322e 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -844,7 +844,7 @@ static MACHINE_CONFIG_START( bbca ) MCFG_CPU_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */ MCFG_QUANTUM_TIME(attotime::from_hz(60)) - MCFG_INPUT_MERGER_ACTIVE_HIGH("irqs") + MCFG_INPUT_MERGER_ANY_HIGH("irqs") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE)) /* internal ram */ @@ -902,7 +902,7 @@ static MACHINE_CONFIG_START( bbca ) MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bbc_state, bbc_txd_w)) MCFG_ACIA6850_RTS_HANDLER(WRITELINE(bbc_state, bbc_rts_w)) - MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in0_w)) + MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<0>)) MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE(bbc_state, write_rxd_serial)) @@ -918,7 +918,7 @@ static MACHINE_CONFIG_START( bbca ) MCFG_VIA6522_READPB_HANDLER(READ8(bbc_state, bbcb_via_system_read_portb)) MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_porta)) MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_portb)) - MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in1_w)) + MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<1>)) /* EPROM sockets */ MCFG_FRAGMENT_ADD(bbc_eprom_sockets) @@ -950,7 +950,7 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca ) MCFG_VIA6522_WRITEPA_HANDLER(DEVWRITE8("cent_data_out", output_latch_device, write)) MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_user_write_portb)) MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("centronics", centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in2_w)) + MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<2>)) /* adc */ MCFG_DEVICE_ADD("upd7002", UPD7002, 0) @@ -979,7 +979,7 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca ) /* expansion ports */ MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, "acornjoy") MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbcb_1mhzbus_devices, nullptr) - MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in3_w)) + MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<3>)) MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(bbc_state, bus_nmi_w)) MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_tube_ext_devices, nullptr) MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr) @@ -1277,7 +1277,7 @@ static MACHINE_CONFIG_START( bbcm ) MCFG_CPU_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */ MCFG_QUANTUM_TIME(attotime::from_hz(60)) - MCFG_INPUT_MERGER_ACTIVE_HIGH("irqs") + MCFG_INPUT_MERGER_ANY_HIGH("irqs") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE)) /* internal ram */ @@ -1357,7 +1357,7 @@ static MACHINE_CONFIG_START( bbcm ) MCFG_DEVICE_ADD("acia6850", ACIA6850, 0) MCFG_ACIA6850_TXD_HANDLER(WRITELINE(bbc_state, bbc_txd_w)) MCFG_ACIA6850_RTS_HANDLER(WRITELINE(bbc_state, bbc_rts_w)) - MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in0_w)) + MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<0>)) MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE(bbc_state, write_rxd_serial)) @@ -1378,7 +1378,7 @@ static MACHINE_CONFIG_START( bbcm ) MCFG_VIA6522_READPB_HANDLER(READ8(bbc_state, bbcb_via_system_read_portb)) MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_porta)) MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_system_write_portb)) - MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in1_w)) + MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<1>)) /* user via */ MCFG_DEVICE_ADD("via6522_1", VIA6522, XTAL_16MHz / 16) @@ -1386,7 +1386,7 @@ static MACHINE_CONFIG_START( bbcm ) MCFG_VIA6522_WRITEPA_HANDLER(DEVWRITE8("cent_data_out", output_latch_device, write)) MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(bbc_state, bbcb_via_user_write_portb)) MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("centronics", centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_active_high_device, in2_w)) + MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<2>)) /* fdc */ MCFG_WD1770_ADD("wd1770", XTAL_16MHz / 2) diff --git a/src/mame/drivers/beezer.cpp b/src/mame/drivers/beezer.cpp index 82a0a065e48..202b46bfcca 100644 --- a/src/mame/drivers/beezer.cpp +++ b/src/mame/drivers/beezer.cpp @@ -499,7 +499,7 @@ static MACHINE_CONFIG_START( beezer ) MCFG_CPU_ADD("audiocpu", M6809, XTAL_12MHz / 12) MCFG_CPU_PROGRAM_MAP(sound_map) - MCFG_INPUT_MERGER_ACTIVE_HIGH("audio_irqs") + MCFG_INPUT_MERGER_ANY_HIGH("audio_irqs") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", M6809_IRQ_LINE)) MCFG_DEVICE_ADD("via_u18", VIA6522, 0) @@ -509,13 +509,13 @@ static MACHINE_CONFIG_START( beezer ) MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("via_u6", via6522_device, write_cb1)) MCFG_VIA6522_CB1_HANDLER(WRITELINE(beezer_state, dmod_clr_w)) MCFG_VIA6522_CB2_HANDLER(WRITELINE(beezer_state, dmod_data_w)) - MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("audio_irqs", input_merger_active_high_device, in0_w)) + MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("audio_irqs", input_merger_device, in_w<0>)) MCFG_DEVICE_ADD("ptm", PTM6840, XTAL_12MHz / 12) MCFG_PTM6840_OUT0_CB(WRITELINE(beezer_state, ptm_out0_w)) MCFG_PTM6840_OUT1_CB(WRITELINE(beezer_state, ptm_out1_w)) MCFG_PTM6840_OUT2_CB(WRITELINE(beezer_state, ptm_out2_w)) - MCFG_PTM6840_IRQ_CB(DEVWRITELINE("audio_irqs", input_merger_active_high_device, in1_w)) + MCFG_PTM6840_IRQ_CB(DEVWRITELINE("audio_irqs", input_merger_device, in_w<1>)) // schematics show an input labeled VCO to channel 2, but the source is unknown MCFG_MM5837_ADD("noise") diff --git a/src/mame/drivers/bublbobl.cpp b/src/mame/drivers/bublbobl.cpp index f687f28ee4d..a8823b4727c 100644 --- a/src/mame/drivers/bublbobl.cpp +++ b/src/mame/drivers/bublbobl.cpp @@ -72,7 +72,7 @@ Address Dir Data Name Description 111110100-----00 W xxxxxxxx SOUND command for sound CPU 111110100-----01 W -------- n.c. 111110100-----10 W -------- n.c. -111110100-----11 W -------x SRESET reset sound CPU and sound chips +111110100-----11 W -------x SRESET reset sound CPU, sound chips, and sound CPU to CPU #1 semaphore 111110100-----00 R xxxxxxxx answer from sound CPU (not used) 111110100-----01 R -------x message pending from sound CPU to CPU #1 (not used) 111110100-----01 R ------x- message pending from CPU #1 to sound CPU (not used) @@ -262,10 +262,10 @@ TODO: that's the only thing required for normal operation, but the program does use some of the additional features in its special "test" mode. - tokio: sound support is probably incomplete. There are a couple of unknown - accesses done by the CPU, including to the YM2203 I/O ports. At the - very least, there should be some filters. + accesses done by the sound CPU to the YM2203 I/O ports. At the very least, there + could be some filters. - there are also Bubble Bobble bootlegs with a P8749H MCU, however the MCU + There are also Bubble Bobble bootlegs with a P8749H MCU, however the MCU is protected against reading and the main code only differs by 1 byte from Bubble Bobble. If the MCU were to be dumped that would also make for interesting comparisons. @@ -292,34 +292,65 @@ TODO: * Address maps * *************************************/ - -static ADDRESS_MAP_START( master_map, AS_PROGRAM, 8, bublbobl_state ) +static ADDRESS_MAP_START( common_maincpu_map, AS_PROGRAM, 8, bublbobl_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") AM_RANGE(0xc000, 0xdcff) AM_RAM AM_SHARE("videoram") AM_RANGE(0xdd00, 0xdfff) AM_RAM AM_SHARE("objectram") AM_RANGE(0xe000, 0xf7ff) AM_RAM AM_SHARE("share1") AM_RANGE(0xf800, 0xf9ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") - AM_RANGE(0xfa00, 0xfa00) AM_READWRITE(bublbobl_sound_status_r, bublbobl_sound_command_w) - AM_RANGE(0xfa03, 0xfa03) AM_WRITE(bublbobl_soundcpu_reset_w) - AM_RANGE(0xfa80, 0xfa80) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w) - AM_RANGE(0xfb40, 0xfb40) AM_WRITE(bublbobl_bankswitch_w) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( bublbobl_maincpu_map, AS_PROGRAM, 8, bublbobl_state ) + AM_IMPORT_FROM(common_maincpu_map) + AM_RANGE(0xfa00, 0xfa00) AM_MIRROR(0x007c) AM_DEVREAD("sound_to_main", generic_latch_8_device, read) AM_DEVWRITE("main_to_sound", generic_latch_8_device, write) + AM_RANGE(0xfa01, 0xfa01) AM_MIRROR(0x007c) AM_READ(common_sound_semaphores_r) + AM_RANGE(0xfa03, 0xfa03) AM_MIRROR(0x007c) AM_WRITE(bublbobl_soundcpu_reset_w) + AM_RANGE(0xfa80, 0xfa80) AM_MIRROR(0x007f) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w) + AM_RANGE(0xfb00, 0xfb00) AM_MIRROR(0x003f) AM_WRITE(bublbobl_nmitrigger_w) + AM_RANGE(0xfb40, 0xfb40) AM_MIRROR(0x003f) AM_WRITE(bublbobl_bankswitch_w) AM_RANGE(0xfc00, 0xffff) AM_RAM AM_SHARE("mcu_sharedram") ADDRESS_MAP_END -static ADDRESS_MAP_START( slave_map, AS_PROGRAM, 8, bublbobl_state ) +static ADDRESS_MAP_START( subcpu_map, AS_PROGRAM, 8, bublbobl_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0xe000, 0xf7ff) AM_RAM AM_SHARE("share1") ADDRESS_MAP_END +/* Sound cpu address map + | | | +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 + 0 * * * * * * * * * * * * * * * R ROM (27256 or 27128@ic46) + 1 * * * decoded by 74ls138@ic48 + 1 0 0 0 * * * * * * * * * * * * RW RAM (first half of 6264@ic37[1]) + 1 0 0 1 x x x x x x x x x x x * RW YM2203 OPM chip + 1 0 1 0 x x x x x x x x x x x * RW YM3526 OPL chip + 1 0 1 1 * * decoded by 74ls155@ic33 + 1 0 1 1 x x x x x x x x x x 0 0 R maincpu_to_sound latch 74ls374 @ic24 and clear maincpu_has_written semaphore + 1 0 1 1 x x x x x x x x x x 0 0 W sound_to_maincpu latch 74ls374 @ic25 and set sound_has_written sempaphore + 1 0 1 1 x x x x x x x x x x 0 1 R read semaphores in d0 and d1 + 1 0 1 1 x x x x x x x x x x 0 1 W set latch to enable sound cpu nmi on maincpu_has_written semaphore active + 1 0 1 1 x x x x x x x x x x 1 x R OPEN BUS + 1 0 1 1 x x x x x x x x x x 1 0 W clear latch to disable sound cpu nmi on maincpu_has_written semaphore active + 1 0 1 1 x x x x x x x x x x 1 1 RW OPEN BUS + 1 0 1 1 x x x x x x x x x x x 0 RW sound latch[2] + 1 1 x x x x x x x x x x x x x x OPEN BUS +(1 1 * * * * * * * * * * * * * * R DIAGNOSTIC ROM[4]) + [1] Technicaly A12 is conencted to the 6264 SRAM too, but the 74ls138 disables the SRAM when A12 is high, so only half is usable + [4] While normally not populated (or even present? not shown on the schematic at all? possibly a holdover from tokio?) + the sound code probes for a ROM here, and will use it if found. +Sound cpu semaphores are both active low: + 74ls74@ic9 [1/2] 'sound_has_written', appears on d0 + 74ls74@ic10 [2/2] 'maincpu_has_written', appears on d1 +*/ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, bublbobl_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x8fff) AM_RAM - AM_RANGE(0x9000, 0x9001) AM_DEVREADWRITE("ym1", ym2203_device, read, write) - AM_RANGE(0xa000, 0xa001) AM_DEVREADWRITE("ym2", ym3526_device, read, write) - AM_RANGE(0xb000, 0xb000) AM_DEVREAD("soundlatch", generic_latch_8_device, read) AM_WRITE(bublbobl_sound_status_w) - AM_RANGE(0xb001, 0xb001) AM_WRITE(bublbobl_sh_nmi_enable_w) AM_READNOP - AM_RANGE(0xb002, 0xb002) AM_WRITE(bublbobl_sh_nmi_disable_w) + AM_RANGE(0x9000, 0x9001) AM_MIRROR(0x0ffe) AM_DEVREADWRITE("ym1", ym2203_device, read, write) + AM_RANGE(0xa000, 0xa001) AM_MIRROR(0x0ffe) AM_DEVREADWRITE("ym2", ym3526_device, read, write) + AM_RANGE(0xb000, 0xb000) AM_MIRROR(0x0ffc) AM_DEVREAD("main_to_sound", generic_latch_8_device, read) AM_DEVWRITE("sound_to_main", generic_latch_8_device, write) + AM_RANGE(0xb001, 0xb001) AM_MIRROR(0x0ffc) AM_READ(common_sound_semaphores_r) AM_DEVWRITE("soundnmi", input_merger_device, in_set<0>) + AM_RANGE(0xb002, 0xb002) AM_MIRROR(0x0ffc) AM_DEVWRITE("soundnmi", input_merger_device, in_clear<0>); AM_RANGE(0xe000, 0xffff) AM_ROM // space for diagnostic ROM? ADDRESS_MAP_END @@ -337,16 +368,14 @@ static ADDRESS_MAP_START( mcu_map, AS_PROGRAM, 8, bublbobl_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( bootleg_map, AS_PROGRAM, 8, bublbobl_state ) - AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") - AM_RANGE(0xc000, 0xdcff) AM_RAM AM_SHARE("videoram") - AM_RANGE(0xdd00, 0xdfff) AM_RAM AM_SHARE("objectram") - AM_RANGE(0xe000, 0xf7ff) AM_RAM AM_SHARE("share1") - AM_RANGE(0xf800, 0xf9ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") - AM_RANGE(0xfa00, 0xfa00) AM_READWRITE(bublbobl_sound_status_r, bublbobl_sound_command_w) - AM_RANGE(0xfa03, 0xfa03) AM_WRITE(bublbobl_soundcpu_reset_w) - AM_RANGE(0xfa80, 0xfa80) AM_WRITENOP // ??? - AM_RANGE(0xfb40, 0xfb40) AM_WRITE(bublbobl_bankswitch_w) + AM_IMPORT_FROM(common_maincpu_map) + AM_RANGE(0xfa00, 0xfa00) AM_MIRROR(0x007c) AM_DEVREAD("sound_to_main", generic_latch_8_device, read) AM_DEVWRITE("main_to_sound", generic_latch_8_device, write) + AM_RANGE(0xfa01, 0xfa01) AM_MIRROR(0x007c) AM_READ(common_sound_semaphores_r) + AM_RANGE(0xfa03, 0xfa03) AM_MIRROR(0x007c) AM_WRITE(bublbobl_soundcpu_reset_w) + AM_RANGE(0xfa80, 0xfa80) AM_MIRROR(0x007f) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w) + AM_RANGE(0xfb00, 0xfb00) AM_MIRROR(0x003f) AM_WRITE(bublbobl_nmitrigger_w) + AM_RANGE(0xfb40, 0xfb40) AM_MIRROR(0x003f) AM_WRITE(bublbobl_bankswitch_w) + // above here is identical to non-bootleg AM_RANGE(0xfc00, 0xfcff) AM_RAM AM_RANGE(0xfd00, 0xfdff) AM_RAM AM_RANGE(0xfe00, 0xfe03) AM_READWRITE(boblbobl_ic43_a_r, boblbobl_ic43_a_w) @@ -361,12 +390,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( tokio_map, AS_PROGRAM, 8, bublbobl_state ) - AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") - AM_RANGE(0xc000, 0xdcff) AM_RAM AM_SHARE("videoram") - AM_RANGE(0xdd00, 0xdfff) AM_RAM AM_SHARE("objectram") - AM_RANGE(0xe000, 0xf7ff) AM_RAM AM_SHARE("share1") - AM_RANGE(0xf800, 0xf9ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") + AM_IMPORT_FROM(common_maincpu_map) AM_RANGE(0xfa00, 0xfa00) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w) AM_RANGE(0xfa03, 0xfa03) AM_READ_PORT("DSW0") AM_RANGE(0xfa04, 0xfa04) AM_READ_PORT("DSW1") @@ -376,7 +400,7 @@ static ADDRESS_MAP_START( tokio_map, AS_PROGRAM, 8, bublbobl_state ) AM_RANGE(0xfa80, 0xfa80) AM_WRITE(tokio_bankswitch_w) AM_RANGE(0xfb00, 0xfb00) AM_WRITE(tokio_videoctrl_w) AM_RANGE(0xfb80, 0xfb80) AM_WRITE(bublbobl_nmitrigger_w) - AM_RANGE(0xfc00, 0xfc00) AM_READWRITE(bublbobl_sound_status_r, bublbobl_sound_command_w) + AM_RANGE(0xfc00, 0xfc00) AM_DEVREAD("sound_to_main", generic_latch_8_device, read) AM_DEVWRITE("main_to_sound", generic_latch_8_device, write) ADDRESS_MAP_END static ADDRESS_MAP_START( tokio_map_mcu, AS_PROGRAM, 8, bublbobl_state ) @@ -390,7 +414,7 @@ static ADDRESS_MAP_START( tokio_map_bootleg, AS_PROGRAM, 8, bublbobl_state ) ADDRESS_MAP_END -static ADDRESS_MAP_START( tokio_slave_map, AS_PROGRAM, 8, bublbobl_state ) +static ADDRESS_MAP_START( tokio_subcpu_map, AS_PROGRAM, 8, bublbobl_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x97ff) AM_RAM AM_SHARE("share1") ADDRESS_MAP_END @@ -398,10 +422,10 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( tokio_sound_map, AS_PROGRAM, 8, bublbobl_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x8fff) AM_RAM - AM_RANGE(0x9000, 0x9000) AM_DEVREAD("soundlatch", generic_latch_8_device, read) AM_WRITE(bublbobl_sound_status_w) - AM_RANGE(0x9800, 0x9800) AM_READNOP // ??? - AM_RANGE(0xa000, 0xa000) AM_WRITE(bublbobl_sh_nmi_disable_w) - AM_RANGE(0xa800, 0xa800) AM_WRITE(bublbobl_sh_nmi_enable_w) + AM_RANGE(0x9000, 0x9000) AM_DEVREAD("main_to_sound", generic_latch_8_device, read) AM_DEVWRITE("sound_to_main", generic_latch_8_device, write) + AM_RANGE(0x9800, 0x9800) AM_READ(common_sound_semaphores_r) + AM_RANGE(0xa000, 0xa000) AM_DEVWRITE("soundnmi", input_merger_device, in_clear<0>) + AM_RANGE(0xa800, 0xa800) AM_DEVWRITE("soundnmi", input_merger_device, in_set<0>) AM_RANGE(0xb000, 0xb001) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write) AM_RANGE(0xe000, 0xffff) AM_ROM // space for diagnostic ROM? ADDRESS_MAP_END @@ -781,17 +805,19 @@ GFXDECODE_END MACHINE_START_MEMBER(bublbobl_state,common) { - save_item(NAME(m_sound_nmi_enable)); - save_item(NAME(m_pending_nmi)); - save_item(NAME(m_sound_status)); + m_sreset_old = CLEAR_LINE; save_item(NAME(m_video_enable)); + save_item(NAME(m_sreset_old)); } -MACHINE_RESET_MEMBER(bublbobl_state,common) +MACHINE_RESET_MEMBER(bublbobl_state,common) // things common on both tokio and bubble bobble hw { - m_sound_nmi_enable = 0; - m_pending_nmi = 0; - m_sound_status = 0; + m_soundnmi->in_w<0>(0); // clear sound NMI stuff + m_soundnmi->in_w<1>(0); + m_subcpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); // if a subcpu nmi is active (extremely remote chance), it is cleared + m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); // maincpu is reset + m_subcpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); // subcpu is reset + common_sreset(PULSE_LINE); // /SRESET is pulsed } @@ -800,14 +826,13 @@ MACHINE_START_MEMBER(bublbobl_state,tokio) MACHINE_START_CALL_MEMBER(common); } - MACHINE_RESET_MEMBER(bublbobl_state,tokio) { MACHINE_RESET_CALL_MEMBER(common); + tokio_bankswitch_w(m_maincpu->device_t::memory().space(AS_PROGRAM), 0, 0x00, 0xFF); // force a bankswitch write of all zeroes, as /RESET clears the latch + tokio_videoctrl_w(m_maincpu->device_t::memory().space(AS_PROGRAM), 0, 0x00, 0xFF); // TODO: does /RESET clear this the same as above? probably yes, needs tracing... } - - static MACHINE_CONFIG_START( tokio ) /* basic machine hardware */ @@ -815,8 +840,8 @@ static MACHINE_CONFIG_START( tokio ) MCFG_CPU_PROGRAM_MAP(tokio_map_mcu) MCFG_CPU_VBLANK_INT_DRIVER("screen", bublbobl_state, irq0_line_hold) - MCFG_CPU_ADD("slave", Z80, MAIN_XTAL/4) // 6 MHz - MCFG_CPU_PROGRAM_MAP(tokio_slave_map) + MCFG_CPU_ADD("subcpu", Z80, MAIN_XTAL/4) // 6 MHz + MCFG_CPU_PROGRAM_MAP(tokio_subcpu_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", bublbobl_state, irq0_line_hold) MCFG_CPU_ADD("audiocpu", Z80, MAIN_XTAL/8) // 3 MHz @@ -824,9 +849,10 @@ static MACHINE_CONFIG_START( tokio ) MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, MAIN_XTAL/8) // 3 Mhz - MCFG_QUANTUM_PERFECT_CPU("maincpu") + MCFG_QUANTUM_PERFECT_CPU("maincpu") // is this necessary? MCFG_WATCHDOG_ADD("watchdog") + MCFG_WATCHDOG_VBLANK_INIT("screen", 128); // 74LS393, counts 128 vblanks before firing watchdog; same circuit as taitosj uses MCFG_MACHINE_START_OVERRIDE(bublbobl_state, tokio) MCFG_MACHINE_RESET_OVERRIDE(bublbobl_state, tokio) @@ -845,7 +871,13 @@ static MACHINE_CONFIG_START( tokio ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_INPUT_MERGER_ALL_HIGH("soundnmi") + MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI)) + + MCFG_GENERIC_LATCH_8_ADD("main_to_sound") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(DEVWRITELINE("soundnmi", input_merger_device, in_w<1>)) + + MCFG_GENERIC_LATCH_8_ADD("sound_to_main") MCFG_SOUND_ADD("ymsnd", YM2203, MAIN_XTAL/8) MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) @@ -855,13 +887,25 @@ static MACHINE_CONFIG_START( tokio ) MCFG_SOUND_ROUTE(3, "mono", 1.0) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( bublboblp, tokio ) + MCFG_DEVICE_REMOVE("bmcu") // no mcu, socket is empty + + // watchdog circuit is actually present on the prototype pcb, but is either + // hooked up wrong in MAME for tokio in general, or is disabled with a wire + // jumper under the epoxy + MCFG_DEVICE_REMOVE("watchdog") + MCFG_WATCHDOG_ADD("watchdog") // this adds back a watchdog, but due to the way MAME handles watchdogs, it will never fire unless it first gets at least one pulse, which it never will. + + MCFG_CPU_REPLACE("maincpu", Z80, MAIN_XTAL/4) // 6 MHz + MCFG_CPU_PROGRAM_MAP(tokio_map) // no mcu or resistors at all + MCFG_CPU_VBLANK_INT_DRIVER("screen", bublbobl_state, irq0_line_hold) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( tokiob, tokio ) + MCFG_DEVICE_REMOVE("bmcu") // no mcu, but see below... - MCFG_DEVICE_REMOVE("maincpu") - MCFG_DEVICE_REMOVE("bmcu") - - MCFG_CPU_ADD("maincpu", Z80, MAIN_XTAL/4) // 6 MHz - MCFG_CPU_PROGRAM_MAP(tokio_map_bootleg) + MCFG_CPU_REPLACE("maincpu", Z80, MAIN_XTAL/4) // 6 MHz + MCFG_CPU_PROGRAM_MAP(tokio_map_bootleg) // resistor tying mcu's footprint PA6 pin low so mcu reads always return 0xBF MCFG_CPU_VBLANK_INT_DRIVER("screen", bublbobl_state, irq0_line_hold) MACHINE_CONFIG_END @@ -884,10 +928,10 @@ MACHINE_START_MEMBER(bublbobl_state,bublbobl) save_item(NAME(m_port4_out)); } - MACHINE_RESET_MEMBER(bublbobl_state,bublbobl) { MACHINE_RESET_CALL_MEMBER(common); + bublbobl_bankswitch_w(m_maincpu->device_t::memory().space(AS_PROGRAM), 0, 0x00, 0xFF); // force a bankswitch write of all zeroes, as /RESET clears the latch m_ddr1 = 0; m_ddr2 = 0; @@ -907,11 +951,11 @@ static MACHINE_CONFIG_START( bublbobl ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MAIN_XTAL/4) // 6 MHz - MCFG_CPU_PROGRAM_MAP(master_map) + MCFG_CPU_PROGRAM_MAP(bublbobl_maincpu_map) // IRQs are triggered by the MCU - MCFG_CPU_ADD("slave", Z80, MAIN_XTAL/4) // 6 MHz - MCFG_CPU_PROGRAM_MAP(slave_map) + MCFG_CPU_ADD("subcpu", Z80, MAIN_XTAL/4) // 6 MHz + MCFG_CPU_PROGRAM_MAP(subcpu_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", bublbobl_state, irq0_line_hold) MCFG_CPU_ADD("audiocpu", Z80, MAIN_XTAL/8) // 3 MHz @@ -924,6 +968,7 @@ static MACHINE_CONFIG_START( bublbobl ) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs MCFG_WATCHDOG_ADD("watchdog") + MCFG_WATCHDOG_VBLANK_INIT("screen", 128); // 74LS393, counts 128 vblanks before firing watchdog; same circuit as taitosj uses MCFG_MACHINE_START_OVERRIDE(bublbobl_state, bublbobl) MCFG_MACHINE_RESET_OVERRIDE(bublbobl_state, bublbobl) @@ -942,17 +987,26 @@ static MACHINE_CONFIG_START( bublbobl ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_INPUT_MERGER_ANY_HIGH("soundirq") + MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_IRQ0)) + + MCFG_INPUT_MERGER_ALL_HIGH("soundnmi") + MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("audiocpu", INPUT_LINE_NMI)) + + MCFG_GENERIC_LATCH_8_ADD("main_to_sound") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(DEVWRITELINE("soundnmi", input_merger_device, in_w<1>)) + + MCFG_GENERIC_LATCH_8_ADD("sound_to_main") MCFG_SOUND_ADD("ym1", YM2203, MAIN_XTAL/8) - MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) + MCFG_YM2203_IRQ_HANDLER(DEVWRITELINE("soundirq", input_merger_device, in_w<0>)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MCFG_SOUND_ADD("ym2", YM3526, MAIN_XTAL/8) + MCFG_YM3526_IRQ_HANDLER(DEVWRITELINE("soundirq", input_merger_device, in_w<1>)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_CONFIG_END - MACHINE_START_MEMBER(bublbobl_state,boblbobl) { MACHINE_START_CALL_MEMBER(common); @@ -964,6 +1018,7 @@ MACHINE_START_MEMBER(bublbobl_state,boblbobl) MACHINE_RESET_MEMBER(bublbobl_state,boblbobl) { MACHINE_RESET_CALL_MEMBER(common); + bublbobl_bankswitch_w(m_maincpu->device_t::memory().space(AS_PROGRAM), 0, 0x00, 0xff); // force a bankswitch write of all zeroes, as /RESET clears the latch m_ic43_a = 0; m_ic43_b = 0; @@ -999,6 +1054,7 @@ MACHINE_START_MEMBER(bub68705_state, bub68705) MACHINE_RESET_MEMBER(bub68705_state, bub68705) { MACHINE_RESET_CALL_MEMBER(common); + bublbobl_bankswitch_w(m_maincpu->device_t::memory().space(AS_PROGRAM), 0, 0x00, 0xff); // force a bankswitch write of all zeroes, as /RESET clears the latch m_address = 0; m_latch = 0; @@ -1035,7 +1091,7 @@ ROM_START( tokio ) // newer japan set, has -1 revision of roms 02, 03 and 06 ROM_LOAD( "a71-05.ic7", 0x20000, 0x8000, CRC(6da0b945) SHA1(6c80b8333dd95657f99e6ba5b6e877733ac02a8c) ) ROM_LOAD( "a71-06-1.ic8", 0x28000, 0x8000, CRC(56927b3f) SHA1(33fb4e71b95664ecff1f35f6782a14101982a56d) ) - ROM_REGION( 0x10000, "slave", 0 ) /* video CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* video CPU */ ROM_LOAD( "a71-01.ic1", 0x00000, 0x8000, CRC(0867c707) SHA1(7129974f1252b28e9e338bd3c7fcb87210dcf412) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio CPU */ @@ -1078,7 +1134,7 @@ ROM_START( tokioo ) // older japan set, has older roms 02, 03, 06 ROM_LOAD( "a71-05.ic7", 0x20000, 0x8000, CRC(6da0b945) SHA1(6c80b8333dd95657f99e6ba5b6e877733ac02a8c) ) ROM_LOAD( "a71-06.ic8", 0x28000, 0x8000, CRC(447d6779) SHA1(5b329b221357a9cea777415d409a6423529a925c) ) - ROM_REGION( 0x10000, "slave", 0 ) /* video CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* video CPU */ ROM_LOAD( "a71-01.ic1", 0x00000, 0x8000, CRC(0867c707) SHA1(7129974f1252b28e9e338bd3c7fcb87210dcf412) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio CPU */ @@ -1121,7 +1177,7 @@ ROM_START( tokiou ) ROM_LOAD( "a71-05.ic7", 0x20000, 0x8000, CRC(6da0b945) SHA1(6c80b8333dd95657f99e6ba5b6e877733ac02a8c) ) ROM_LOAD( "a71-06-1.ic8", 0x28000, 0x8000, CRC(56927b3f) SHA1(33fb4e71b95664ecff1f35f6782a14101982a56d) ) - ROM_REGION( 0x10000, "slave", 0 ) /* video CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* video CPU */ ROM_LOAD( "a71-01.ic1", 0x00000, 0x8000, CRC(0867c707) SHA1(7129974f1252b28e9e338bd3c7fcb87210dcf412) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio CPU */ @@ -1164,7 +1220,7 @@ ROM_START( tokiob ) ROM_LOAD( "a71-05.ic7", 0x20000, 0x8000, CRC(6da0b945) SHA1(6c80b8333dd95657f99e6ba5b6e877733ac02a8c) ) ROM_LOAD( "6.ic8", 0x28000, 0x8000, CRC(1490e95b) SHA1(a73e1857a1029156f0b5f7f7fe34a37870e72209) ) - ROM_REGION( 0x10000, "slave", 0 ) /* video CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* video CPU */ ROM_LOAD( "a71-01.ic1", 0x00000, 0x8000, CRC(0867c707) SHA1(7129974f1252b28e9e338bd3c7fcb87210dcf412) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio CPU */ @@ -1205,8 +1261,8 @@ ROM_START( bublboblp ) // ic7 socket is empty, under epoxy // ic8 socket is empty, under epoxy - ROM_REGION( 0x10000, "slave", 0 ) /* video CPU */ - ROM_LOAD( "slave.ic1", 0x00000, 0x8000, CRC(e8187e8f) SHA1(74b0442c61fe7f745ce0014bd5b7948783a323bd) ) // blank label, under epoxy + ROM_REGION( 0x10000, "subcpu", 0 ) /* video CPU */ + ROM_LOAD( "subcpu.ic1", 0x00000, 0x8000, CRC(e8187e8f) SHA1(74b0442c61fe7f745ce0014bd5b7948783a323bd) ) // blank label, under epoxy ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio CPU */ ROM_LOAD( "audiocpu.ic10", 0x0000, 0x08000, CRC(c516c26e) SHA1(8cdeff2b8bb21d8c118f48e43b567a4e5b5e7184) ) // blank label, under epoxy @@ -1259,7 +1315,7 @@ ROM_START( bublbobl ) ROM_LOAD( "a78-05-1.52", 0x10000, 0x10000, CRC(9f8ee242) SHA1(924150d4e7e087a9b2b0a294c2d0e9903a266c6c) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "a78-08.37", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1308,7 +1364,7 @@ ROM_START( bublbobl1 ) ROM_LOAD( "a78-05.52", 0x10000, 0x10000, CRC(53f4bc6e) SHA1(15a2e6d83438d4136b154b3d90dd2cf9f1ce572c) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "a78-08.37", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1357,7 +1413,7 @@ ROM_START( bublboblr ) ROM_LOAD( "a78-24.52", 0x10000, 0x10000, CRC(b7afedc4) SHA1(6e4c8712f1fdf000e231cfd622dd3b514c61a6fd) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "a78-08.37", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1406,7 +1462,7 @@ ROM_START( bublboblr1 ) ROM_LOAD( "a78-21.52", 0x10000, 0x10000, CRC(2844033d) SHA1(6ac0b09d0325990cf18935f35b0adbc033758947) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "a78-08.37", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1449,7 +1505,7 @@ ROM_START( boblbobl ) ROM_LOAD( "bb4", 0x18000, 0x08000, CRC(afda99d8) SHA1(304324074ae726501bbb08e683850639d69939fb) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "a78-08.37", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1487,7 +1543,7 @@ ROM_START( bbredux ) ROM_LOAD( "redux_bb5", 0x10000, 0x8000, CRC(d29d3444) SHA1(3db694a6ba2ba2ed85d31c2bc4c7c94911b99b85) ) ROM_LOAD( "redux_bb4", 0x18000, 0x8000, CRC(984149bd) SHA1(9a0f96eee038712277f652545a343587f711b9aa) ) - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "a78-08.37", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1526,7 +1582,7 @@ ROM_START( sboblbobl ) ROM_LOAD( "cpu2-4.bin", 0x18000, 0x08000, CRC(3f9fed10) SHA1(1cc18a58d9a27495048825836accfa81ebbc0c56) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "a78-08.37", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1556,7 +1612,7 @@ ROM_START( sboblbobla ) ROM_LOAD( "1b.bin", 0x18000, 0x08000, CRC(1f29b5c0) SHA1(c15c84ca11cc10edac6340468bca463ecb2d89e6) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "1e.rom", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1590,7 +1646,7 @@ ROM_START( sboblboblb ) ROM_LOAD( "bbb-4.rom", 0x18000, 0x08000, CRC(94c75591) SHA1(7698bc4b7d20e554a73a489cd3a15ae61b350e37) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "a78-08.37", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1626,7 +1682,7 @@ ROM_START( sboblboblc ) ROM_LOAD( "4", 0x18000, 0x08000, CRC(1f29b5c0) SHA1(c15c84ca11cc10edac6340468bca463ecb2d89e6) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "1", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1662,7 +1718,7 @@ ROM_START( sboblbobld ) ROM_LOAD( "4.bin", 0x18000, 0x08000, CRC(13fe9baa) SHA1(ca1ca240d755621e533d9bbbdd8d953154670499) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "1.bin", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1697,7 +1753,7 @@ ROM_START( bub68705 ) ROM_LOAD( "3.bin", 0x18000, 0x08000, CRC(e6c698f2) SHA1(8df116075f5891f74d0da8966ed11c597b5f544f) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "4.bin", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1735,7 +1791,7 @@ ROM_START( dland ) ROM_LOAD( "dl_4.u68", 0x18000, 0x08000, CRC(c6a3776f) SHA1(473fc8c990046f90517f2506f1ca59eeb7ea13e5) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "dl_1.u42", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1761,7 +1817,7 @@ ROM_START( bublcave ) ROM_LOAD( "bublcave-06.51", 0x00000, 0x08000, CRC(e8b9af5e) SHA1(dec44e47634a402df212806e84e3a810f8442776) ) ROM_LOAD( "bublcave-05.52", 0x10000, 0x10000, CRC(cfe14cb8) SHA1(17d463c755f630ae9d05943515fa4828972bd7b0) ) - ROM_REGION( 0x10000, "slave", 0 ) + ROM_REGION( 0x10000, "subcpu", 0 ) ROM_LOAD( "bublcave-08.37", 0x0000, 0x08000, CRC(a9384086) SHA1(26e686671d6d3ba3759716bf46e7f951bbb8a291) ) ROM_REGION( 0x10000, "audiocpu", 0 ) @@ -1797,7 +1853,7 @@ ROM_START( boblcave ) ROM_LOAD( "lc12_bb4", 0x18000, 0x08000, CRC(bd7afdf4) SHA1(a9bcdc857b1f252c36a5a70f5027a11737f8dd59) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "bublcave-08.37", 0x0000, 0x08000, CRC(a9384086) SHA1(26e686671d6d3ba3759716bf46e7f951bbb8a291) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1832,7 +1888,7 @@ ROM_START( bublcave11 ) ROM_LOAD( "bublcave10-06.51", 0x00000, 0x08000, CRC(185cc219) SHA1(dfb312f144fb01c07581cb8ea55ab0dc92ccd5b2) ) ROM_LOAD( "bublcave11-05.52", 0x10000, 0x10000, CRC(b6b02df3) SHA1(542589544216a54f84c213b161d7145934875d2b) ) - ROM_REGION( 0x10000, "slave", 0 ) + ROM_REGION( 0x10000, "subcpu", 0 ) ROM_LOAD( "bublcave11-08.37", 0x0000, 0x08000, CRC(c5d14e62) SHA1(b32b1ca76b54755a69a7a346d01545f2699e1363) ) ROM_REGION( 0x10000, "audiocpu", 0 ) @@ -1864,7 +1920,7 @@ ROM_START( bublcave10 ) ROM_LOAD( "bublcave10-06.51", 0x00000, 0x08000, CRC(185cc219) SHA1(dfb312f144fb01c07581cb8ea55ab0dc92ccd5b2) ) ROM_LOAD( "bublcave10-05.52", 0x10000, 0x10000, CRC(381cdde7) SHA1(0c9de44d7dbad754e873af8ddb5a2736f5ec2096) ) - ROM_REGION( 0x10000, "slave", 0 ) + ROM_REGION( 0x10000, "subcpu", 0 ) ROM_LOAD( "bublcave10-08.37", 0x0000, 0x08000, CRC(026a68e1) SHA1(9e54310a9f1f5187ea6eb49d9189865b44708a7e) ) ROM_REGION( 0x10000, "audiocpu", 0 ) @@ -1898,7 +1954,7 @@ ROM_START( bublboblb ) ROM_LOAD( "bbaladar.5", 0x10000, 0x8000, CRC(16386e9a) SHA1(77fa3f5ecce5c79ba52098c0870482459926b415) ) ROM_LOAD( "bbaladar.4", 0x18000, 0x8000, CRC(0c4bcb07) SHA1(3e3f7fa098d6be61d265cab5258dbd0e279bd8ed) ) - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "a78-08.37", 0x0000, 0x08000, CRC(ae11a07b) SHA1(af7a335c8da637103103cc274e077f123908ebb7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -1941,25 +1997,11 @@ void bublbobl_state::configure_banks( ) membank("bank1")->configure_entries(0, 8, &ROM[0x10000], 0x4000); } -DRIVER_INIT_MEMBER(bublbobl_state,bublbobl) +DRIVER_INIT_MEMBER(bublbobl_state,common) { configure_banks(); - - /* we init this here, so that it does not conflict with tokio init, below */ - m_video_enable = 0; } -DRIVER_INIT_MEMBER(bublbobl_state,tokio) -{ - configure_banks(); - - /* preemptively enable video, the bit is not mapped for this game and */ - /* I don't know if it even has it. */ - m_video_enable = 1; -} - - - DRIVER_INIT_MEMBER(bublbobl_state,dland) { // rearrange gfx to original format @@ -1971,7 +2013,7 @@ DRIVER_INIT_MEMBER(bublbobl_state,dland) for (i = 0x40000; i < 0x80000; i++) src[i] = BITSWAP8(src[i],7,4,5,6,3,0,1,2); - DRIVER_INIT_CALL(bublbobl); + DRIVER_INIT_CALL(common); } @@ -1980,32 +2022,32 @@ DRIVER_INIT_MEMBER(bublbobl_state,dland) * Game driver(s) * *************************************/ +// YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS +GAME( 1986, tokio, 0, tokio, tokio, bublbobl_state, common, ROT90, "Taito Corporation", "Tokio / Scramble Formation (newer)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, tokioo, tokio, tokio, tokio, bublbobl_state, common, ROT90, "Taito Corporation", "Tokio / Scramble Formation (older)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, tokiou, tokio, tokio, tokio, bublbobl_state, common, ROT90, "Taito America Corporation (Romstar license)", "Tokio / Scramble Formation (US)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, tokiob, tokio, tokiob, tokio_base, bublbobl_state, common, ROT90, "bootleg", "Tokio / Scramble Formation (bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, tokio, 0, tokio, tokio, bublbobl_state, tokio, ROT90, "Taito Corporation", "Tokio / Scramble Formation (newer)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, tokioo, tokio, tokio, tokio, bublbobl_state, tokio, ROT90, "Taito Corporation", "Tokio / Scramble Formation (older)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, tokiou, tokio, tokio, tokio, bublbobl_state, tokio, ROT90, "Taito America Corporation (Romstar license)", "Tokio / Scramble Formation (US)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, tokiob, tokio, tokiob, tokio_base, bublbobl_state, tokio, ROT90, "bootleg", "Tokio / Scramble Formation (bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, bublboblp, bublbobl, bublboblp, bublboblp, bublbobl_state, common, ROT0, "Taito Corporation", "Bubble Bobble (prototype on Tokio hardware)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, bublbobl, 0, bublbobl, bublbobl, bublbobl_state, common, ROT0, "Taito Corporation", "Bubble Bobble (Japan, Ver 0.1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, bublbobl1, bublbobl, bublbobl, bublbobl, bublbobl_state, common, ROT0, "Taito Corporation", "Bubble Bobble (Japan, Ver 0.0)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, bublboblr, bublbobl, bublbobl, bublbobl, bublbobl_state, common, ROT0, "Taito America Corporation (Romstar license)", "Bubble Bobble (US, Ver 5.1)", MACHINE_SUPPORTS_SAVE ) // newest release, with mode select +GAME( 1986, bublboblr1, bublbobl, bublbobl, bublbobl, bublbobl_state, common, ROT0, "Taito America Corporation (Romstar license)", "Bubble Bobble (US, Ver 1.0)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, bublboblp, bublbobl, tokiob, bublboblp, bublbobl_state, tokio, ROT0, "Taito Corporation", "Bubble Bobble (prototype on Tokio hardware)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, bublbobl, 0, bublbobl, bublbobl, bublbobl_state, bublbobl, ROT0, "Taito Corporation", "Bubble Bobble (Japan, Ver 0.1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, bublbobl1, bublbobl, bublbobl, bublbobl, bublbobl_state, bublbobl, ROT0, "Taito Corporation", "Bubble Bobble (Japan, Ver 0.0)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, bublboblr, bublbobl, bublbobl, bublbobl, bublbobl_state, bublbobl, ROT0, "Taito America Corporation (Romstar license)", "Bubble Bobble (US, Ver 5.1)", MACHINE_SUPPORTS_SAVE ) // newest release, with mode select -GAME( 1986, bublboblr1, bublbobl, bublbobl, bublbobl, bublbobl_state, bublbobl, ROT0, "Taito America Corporation (Romstar license)", "Bubble Bobble (US, Ver 1.0)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, boblbobl, bublbobl, boblbobl, boblbobl, bublbobl_state, common, ROT0, "bootleg", "Bobble Bobble (bootleg of Bubble Bobble)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, sboblbobl, bublbobl, boblbobl, sboblbobl, bublbobl_state, common, ROT0, "bootleg (Datsu)", "Super Bobble Bobble (bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, sboblbobla, bublbobl, boblbobl, boblbobl, bublbobl_state, common, ROT0, "bootleg", "Super Bobble Bobble (bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, sboblboblb, bublbobl, boblbobl, sboblboblb, bublbobl_state, common, ROT0, "bootleg", "Super Bobble Bobble (bootleg, set 3)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, sboblbobld, bublbobl, boblbobl, sboblboblb, bublbobl_state, common, ROT0, "bootleg", "Super Bobble Bobble (bootleg, set 4)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, sboblboblc, bublbobl, boblbobl, sboblboblb, bublbobl_state, common, ROT0, "bootleg", "Super Bubble Bobble (bootleg)", MACHINE_SUPPORTS_SAVE ) // the title screen on this one isn't hacked +GAME( 1986, bub68705, bublbobl, bub68705, bublbobl, bub68705_state, common, ROT0, "bootleg", "Bubble Bobble (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, boblbobl, bublbobl, boblbobl, boblbobl, bublbobl_state, bublbobl, ROT0, "bootleg", "Bobble Bobble (bootleg of Bubble Bobble)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, sboblbobl, bublbobl, boblbobl, sboblbobl, bublbobl_state, bublbobl, ROT0, "bootleg (Datsu)", "Super Bobble Bobble (bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, sboblbobla, bublbobl, boblbobl, boblbobl, bublbobl_state, bublbobl, ROT0, "bootleg", "Super Bobble Bobble (bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, sboblboblb, bublbobl, boblbobl, sboblboblb, bublbobl_state, bublbobl, ROT0, "bootleg", "Super Bobble Bobble (bootleg, set 3)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, sboblbobld, bublbobl, boblbobl, sboblboblb, bublbobl_state, bublbobl, ROT0, "bootleg", "Super Bobble Bobble (bootleg, set 4)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, sboblboblc, bublbobl, boblbobl, sboblboblb, bublbobl_state, bublbobl, ROT0, "bootleg", "Super Bubble Bobble (bootleg)", MACHINE_SUPPORTS_SAVE ) // the title screen on this one isn't hacked -GAME( 1986, bub68705, bublbobl, bub68705, bublbobl, bub68705_state, bublbobl, ROT0, "bootleg", "Bubble Bobble (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, dland, bublbobl, boblbobl, dland, bublbobl_state, dland, ROT0, "bootleg", "Dream Land / Super Dream Land (bootleg of Bubble Bobble)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, dland, bublbobl, boblbobl, dland, bublbobl_state, dland, ROT0, "bootleg", "Dream Land / Super Dream Land (bootleg of Bubble Bobble)", MACHINE_SUPPORTS_SAVE ) +GAME( 2013, bbredux, bublbobl, boblbobl, boblbobl, bublbobl_state, common, ROT0, "bootleg (Punji)", "Bubble Bobble ('bootleg redux' hack for Bobble Bobble PCB)", MACHINE_SUPPORTS_SAVE ) // for use on non-MCU bootleg boards (Bobble Bobble etc.) has more faithful simulation of the protection device (JAN-04-2015 release) +GAME( 2013, bublboblb, bublbobl, boblbobl, boblcave, bublbobl_state, common, ROT0, "bootleg (Aladar)", "Bubble Bobble (for Bobble Bobble PCB)", MACHINE_SUPPORTS_SAVE ) // alt bootleg/hack to restore proper MCU behavior to bootleg boards -GAME( 2013, bbredux, bublbobl, boblbobl, boblbobl, bublbobl_state, bublbobl, ROT0, "bootleg (Punji)", "Bubble Bobble ('bootleg redux' hack for Bobble Bobble PCB)", MACHINE_SUPPORTS_SAVE ) // for use on non-MCU bootleg boards (Bobble Bobble etc.) has more faithful simulation of the protection device (JAN-04-2015 release) -GAME( 2013, bublboblb, bublbobl, boblbobl, boblcave, bublbobl_state, bublbobl, ROT0, "bootleg (Aladar)", "Bubble Bobble (for Bobble Bobble PCB)", MACHINE_SUPPORTS_SAVE ) // alt bootleg/hack to restore proper MCU behavior to bootleg boards - -GAME( 2013, bublcave, bublbobl, bublbobl, bublbobl, bublbobl_state, bublbobl, ROT0, "hack (Bisboch and Aladar)", "Bubble Bobble: Lost Cave V1.2", MACHINE_SUPPORTS_SAVE ) -GAME( 2013, boblcave, bublbobl, boblbobl, boblcave, bublbobl_state, bublbobl, ROT0, "hack (Bisboch and Aladar)", "Bubble Bobble: Lost Cave V1.2 (for Bobble Bobble PCB)", MACHINE_SUPPORTS_SAVE ) -GAME( 2012, bublcave11, bublbobl, bublbobl, bublbobl, bublbobl_state, bublbobl, ROT0, "hack (Bisboch and Aladar)", "Bubble Bobble: Lost Cave V1.1", MACHINE_SUPPORTS_SAVE ) -GAME( 2012, bublcave10, bublbobl, bublbobl, bublbobl, bublbobl_state, bublbobl, ROT0, "hack (Bisboch and Aladar)", "Bubble Bobble: Lost Cave V1.0", MACHINE_SUPPORTS_SAVE ) +GAME( 2013, bublcave, bublbobl, bublbobl, bublbobl, bublbobl_state, common, ROT0, "hack (Bisboch and Aladar)", "Bubble Bobble: Lost Cave V1.2", MACHINE_SUPPORTS_SAVE ) +GAME( 2013, boblcave, bublbobl, boblbobl, boblcave, bublbobl_state, common, ROT0, "hack (Bisboch and Aladar)", "Bubble Bobble: Lost Cave V1.2 (for Bobble Bobble PCB)", MACHINE_SUPPORTS_SAVE ) +GAME( 2012, bublcave11, bublbobl, bublbobl, bublbobl, bublbobl_state, common, ROT0, "hack (Bisboch and Aladar)", "Bubble Bobble: Lost Cave V1.1", MACHINE_SUPPORTS_SAVE ) +GAME( 2012, bublcave10, bublbobl, bublbobl, bublbobl, bublbobl_state, common, ROT0, "hack (Bisboch and Aladar)", "Bubble Bobble: Lost Cave V1.0", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/cmi.cpp b/src/mame/drivers/cmi.cpp index f494cbfc3ab..57a7b55c6a1 100644 --- a/src/mame/drivers/cmi.cpp +++ b/src/mame/drivers/cmi.cpp @@ -2854,7 +2854,7 @@ static MACHINE_CONFIG_START( cmi2x ) MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("ank_pia", pia6821_device, ca2_w)) MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(cmi_state, mkbd_kbd_acia_int)) - MCFG_INPUT_MERGER_ACTIVE_HIGH("irqs") + MCFG_INPUT_MERGER_ANY_HIGH("irqs") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("alphakeys", M6802_IRQ_LINE)) MCFG_DEVICE_MODIFY("ank_pia") diff --git a/src/mame/drivers/missb2.cpp b/src/mame/drivers/missb2.cpp index 9d3c5692711..a7848e92fe4 100644 --- a/src/mame/drivers/missb2.cpp +++ b/src/mame/drivers/missb2.cpp @@ -174,16 +174,17 @@ READ8_MEMBER(missb2_state::missb2_oki_r) /* Memory Maps */ -static ADDRESS_MAP_START( master_map, AS_PROGRAM, 8, missb2_state ) +static ADDRESS_MAP_START( maincpu_map, AS_PROGRAM, 8, missb2_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") AM_RANGE(0xc000, 0xdcff) AM_RAM AM_SHARE("videoram") AM_RANGE(0xdd00, 0xdfff) AM_RAM AM_SHARE("objectram") AM_RANGE(0xe000, 0xf7ff) AM_RAM AM_SHARE("share1") AM_RANGE(0xf800, 0xf9ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") - AM_RANGE(0xfa00, 0xfa00) AM_WRITE(bublbobl_sound_command_w) - AM_RANGE(0xfa03, 0xfa03) AM_WRITENOP // sound cpu reset - AM_RANGE(0xfa80, 0xfa80) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w) AM_MIRROR(0x007f) + AM_RANGE(0xfa00, 0xfa00) AM_MIRROR(0x007c) AM_DEVREAD("sound_to_main", generic_latch_8_device, read) AM_DEVWRITE("main_to_sound", generic_latch_8_device, write) + AM_RANGE(0xfa01, 0xfa01) AM_MIRROR(0x007c) AM_READ(common_sound_semaphores_r) + AM_RANGE(0xfa03, 0xfa03) AM_MIRROR(0x007c) AM_WRITE(bublbobl_soundcpu_reset_w) + AM_RANGE(0xfa80, 0xfa80) AM_MIRROR(0x007f) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w) AM_RANGE(0xfb40, 0xfb40) AM_WRITE(bublbobl_bankswitch_w) AM_RANGE(0xfc00, 0xfcff) AM_RAM AM_RANGE(0xfd00, 0xfdff) AM_RAM // ??? @@ -197,7 +198,7 @@ static ADDRESS_MAP_START( master_map, AS_PROGRAM, 8, missb2_state ) AM_RANGE(0xff98, 0xff98) AM_WRITENOP // ??? ADDRESS_MAP_END -static ADDRESS_MAP_START( slave_map, AS_PROGRAM, 8, missb2_state ) +static ADDRESS_MAP_START( subcpu_map, AS_PROGRAM, 8, missb2_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x9000, 0x9fff) AM_ROMBANK("bank2") // ROM data for the background palette ram AM_RANGE(0xa000, 0xafff) AM_ROMBANK("bank3") // ROM data for the background palette ram @@ -211,15 +212,16 @@ static ADDRESS_MAP_START( slave_map, AS_PROGRAM, 8, missb2_state ) ADDRESS_MAP_END // Looks like the original bublbobl code modified to support the OKI M6295. - +// due to some really wacky bugs in the way the oki6295 was hacked in place, writes will happen to +// many addresses other than 9000: 9000-9001, 0000-0001, 3827-3828, 44a8-44a9 static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, missb2_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x8fff) AM_RAM - AM_RANGE(0xa000, 0xa001) AM_DEVREADWRITE("ymsnd", ym3526_device, read, write) - AM_RANGE(0xb000, 0xb000) AM_DEVREAD("soundlatch", generic_latch_8_device, read) AM_WRITENOP // message for main cpu - AM_RANGE(0xb001, 0xb001) AM_READNOP AM_WRITE(bublbobl_sh_nmi_enable_w) // bit 0: message pending for main cpu, bit 1: message pending for sound cpu - AM_RANGE(0xb002, 0xb002) AM_WRITE(bublbobl_sh_nmi_disable_w) - AM_RANGE(0x9000, 0x9000) AM_READWRITE(missb2_oki_r, missb2_oki_w) //AM_MIRROR(0x0FFF) + AM_RANGE(0x9000, 0x9000) AM_READWRITE(missb2_oki_r, missb2_oki_w) //AM_MIRROR(0x0fff) ??? + AM_RANGE(0xa000, 0xa001) AM_MIRROR(0x0ffe) AM_DEVREADWRITE("ymsnd", ym3526_device, read, write) + AM_RANGE(0xb000, 0xb000) AM_MIRROR(0x0ffc) AM_DEVREAD("main_to_sound", generic_latch_8_device, read) AM_DEVWRITE("sound_to_main", generic_latch_8_device, write) + AM_RANGE(0xb001, 0xb001) AM_MIRROR(0x0ffc) AM_READ(common_sound_semaphores_r) AM_DEVWRITE("soundnmi", input_merger_device, in_set<0>) + AM_RANGE(0xb002, 0xb002) AM_MIRROR(0x0ffc) AM_DEVWRITE("soundnmi", input_merger_device, in_clear<0>) AM_RANGE(0xe000, 0xefff) AM_ROM // space for diagnostic ROM? ADDRESS_MAP_END @@ -439,28 +441,23 @@ MACHINE_START_MEMBER(missb2_state,missb2) { m_gfxdecode->gfx(1)->set_palette(*m_bgpalette); - save_item(NAME(m_sound_nmi_enable)); - save_item(NAME(m_pending_nmi)); - save_item(NAME(m_sound_status)); save_item(NAME(m_video_enable)); } MACHINE_RESET_MEMBER(missb2_state,missb2) { - m_sound_nmi_enable = 0; - m_pending_nmi = 0; - m_sound_status = 0; + MACHINE_RESET_CALL_MEMBER(common); } static MACHINE_CONFIG_START( missb2 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MAIN_XTAL/4) // 6 MHz - MCFG_CPU_PROGRAM_MAP(master_map) + MCFG_CPU_PROGRAM_MAP(maincpu_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", missb2_state, irq0_line_hold) - MCFG_CPU_ADD("slave", Z80, MAIN_XTAL/4) // 6 MHz - MCFG_CPU_PROGRAM_MAP(slave_map) + MCFG_CPU_ADD("subcpu", Z80, MAIN_XTAL/4) // 6 MHz + MCFG_CPU_PROGRAM_MAP(subcpu_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", missb2_state, irq0_line_hold) MCFG_CPU_ADD("audiocpu", Z80, MAIN_XTAL/8) // 3 MHz @@ -495,7 +492,10 @@ static MACHINE_CONFIG_START( missb2 ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_8_ADD("main_to_sound") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(DEVWRITELINE("soundnmi", input_merger_device, in_w<0>)) + + MCFG_GENERIC_LATCH_8_ADD("sound_to_main") MCFG_SOUND_ADD("ymsnd", YM3526, MAIN_XTAL/8) MCFG_YM3526_IRQ_HANDLER(WRITELINE(missb2_state, irqhandler)) @@ -518,7 +518,7 @@ ROM_START( missb2 ) ROM_LOAD( "msbub2-u.203", 0x10000, 0x10000, CRC(29fd8afe) SHA1(94ead80d20cd3974dd4fb0358915e3bd8b793158) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "msbub2-u.11", 0x0000, 0x10000, CRC(003dc092) SHA1(dff3c2b31d0804a308e5c42cf9705cd3d6144ad7) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -552,7 +552,7 @@ ROM_START( bublpong ) ROM_LOAD( "u203", 0x10000, 0x10000, CRC(29fd8afe) SHA1(94ead80d20cd3974dd4fb0358915e3bd8b793158) ) /* 20000-2ffff empty */ - ROM_REGION( 0x10000, "slave", 0 ) /* 64k for the second CPU */ + ROM_REGION( 0x10000, "subcpu", 0 ) /* 64k for the second CPU */ ROM_LOAD( "ic11", 0x0000, 0x10000, CRC(dc1c72ba) SHA1(89b3835884f46bea1ca49356a1faeddd87f772c9) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the third CPU */ @@ -582,13 +582,13 @@ ROM_END void missb2_state::configure_banks() { uint8_t *ROM = memregion("maincpu")->base(); - uint8_t *SLAVE = memregion("slave")->base(); + uint8_t *SUBCPU = memregion("subcpu")->base(); membank("bank1")->configure_entries(0, 8, &ROM[0x10000], 0x4000); /* 2009-11 FP: isn't there a way to configure both at once? */ - membank("bank2")->configure_entries(0, 7, &SLAVE[0x8000], 0x1000); - membank("bank3")->configure_entries(0, 7, &SLAVE[0x9000], 0x1000); + membank("bank2")->configure_entries(0, 7, &SUBCPU[0x8000], 0x1000); + membank("bank3")->configure_entries(0, 7, &SUBCPU[0x9000], 0x1000); } DRIVER_INIT_MEMBER(missb2_state,missb2) diff --git a/src/mame/drivers/osbexec.cpp b/src/mame/drivers/osbexec.cpp index fad52267053..2a2a9fc05c3 100644 --- a/src/mame/drivers/osbexec.cpp +++ b/src/mame/drivers/osbexec.cpp @@ -580,14 +580,14 @@ static MACHINE_CONFIG_START( osbexec ) MCFG_PIA_WRITEPB_HANDLER(WRITE8(osbexec_state, osbexec_pia0_b_w)) MCFG_PIA_CA2_HANDLER(WRITELINE(osbexec_state, osbexec_pia0_ca2_w)) MCFG_PIA_CB2_HANDLER(WRITELINE(osbexec_state, osbexec_pia0_cb2_w)) - MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in0_w)) - MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in0_w)) + MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in_w<0>)) + MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in_w<1>)) MCFG_DEVICE_ADD("pia_1", PIA6821, 0) - MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in1_w)) - MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in1_w)) + MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in_w<2>)) + MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in_w<3>)) - MCFG_INPUT_MERGER_ACTIVE_HIGH("mainirq") + MCFG_INPUT_MERGER_ANY_HIGH("mainirq") MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", 0)) MCFG_Z80SIO2_ADD("sio", MAIN_CLOCK/6, 0, 0, 0, 0) @@ -597,7 +597,7 @@ static MACHINE_CONFIG_START( osbexec ) MCFG_Z80DART_OUT_TXDB_CB(DEVWRITELINE(PRINTER_PORT_TAG, rs232_port_device, write_txd)) MCFG_DEVCB_INVERT MCFG_Z80DART_OUT_DTRB_CB(DEVWRITELINE(PRINTER_PORT_TAG, rs232_port_device, write_dtr)) MCFG_DEVCB_INVERT MCFG_Z80DART_OUT_RTSB_CB(DEVWRITELINE(PRINTER_PORT_TAG, rs232_port_device, write_rts)) MCFG_DEVCB_INVERT - MCFG_Z80DART_OUT_INT_CB(DEVWRITELINE("mainirq", input_merger_device, in2_w)) + MCFG_Z80DART_OUT_INT_CB(DEVWRITELINE("mainirq", input_merger_device, in_w<4>)) MCFG_DEVICE_ADD("ctc", PIT8253, 0) MCFG_PIT8253_CLK0(MAIN_CLOCK / 13) // divided by 74S161 @ UC25 diff --git a/src/mame/drivers/zorba.cpp b/src/mame/drivers/zorba.cpp index 557c823270a..df697c0d64e 100644 --- a/src/mame/drivers/zorba.cpp +++ b/src/mame/drivers/zorba.cpp @@ -150,18 +150,18 @@ MACHINE_CONFIG_START( zorba ) MCFG_SOUND_ADD("beeper", BEEP, 800) // should be horizontal frequency / 16, so depends on CRTC parameters MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) - MCFG_INPUT_MERGER_ACTIVE_HIGH("irq0") + MCFG_INPUT_MERGER_ANY_HIGH("irq0") MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(zorba_state, irq_w<0>)) - MCFG_INPUT_MERGER_ACTIVE_HIGH("irq1") + MCFG_INPUT_MERGER_ANY_HIGH("irq1") MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(zorba_state, irq_w<1>)) - MCFG_INPUT_MERGER_ACTIVE_HIGH("irq2") + MCFG_INPUT_MERGER_ANY_HIGH("irq2") MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(zorba_state, irq_w<2>)) /* devices */ MCFG_DEVICE_ADD("dma", Z80DMA, XTAL_24MHz/6) // busack on cpu connects to bai pin MCFG_Z80DMA_OUT_BUSREQ_CB(WRITELINE(zorba_state, busreq_w)) //connects to busreq on cpu - MCFG_Z80DMA_OUT_INT_CB(DEVWRITELINE("irq0", input_merger_active_high_device, in0_w)) + MCFG_Z80DMA_OUT_INT_CB(DEVWRITELINE("irq0", input_merger_device, in_w<0>)) //ba0 - not connected MCFG_Z80DMA_IN_MREQ_CB(READ8(zorba_state, memory_read_byte)) MCFG_Z80DMA_OUT_MREQ_CB(WRITE8(zorba_state, memory_write_byte)) @@ -201,8 +201,8 @@ MACHINE_CONFIG_START( zorba ) MCFG_PIA_WRITEPB_HANDLER(WRITE8(zorba_state, pia1_portb_w)) MCFG_PIA_CA2_HANDLER(DEVWRITELINE(IEEE488_TAG, ieee488_device, ifc_w)) MCFG_PIA_CB2_HANDLER(DEVWRITELINE(IEEE488_TAG, ieee488_device, ren_w)) - MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("irq1", input_merger_active_high_device, in0_w)) - MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("irq1", input_merger_active_high_device, in1_w)) + MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("irq1", input_merger_device, in_w<0>)) + MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("irq1", input_merger_device, in_w<1>)) // PIT MCFG_DEVICE_ADD("pit", PIT8254, 0) @@ -220,13 +220,13 @@ MACHINE_CONFIG_START( zorba ) MCFG_I8275_CHARACTER_WIDTH(8) MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(zorba_state, zorba_update_chr) MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma", z80dma_device, rdy_w)) - MCFG_I8275_IRQ_CALLBACK(DEVWRITELINE("irq0", input_merger_active_high_device, in1_w)) + MCFG_I8275_IRQ_CALLBACK(DEVWRITELINE("irq0", input_merger_device, in_w<1>)) MCFG_VIDEO_SET_SCREEN("screen") // Floppies MCFG_FD1793_ADD("fdc", XTAL_24MHz / 24) - MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("irq2", input_merger_active_high_device, in0_w)) - MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("irq2", input_merger_active_high_device, in1_w)) + MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("irq2", input_merger_device, in_w<0>)) + MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("irq2", input_merger_device, in_w<1>)) MCFG_FLOPPY_DRIVE_ADD("fdc:0", zorba_floppies, "525dd", floppy_image_device::default_floppy_formats) MCFG_FLOPPY_DRIVE_SOUND(true) MCFG_FLOPPY_DRIVE_ADD("fdc:1", zorba_floppies, "525dd", floppy_image_device::default_floppy_formats) diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h index ac70df5393e..4f9ffc98170 100644 --- a/src/mame/includes/bbc.h +++ b/src/mame/includes/bbc.h @@ -250,7 +250,7 @@ public: // HACK FOR MC6845 required_memory_bank m_bank7; // bbca bbcb bbcbp bbcbp128 bbcm optional_memory_bank m_bank8; // bbcm - required_device m_irqs; + required_device m_irqs; machine_type_t m_machinetype; diff --git a/src/mame/includes/bublbobl.h b/src/mame/includes/bublbobl.h index e9d54f90dc2..52359d334f1 100644 --- a/src/mame/includes/bublbobl.h +++ b/src/mame/includes/bublbobl.h @@ -1,32 +1,46 @@ // license:BSD-3-Clause // copyright-holders:Chris Moore, Nicola Salmoria +#ifndef MAME_INCLUDES_BUBLBOBL_H +#define MAME_INCLUDES_BUBLBOBL_H + +#pragma once #include "cpu/m6805/m68705.h" - +#include "machine/input_merger.h" #include "machine/gen_latch.h" +#include "sound/2203intf.h" +#include "sound/3526intf.h" +#include "screen.h" + #include "machine/taito68705interface.h" + class bublbobl_state : public driver_device { public: enum { - TIMER_NMI, TIMER_M68705_IRQ_ACK }; bublbobl_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_videoram(*this, "videoram"), - m_objectram(*this, "objectram"), - m_mcu_sharedram(*this, "mcu_sharedram"), - m_maincpu(*this, "maincpu"), - m_mcu(*this, "mcu"), - m_audiocpu(*this, "audiocpu"), - m_slave(*this, "slave"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_soundlatch(*this, "soundlatch") + : driver_device(mconfig, type, tag) + , m_videoram(*this, "videoram") + , m_objectram(*this, "objectram") + , m_mcu_sharedram(*this, "mcu_sharedram") + , m_maincpu(*this, "maincpu") + , m_mcu(*this, "mcu") + , m_audiocpu(*this, "audiocpu") + , m_subcpu(*this, "subcpu") + , m_screen(*this, "screen") + , m_gfxdecode(*this, "gfxdecode") + , m_palette(*this, "palette") + , m_ym2203(*this, "ym2203") + , m_ym3526(*this, "ym3526") + , m_soundirq(*this, "soundirq") + , m_soundnmi(*this, "soundnmi") + , m_main_to_sound(*this, "main_to_sound") + , m_sound_to_main(*this, "sound_to_main") { } /* memory pointers */ @@ -35,12 +49,10 @@ public: optional_shared_ptr m_mcu_sharedram; /* video-related */ - int m_video_enable; + bool m_video_enable; /* sound-related */ - int m_sound_nmi_enable; - int m_pending_nmi; - int m_sound_status; + int m_sreset_old; /* mcu-related */ @@ -65,23 +77,26 @@ public: required_device m_maincpu; optional_device m_mcu; required_device m_audiocpu; - required_device m_slave; + required_device m_subcpu; + required_device m_screen; required_device m_gfxdecode; required_device m_palette; - required_device m_soundlatch; + optional_device m_ym2203; + optional_device m_ym3526; + optional_device m_soundirq; + optional_device m_soundnmi; + required_device m_main_to_sound; + required_device m_sound_to_main; + + void common_sreset(int state); DECLARE_WRITE8_MEMBER(bublbobl_bankswitch_w); DECLARE_WRITE8_MEMBER(tokio_bankswitch_w); DECLARE_WRITE8_MEMBER(tokio_videoctrl_w); DECLARE_WRITE8_MEMBER(bublbobl_nmitrigger_w); - DECLARE_READ8_MEMBER(tokiob_mcu_r); - DECLARE_WRITE8_MEMBER(bublbobl_sound_command_w); - DECLARE_WRITE8_MEMBER(bublbobl_sh_nmi_disable_w); - DECLARE_WRITE8_MEMBER(bublbobl_sh_nmi_enable_w); DECLARE_WRITE8_MEMBER(bublbobl_soundcpu_reset_w); - DECLARE_READ8_MEMBER(bublbobl_sound_status_r); - DECLARE_WRITE8_MEMBER(bublbobl_sound_status_w); + DECLARE_READ8_MEMBER(common_sound_semaphores_r); DECLARE_READ8_MEMBER(bublbobl_mcu_ddr1_r); DECLARE_WRITE8_MEMBER(bublbobl_mcu_ddr1_w); DECLARE_READ8_MEMBER(bublbobl_mcu_ddr2_r); @@ -103,9 +118,8 @@ public: DECLARE_WRITE8_MEMBER(boblbobl_ic43_b_w); DECLARE_READ8_MEMBER(boblbobl_ic43_b_r); - DECLARE_DRIVER_INIT(tokio); DECLARE_DRIVER_INIT(dland); - DECLARE_DRIVER_INIT(bublbobl); + DECLARE_DRIVER_INIT(common); DECLARE_MACHINE_START(tokio); DECLARE_MACHINE_RESET(tokio); DECLARE_MACHINE_START(bublbobl); @@ -153,3 +167,5 @@ protected: uint16_t m_address; uint8_t m_latch; }; + +#endif // MAME_INCLUDES_BUBLBOBL_H diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp index 24cbe1bfeaa..9351603e78e 100644 --- a/src/mame/machine/bbc.cpp +++ b/src/mame/machine/bbc.cpp @@ -294,7 +294,7 @@ WRITE8_MEMBER(bbc_state::bbcm_ACCCON_write) if (tempIRR!=m_ACCCON_IRR) { - m_irqs->in3_w(m_ACCCON_IRR); + m_irqs->in_w<3>(m_ACCCON_IRR); } if (m_ACCCON_Y) diff --git a/src/mame/machine/bublbobl.cpp b/src/mame/machine/bublbobl.cpp index f182286d442..e7a2e8a4ae6 100644 --- a/src/mame/machine/bublbobl.cpp +++ b/src/mame/machine/bublbobl.cpp @@ -10,19 +10,46 @@ ***************************************************************************/ #include "emu.h" -#include "cpu/z80/z80.h" #include "includes/bublbobl.h" +#include "cpu/z80/z80.h" + + +void bublbobl_state::common_sreset(int state) +{ + if ((state != CLEAR_LINE) && !m_sreset_old) + { + if (m_ym2203 != nullptr) m_ym2203->reset(); // ym2203, if present, is reset + if (m_ym3526 != nullptr) m_ym3526->reset(); // ym3526, if present, is reset + m_audiocpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); // if a sound irq is active, it is cleared. is this necessary? if the above two devices de-assert /IRQ on reset (as a device_line write) properly, it shouldn't be... + m_sound_to_main->acknowledge_w(m_audiocpu->device_t::memory().space(AS_PROGRAM), 0, 0x00, 0xFF); // sound->main semaphore is cleared + m_soundnmi->in_w<0>(0); // sound nmi enable is unset + } + m_audiocpu->set_input_line(INPUT_LINE_RESET, state); // soundcpu is reset + m_sreset_old = (ASSERT_LINE == state); +} + +/* bublbobl bankswitch reg + 76543210 + |||||\\\- Select ROM bank + ||||\---- N.C. + |||\----- /SBRES [SUBCPU /RESET] + ||\------ /SEQRES [MCU /RESET] + |\------- /BLACK [Video Enable] + \-------- VHINV [flip screen] +// 44 74 74 76 or 76 36 76 once or more per frame... +*/ WRITE8_MEMBER(bublbobl_state::bublbobl_bankswitch_w) { + //logerror("bankswitch_w: write of %02X\n", data); /* bits 0-2 select ROM bank */ membank("bank1")->set_entry((data ^ 4) & 7); /* bit 3 n.c. */ - /* bit 4 resets second Z80 */ - m_slave->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE); + /* bit 4 resets subcpu Z80 */ + m_subcpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE); /* bit 5 resets mcu */ if (m_mcu != nullptr) // only if we have a MCU @@ -35,36 +62,69 @@ WRITE8_MEMBER(bublbobl_state::bublbobl_bankswitch_w) flip_screen_set(data & 0x80); } +/* tokio bankswitch reg + 76543210 + |||||\\\- Select ROM bank + ||||\---- ? used (idle high, /SEQRES?) + |||\----- not used? + ||\------ not used? + |\------- ? used (idle high, /BLACK?) + \-------- ? used (idle high, /SRESET?) +// bublboblp: test and main: 00 C8 C9 C8 C9...; tokio: test 00 09 09 49 main 00 09 C8 CF +*/ WRITE8_MEMBER(bublbobl_state::tokio_bankswitch_w) { + m_screen->update_now(); /* bits 0-2 select ROM bank */ membank("bank1")->set_entry(data & 7); - /* bits 3-7 unknown */ + /* bit 3 unknown */ + /* GUESS: bit 3 resets mcu */ + if (m_mcu != nullptr) // only if we have a MCU + m_mcu->set_input_line(INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE); + + /* bit 4 and 5 unknown, not used? */ + + /* bit 6 is unknown */ + /* GUESS: bit 6 is video enable "/BLACK" */ + m_video_enable = data & 0x40; // guess + + /* bit 7 is unknown but used */ } +/* tokio videoctrl reg + 76543210 + ||||\\\\- not used? + |||\----- OUT (coin lockout to pc030cm, active low) + ||\------ ? used (idle low, maybe 2WAY to pc030cm?) + |\------- ? used (idle high, /SBRES? or /SBINT?) + \-------- VHINV (flip screen) +*/ WRITE8_MEMBER(bublbobl_state::tokio_videoctrl_w) { + //logerror("tokio_videoctrl_w: write of %02X\n", data); + /* bits 0-3 not used? */ + + /* bit 4 is the coin lockout */ + machine().bookkeeping().coin_lockout_global_w(~data & 0x10); + + /* bit 5 and 6 are unknown but used */ + /* bit 7 flips screen */ flip_screen_set(data & 0x80); - - /* other bits unknown */ } WRITE8_MEMBER(bublbobl_state::bublbobl_nmitrigger_w) { - m_slave->set_input_line(INPUT_LINE_NMI, PULSE_LINE); + m_subcpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); } - - - - - - READ8_MEMBER(bublbobl_state::tokiob_mcu_r) { - return 0xbf; /* ad-hoc value set to pass initial testing */ + /* This return value is literally set by a resistor on the bootleg tokio pcb; + the MCU footprint is unpopulated but for a resistor tying what would be the + PA6 pin to ground. The remaining pins seem to float high. */ + return 0xbf; } @@ -72,12 +132,6 @@ void bublbobl_state::device_timer(emu_timer &timer, device_timer_id id, int para { switch (id) { - case TIMER_NMI: - if (m_sound_nmi_enable) - m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); - else - m_pending_nmi = 1; - break; case TIMER_M68705_IRQ_ACK: m_mcu->set_input_line(0, CLEAR_LINE); break; @@ -86,41 +140,18 @@ void bublbobl_state::device_timer(emu_timer &timer, device_timer_id id, int para } } - -WRITE8_MEMBER(bublbobl_state::bublbobl_sound_command_w) -{ - m_soundlatch->write(space, offset, data); - synchronize(TIMER_NMI, data); -} - -WRITE8_MEMBER(bublbobl_state::bublbobl_sh_nmi_disable_w) -{ - m_sound_nmi_enable = 0; -} - -WRITE8_MEMBER(bublbobl_state::bublbobl_sh_nmi_enable_w) -{ - m_sound_nmi_enable = 1; - if (m_pending_nmi) - { - m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); - m_pending_nmi = 0; - } -} - WRITE8_MEMBER(bublbobl_state::bublbobl_soundcpu_reset_w) { - m_audiocpu->set_input_line(INPUT_LINE_RESET, data ? ASSERT_LINE : CLEAR_LINE); + //logerror("soundcpu_reset_w called with data of %d\n", data); + common_sreset(data ? ASSERT_LINE : CLEAR_LINE); } -READ8_MEMBER(bublbobl_state::bublbobl_sound_status_r) +READ8_MEMBER(bublbobl_state::common_sound_semaphores_r) { - return m_sound_status; -} - -WRITE8_MEMBER(bublbobl_state::bublbobl_sound_status_w) -{ - m_sound_status = data; + uint8_t ret = 0xfc; + ret |= m_main_to_sound->pending_r() ? 0x2 : 0x0; + ret |= m_sound_to_main->pending_r() ? 0x1 : 0x0; + return ret; }