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