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