// license:BSD-3-Clause // copyright-holders:Ryan Holtz /****************************************************************************** * * Sony PlayStation 2 EE DMA controller device skeleton * * To Do: * Everything * */ #ifndef MAME_MACHINE_PS2DMA_H #define MAME_MACHINE_PS2DMA_H #pragma once #include "cpu/mips/ps2vu.h" #include "video/ps2gs.h" #include "ps2sif.h" class ps2_dmac_device : public device_t, public device_execute_interface { public: template ps2_dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&ee_tag, U &&ram_tag, V &&sif_tag, W &&gs_tag, X &&vu1_tag) : ps2_dmac_device(mconfig, tag, owner, clock) { m_ee.set_tag(std::forward(ee_tag)); m_ram.set_tag(std::forward(ram_tag)); m_sif.set_tag(std::forward(sif_tag)); m_gs.set_tag(std::forward(gs_tag)); m_vu1.set_tag(std::forward(vu1_tag)); } ps2_dmac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ~ps2_dmac_device() override; enum channel_type : uint32_t { VIF0 = 0, VIF1, GIF, IPU_OUT, IPU_IN, SIF0, SIF1, SIF2, SPR_OUT, SPR_IN }; DECLARE_READ32_MEMBER(read); DECLARE_WRITE32_MEMBER(write); DECLARE_READ32_MEMBER(channel_r); DECLARE_WRITE32_MEMBER(channel_w); DECLARE_READ32_MEMBER(disable_mask_r); DECLARE_WRITE32_MEMBER(disable_mask_w); protected: virtual void device_start() override; virtual void device_reset() override; virtual void execute_run() override; enum tag_id { ID_REFE = 0, ID_CNT, ID_NEXT, ID_REF, ID_REFS, ID_CALL, ID_RET, ID_END }; class channel_t { friend class ps2_dmac_device; public: channel_t() : m_chcr(0), m_mode(0), m_enabled(false), m_end_tag(false), m_end_irq(false), m_ienable(false), m_addr(0), m_qwc(0) { } void set_chcr(uint32_t data); uint32_t chcr() const { return m_chcr; } uint32_t mode() const { return m_mode; } bool enabled() const { return m_enabled; } bool irq_enable() const { return m_ienable; } bool end_tag() const { return m_end_tag; } void set_end_tag(bool end_tag) { m_end_tag = end_tag; } bool end_irq() const { return m_end_irq; } void set_end_irq(bool end_irq) { m_end_irq = end_irq; } uint32_t addr() const { return m_addr; } void set_addr(uint32_t addr) { m_addr = addr; } uint32_t quadword_count() const { return m_qwc; } void set_quadword_count(uint32_t qwc) { m_qwc = qwc; } uint32_t tag_addr() const { return m_tag_addr; } void set_tag_addr(uint32_t tag_addr) { m_tag_addr = tag_addr; } protected: uint32_t m_chcr; uint32_t m_mode; bool m_enabled; bool m_end_tag; bool m_end_irq; bool m_ienable; uint32_t m_addr; uint32_t m_qwc; uint32_t m_tag_addr; }; void transfer_vif1(); void transfer_gif(); void transfer_sif0(); void transfer_sif1(); void transfer_finish(uint32_t chan); void follow_source_tag(uint32_t channel); void update_interrupts(); required_device m_ee; required_shared_ptr m_ram; required_device m_sif; required_device m_gs; required_device m_vu1; int m_icount; uint32_t m_ctrl; uint32_t m_mem_drain; bool m_enabled; uint32_t m_disable_mask; uint32_t m_istat; uint32_t m_imask; uint32_t m_last_serviced; channel_t m_channels[10]; }; DECLARE_DEVICE_TYPE(SONYPS2_DMAC, ps2_dmac_device) #endif // MAME_MACHINE_PS2DMA_H