1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4 
5     Western Digital WD11C00-17 PC/XT Host Interface Logic Device
6 
7 **********************************************************************/
8 
9 #ifndef MAME_MACHINE_WD11C00_17_H
10 #define MAME_MACHINE_WD11C00_17_H
11 
12 #pragma once
13 
14 
15 //**************************************************************************
16 //  TYPE DEFINITIONS
17 //**************************************************************************
18 
19 // ======================> wd11c00_17_device
20 
21 class wd11c00_17_device :   public device_t
22 {
23 public:
24 	// construction/destruction
25 	wd11c00_17_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
26 
out_irq5_callback()27 	auto out_irq5_callback() { return m_out_irq5_cb.bind(); }
out_drq3_callback()28 	auto out_drq3_callback() { return m_out_drq3_cb.bind(); }
out_mr_callback()29 	auto out_mr_callback() { return m_out_mr_cb.bind(); }
out_busy_callback()30 	auto out_busy_callback() { return m_out_busy_cb.bind(); }
out_req_callback()31 	auto out_req_callback() { return m_out_req_cb.bind(); }
out_ra3_callback()32 	auto out_ra3_callback() { return m_out_ra3_cb.bind(); }
in_rd322_callback()33 	auto in_rd322_callback() { return m_in_rd322_cb.bind(); }
in_ramcs_callback()34 	auto in_ramcs_callback() { return m_in_ramcs_cb.bind(); }
out_ramwr_callback()35 	auto out_ramwr_callback() { return m_out_ramwr_cb.bind(); }
in_cs1010_callback()36 	auto in_cs1010_callback() { return m_in_cs1010_cb.bind(); }
out_cs1010_callback()37 	auto out_cs1010_callback() { return m_out_cs1010_cb.bind(); }
38 
39 	uint8_t io_r(offs_t offset);
40 	void io_w(offs_t offset, uint8_t data);
41 
42 	void dack3_w(int state);
43 	uint8_t dack_r();
44 	void dack_w(uint8_t data);
45 
46 	uint8_t read(offs_t offset);
47 	void write(offs_t offset, uint8_t data);
48 
49 	void ireq_w(int state);
50 	void io_w(int state);
51 	void cd_w(int state);
52 	void clct_w(int state);
53 	void mode_w(int state);
54 
55 	int busy_r();
56 	int ecc_not_0_r();
57 
58 protected:
59 	// device-level overrides
60 	virtual void device_start() override;
61 	virtual void device_reset() override;
62 
63 private:
64 	inline void check_interrupt();
65 	inline void increment_address();
66 	inline uint8_t read_data();
67 	inline void write_data(uint8_t data);
68 	inline void software_reset();
69 	inline void select();
70 
71 	devcb_write_line    m_out_irq5_cb;
72 	devcb_write_line    m_out_drq3_cb;
73 	devcb_write_line    m_out_mr_cb;
74 	devcb_write_line    m_out_busy_cb;
75 	devcb_write_line    m_out_req_cb;
76 	devcb_write_line    m_out_ra3_cb;
77 	devcb_read8         m_in_rd322_cb;
78 	devcb_read8         m_in_ramcs_cb;
79 	devcb_write8        m_out_ramwr_cb;
80 	devcb_read8         m_in_cs1010_cb;
81 	devcb_write8        m_out_cs1010_cb;
82 
83 	uint8_t m_status;
84 	uint8_t m_mask;
85 
86 	offs_t m_ra;
87 
88 	int m_mode;
89 	int m_ecc_not_0;
90 
91 	int m_irq5;
92 	int m_drq3;
93 	int m_busy;
94 	int m_req;
95 	int m_ra3;
96 };
97 
98 
99 // device type definition
100 DECLARE_DEVICE_TYPE(WD11C00_17, wd11c00_17_device)
101 
102 #endif // MAME_MACHINE_WD11C00_17_H
103