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