// license:BSD-3-Clause // copyright-holders:Ernesto Corvi, Nicola Salmoria, David Haywood, Vas Crabb #ifndef MAME_MACHINE_TAITO68705INTERFACE_H #define MAME_MACHINE_TAITO68705INTERFACE_H #pragma once #include "cpu/m6805/m68705.h" DECLARE_DEVICE_TYPE(TAITO68705_MCU, taito68705_mcu_device) DECLARE_DEVICE_TYPE(TAITO68705_MCU_TIGER, taito68705_mcu_tiger_device) DECLARE_DEVICE_TYPE(ARKANOID_68705P3, arkanoid_68705p3_device) DECLARE_DEVICE_TYPE(ARKANOID_68705P5, arkanoid_68705p5_device) class taito68705_mcu_device_base : public device_t { public: // host interface u8 data_r(); void data_w(u8 data); DECLARE_WRITE_LINE_MEMBER(reset_w); DECLARE_READ_LINE_MEMBER(host_semaphore_r) { return m_host_flag ? 1 : 0; } DECLARE_READ_LINE_MEMBER(mcu_semaphore_r) { return m_mcu_flag ? 1 : 0; } protected: taito68705_mcu_device_base( machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock); auto semaphore_cb() { return m_semaphore_cb.bind(); } // MCU callbacks void mcu_pa_w(u8 data); virtual void device_start() override; virtual void device_reset() override; bool host_flag() const { return m_host_flag; } bool mcu_flag() const { return m_mcu_flag; } u8 pa_value() const { return m_pa_output & (m_latch_driven ? m_host_latch : 0xff); } void latch_control(u8 data, u8 &value, unsigned host_bit, unsigned mcu_bit); required_device m_mcu; private: devcb_write_line m_semaphore_cb; bool m_latch_driven; bool m_reset_input; bool m_host_flag; bool m_mcu_flag; u8 m_host_latch; u8 m_mcu_latch; u8 m_pa_output; }; class taito68705_mcu_device : public taito68705_mcu_device_base { public: auto aux_strobe_cb() { return m_aux_strobe_cb.bind(); } taito68705_mcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: taito68705_mcu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); virtual u8 mcu_portc_r(); void mcu_portb_w(offs_t offset, u8 data, u8 mem_mask = ~0); virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; devcb_write8 m_aux_strobe_cb; u8 m_pb_output; }; class taito68705_mcu_tiger_device : public taito68705_mcu_device { public: taito68705_mcu_tiger_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); protected: virtual u8 mcu_portc_r() override; }; class arkanoid_mcu_device_base : public taito68705_mcu_device_base { public: using taito68705_mcu_device_base::semaphore_cb; auto portb_r_cb() { return m_portb_r_cb.bind(); } protected: arkanoid_mcu_device_base( machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock); // MCU callbacks u8 mcu_pb_r(); u8 mcu_pc_r(); void mcu_pc_w(u8 data); virtual void device_start() override; devcb_read8 m_portb_r_cb; u8 m_pc_output; }; class arkanoid_68705p3_device : public arkanoid_mcu_device_base { public: arkanoid_68705p3_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); protected: virtual void device_add_mconfig(machine_config &config) override; }; class arkanoid_68705p5_device : public arkanoid_mcu_device_base { public: arkanoid_68705p5_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); protected: virtual void device_add_mconfig(machine_config &config) override; }; #endif // MAME_MACHINE_TAITO68705INTERFACE_H