1 // license:GPL-2.0+
2 // copyright-holders:Dirk Best,Carl
3 /***************************************************************************
4 
5     Intel 8089 I/O Processor
6 
7     I/O channel
8 
9 ***************************************************************************/
10 
11 #ifndef MAME_CPU_I8080_I8089_CHANNEL_H
12 #define MAME_CPU_I8080_I8089_CHANNEL_H
13 
14 #pragma once
15 
16 
17 //**************************************************************************
18 //  TYPE DEFINITIONS
19 //**************************************************************************
20 
21 // forward declaration
22 class i8089_device;
23 
24 class i8089_channel_device : public device_t
25 {
26 public:
27 	// construction/destruction
28 	i8089_channel_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
29 
sintr()30 	auto sintr() { return m_write_sintr.bind(); }
31 
32 	// set register
33 	void set_reg(int reg, uint32_t value, int tag = -1);
34 
35 	int execute_run();
36 	void attention();
37 
38 	// channel status
39 	bool executing();
40 	bool transferring();
41 	bool priority();
42 	int  chan_prio();
43 	bool chained();
44 	bool lock();
45 	void ca();
46 
47 	DECLARE_WRITE_LINE_MEMBER( ext_w );
48 	DECLARE_WRITE_LINE_MEMBER( drq_w );
49 
50 	// register
51 	enum
52 	{
53 		GA,  // 20-bit general purpose address a
54 		GB,  // 20-bit general purpose address b
55 		GC,  // 20-bit general purpose address c
56 		BC,  // byte count
57 		TP,  // 20-bit task pointer
58 		IX,  // byte count
59 		CC,  // mask compare
60 		MC,  // channel control
61 
62 		// internal use register
63 		CP,  // 20-bit control block pointer
64 		PP,  // 20-bit parameter pointer
65 		PSW, // program status word
66 
67 		NUM_REGS
68 	};
69 
70 	struct
71 	{
72 		uint32_t w; // 20-bit address
73 		bool t; // tag-bit
74 	}
75 	m_r[11];
76 
77 protected:
78 	// device-level overrides
79 	virtual void device_start() override;
80 	virtual void device_reset() override;
81 
82 private:
83 
84 	// opcodes
85 	void add_rm(int r, int m, int o);
86 	void add_mr(int m, int r, int o);
87 	void addb_rm(int r, int m, int o);
88 	void addb_mr(int m, int r, int o);
89 	void addbi_ri(int r, int8_t i);
90 	void addbi_mi(int m, int8_t i, int o);
91 	void addi_ri(int r, int16_t i);
92 	void addi_mi(int m, int16_t i, int o);
93 	void and_rm(int r, int m, int o);
94 	void and_mr(int m, int r, int o);
95 	void andb_rm(int r, int m, int o);
96 	void andb_mr(int m, int r, int o);
97 	void andbi_ri(int r, int8_t i);
98 	void andbi_mi(int m, int8_t i, int o);
99 	void andi_ri(int r, int16_t i);
100 	void andi_mi(int m, int16_t i, int o);
101 	void call(int m, int16_t d, int o);
102 	void clr(int m, int b, int o);
103 	void dec_r(int r);
104 	void dec_m(int m, int o);
105 	void decb(int m, int o);
106 	void hlt();
107 	void inc_r(int r);
108 	void inc_m(int m, int o);
109 	void incb(int m, int o);
110 	void jbt(int m, int b, int16_t d, int o);
111 	void jmce(int m, int16_t d, int o);
112 	void jmcne(int m, int16_t d, int o);
113 	void jnbt(int m, int b, int16_t d, int o);
114 	void jnz_r(int r, int16_t d);
115 	void jnz_m(int m, int16_t d, int o);
116 	void jnzb(int m, int16_t d, int o);
117 	void jz_r(int r, int16_t d);
118 	void jz_m(int m, int16_t d, int o);
119 	void jzb(int m, int16_t d, int o);
120 	void lpd(int p, int m, int o);
121 	void lpdi(int p, int s, int o);
122 	void mov_mr(int m, int r, int o);
123 	void mov_rm(int r, int m, int o);
124 	void mov_mm(int m1, int m2, int o1, int o2);
125 	void movb_mr(int m, int r, int o);
126 	void movb_rm(int r, int m, int o);
127 	void movb_mm(int m1, int m2, int o1, int o2);
128 	void movbi_ri(int r, int8_t i);
129 	void movbi_mi(int m, int8_t i, int o);
130 	void movi_ri(int r, int16_t i);
131 	void movi_mi(int m, int16_t i, int o);
132 	void movp_mp(int m, int p, int o);
133 	void movp_pm(int p, int m, int o);
134 	void nop();
135 	void not_r(int r);
136 	void not_m(int m, int o);
137 	void not_rm(int r, int m, int o);
138 	void notb_m(int m, int o);
139 	void notb_rm(int r, int m, int o);
140 	void or_rm(int r, int m, int o);
141 	void or_mr(int m, int r, int o);
142 	void orb_rm(int r, int m, int o);
143 	void orb_mr(int m, int r, int o);
144 	void orbi_ri(int r, int8_t i);
145 	void orbi_mi(int m, int8_t i, int o);
146 	void ori_ri(int r, int16_t i);
147 	void ori_mi(int m, int16_t i, int o);
148 	void setb(int m, int b, int o);
149 	void do_sintr();
150 	void tsl(int m, int8_t i, int8_t d, int o);
151 	void wid(int s, int d);
152 	void xfer();
153 	void invalid(int opc);
154 
155 	// instruction fetch
156 	int16_t displacement(int wb);
157 	uint32_t offset(int aa, int mm, int w);
158 	int8_t imm8();
159 	int16_t imm16();
160 
161 	void examine_ccw(uint8_t ccw);
162 
163 	devcb_write_line m_write_sintr;
164 
165 	i8089_device *m_iop;
166 
167 	int m_icount;
168 
169 	// dma
170 	void terminate_dma(int offset);
171 
172 	bool m_xfer_pending;
173 	uint16_t m_dma_value;
174 	int m_dma_state;
175 	bool m_drq, m_store_hi, m_load_hi;
176 
177 	// dma state
178 	enum
179 	{
180 		DMA_IDLE,
181 		DMA_WAIT_FOR_SOURCE_DRQ,
182 		DMA_FETCH,
183 		DMA_TRANSLATE,
184 		DMA_WAIT_FOR_DEST_DRQ,
185 		DMA_STORE,
186 		DMA_STORE_BYTE_HIGH,
187 		DMA_COMPARE,
188 		DMA_TERMINATE
189 	};
190 
191 	int m_prio;
192 
193 	// priority
194 	enum
195 	{
196 		PRIO_DMA = 1,
197 		PRIO_DMA_TERM = 1,
198 		PRIO_PROG_CHAIN = 1,
199 		PRIO_CHAN_ATTN,
200 		PRIO_PROG,
201 		PRIO_IDLE
202 	};
203 };
204 
205 
206 // device type definition
207 DECLARE_DEVICE_TYPE(I8089_CHANNEL, i8089_channel_device)
208 
209 #endif // MAME_CPU_I8080_I8089_CHANNEL_H
210