// license:LGPL-2.1+ // copyright-holders:Angelo Salese /*************************************************************************** Sega System Control Unit (c) 1995 Sega ***************************************************************************/ #ifndef MAME_MACHINE_SEGA_SCU_H #define MAME_MACHINE_SEGA_SCU_H #pragma once #include "cpu/sh/sh2.h" #include "cpu/scudsp/scudsp.h" #define IRQ_VBLANK_IN 1 << 0 #define IRQ_VBLANK_OUT 1 << 1 #define IRQ_HBLANK_IN 1 << 2 #define IRQ_TIMER_0 1 << 3 #define IRQ_TIMER_1 1 << 4 #define IRQ_DSP_END 1 << 5 #define IRQ_SOUND_REQ 1 << 6 #define IRQ_SMPC 1 << 7 #define IRQ_PAD 1 << 8 #define IRQ_DMALV2 1 << 9 #define IRQ_DMALV1 1 << 10 #define IRQ_DMALV0 1 << 11 #define IRQ_DMAILL 1 << 12 #define IRQ_VDP1_END 1 << 13 #define IRQ_ABUS 1 << 15 //************************************************************************** // INTERFACE CONFIGURATION MACROS //************************************************************************** #define MCFG_SEGA_SCU_ADD(tag) \ MCFG_DEVICE_ADD((tag), SEGA_SCU, (0)) //************************************************************************** // TYPE DEFINITIONS //************************************************************************** // ======================> sega_scu_device class sega_scu_device : public device_t { public: // construction/destruction sega_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // I/O operations void regs_map(address_map &map); DECLARE_WRITE_LINE_MEMBER(vblank_out_w); DECLARE_WRITE_LINE_MEMBER(vblank_in_w); DECLARE_WRITE_LINE_MEMBER(hblank_in_w); DECLARE_WRITE_LINE_MEMBER(vdp1_end_w); void check_scanline_timers(int scanline,int y_step); DECLARE_WRITE_LINE_MEMBER(sound_req_w); DECLARE_WRITE_LINE_MEMBER(smpc_irq_w); void set_hostcpu(const char *cputag) { m_hostcpu_tag = cputag; } protected: // device-level overrides //virtual void device_validity_check(validity_checker &valid) const override; virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; virtual void device_reset() override; virtual void device_reset_after_children() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; private: required_device m_scudsp; enum { DMALV0_ID = 0, DMALV1_ID, DMALV2_ID }; emu_timer *m_dma_timer[3]; uint32_t m_ism; uint32_t m_ist; uint32_t m_t0c; uint32_t m_t1s; uint32_t m_status; bool m_t1md; bool m_tenb; const char *m_hostcpu_tag; sh2_device *m_hostcpu; address_space *m_hostspace; void test_pending_irqs(); struct { uint32_t src; /* Source DMA lv n address*/ uint32_t dst; /* Destination DMA lv n address*/ uint32_t src_add; /* Source Addition for DMA lv n*/ uint32_t dst_add; /* Destination Addition for DMA lv n*/ uint32_t size; /* Transfer DMA size lv n*/ uint32_t index; uint8_t start_factor; bool enable_mask; bool indirect_mode; bool rup; bool wup; }m_dma[3]; uint32_t dma_common_r(uint8_t offset,uint8_t level); void dma_common_w(uint8_t offset,uint8_t level,uint32_t data); void handle_dma_direct(uint8_t level); void handle_dma_indirect(uint8_t level); void update_dma_status(uint8_t level,bool state); void dma_single_transfer(uint32_t src, uint32_t dst,uint8_t *src_shift); void dma_start_factor_ack(uint8_t event); DECLARE_WRITE_LINE_MEMBER(scudsp_end_w); DECLARE_READ16_MEMBER(scudsp_dma_r); DECLARE_WRITE16_MEMBER(scudsp_dma_w); // DMA DECLARE_READ32_MEMBER(dma_lv0_r); DECLARE_WRITE32_MEMBER(dma_lv0_w); DECLARE_READ32_MEMBER(dma_lv1_r); DECLARE_WRITE32_MEMBER(dma_lv1_w); DECLARE_READ32_MEMBER(dma_lv2_r); DECLARE_WRITE32_MEMBER(dma_lv2_w); DECLARE_READ32_MEMBER(dma_status_r); // Timers DECLARE_WRITE32_MEMBER(t0_compare_w); DECLARE_WRITE32_MEMBER(t1_setdata_w); DECLARE_WRITE16_MEMBER(t1_mode_w); // Interrupt DECLARE_READ32_MEMBER(irq_mask_r); DECLARE_READ32_MEMBER(irq_status_r); DECLARE_WRITE32_MEMBER(irq_mask_w); DECLARE_WRITE32_MEMBER(irq_status_w); DECLARE_READ32_MEMBER(version_r); }; // device type definition DECLARE_DEVICE_TYPE(SEGA_SCU, sega_scu_device) //************************************************************************** // GLOBAL VARIABLES //************************************************************************** #endif // MAME_MACHINE_SEGA_SCU_H