summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/sega/saturn_scu.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/sega/saturn_scu.h')
-rw-r--r--src/mame/sega/saturn_scu.h144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/mame/sega/saturn_scu.h b/src/mame/sega/saturn_scu.h
new file mode 100644
index 00000000000..1ecbff9a8c1
--- /dev/null
+++ b/src/mame/sega/saturn_scu.h
@@ -0,0 +1,144 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+
+#ifndef MAME_SEGA_SATURN_SCU_H
+#define MAME_SEGA_SATURN_SCU_H
+
+#pragma once
+
+#include "cpu/sh/sh7604.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
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> saturn_scu_device
+
+class saturn_scu_device : public device_t
+{
+public:
+ // construction/destruction
+ saturn_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // I/O operations
+ void regs_map(address_map &map) ATTR_COLD;
+
+ void vblank_out_w(int state);
+ void vblank_in_w(int state);
+ void hblank_in_w(int state);
+ void vdp1_end_w(int state);
+ void check_scanline_timers(int scanline,int y_step);
+ void sound_req_w(int state);
+ void smpc_irq_w(int state);
+
+ template <typename T> void set_hostcpu(T &&tag) { m_hostcpu.set_tag(std::forward<T>(tag)); }
+
+protected:
+ // device-level overrides
+ //virtual void device_validity_check(validity_checker &valid) const override;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+ virtual void device_reset_after_children() override;
+
+ template <int Level> TIMER_CALLBACK_MEMBER(dma_tick);
+
+private:
+ required_device<scudsp_cpu_device> m_scudsp;
+
+ enum dma_id : int {
+ 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;
+
+ required_device<sh7604_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);
+
+ void scudsp_end_w(int state);
+ uint16_t scudsp_dma_r(offs_t offset, uint16_t mem_mask = ~0);
+ void scudsp_dma_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+
+ // DMA
+ uint32_t dma_lv0_r(offs_t offset);
+ void dma_lv0_w(offs_t offset, uint32_t data);
+ uint32_t dma_lv1_r(offs_t offset);
+ void dma_lv1_w(offs_t offset, uint32_t data);
+ uint32_t dma_lv2_r(offs_t offset);
+ void dma_lv2_w(offs_t offset, uint32_t data);
+ uint32_t dma_status_r();
+
+ // Timers
+ void t0_compare_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+ void t1_setdata_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+ void t1_mode_w(uint16_t data);
+ // Interrupt
+ uint32_t irq_mask_r();
+ uint32_t irq_status_r();
+ void irq_mask_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+ void irq_status_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
+ uint32_t version_r();
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(SATURN_SCU, saturn_scu_device)
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+
+#endif // MAME_SEGA_SATURN_SCU_H