1 // license:BSD-3-Clause
2 // copyright-holders:smf
3 #ifndef MAME_MACHINE_53C810_H
4 #define MAME_MACHINE_53C810_H
5 
6 #pragma once
7 
8 #include "legscsi.h"
9 
10 class lsi53c810_device : public legacy_scsi_host_adapter
11 {
12 public:
13 	typedef device_delegate<void (int state)> irq_delegate;
14 	typedef device_delegate<void (uint32_t src, uint32_t dst, int length, int byteswap)> dma_delegate;
15 	typedef device_delegate<uint32_t (uint32_t dsp)> fetch_delegate;
16 
17 	// construction/destruction
18 	lsi53c810_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
19 
set_irq_callback(T &&...args)20 	template <typename... T> void set_irq_callback(T &&... args)
21 	{
22 		m_irq_cb.set(std::forward<T>(args)...);
23 	}
24 
set_dma_callback(T &&...args)25 	template <typename... T> void set_dma_callback(T &&... args)
26 	{
27 		m_dma_cb.set(std::forward<T>(args)...);
28 	}
29 
set_fetch_callback(T &&...args)30 	template <typename... T> void set_fetch_callback(T &&... args)
31 	{
32 		m_fetch_cb.set(std::forward<T>(args)...);
33 	}
34 
35 	uint8_t reg_r(int offset);
36 	void reg_w(int offset, uint8_t data);
37 
38 protected:
39 	// device-level overrides
40 	virtual void device_start() override;
41 
42 private:
43 	typedef delegate<void ()> opcode_handler_delegate;
44 	opcode_handler_delegate dma_opcode[256];
45 
46 	irq_delegate m_irq_cb;
47 	dma_delegate m_dma_cb;
48 	fetch_delegate m_fetch_cb;
49 
50 	uint32_t FETCH();
51 	void dmaop_invalid();
52 	void dmaop_move_memory();
53 	void dmaop_interrupt();
54 	void dmaop_block_move();
55 	void dmaop_select();
56 	void dmaop_wait_disconnect();
57 	void dmaop_wait_reselect();
58 	void dmaop_set();
59 	void dmaop_clear();
60 	void dmaop_move_from_sfbr();
61 	void dmaop_move_to_sfbr();
62 	void dmaop_read_modify_write();
63 	int scripts_compute_branch();
64 	uint32_t scripts_get_jump_dest();
65 	void dmaop_jump();
66 	void dmaop_call();
67 	void dmaop_return();
68 	void dmaop_store();
69 	void dmaop_load();
70 	void dma_exec();
71 	void add_opcode(uint8_t op, uint8_t mask, opcode_handler_delegate handler);
72 	uint32_t lsi53c810_dasm_fetch(uint32_t pc);
73 	unsigned lsi53c810_dasm(char *buf, uint32_t pc);
74 
75 	uint8_t scntl0;
76 	uint8_t scntl1;
77 	uint8_t scntl2;
78 	uint8_t scntl3;
79 	uint8_t scid;
80 	uint8_t sxfer;
81 	uint8_t socl;
82 	uint8_t istat;
83 	uint8_t dstat;
84 	uint8_t sstat0;
85 	uint8_t sstat1;
86 	uint8_t sstat2;
87 	uint8_t dien;
88 	uint8_t dcntl;
89 	uint8_t dmode;
90 	uint32_t temp;
91 	uint32_t dsa;
92 	uint32_t dsp;
93 	uint32_t dsps;
94 	uint32_t dcmd;
95 	uint8_t sien0;
96 	uint8_t sien1;
97 	uint8_t stime0;
98 	uint8_t respid;
99 	uint8_t stest1;
100 	uint8_t scratch_a[4];
101 	uint8_t scratch_b[4];
102 	int dma_icount;
103 	int halted;
104 	int carry;
105 };
106 
107 // device type definition
108 DECLARE_DEVICE_TYPE(LSI53C810, lsi53c810_device)
109 
110 #endif // MAME_MACHINE_53C810_H
111