1 /*###################################################################################################
2 **
3 **	TMS34010: Portable Texas Instruments TMS34010 emulator
4 **
5 **	Copyright (C) Alex Pasadyn/Zsolt Vasvari 1998
6 **	 Parts based on code by Aaron Giles
7 **
8 **#################################################################################################*/
9 
10 #include <stdio.h>
11 #include "driver.h"
12 #include "osd_cpu.h"
13 #include "tms34010.h"
14 #include "34010ops.h"
15 
16 
17 /*###################################################################################################
18 **	FIELD WRITE FUNCTIONS
19 **#################################################################################################*/
20 
WRITE_HANDLER(wfield_01)21 WRITE_HANDLER( wfield_01 )
22 {
23 	WFIELDMAC(0x01,16);
24 }
25 
WRITE_HANDLER(wfield_02)26 WRITE_HANDLER( wfield_02 )
27 {
28 	WFIELDMAC(0x03,15);
29 }
30 
WRITE_HANDLER(wfield_03)31 WRITE_HANDLER( wfield_03 )
32 {
33 	WFIELDMAC(0x07,14);
34 }
35 
WRITE_HANDLER(wfield_04)36 WRITE_HANDLER( wfield_04 )
37 {
38 	WFIELDMAC(0x0f,13);
39 }
40 
WRITE_HANDLER(wfield_05)41 WRITE_HANDLER( wfield_05 )
42 {
43 	WFIELDMAC(0x1f,12);
44 }
45 
WRITE_HANDLER(wfield_06)46 WRITE_HANDLER( wfield_06 )
47 {
48 	WFIELDMAC(0x3f,11);
49 }
50 
WRITE_HANDLER(wfield_07)51 WRITE_HANDLER( wfield_07 )
52 {
53 	WFIELDMAC(0x7f,10);
54 }
55 
WRITE_HANDLER(wfield_08)56 WRITE_HANDLER( wfield_08 )
57 {
58 	WFIELDMAC_8;
59 }
60 
WRITE_HANDLER(wfield_09)61 WRITE_HANDLER( wfield_09 )
62 {
63 	WFIELDMAC(0x1ff,8);
64 }
65 
WRITE_HANDLER(wfield_10)66 WRITE_HANDLER( wfield_10 )
67 {
68 	WFIELDMAC(0x3ff,7);
69 }
70 
WRITE_HANDLER(wfield_11)71 WRITE_HANDLER( wfield_11 )
72 {
73 	WFIELDMAC(0x7ff,6);
74 }
75 
WRITE_HANDLER(wfield_12)76 WRITE_HANDLER( wfield_12 )
77 {
78 	WFIELDMAC(0xfff,5);
79 }
80 
WRITE_HANDLER(wfield_13)81 WRITE_HANDLER( wfield_13 )
82 {
83 	WFIELDMAC(0x1fff,4);
84 }
85 
WRITE_HANDLER(wfield_14)86 WRITE_HANDLER( wfield_14 )
87 {
88 	WFIELDMAC(0x3fff,3);
89 }
90 
WRITE_HANDLER(wfield_15)91 WRITE_HANDLER( wfield_15 )
92 {
93 	WFIELDMAC(0x7fff,2);
94 }
95 
WRITE_HANDLER(wfield_16)96 WRITE_HANDLER( wfield_16 )
97 {
98 	if (offset & 0x0f)
99 	{
100 		WFIELDMAC(0xffff,1);
101 	}
102 	else
103 	{
104 		TMS34010_WRMEM_WORD(TOBYTE(offset),data);
105 	}
106 }
107 
WRITE_HANDLER(wfield_17)108 WRITE_HANDLER( wfield_17 )
109 {
110 	WFIELDMAC(0x1ffff,0);
111 }
112 
WRITE_HANDLER(wfield_18)113 WRITE_HANDLER( wfield_18 )
114 {
115 	WFIELDMAC_BIG(0x3ffff,15);
116 }
117 
WRITE_HANDLER(wfield_19)118 WRITE_HANDLER( wfield_19 )
119 {
120 	WFIELDMAC_BIG(0x7ffff,14);
121 }
122 
WRITE_HANDLER(wfield_20)123 WRITE_HANDLER( wfield_20 )
124 {
125 	WFIELDMAC_BIG(0xfffff,13);
126 }
127 
WRITE_HANDLER(wfield_21)128 WRITE_HANDLER( wfield_21 )
129 {
130 	WFIELDMAC_BIG(0x1fffff,12);
131 }
132 
WRITE_HANDLER(wfield_22)133 WRITE_HANDLER( wfield_22 )
134 {
135 	WFIELDMAC_BIG(0x3fffff,11);
136 }
137 
WRITE_HANDLER(wfield_23)138 WRITE_HANDLER( wfield_23 )
139 {
140 	WFIELDMAC_BIG(0x7fffff,10);
141 }
142 
WRITE_HANDLER(wfield_24)143 WRITE_HANDLER( wfield_24 )
144 {
145 	WFIELDMAC_BIG(0xffffff,9);
146 }
147 
WRITE_HANDLER(wfield_25)148 WRITE_HANDLER( wfield_25 )
149 {
150 	WFIELDMAC_BIG(0x1ffffff,8);
151 }
152 
WRITE_HANDLER(wfield_26)153 WRITE_HANDLER( wfield_26 )
154 {
155 	WFIELDMAC_BIG(0x3ffffff,7);
156 }
157 
WRITE_HANDLER(wfield_27)158 WRITE_HANDLER( wfield_27 )
159 {
160 	WFIELDMAC_BIG(0x7ffffff,6);
161 }
162 
WRITE_HANDLER(wfield_28)163 WRITE_HANDLER( wfield_28 )
164 {
165 	WFIELDMAC_BIG(0xfffffff,5);
166 }
167 
WRITE_HANDLER(wfield_29)168 WRITE_HANDLER( wfield_29 )
169 {
170 	WFIELDMAC_BIG(0x1fffffff,4);
171 }
172 
WRITE_HANDLER(wfield_30)173 WRITE_HANDLER( wfield_30 )
174 {
175 	WFIELDMAC_BIG(0x3fffffff,3);
176 }
177 
WRITE_HANDLER(wfield_31)178 WRITE_HANDLER( wfield_31 )
179 {
180 	WFIELDMAC_BIG(0x7fffffff,2);
181 }
182 
WRITE_HANDLER(wfield_32)183 WRITE_HANDLER( wfield_32 )
184 {
185 	WFIELDMAC_32;
186 }
187 
188 
189 
190 /*###################################################################################################
191 **	FIELD READ FUNCTIONS (ZERO-EXTEND)
192 **#################################################################################################*/
193 
READ_HANDLER(rfield_z_01)194 READ_HANDLER( rfield_z_01 )
195 {
196 	UINT32 ret;
197 	RFIELDMAC(0x01,16);
198 	return ret;
199 }
200 
READ_HANDLER(rfield_z_02)201 READ_HANDLER( rfield_z_02 )
202 {
203 	UINT32 ret;
204 	RFIELDMAC(0x03,15);
205 	return ret;
206 }
207 
READ_HANDLER(rfield_z_03)208 READ_HANDLER( rfield_z_03 )
209 {
210 	UINT32 ret;
211 	RFIELDMAC(0x07,14);
212 	return ret;
213 }
214 
READ_HANDLER(rfield_z_04)215 READ_HANDLER( rfield_z_04 )
216 {
217 	UINT32 ret;
218 	RFIELDMAC(0x0f,13);
219 	return ret;
220 }
221 
READ_HANDLER(rfield_z_05)222 READ_HANDLER( rfield_z_05 )
223 {
224 	UINT32 ret;
225 	RFIELDMAC(0x1f,12);
226 	return ret;
227 }
228 
READ_HANDLER(rfield_z_06)229 READ_HANDLER( rfield_z_06 )
230 {
231 	UINT32 ret;
232 	RFIELDMAC(0x3f,11);
233 	return ret;
234 }
235 
READ_HANDLER(rfield_z_07)236 READ_HANDLER( rfield_z_07 )
237 {
238 	UINT32 ret;
239 	RFIELDMAC(0x7f,10);
240 	return ret;
241 }
242 
READ_HANDLER(rfield_z_08)243 READ_HANDLER( rfield_z_08 )
244 {
245 	UINT32 ret;
246 	RFIELDMAC_8;
247 	return ret;
248 }
249 
READ_HANDLER(rfield_z_09)250 READ_HANDLER( rfield_z_09 )
251 {
252 	UINT32 ret;
253 	RFIELDMAC(0x1ff,8);
254 	return ret;
255 }
256 
READ_HANDLER(rfield_z_10)257 READ_HANDLER( rfield_z_10 )
258 {
259 	UINT32 ret;
260 	RFIELDMAC(0x3ff,7);
261 	return ret;
262 }
263 
READ_HANDLER(rfield_z_11)264 READ_HANDLER( rfield_z_11 )
265 {
266 	UINT32 ret;
267 	RFIELDMAC(0x7ff,6);
268 	return ret;
269 }
270 
READ_HANDLER(rfield_z_12)271 READ_HANDLER( rfield_z_12 )
272 {
273 	UINT32 ret;
274 	RFIELDMAC(0xfff,5);
275 	return ret;
276 }
277 
READ_HANDLER(rfield_z_13)278 READ_HANDLER( rfield_z_13 )
279 {
280 	UINT32 ret;
281 	RFIELDMAC(0x1fff,4);
282 	return ret;
283 }
284 
READ_HANDLER(rfield_z_14)285 READ_HANDLER( rfield_z_14 )
286 {
287 	UINT32 ret;
288 	RFIELDMAC(0x3fff,3);
289 	return ret;
290 }
291 
READ_HANDLER(rfield_z_15)292 READ_HANDLER( rfield_z_15 )
293 {
294 	UINT32 ret;
295 	RFIELDMAC(0x7fff,2);
296 	return ret;
297 }
298 
READ_HANDLER(rfield_z_16)299 READ_HANDLER( rfield_z_16 )
300 {
301 	UINT32 ret;
302 	if (offset & 0x0f)
303 	{
304 		RFIELDMAC(0xffff,1);
305 	}
306 
307 	else
308 		ret = TMS34010_RDMEM_WORD(TOBYTE(offset));
309 	return ret;
310 }
311 
READ_HANDLER(rfield_z_17)312 READ_HANDLER( rfield_z_17 )
313 {
314 	UINT32 ret;
315 	RFIELDMAC(0x1ffff,0);
316 	return ret;
317 }
318 
READ_HANDLER(rfield_z_18)319 READ_HANDLER( rfield_z_18 )
320 {
321 	UINT32 ret;
322 	RFIELDMAC_BIG(0x3ffff,15);
323 	return ret;
324 }
325 
READ_HANDLER(rfield_z_19)326 READ_HANDLER( rfield_z_19 )
327 {
328 	UINT32 ret;
329 	RFIELDMAC_BIG(0x7ffff,14);
330 	return ret;
331 }
332 
READ_HANDLER(rfield_z_20)333 READ_HANDLER( rfield_z_20 )
334 {
335 	UINT32 ret;
336 	RFIELDMAC_BIG(0xfffff,13);
337 	return ret;
338 }
339 
READ_HANDLER(rfield_z_21)340 READ_HANDLER( rfield_z_21 )
341 {
342 	UINT32 ret;
343 	RFIELDMAC_BIG(0x1fffff,12);
344 	return ret;
345 }
346 
READ_HANDLER(rfield_z_22)347 READ_HANDLER( rfield_z_22 )
348 {
349 	UINT32 ret;
350 	RFIELDMAC_BIG(0x3fffff,11);
351 	return ret;
352 }
353 
READ_HANDLER(rfield_z_23)354 READ_HANDLER( rfield_z_23 )
355 {
356 	UINT32 ret;
357 	RFIELDMAC_BIG(0x7fffff,10);
358 	return ret;
359 }
360 
READ_HANDLER(rfield_z_24)361 READ_HANDLER( rfield_z_24 )
362 {
363 	UINT32 ret;
364 	RFIELDMAC_BIG(0xffffff,9);
365 	return ret;
366 }
367 
READ_HANDLER(rfield_z_25)368 READ_HANDLER( rfield_z_25 )
369 {
370 	UINT32 ret;
371 	RFIELDMAC_BIG(0x1ffffff,8);
372 	return ret;
373 }
374 
READ_HANDLER(rfield_z_26)375 READ_HANDLER( rfield_z_26 )
376 {
377 	UINT32 ret;
378 	RFIELDMAC_BIG(0x3ffffff,7);
379 	return ret;
380 }
381 
READ_HANDLER(rfield_z_27)382 READ_HANDLER( rfield_z_27 )
383 {
384 	UINT32 ret;
385 	RFIELDMAC_BIG(0x7ffffff,6);
386 	return ret;
387 }
388 
READ_HANDLER(rfield_z_28)389 READ_HANDLER( rfield_z_28 )
390 {
391 	UINT32 ret;
392 	RFIELDMAC_BIG(0xfffffff,5);
393 	return ret;
394 }
395 
READ_HANDLER(rfield_z_29)396 READ_HANDLER( rfield_z_29 )
397 {
398 	UINT32 ret;
399 	RFIELDMAC_BIG(0x1fffffff,4);
400 	return ret;
401 }
402 
READ_HANDLER(rfield_z_30)403 READ_HANDLER( rfield_z_30 )
404 {
405 	UINT32 ret;
406 	RFIELDMAC_BIG(0x3fffffff,3);
407 	return ret;
408 }
409 
READ_HANDLER(rfield_z_31)410 READ_HANDLER( rfield_z_31 )
411 {
412 	UINT32 ret;
413 	RFIELDMAC_BIG(0x7fffffff,2);
414 	return ret;
415 }
416 
READ_HANDLER(rfield_32)417 READ_HANDLER( rfield_32 )
418 {
419 	RFIELDMAC_32;
420 }
421 
422 
423 
424 /*###################################################################################################
425 **	FIELD READ FUNCTIONS (SIGN-EXTEND)
426 **#################################################################################################*/
427 
READ_HANDLER(rfield_s_01)428 READ_HANDLER( rfield_s_01 )
429 {
430 	UINT32 ret;
431 	RFIELDMAC(0x01,16);
432 	return ((INT32)(ret << 31)) >> 31;
433 }
434 
READ_HANDLER(rfield_s_02)435 READ_HANDLER( rfield_s_02 )
436 {
437 	UINT32 ret;
438 	RFIELDMAC(0x03,15);
439 	return ((INT32)(ret << 30)) >> 30;
440 }
441 
READ_HANDLER(rfield_s_03)442 READ_HANDLER( rfield_s_03 )
443 {
444 	UINT32 ret;
445 	RFIELDMAC(0x07,14);
446 	return ((INT32)(ret << 29)) >> 29;
447 }
448 
READ_HANDLER(rfield_s_04)449 READ_HANDLER( rfield_s_04 )
450 {
451 	UINT32 ret;
452 	RFIELDMAC(0x0f,13);
453 	return ((INT32)(ret << 28)) >> 28;
454 }
455 
READ_HANDLER(rfield_s_05)456 READ_HANDLER( rfield_s_05 )
457 {
458 	UINT32 ret;
459 	RFIELDMAC(0x1f,12);
460 	return ((INT32)(ret << 27)) >> 27;
461 }
462 
READ_HANDLER(rfield_s_06)463 READ_HANDLER( rfield_s_06 )
464 {
465 	UINT32 ret;
466 	RFIELDMAC(0x3f,11);
467 	return ((INT32)(ret << 26)) >> 26;
468 }
469 
READ_HANDLER(rfield_s_07)470 READ_HANDLER( rfield_s_07 )
471 {
472 	UINT32 ret;
473 	RFIELDMAC(0x7f,10);
474 	return ((INT32)(ret << 25)) >> 25;
475 }
476 
READ_HANDLER(rfield_s_08)477 READ_HANDLER( rfield_s_08 )
478 {
479 	UINT32 ret;
480 	if (offset & 0x07)
481 	{
482 		RFIELDMAC(0xff,9);
483 	}
484 
485 	else
486 		ret = TMS34010_RDMEM(TOBYTE(offset));
487 	return (INT32)(INT8)ret;
488 }
489 
READ_HANDLER(rfield_s_09)490 READ_HANDLER( rfield_s_09 )
491 {
492 	UINT32 ret;
493 	RFIELDMAC(0x1ff,8);
494 	return ((INT32)(ret << 23)) >> 23;
495 }
496 
READ_HANDLER(rfield_s_10)497 READ_HANDLER( rfield_s_10 )
498 {
499 	UINT32 ret;
500 	RFIELDMAC(0x3ff,7);
501 	return ((INT32)(ret << 22)) >> 22;
502 }
503 
READ_HANDLER(rfield_s_11)504 READ_HANDLER( rfield_s_11 )
505 {
506 	UINT32 ret;
507 	RFIELDMAC(0x7ff,6);
508 	return ((INT32)(ret << 21)) >> 21;
509 }
510 
READ_HANDLER(rfield_s_12)511 READ_HANDLER( rfield_s_12 )
512 {
513 	UINT32 ret;
514 	RFIELDMAC(0xfff,5);
515 	return ((INT32)(ret << 20)) >> 20;
516 }
517 
READ_HANDLER(rfield_s_13)518 READ_HANDLER( rfield_s_13 )
519 {
520 	UINT32 ret;
521 	RFIELDMAC(0x1fff,4);
522 	return ((INT32)(ret << 19)) >> 19;
523 }
524 
READ_HANDLER(rfield_s_14)525 READ_HANDLER( rfield_s_14 )
526 {
527 	UINT32 ret;
528 	RFIELDMAC(0x3fff,3);
529 	return ((INT32)(ret << 18)) >> 18;
530 }
531 
READ_HANDLER(rfield_s_15)532 READ_HANDLER( rfield_s_15 )
533 {
534 	UINT32 ret;
535 	RFIELDMAC(0x7fff,2);
536 	return ((INT32)(ret << 17)) >> 17;
537 }
538 
READ_HANDLER(rfield_s_16)539 READ_HANDLER( rfield_s_16 )
540 {
541 	UINT32 ret;
542 	if (offset & 0x0f)
543 	{
544 		RFIELDMAC(0xffff,1);
545 	}
546 
547 	else
548 	{
549 		ret = TMS34010_RDMEM_WORD(TOBYTE(offset));
550 	}
551 
552 	return (INT32)(INT16)ret;
553 }
554 
READ_HANDLER(rfield_s_17)555 READ_HANDLER( rfield_s_17 )
556 {
557 	UINT32 ret;
558 	RFIELDMAC(0x1ffff,0);
559 	return ((INT32)(ret << 15)) >> 15;
560 }
561 
READ_HANDLER(rfield_s_18)562 READ_HANDLER( rfield_s_18 )
563 {
564 	UINT32 ret;
565 	RFIELDMAC_BIG(0x3ffff,15);
566 	return ((INT32)(ret << 14)) >> 14;
567 }
568 
READ_HANDLER(rfield_s_19)569 READ_HANDLER( rfield_s_19 )
570 {
571 	UINT32 ret;
572 	RFIELDMAC_BIG(0x7ffff,14);
573 	return ((INT32)(ret << 13)) >> 13;
574 }
575 
READ_HANDLER(rfield_s_20)576 READ_HANDLER( rfield_s_20 )
577 {
578 	UINT32 ret;
579 	RFIELDMAC_BIG(0xfffff,13);
580 	return ((INT32)(ret << 12)) >> 12;
581 }
582 
READ_HANDLER(rfield_s_21)583 READ_HANDLER( rfield_s_21 )
584 {
585 	UINT32 ret;
586 	RFIELDMAC_BIG(0x1fffff,12);
587 	return ((INT32)(ret << 11)) >> 11;
588 }
589 
READ_HANDLER(rfield_s_22)590 READ_HANDLER( rfield_s_22 )
591 {
592 	UINT32 ret;
593 	RFIELDMAC_BIG(0x3fffff,11);
594 	return ((INT32)(ret << 10)) >> 10;
595 }
596 
READ_HANDLER(rfield_s_23)597 READ_HANDLER( rfield_s_23 )
598 {
599 	UINT32 ret;
600 	RFIELDMAC_BIG(0x7fffff,10);
601 	return ((INT32)(ret << 9)) >> 9;
602 }
603 
READ_HANDLER(rfield_s_24)604 READ_HANDLER( rfield_s_24 )
605 {
606 	UINT32 ret;
607 	RFIELDMAC_BIG(0xffffff,9);
608 	return ((INT32)(ret << 8)) >> 8;
609 }
610 
READ_HANDLER(rfield_s_25)611 READ_HANDLER( rfield_s_25 )
612 {
613 	UINT32 ret;
614 	RFIELDMAC_BIG(0x1ffffff,8);
615 	return ((INT32)(ret << 7)) >> 7;
616 }
617 
READ_HANDLER(rfield_s_26)618 READ_HANDLER( rfield_s_26 )
619 {
620 	UINT32 ret;
621 	RFIELDMAC_BIG(0x3ffffff,7);
622 	return ((INT32)(ret << 6)) >> 6;
623 }
624 
READ_HANDLER(rfield_s_27)625 READ_HANDLER( rfield_s_27 )
626 {
627 	UINT32 ret;
628 	RFIELDMAC_BIG(0x7ffffff,6);
629 	return ((INT32)(ret << 5)) >> 5;
630 }
631 
READ_HANDLER(rfield_s_28)632 READ_HANDLER( rfield_s_28 )
633 {
634 	UINT32 ret;
635 	RFIELDMAC_BIG(0xfffffff,5);
636 	return ((INT32)(ret << 4)) >> 4;
637 }
638 
READ_HANDLER(rfield_s_29)639 READ_HANDLER( rfield_s_29 )
640 {
641 	UINT32 ret;
642 	RFIELDMAC_BIG(0x1fffffff,4);
643 	return ((INT32)(ret << 3)) >> 3;
644 }
645 
READ_HANDLER(rfield_s_30)646 READ_HANDLER( rfield_s_30 )
647 {
648 	UINT32 ret;
649 	RFIELDMAC_BIG(0x3fffffff,3);
650 	return ((INT32)(ret << 2)) >> 2;
651 }
652 
READ_HANDLER(rfield_s_31)653 READ_HANDLER( rfield_s_31 )
654 {
655 	UINT32 ret;
656 	RFIELDMAC_BIG(0x7fffffff,2);
657 	return ((INT32)(ret << 1)) >> 1;
658 }
659 
660 
661