1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /***************************************************************************
4 
5     tms32031.h
6 
7     TMS320C3x family 32-bit floating point DSP emulator
8 
9 ***************************************************************************/
10 
11 #ifndef MAME_CPU_TMS32031_TMS32031_H
12 #define MAME_CPU_TMS32031_TMS32031_H
13 
14 #pragma once
15 
16 
17 //**************************************************************************
18 //  DEBUGGING
19 //**************************************************************************
20 
21 #define TMS_3203X_LOG_OPCODE_USAGE  (0)
22 
23 
24 
25 //**************************************************************************
26 //  CONSTANTS
27 //**************************************************************************
28 
29 // interrupts
30 const int TMS3203X_IRQ0     = 0;        // IRQ0
31 const int TMS3203X_IRQ1     = 1;        // IRQ1
32 const int TMS3203X_IRQ2     = 2;        // IRQ2
33 const int TMS3203X_IRQ3     = 3;        // IRQ3
34 const int TMS3203X_XINT0    = 4;        // serial 0 transmit interrupt
35 const int TMS3203X_RINT0    = 5;        // serial 0 receive interrupt
36 const int TMS3203X_XINT1    = 6;        // serial 1 transmit interrupt
37 const int TMS3203X_RINT1    = 7;        // serial 1 receive interrupt
38 const int TMS3203X_TINT0    = 8;        // timer 0 interrupt
39 const int TMS3203X_TINT1    = 9;        // timer 1 interrupt
40 const int TMS3203X_DINT     = 10;       // DMA interrupt
41 const int TMS3203X_DINT0    = 10;       // DMA 0 interrupt (32032 only)
42 const int TMS3203X_DINT1    = 11;       // DMA 1 interrupt (32032 only)
43 const int TMS3203X_MCBL     = 12;       // Microcomputer/boot loader mode
44 const int TMS3203X_HOLD     = 13;       // Primary bus interface hold signal
45 
46 // register enumeration
47 enum
48 {
49 	TMS3203X_PC=1,
50 	TMS3203X_R0,
51 	TMS3203X_R1,
52 	TMS3203X_R2,
53 	TMS3203X_R3,
54 	TMS3203X_R4,
55 	TMS3203X_R5,
56 	TMS3203X_R6,
57 	TMS3203X_R7,
58 	TMS3203X_R0F,
59 	TMS3203X_R1F,
60 	TMS3203X_R2F,
61 	TMS3203X_R3F,
62 	TMS3203X_R4F,
63 	TMS3203X_R5F,
64 	TMS3203X_R6F,
65 	TMS3203X_R7F,
66 	TMS3203X_AR0,
67 	TMS3203X_AR1,
68 	TMS3203X_AR2,
69 	TMS3203X_AR3,
70 	TMS3203X_AR4,
71 	TMS3203X_AR5,
72 	TMS3203X_AR6,
73 	TMS3203X_AR7,
74 	TMS3203X_DP,
75 	TMS3203X_IR0,
76 	TMS3203X_IR1,
77 	TMS3203X_BK,
78 	TMS3203X_SP,
79 	TMS3203X_ST,
80 	TMS3203X_IE,
81 	TMS3203X_IF,
82 	TMS3203X_IOF,
83 	TMS3203X_RS,
84 	TMS3203X_RE,
85 	TMS3203X_RC
86 };
87 
88 
89 
90 //**************************************************************************
91 //  TYPE DEFINITIONS
92 //**************************************************************************
93 
94 // ======================> tms3203x_device
95 
96 class tms3203x_device : public cpu_device
97 {
98 	struct tmsreg
99 	{
100 		// constructors
tmsregtmsreg101 		tmsreg() { i32[0] = i32[1] = 0; }
tmsregtmsreg102 		tmsreg(double value) { from_double(value); }
tmsregtmsreg103 		tmsreg(int32_t mantissa, int8_t exponent) { set_mantissa(mantissa); set_exponent(exponent); }
104 
105 		// getters
integertmsreg106 		uint32_t integer() const { return i32[0]; }
mantissatmsreg107 		int32_t mantissa() const { return i32[0]; }
exponenttmsreg108 		int8_t exponent() const { return i32[1]; }
set_mantissatmsreg109 		void set_mantissa(int32_t man) { i32[0] = man; }
set_exponenttmsreg110 		void set_exponent(int8_t exp) { i32[1] = exp; }
111 
112 		// exporters
113 		float as_float() const;
114 		double as_double() const;
115 
116 		// importers
117 		void from_double(double);
118 
119 		uint32_t      i32[2];
120 	};
121 
122 public:
123 	virtual ~tms3203x_device();
124 
125 	// inline configuration helpers
set_mcbl_mode(bool mode)126 	void set_mcbl_mode(bool mode) { m_mcbl_mode = mode; }
xf0()127 	auto xf0() { return m_xf0_cb.bind(); }
xf1()128 	auto xf1() { return m_xf1_cb.bind(); }
iack()129 	auto iack() { return m_iack_cb.bind(); }
holda()130 	auto holda() { return m_holda_cb.bind(); }
131 
132 	// public interfaces
133 	static float fp_to_float(uint32_t floatdata);
134 	static double fp_to_double(uint32_t floatdata);
135 	static uint32_t float_to_fp(float fval);
136 	static uint32_t double_to_fp(double dval);
137 
138 protected:
139 	enum
140 	{
141 		CHIP_TYPE_TMS32030,
142 		CHIP_TYPE_TMS32031,
143 		CHIP_TYPE_TMS32032
144 	};
145 
146 	// construction/destruction
147 	tms3203x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t chiptype, address_map_constructor internal_map);
148 	void common_3203x(address_map &map);
149 
150 	// device-level overrides
151 	virtual void device_start() override;
152 	virtual void device_reset() override;
153 
154 	virtual const tiny_rom_entry *device_rom_region() const override;
155 
156 	// device_execute_interface overrides
157 	virtual uint32_t execute_min_cycles() const noexcept override;
158 	virtual uint32_t execute_max_cycles() const noexcept override;
159 	virtual uint32_t execute_input_lines() const noexcept override;
160 	virtual void execute_run() override;
161 	virtual void execute_set_input(int inputnum, int state) override;
162 
163 	// device_memory_interface overrides
164 	virtual space_config_vector memory_space_config() const override;
165 
166 	// device_state_interface overrides
167 	virtual void state_import(const device_state_entry &entry) override;
168 	virtual void state_export(const device_state_entry &entry) override;
169 	virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
170 
171 	// device_disasm_interface overrides
172 	virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
173 
174 	// internal peripheral device handlers
primary_bus_control_r()175 	uint32_t primary_bus_control_r() { return m_primary_bus_control; }
176 	void primary_bus_control_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
177 
178 	// memory helpers
179 	uint32_t ROPCODE(offs_t pc);
180 	uint32_t RMEM(offs_t addr);
181 	void WMEM(offs_t addr, uint32_t data);
182 
183 	// misc helpers
184 	void check_irqs();
185 	void execute_one();
186 	void update_special(int dreg);
187 	bool condition(int which);
188 
189 	// floating point helpers
190 	void int2float(tmsreg &srcdst);
191 	void float2int(tmsreg &srcdst, bool setflags);
192 	void negf(tmsreg &dst, tmsreg &src);
193 	void addf(tmsreg &dst, tmsreg &src1, tmsreg &src2);
194 	void subf(tmsreg &dst, tmsreg &src1, tmsreg &src2);
195 	void mpyf(tmsreg &dst, tmsreg &src1, tmsreg &src2);
196 	void norm(tmsreg &dst, tmsreg &src);
197 
198 	// memory addressing
199 	uint32_t mod00_d(uint32_t op, uint8_t ar);
200 	uint32_t mod01_d(uint32_t op, uint8_t ar);
201 	uint32_t mod02_d(uint32_t op, uint8_t ar);
202 	uint32_t mod03_d(uint32_t op, uint8_t ar);
203 	uint32_t mod04_d(uint32_t op, uint8_t ar);
204 	uint32_t mod05_d(uint32_t op, uint8_t ar);
205 	uint32_t mod06_d(uint32_t op, uint8_t ar);
206 	uint32_t mod07_d(uint32_t op, uint8_t ar);
207 
208 	uint32_t mod00_1(uint32_t op, uint8_t ar);
209 	uint32_t mod01_1(uint32_t op, uint8_t ar);
210 	uint32_t mod02_1(uint32_t op, uint8_t ar);
211 	uint32_t mod03_1(uint32_t op, uint8_t ar);
212 	uint32_t mod04_1(uint32_t op, uint8_t ar);
213 	uint32_t mod05_1(uint32_t op, uint8_t ar);
214 	uint32_t mod06_1(uint32_t op, uint8_t ar);
215 	uint32_t mod07_1(uint32_t op, uint8_t ar);
216 
217 	uint32_t mod08(uint32_t op, uint8_t ar);
218 	uint32_t mod09(uint32_t op, uint8_t ar);
219 	uint32_t mod0a(uint32_t op, uint8_t ar);
220 	uint32_t mod0b(uint32_t op, uint8_t ar);
221 	uint32_t mod0c(uint32_t op, uint8_t ar);
222 	uint32_t mod0d(uint32_t op, uint8_t ar);
223 	uint32_t mod0e(uint32_t op, uint8_t ar);
224 	uint32_t mod0f(uint32_t op, uint8_t ar);
225 
226 	uint32_t mod10(uint32_t op, uint8_t ar);
227 	uint32_t mod11(uint32_t op, uint8_t ar);
228 	uint32_t mod12(uint32_t op, uint8_t ar);
229 	uint32_t mod13(uint32_t op, uint8_t ar);
230 	uint32_t mod14(uint32_t op, uint8_t ar);
231 	uint32_t mod15(uint32_t op, uint8_t ar);
232 	uint32_t mod16(uint32_t op, uint8_t ar);
233 	uint32_t mod17(uint32_t op, uint8_t ar);
234 
235 	uint32_t mod18(uint32_t op, uint8_t ar);
236 	uint32_t mod19(uint32_t op, uint8_t ar);
237 	uint32_t modillegal(uint32_t op, uint8_t ar);
238 
239 	uint32_t mod00_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
240 	uint32_t mod01_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
241 	uint32_t mod02_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
242 	uint32_t mod03_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
243 	uint32_t mod04_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
244 	uint32_t mod05_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
245 	uint32_t mod06_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
246 	uint32_t mod07_1_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
247 
248 	uint32_t mod08_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
249 	uint32_t mod09_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
250 	uint32_t mod0a_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
251 	uint32_t mod0b_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
252 	uint32_t mod0c_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
253 	uint32_t mod0d_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
254 	uint32_t mod0e_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
255 	uint32_t mod0f_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
256 
257 	uint32_t mod10_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
258 	uint32_t mod11_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
259 	uint32_t mod12_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
260 	uint32_t mod13_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
261 	uint32_t mod14_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
262 	uint32_t mod15_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
263 	uint32_t mod16_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
264 	uint32_t mod17_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
265 	uint32_t mod18_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
266 	uint32_t mod19_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
267 	uint32_t modillegal_def(uint32_t op, uint8_t ar, uint32_t *&defptrptr);
268 
269 	// instructions
270 	void illegal(uint32_t op);
271 	void unimplemented(uint32_t op);
272 
273 	void absf_reg(uint32_t op);
274 	void absf_dir(uint32_t op);
275 	void absf_ind(uint32_t op);
276 	void absf_imm(uint32_t op);
277 	void absi_reg(uint32_t op);
278 	void absi_dir(uint32_t op);
279 	void absi_ind(uint32_t op);
280 	void absi_imm(uint32_t op);
281 	void addc_reg(uint32_t op);
282 	void addc_dir(uint32_t op);
283 	void addc_ind(uint32_t op);
284 	void addc_imm(uint32_t op);
285 	void addf_reg(uint32_t op);
286 	void addf_dir(uint32_t op);
287 	void addf_ind(uint32_t op);
288 	void addf_imm(uint32_t op);
289 	void addi_reg(uint32_t op);
290 	void addi_dir(uint32_t op);
291 	void addi_ind(uint32_t op);
292 	void addi_imm(uint32_t op);
293 	void and_reg(uint32_t op);
294 	void and_dir(uint32_t op);
295 	void and_ind(uint32_t op);
296 	void and_imm(uint32_t op);
297 	void andn_reg(uint32_t op);
298 	void andn_dir(uint32_t op);
299 	void andn_ind(uint32_t op);
300 	void andn_imm(uint32_t op);
301 	void ash_reg(uint32_t op);
302 	void ash_dir(uint32_t op);
303 	void ash_ind(uint32_t op);
304 	void ash_imm(uint32_t op);
305 	void cmpf_reg(uint32_t op);
306 	void cmpf_dir(uint32_t op);
307 	void cmpf_ind(uint32_t op);
308 	void cmpf_imm(uint32_t op);
309 	void cmpi_reg(uint32_t op);
310 	void cmpi_dir(uint32_t op);
311 	void cmpi_ind(uint32_t op);
312 	void cmpi_imm(uint32_t op);
313 	void fix_reg(uint32_t op);
314 	void fix_dir(uint32_t op);
315 	void fix_ind(uint32_t op);
316 	void fix_imm(uint32_t op);
317 	void float_reg(uint32_t op);
318 	void float_dir(uint32_t op);
319 	void float_ind(uint32_t op);
320 	void float_imm(uint32_t op);
321 	void idle(uint32_t op);
322 	void lde_reg(uint32_t op);
323 	void lde_dir(uint32_t op);
324 	void lde_ind(uint32_t op);
325 	void lde_imm(uint32_t op);
326 	void ldf_reg(uint32_t op);
327 	void ldf_dir(uint32_t op);
328 	void ldf_ind(uint32_t op);
329 	void ldf_imm(uint32_t op);
330 	void ldfi_dir(uint32_t op);
331 	void ldfi_ind(uint32_t op);
332 	void ldi_reg(uint32_t op);
333 	void ldi_dir(uint32_t op);
334 	void ldi_ind(uint32_t op);
335 	void ldi_imm(uint32_t op);
336 	void ldii_dir(uint32_t op);
337 	void ldii_ind(uint32_t op);
338 	void ldm_reg(uint32_t op);
339 	void ldm_dir(uint32_t op);
340 	void ldm_ind(uint32_t op);
341 	void ldm_imm(uint32_t op);
342 	void lsh_reg(uint32_t op);
343 	void lsh_dir(uint32_t op);
344 	void lsh_ind(uint32_t op);
345 	void lsh_imm(uint32_t op);
346 	void mpyf_reg(uint32_t op);
347 	void mpyf_dir(uint32_t op);
348 	void mpyf_ind(uint32_t op);
349 	void mpyf_imm(uint32_t op);
350 	void mpyi_reg(uint32_t op);
351 	void mpyi_dir(uint32_t op);
352 	void mpyi_ind(uint32_t op);
353 	void mpyi_imm(uint32_t op);
354 	void negb_reg(uint32_t op);
355 	void negb_dir(uint32_t op);
356 	void negb_ind(uint32_t op);
357 	void negb_imm(uint32_t op);
358 	void negf_reg(uint32_t op);
359 	void negf_dir(uint32_t op);
360 	void negf_ind(uint32_t op);
361 	void negf_imm(uint32_t op);
362 	void negi_reg(uint32_t op);
363 	void negi_dir(uint32_t op);
364 	void negi_ind(uint32_t op);
365 	void negi_imm(uint32_t op);
366 	void nop_reg(uint32_t op);
367 	void nop_ind(uint32_t op);
368 	void norm_reg(uint32_t op);
369 	void norm_dir(uint32_t op);
370 	void norm_ind(uint32_t op);
371 	void norm_imm(uint32_t op);
372 	void not_reg(uint32_t op);
373 	void not_dir(uint32_t op);
374 	void not_ind(uint32_t op);
375 	void not_imm(uint32_t op);
376 	void pop(uint32_t op);
377 	void popf(uint32_t op);
378 	void push(uint32_t op);
379 	void pushf(uint32_t op);
380 	void or_reg(uint32_t op);
381 	void or_dir(uint32_t op);
382 	void or_ind(uint32_t op);
383 	void or_imm(uint32_t op);
384 	void maxspeed(uint32_t op);
385 	void rnd_reg(uint32_t op);
386 	void rnd_dir(uint32_t op);
387 	void rnd_ind(uint32_t op);
388 	void rnd_imm(uint32_t op);
389 	void rol(uint32_t op);
390 	void rolc(uint32_t op);
391 	void ror(uint32_t op);
392 	void rorc(uint32_t op);
393 	void rpts_reg(uint32_t op);
394 	void rpts_dir(uint32_t op);
395 	void rpts_ind(uint32_t op);
396 	void rpts_imm(uint32_t op);
397 	void stf_dir(uint32_t op);
398 	void stf_ind(uint32_t op);
399 	void stfi_dir(uint32_t op);
400 	void stfi_ind(uint32_t op);
401 	void sti_dir(uint32_t op);
402 	void sti_ind(uint32_t op);
403 	void stii_dir(uint32_t op);
404 	void stii_ind(uint32_t op);
405 	void sigi(uint32_t op);
406 	void subb_reg(uint32_t op);
407 	void subb_dir(uint32_t op);
408 	void subb_ind(uint32_t op);
409 	void subb_imm(uint32_t op);
410 	void subc_reg(uint32_t op);
411 	void subc_dir(uint32_t op);
412 	void subc_ind(uint32_t op);
413 	void subc_imm(uint32_t op);
414 	void subf_reg(uint32_t op);
415 	void subf_dir(uint32_t op);
416 	void subf_ind(uint32_t op);
417 	void subf_imm(uint32_t op);
418 	void subi_reg(uint32_t op);
419 	void subi_dir(uint32_t op);
420 	void subi_ind(uint32_t op);
421 	void subi_imm(uint32_t op);
422 	void subrb_reg(uint32_t op);
423 	void subrb_dir(uint32_t op);
424 	void subrb_ind(uint32_t op);
425 	void subrb_imm(uint32_t op);
426 	void subrf_reg(uint32_t op);
427 	void subrf_dir(uint32_t op);
428 	void subrf_ind(uint32_t op);
429 	void subrf_imm(uint32_t op);
430 	void subri_reg(uint32_t op);
431 	void subri_dir(uint32_t op);
432 	void subri_ind(uint32_t op);
433 	void subri_imm(uint32_t op);
434 	void tstb_reg(uint32_t op);
435 	void tstb_dir(uint32_t op);
436 	void tstb_ind(uint32_t op);
437 	void tstb_imm(uint32_t op);
438 	void xor_reg(uint32_t op);
439 	void xor_dir(uint32_t op);
440 	void xor_ind(uint32_t op);
441 	void xor_imm(uint32_t op);
442 	void iack_dir(uint32_t op);
443 	void iack_ind(uint32_t op);
444 	void addc3_regreg(uint32_t op);
445 	void addc3_indreg(uint32_t op);
446 	void addc3_regind(uint32_t op);
447 	void addc3_indind(uint32_t op);
448 	void addf3_regreg(uint32_t op);
449 	void addf3_indreg(uint32_t op);
450 	void addf3_regind(uint32_t op);
451 	void addf3_indind(uint32_t op);
452 	void addi3_regreg(uint32_t op);
453 	void addi3_indreg(uint32_t op);
454 	void addi3_regind(uint32_t op);
455 	void addi3_indind(uint32_t op);
456 	void and3_regreg(uint32_t op);
457 	void and3_indreg(uint32_t op);
458 	void and3_regind(uint32_t op);
459 	void and3_indind(uint32_t op);
460 	void andn3_regreg(uint32_t op);
461 	void andn3_indreg(uint32_t op);
462 	void andn3_regind(uint32_t op);
463 	void andn3_indind(uint32_t op);
464 	void ash3_regreg(uint32_t op);
465 	void ash3_indreg(uint32_t op);
466 	void ash3_regind(uint32_t op);
467 	void ash3_indind(uint32_t op);
468 	void cmpf3_regreg(uint32_t op);
469 	void cmpf3_indreg(uint32_t op);
470 	void cmpf3_regind(uint32_t op);
471 	void cmpf3_indind(uint32_t op);
472 	void cmpi3_regreg(uint32_t op);
473 	void cmpi3_indreg(uint32_t op);
474 	void cmpi3_regind(uint32_t op);
475 	void cmpi3_indind(uint32_t op);
476 	void lsh3_regreg(uint32_t op);
477 	void lsh3_indreg(uint32_t op);
478 	void lsh3_regind(uint32_t op);
479 	void lsh3_indind(uint32_t op);
480 	void mpyf3_regreg(uint32_t op);
481 	void mpyf3_indreg(uint32_t op);
482 	void mpyf3_regind(uint32_t op);
483 	void mpyf3_indind(uint32_t op);
484 	void mpyi3_regreg(uint32_t op);
485 	void mpyi3_indreg(uint32_t op);
486 	void mpyi3_regind(uint32_t op);
487 	void mpyi3_indind(uint32_t op);
488 	void or3_regreg(uint32_t op);
489 	void or3_indreg(uint32_t op);
490 	void or3_regind(uint32_t op);
491 	void or3_indind(uint32_t op);
492 	void subb3_regreg(uint32_t op);
493 	void subb3_indreg(uint32_t op);
494 	void subb3_regind(uint32_t op);
495 	void subb3_indind(uint32_t op);
496 	void subf3_regreg(uint32_t op);
497 	void subf3_indreg(uint32_t op);
498 	void subf3_regind(uint32_t op);
499 	void subf3_indind(uint32_t op);
500 	void subi3_regreg(uint32_t op);
501 	void subi3_indreg(uint32_t op);
502 	void subi3_regind(uint32_t op);
503 	void subi3_indind(uint32_t op);
504 	void tstb3_regreg(uint32_t op);
505 	void tstb3_indreg(uint32_t op);
506 	void tstb3_regind(uint32_t op);
507 	void tstb3_indind(uint32_t op);
508 	void xor3_regreg(uint32_t op);
509 	void xor3_indreg(uint32_t op);
510 	void xor3_regind(uint32_t op);
511 	void xor3_indind(uint32_t op);
512 	void ldfu_reg(uint32_t op);
513 	void ldfu_dir(uint32_t op);
514 	void ldfu_ind(uint32_t op);
515 	void ldfu_imm(uint32_t op);
516 	void ldflo_reg(uint32_t op);
517 	void ldflo_dir(uint32_t op);
518 	void ldflo_ind(uint32_t op);
519 	void ldflo_imm(uint32_t op);
520 	void ldfls_reg(uint32_t op);
521 	void ldfls_dir(uint32_t op);
522 	void ldfls_ind(uint32_t op);
523 	void ldfls_imm(uint32_t op);
524 	void ldfhi_reg(uint32_t op);
525 	void ldfhi_dir(uint32_t op);
526 	void ldfhi_ind(uint32_t op);
527 	void ldfhi_imm(uint32_t op);
528 	void ldfhs_reg(uint32_t op);
529 	void ldfhs_dir(uint32_t op);
530 	void ldfhs_ind(uint32_t op);
531 	void ldfhs_imm(uint32_t op);
532 	void ldfeq_reg(uint32_t op);
533 	void ldfeq_dir(uint32_t op);
534 	void ldfeq_ind(uint32_t op);
535 	void ldfeq_imm(uint32_t op);
536 	void ldfne_reg(uint32_t op);
537 	void ldfne_dir(uint32_t op);
538 	void ldfne_ind(uint32_t op);
539 	void ldfne_imm(uint32_t op);
540 	void ldflt_reg(uint32_t op);
541 	void ldflt_dir(uint32_t op);
542 	void ldflt_ind(uint32_t op);
543 	void ldflt_imm(uint32_t op);
544 	void ldfle_reg(uint32_t op);
545 	void ldfle_dir(uint32_t op);
546 	void ldfle_ind(uint32_t op);
547 	void ldfle_imm(uint32_t op);
548 	void ldfgt_reg(uint32_t op);
549 	void ldfgt_dir(uint32_t op);
550 	void ldfgt_ind(uint32_t op);
551 	void ldfgt_imm(uint32_t op);
552 	void ldfge_reg(uint32_t op);
553 	void ldfge_dir(uint32_t op);
554 	void ldfge_ind(uint32_t op);
555 	void ldfge_imm(uint32_t op);
556 	void ldfnv_reg(uint32_t op);
557 	void ldfnv_dir(uint32_t op);
558 	void ldfnv_ind(uint32_t op);
559 	void ldfnv_imm(uint32_t op);
560 	void ldfv_reg(uint32_t op);
561 	void ldfv_dir(uint32_t op);
562 	void ldfv_ind(uint32_t op);
563 	void ldfv_imm(uint32_t op);
564 	void ldfnuf_reg(uint32_t op);
565 	void ldfnuf_dir(uint32_t op);
566 	void ldfnuf_ind(uint32_t op);
567 	void ldfnuf_imm(uint32_t op);
568 	void ldfuf_reg(uint32_t op);
569 	void ldfuf_dir(uint32_t op);
570 	void ldfuf_ind(uint32_t op);
571 	void ldfuf_imm(uint32_t op);
572 	void ldfnlv_reg(uint32_t op);
573 	void ldfnlv_dir(uint32_t op);
574 	void ldfnlv_ind(uint32_t op);
575 	void ldfnlv_imm(uint32_t op);
576 	void ldflv_reg(uint32_t op);
577 	void ldflv_dir(uint32_t op);
578 	void ldflv_ind(uint32_t op);
579 	void ldflv_imm(uint32_t op);
580 	void ldfnluf_reg(uint32_t op);
581 	void ldfnluf_dir(uint32_t op);
582 	void ldfnluf_ind(uint32_t op);
583 	void ldfnluf_imm(uint32_t op);
584 	void ldfluf_reg(uint32_t op);
585 	void ldfluf_dir(uint32_t op);
586 	void ldfluf_ind(uint32_t op);
587 	void ldfluf_imm(uint32_t op);
588 	void ldfzuf_reg(uint32_t op);
589 	void ldfzuf_dir(uint32_t op);
590 	void ldfzuf_ind(uint32_t op);
591 	void ldfzuf_imm(uint32_t op);
592 	void ldiu_reg(uint32_t op);
593 	void ldiu_dir(uint32_t op);
594 	void ldiu_ind(uint32_t op);
595 	void ldiu_imm(uint32_t op);
596 	void ldilo_reg(uint32_t op);
597 	void ldilo_dir(uint32_t op);
598 	void ldilo_ind(uint32_t op);
599 	void ldilo_imm(uint32_t op);
600 	void ldils_reg(uint32_t op);
601 	void ldils_dir(uint32_t op);
602 	void ldils_ind(uint32_t op);
603 	void ldils_imm(uint32_t op);
604 	void ldihi_reg(uint32_t op);
605 	void ldihi_dir(uint32_t op);
606 	void ldihi_ind(uint32_t op);
607 	void ldihi_imm(uint32_t op);
608 	void ldihs_reg(uint32_t op);
609 	void ldihs_dir(uint32_t op);
610 	void ldihs_ind(uint32_t op);
611 	void ldihs_imm(uint32_t op);
612 	void ldieq_reg(uint32_t op);
613 	void ldieq_dir(uint32_t op);
614 	void ldieq_ind(uint32_t op);
615 	void ldieq_imm(uint32_t op);
616 	void ldine_reg(uint32_t op);
617 	void ldine_dir(uint32_t op);
618 	void ldine_ind(uint32_t op);
619 	void ldine_imm(uint32_t op);
620 	void ldilt_reg(uint32_t op);
621 	void ldilt_dir(uint32_t op);
622 	void ldilt_ind(uint32_t op);
623 	void ldilt_imm(uint32_t op);
624 	void ldile_reg(uint32_t op);
625 	void ldile_dir(uint32_t op);
626 	void ldile_ind(uint32_t op);
627 	void ldile_imm(uint32_t op);
628 	void ldigt_reg(uint32_t op);
629 	void ldigt_dir(uint32_t op);
630 	void ldigt_ind(uint32_t op);
631 	void ldigt_imm(uint32_t op);
632 	void ldige_reg(uint32_t op);
633 	void ldige_dir(uint32_t op);
634 	void ldige_ind(uint32_t op);
635 	void ldige_imm(uint32_t op);
636 	void ldinv_reg(uint32_t op);
637 	void ldinv_dir(uint32_t op);
638 	void ldinv_ind(uint32_t op);
639 	void ldinv_imm(uint32_t op);
640 	void ldiuf_reg(uint32_t op);
641 	void ldiuf_dir(uint32_t op);
642 	void ldiuf_ind(uint32_t op);
643 	void ldiuf_imm(uint32_t op);
644 	void ldinuf_reg(uint32_t op);
645 	void ldinuf_dir(uint32_t op);
646 	void ldinuf_ind(uint32_t op);
647 	void ldinuf_imm(uint32_t op);
648 	void ldiv_reg(uint32_t op);
649 	void ldiv_dir(uint32_t op);
650 	void ldiv_ind(uint32_t op);
651 	void ldiv_imm(uint32_t op);
652 	void ldinlv_reg(uint32_t op);
653 	void ldinlv_dir(uint32_t op);
654 	void ldinlv_ind(uint32_t op);
655 	void ldinlv_imm(uint32_t op);
656 	void ldilv_reg(uint32_t op);
657 	void ldilv_dir(uint32_t op);
658 	void ldilv_ind(uint32_t op);
659 	void ldilv_imm(uint32_t op);
660 	void ldinluf_reg(uint32_t op);
661 	void ldinluf_dir(uint32_t op);
662 	void ldinluf_ind(uint32_t op);
663 	void ldinluf_imm(uint32_t op);
664 	void ldiluf_reg(uint32_t op);
665 	void ldiluf_dir(uint32_t op);
666 	void ldiluf_ind(uint32_t op);
667 	void ldiluf_imm(uint32_t op);
668 	void ldizuf_reg(uint32_t op);
669 	void ldizuf_dir(uint32_t op);
670 	void ldizuf_ind(uint32_t op);
671 	void ldizuf_imm(uint32_t op);
672 	void execute_delayed(uint32_t newpc);
673 	void br_imm(uint32_t op);
674 	void brd_imm(uint32_t op);
675 	void call_imm(uint32_t op);
676 	void rptb_imm(uint32_t op);
677 	void swi(uint32_t op);
678 	void brc_reg(uint32_t op);
679 	void brcd_reg(uint32_t op);
680 	void brc_imm(uint32_t op);
681 	void brcd_imm(uint32_t op);
682 	void dbc_reg(uint32_t op);
683 	void dbcd_reg(uint32_t op);
684 	void dbc_imm(uint32_t op);
685 	void dbcd_imm(uint32_t op);
686 	void callc_reg(uint32_t op);
687 	void callc_imm(uint32_t op);
688 	void trap(int trapnum);
689 	void trapc(uint32_t op);
690 	void retic_reg(uint32_t op);
691 	void retsc_reg(uint32_t op);
692 	void mpyaddf_0(uint32_t op);
693 	void mpyaddf_1(uint32_t op);
694 	void mpyaddf_2(uint32_t op);
695 	void mpyaddf_3(uint32_t op);
696 	void mpysubf_0(uint32_t op);
697 	void mpysubf_1(uint32_t op);
698 	void mpysubf_2(uint32_t op);
699 	void mpysubf_3(uint32_t op);
700 	void mpyaddi_0(uint32_t op);
701 	void mpyaddi_1(uint32_t op);
702 	void mpyaddi_2(uint32_t op);
703 	void mpyaddi_3(uint32_t op);
704 	void mpysubi_0(uint32_t op);
705 	void mpysubi_1(uint32_t op);
706 	void mpysubi_2(uint32_t op);
707 	void mpysubi_3(uint32_t op);
708 	void stfstf(uint32_t op);
709 	void stisti(uint32_t op);
710 	void ldfldf(uint32_t op);
711 	void ldildi(uint32_t op);
712 	void absfstf(uint32_t op);
713 	void absisti(uint32_t op);
714 	void addf3stf(uint32_t op);
715 	void addi3sti(uint32_t op);
716 	void and3sti(uint32_t op);
717 	void ash3sti(uint32_t op);
718 	void fixsti(uint32_t op);
719 	void floatstf(uint32_t op);
720 	void ldfstf(uint32_t op);
721 	void ldisti(uint32_t op);
722 	void lsh3sti(uint32_t op);
723 	void mpyf3stf(uint32_t op);
724 	void mpyi3sti(uint32_t op);
725 	void negfstf(uint32_t op);
726 	void negisti(uint32_t op);
727 	void notsti(uint32_t op);
728 	void or3sti(uint32_t op);
729 	void subf3stf(uint32_t op);
730 	void subi3sti(uint32_t op);
731 	void xor3sti(uint32_t op);
732 
733 	// configuration
734 	const address_space_config      m_program_config;
735 	uint32_t                          m_chip_type;
736 
737 	union int_double
738 	{
739 		double d;
740 		float f[2];
741 		uint32_t i[2];
742 	};
743 
744 	// core registers
745 	uint32_t              m_pc;
746 	tmsreg              m_r[36];
747 	uint32_t              m_bkmask;
748 
749 	// internal peripheral registers
750 	enum primary_bus_control_mask : uint32_t
751 	{
752 		HOLDST = 0x00000001, // hold status
753 		NOHOLD = 0x00000002, // external hold disable
754 		HIZ    = 0x00000004, // internal hold
755 		SWW    = 0x00000018, // software wait mode
756 		WTCNT  = 0x000000e0, // software wait count
757 		BNKCMP = 0x00001f00, // bank compare
758 
759 		WMASK  = 0x00001ffe
760 	};
761 	uint32_t            m_primary_bus_control;
762 
763 	// internal stuff
764 	uint16_t            m_irq_state;
765 	bool                m_delayed;
766 	bool                m_irq_pending;
767 	bool                m_is_idling;
768 	int                 m_icount;
769 
770 	uint32_t            m_iotemp;
771 	memory_access<24, 2, -2, ENDIANNESS_LITTLE>::cache m_cache;
772 	memory_access<24, 2, -2, ENDIANNESS_LITTLE>::specific m_program;
773 
774 	optional_memory_region m_internal_rom;
775 
776 	bool                m_mcbl_mode;
777 	bool                m_hold_state;
778 
779 	devcb_write8        m_xf0_cb;
780 	devcb_write8        m_xf1_cb;
781 	devcb_write8        m_iack_cb;
782 	devcb_write_line    m_holda_cb;
783 
784 	// tables
785 	static void (tms3203x_device::*const s_tms32031ops[])(uint32_t op);
786 	static uint32_t (tms3203x_device::*const s_indirect_d[0x20])(uint32_t, uint8_t);
787 	static uint32_t (tms3203x_device::*const s_indirect_1[0x20])(uint32_t, uint8_t);
788 	static uint32_t (tms3203x_device::*const s_indirect_1_def[0x20])(uint32_t, uint8_t, uint32_t *&);
789 
790 #if (TMS_3203X_LOG_OPCODE_USAGE)
791 	uint32_t              m_hits[0x200*4];
792 #endif
793 };
794 
795 
796 // ======================> tms32030_device
797 
798 class tms32030_device : public tms3203x_device
799 {
800 public:
801 	// construction/destruction
802 	tms32030_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
803 	void internal_32030(address_map &map);
804 };
805 
806 
807 // ======================> tms32031_device
808 
809 class tms32031_device : public tms3203x_device
810 {
811 public:
812 	// construction/destruction
813 	tms32031_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
814 	void internal_32031(address_map &map);
815 };
816 
817 
818 // ======================> tms32032_device
819 
820 class tms32032_device : public tms3203x_device
821 {
822 public:
823 	// construction/destruction
824 	tms32032_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
825 	void internal_32032(address_map &map);
826 };
827 
828 
829 // device type definition
830 DECLARE_DEVICE_TYPE(TMS32030, tms32030_device)
831 DECLARE_DEVICE_TYPE(TMS32031, tms32031_device)
832 DECLARE_DEVICE_TYPE(TMS32032, tms32032_device)
833 
834 #endif // MAME_CPU_TMS32031_TMS32031_H
835