comparison z80inst.c @ 1044:1625555e346e

Properly handle redundant prefixes
author Michael Pavone <pavone@retrodev.com>
date Mon, 25 Jul 2016 23:16:04 -0700
parents 103d5cabbe14
children 8519b54f9413
comparison
equal deleted inserted replaced
1043:3980ef0f6307 1044:1625555e346e
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. 4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
5 */ 5 */
6 #include "z80inst.h" 6 #include "z80inst.h"
7 #include <string.h> 7 #include <string.h>
8 #include <stdio.h> 8 #include <stdio.h>
9 9 #include <stddef.h>
10 #define NOP {Z80_NOP, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 1} 10
11 #define NOP2 {Z80_NOP, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 2} 11 #define NOP {Z80_NOP, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}
12 #define USE_MAIN {Z80_USE_MAIN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}
12 13
13 z80inst z80_tbl_a[256] = { 14 z80inst z80_tbl_a[256] = {
14 //0 15 //0
15 NOP, 16 NOP,
16 {Z80_LD, Z80_BC, Z80_IMMED, Z80_UNUSED, 0}, 17 {Z80_LD, Z80_BC, Z80_IMMED, Z80_UNUSED, 0},
343 {Z80_SBC, Z80_HL, Z80_REG, Z80_SP, 0}, 344 {Z80_SBC, Z80_HL, Z80_REG, Z80_SP, 0},
344 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0}, 345 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
345 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, 346 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
346 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 347 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
347 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 1}, 348 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 1},
348 NOP2, 349 NOP,
349 {Z80_IN, Z80_A, Z80_REG_INDIRECT, Z80_C, 0}, 350 {Z80_IN, Z80_A, Z80_REG_INDIRECT, Z80_C, 0},
350 {Z80_OUT, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0}, 351 {Z80_OUT, Z80_A, Z80_REG_INDIRECT | Z80_DIR, Z80_C, 0},
351 {Z80_ADC, Z80_HL, Z80_REG, Z80_SP, 0}, 352 {Z80_ADC, Z80_HL, Z80_REG, Z80_SP, 0},
352 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT, Z80_UNUSED, 0}, 353 {Z80_LD, Z80_SP, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
353 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0}, 354 {Z80_NEG, Z80_A, Z80_UNUSED, Z80_UNUSED, 0},
354 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 355 {Z80_RETN, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
355 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 2}, 356 {Z80_IM, Z80_UNUSED, Z80_IMMED, Z80_UNUSED, 2},
356 NOP2, 357 NOP,
357 //8 358 //8
358 NOP2, 359 NOP,
359 NOP2, 360 NOP,
360 NOP2, 361 NOP,
361 NOP2, 362 NOP,
362 NOP2, 363 NOP,
363 NOP2, 364 NOP,
364 NOP2, 365 NOP,
365 NOP2, 366 NOP,
366 NOP2, 367 NOP,
367 NOP2, 368 NOP,
368 NOP2, 369 NOP,
369 NOP2, 370 NOP,
370 NOP2, 371 NOP,
371 NOP2, 372 NOP,
372 NOP2, 373 NOP,
373 NOP2, 374 NOP,
374 //9 375 //9
375 NOP2, 376 NOP,
376 NOP2, 377 NOP,
377 NOP2, 378 NOP,
378 NOP2, 379 NOP,
379 NOP2, 380 NOP,
380 NOP2, 381 NOP,
381 NOP2, 382 NOP,
382 NOP2, 383 NOP,
383 NOP2, 384 NOP,
384 NOP2, 385 NOP,
385 NOP2, 386 NOP,
386 NOP2, 387 NOP,
387 NOP2, 388 NOP,
388 NOP2, 389 NOP,
389 NOP2, 390 NOP,
390 NOP2, 391 NOP,
391 //A 392 //A
392 {Z80_LDI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 393 {Z80_LDI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
393 {Z80_CPI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 394 {Z80_CPI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
394 {Z80_INI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 395 {Z80_INI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
395 {Z80_OUTI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 396 {Z80_OUTI, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
396 NOP2, 397 NOP,
397 NOP2, 398 NOP,
398 NOP2, 399 NOP,
399 NOP2, 400 NOP,
400 {Z80_LDD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 401 {Z80_LDD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
401 {Z80_CPD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 402 {Z80_CPD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
402 {Z80_IND, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 403 {Z80_IND, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
403 {Z80_OUTD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 404 {Z80_OUTD, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
404 NOP2, 405 NOP,
405 NOP2, 406 NOP,
406 NOP2, 407 NOP,
407 NOP2, 408 NOP,
408 //B 409 //B
409 {Z80_LDIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 410 {Z80_LDIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
410 {Z80_CPIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 411 {Z80_CPIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
411 {Z80_INIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 412 {Z80_INIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
412 {Z80_OTIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 413 {Z80_OTIR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
413 NOP2, 414 NOP,
414 NOP2, 415 NOP,
415 NOP2, 416 NOP,
416 NOP2, 417 NOP,
417 {Z80_LDDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 418 {Z80_LDDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
418 {Z80_CPDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 419 {Z80_CPDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
419 {Z80_INDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 420 {Z80_INDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
420 {Z80_OTDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0}, 421 {Z80_OTDR, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 0},
421 NOP2, 422 NOP,
422 NOP2, 423 NOP,
423 NOP2, 424 NOP,
424 NOP2 425 NOP
425 }; 426 };
426 427
427 #define SHIFT_BLOCK(op) \ 428 #define SHIFT_BLOCK(op) \
428 {op, Z80_B, Z80_UNUSED, Z80_UNUSED, 1},\ 429 {op, Z80_B, Z80_UNUSED, Z80_UNUSED, 1},\
429 {op, Z80_C, Z80_UNUSED, Z80_UNUSED, 1},\ 430 {op, Z80_C, Z80_UNUSED, Z80_UNUSED, 1},\
495 BIT_BLOCK(Z80_SET, 7) 496 BIT_BLOCK(Z80_SET, 7)
496 }; 497 };
497 498
498 z80inst z80_tbl_ix[256] = { 499 z80inst z80_tbl_ix[256] = {
499 //0 500 //0
500 NOP2, 501 USE_MAIN,
501 NOP2, 502 USE_MAIN,
502 NOP2, 503 USE_MAIN,
503 NOP2, 504 USE_MAIN,
504 NOP2, 505 USE_MAIN,
505 NOP2, 506 USE_MAIN,
506 NOP2, 507 USE_MAIN,
507 NOP2, 508 USE_MAIN,
508 NOP2, 509 USE_MAIN,
509 {Z80_ADD, Z80_IX, Z80_REG, Z80_BC, 0}, 510 {Z80_ADD, Z80_IX, Z80_REG, Z80_BC, 0},
510 NOP2, 511 USE_MAIN,
511 NOP2, 512 USE_MAIN,
512 NOP2, 513 USE_MAIN,
513 NOP2, 514 USE_MAIN,
514 NOP2, 515 USE_MAIN,
515 NOP2, 516 USE_MAIN,
516 //1 517 //1
517 NOP2, 518 USE_MAIN,
518 NOP2, 519 USE_MAIN,
519 NOP2, 520 USE_MAIN,
520 NOP2, 521 USE_MAIN,
521 NOP2, 522 USE_MAIN,
522 NOP2, 523 USE_MAIN,
523 NOP2, 524 USE_MAIN,
524 NOP2, 525 USE_MAIN,
525 NOP2, 526 USE_MAIN,
526 {Z80_ADD, Z80_IX, Z80_REG, Z80_DE, 0}, 527 {Z80_ADD, Z80_IX, Z80_REG, Z80_DE, 0},
527 NOP2, 528 USE_MAIN,
528 NOP2, 529 USE_MAIN,
529 NOP2, 530 USE_MAIN,
530 NOP2, 531 USE_MAIN,
531 NOP2, 532 USE_MAIN,
532 NOP2, 533 USE_MAIN,
533 //2 534 //2
534 NOP2, 535 USE_MAIN,
535 {Z80_LD, Z80_IX, Z80_IMMED, Z80_UNUSED, 0}, 536 {Z80_LD, Z80_IX, Z80_IMMED, Z80_UNUSED, 0},
536 {Z80_LD, Z80_IX, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0}, 537 {Z80_LD, Z80_IX, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
537 {Z80_INC, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0}, 538 {Z80_INC, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0},
538 {Z80_INC, Z80_IXH, Z80_UNUSED, Z80_UNUSED, 0}, 539 {Z80_INC, Z80_IXH, Z80_UNUSED, Z80_UNUSED, 0},
539 {Z80_DEC, Z80_IXH, Z80_UNUSED, Z80_UNUSED, 0}, 540 {Z80_DEC, Z80_IXH, Z80_UNUSED, Z80_UNUSED, 0},
540 {Z80_LD, Z80_IXH, Z80_IMMED, Z80_UNUSED, 0}, 541 {Z80_LD, Z80_IXH, Z80_IMMED, Z80_UNUSED, 0},
541 NOP2, 542 USE_MAIN,
542 NOP2, 543 USE_MAIN,
543 {Z80_ADD, Z80_IX, Z80_REG, Z80_IX, 0}, 544 {Z80_ADD, Z80_IX, Z80_REG, Z80_IX, 0},
544 {Z80_LD, Z80_IX, Z80_IMMED_INDIRECT, Z80_UNUSED, 0}, 545 {Z80_LD, Z80_IX, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
545 {Z80_DEC, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0}, 546 {Z80_DEC, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0},
546 {Z80_INC, Z80_IXL, Z80_UNUSED, Z80_UNUSED, 0}, 547 {Z80_INC, Z80_IXL, Z80_UNUSED, Z80_UNUSED, 0},
547 {Z80_DEC, Z80_IXL, Z80_UNUSED, Z80_UNUSED, 0}, 548 {Z80_DEC, Z80_IXL, Z80_UNUSED, Z80_UNUSED, 0},
548 {Z80_LD, Z80_IXL, Z80_IMMED, Z80_UNUSED, 0}, 549 {Z80_LD, Z80_IXL, Z80_IMMED, Z80_UNUSED, 0},
549 NOP2, 550 USE_MAIN,
550 //3 551 //3
551 NOP2, 552 USE_MAIN,
552 NOP2, 553 USE_MAIN,
553 NOP2, 554 USE_MAIN,
554 NOP2, 555 USE_MAIN,
555 {Z80_INC, Z80_UNUSED, Z80_IX_DISPLACE, 0, 0}, 556 {Z80_INC, Z80_UNUSED, Z80_IX_DISPLACE, 0, 0},
556 {Z80_DEC, Z80_UNUSED, Z80_IX_DISPLACE, 0, 0}, 557 {Z80_DEC, Z80_UNUSED, Z80_IX_DISPLACE, 0, 0},
557 {Z80_LD, Z80_USE_IMMED, Z80_IX_DISPLACE | Z80_DIR, 0, 0}, 558 {Z80_LD, Z80_USE_IMMED, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
558 NOP2, 559 USE_MAIN,
559 NOP2, 560 USE_MAIN,
560 {Z80_ADD, Z80_IX, Z80_REG, Z80_SP, 0}, 561 {Z80_ADD, Z80_IX, Z80_REG, Z80_SP, 0},
561 NOP2, 562 USE_MAIN,
562 NOP2, 563 USE_MAIN,
563 NOP2, 564 USE_MAIN,
564 NOP2, 565 USE_MAIN,
565 NOP2, 566 USE_MAIN,
566 NOP2, 567 USE_MAIN,
567 //4 568 //4
568 NOP2, 569 USE_MAIN,
569 NOP2, 570 USE_MAIN,
570 NOP2, 571 USE_MAIN,
571 NOP2, 572 USE_MAIN,
572 {Z80_LD, Z80_B, Z80_REG, Z80_IXH, 0}, 573 {Z80_LD, Z80_B, Z80_REG, Z80_IXH, 0},
573 {Z80_LD, Z80_B, Z80_REG, Z80_IXL, 0}, 574 {Z80_LD, Z80_B, Z80_REG, Z80_IXL, 0},
574 {Z80_LD, Z80_B, Z80_IX_DISPLACE, 0, 0}, 575 {Z80_LD, Z80_B, Z80_IX_DISPLACE, 0, 0},
575 NOP2, 576 USE_MAIN,
576 NOP2, 577 USE_MAIN,
577 NOP2, 578 USE_MAIN,
578 NOP2, 579 USE_MAIN,
579 NOP2, 580 USE_MAIN,
580 {Z80_LD, Z80_C, Z80_REG, Z80_IXH, 0}, 581 {Z80_LD, Z80_C, Z80_REG, Z80_IXH, 0},
581 {Z80_LD, Z80_C, Z80_REG, Z80_IXL, 0}, 582 {Z80_LD, Z80_C, Z80_REG, Z80_IXL, 0},
582 {Z80_LD, Z80_C, Z80_IX_DISPLACE, 0, 0}, 583 {Z80_LD, Z80_C, Z80_IX_DISPLACE, 0, 0},
583 NOP2, 584 USE_MAIN,
584 //5 585 //5
585 NOP2, 586 USE_MAIN,
586 NOP2, 587 USE_MAIN,
587 NOP2, 588 USE_MAIN,
588 NOP2, 589 USE_MAIN,
589 {Z80_LD, Z80_D, Z80_REG, Z80_IXH, 0}, 590 {Z80_LD, Z80_D, Z80_REG, Z80_IXH, 0},
590 {Z80_LD, Z80_D, Z80_REG, Z80_IXL, 0}, 591 {Z80_LD, Z80_D, Z80_REG, Z80_IXL, 0},
591 {Z80_LD, Z80_D, Z80_IX_DISPLACE, 0, 0}, 592 {Z80_LD, Z80_D, Z80_IX_DISPLACE, 0, 0},
592 NOP2, 593 USE_MAIN,
593 NOP2, 594 USE_MAIN,
594 NOP2, 595 USE_MAIN,
595 NOP2, 596 USE_MAIN,
596 NOP2, 597 USE_MAIN,
597 {Z80_LD, Z80_E, Z80_REG, Z80_IXH, 0}, 598 {Z80_LD, Z80_E, Z80_REG, Z80_IXH, 0},
598 {Z80_LD, Z80_E, Z80_REG, Z80_IXL, 0}, 599 {Z80_LD, Z80_E, Z80_REG, Z80_IXL, 0},
599 {Z80_LD, Z80_E, Z80_IX_DISPLACE, 0, 0}, 600 {Z80_LD, Z80_E, Z80_IX_DISPLACE, 0, 0},
600 NOP2, 601 USE_MAIN,
601 //6 602 //6
602 {Z80_LD, Z80_IXH, Z80_REG, Z80_B, 0}, 603 {Z80_LD, Z80_IXH, Z80_REG, Z80_B, 0},
603 {Z80_LD, Z80_IXH, Z80_REG, Z80_C, 0}, 604 {Z80_LD, Z80_IXH, Z80_REG, Z80_C, 0},
604 {Z80_LD, Z80_IXH, Z80_REG, Z80_D, 0}, 605 {Z80_LD, Z80_IXH, Z80_REG, Z80_D, 0},
605 {Z80_LD, Z80_IXH, Z80_REG, Z80_E, 0}, 606 {Z80_LD, Z80_IXH, Z80_REG, Z80_E, 0},
620 {Z80_LD, Z80_C, Z80_IX_DISPLACE | Z80_DIR, 0, 0}, 621 {Z80_LD, Z80_C, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
621 {Z80_LD, Z80_D, Z80_IX_DISPLACE | Z80_DIR, 0, 0}, 622 {Z80_LD, Z80_D, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
622 {Z80_LD, Z80_E, Z80_IX_DISPLACE | Z80_DIR, 0, 0}, 623 {Z80_LD, Z80_E, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
623 {Z80_LD, Z80_H, Z80_IX_DISPLACE | Z80_DIR, 0, 0}, 624 {Z80_LD, Z80_H, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
624 {Z80_LD, Z80_L, Z80_IX_DISPLACE | Z80_DIR, 0, 0}, 625 {Z80_LD, Z80_L, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
625 NOP2, 626 USE_MAIN,
626 {Z80_LD, Z80_A, Z80_IX_DISPLACE | Z80_DIR, 0, 0}, 627 {Z80_LD, Z80_A, Z80_IX_DISPLACE | Z80_DIR, 0, 0},
627 NOP2, 628 USE_MAIN,
628 NOP2, 629 USE_MAIN,
629 NOP2, 630 USE_MAIN,
630 NOP2, 631 USE_MAIN,
631 {Z80_LD, Z80_A, Z80_REG, Z80_IXH, 0}, 632 {Z80_LD, Z80_A, Z80_REG, Z80_IXH, 0},
632 {Z80_LD, Z80_A, Z80_REG, Z80_IXL, 0}, 633 {Z80_LD, Z80_A, Z80_REG, Z80_IXL, 0},
633 {Z80_LD, Z80_A, Z80_IX_DISPLACE, 0, 0}, 634 {Z80_LD, Z80_A, Z80_IX_DISPLACE, 0, 0},
634 NOP2, 635 USE_MAIN,
635 //8 636 //8
636 NOP2, 637 USE_MAIN,
637 NOP2, 638 USE_MAIN,
638 NOP2, 639 USE_MAIN,
639 NOP2, 640 USE_MAIN,
640 {Z80_ADD, Z80_A, Z80_REG, Z80_IXH, 0}, 641 {Z80_ADD, Z80_A, Z80_REG, Z80_IXH, 0},
641 {Z80_ADD, Z80_A, Z80_REG, Z80_IXL, 0}, 642 {Z80_ADD, Z80_A, Z80_REG, Z80_IXL, 0},
642 {Z80_ADD, Z80_A, Z80_IX_DISPLACE, 0, 0}, 643 {Z80_ADD, Z80_A, Z80_IX_DISPLACE, 0, 0},
643 NOP2, 644 USE_MAIN,
644 NOP2, 645 USE_MAIN,
645 NOP2, 646 USE_MAIN,
646 NOP2, 647 USE_MAIN,
647 NOP2, 648 USE_MAIN,
648 {Z80_ADC, Z80_A, Z80_REG, Z80_IXH, 0}, 649 {Z80_ADC, Z80_A, Z80_REG, Z80_IXH, 0},
649 {Z80_ADC, Z80_A, Z80_REG, Z80_IXL, 0}, 650 {Z80_ADC, Z80_A, Z80_REG, Z80_IXL, 0},
650 {Z80_ADC, Z80_A, Z80_IX_DISPLACE, 0, 0}, 651 {Z80_ADC, Z80_A, Z80_IX_DISPLACE, 0, 0},
651 NOP2, 652 USE_MAIN,
652 //9 653 //9
653 NOP2, 654 USE_MAIN,
654 NOP2, 655 USE_MAIN,
655 NOP2, 656 USE_MAIN,
656 NOP2, 657 USE_MAIN,
657 {Z80_SUB, Z80_A, Z80_REG, Z80_IXH, 0}, 658 {Z80_SUB, Z80_A, Z80_REG, Z80_IXH, 0},
658 {Z80_SUB, Z80_A, Z80_REG, Z80_IXL, 0}, 659 {Z80_SUB, Z80_A, Z80_REG, Z80_IXL, 0},
659 {Z80_SUB, Z80_A, Z80_IX_DISPLACE, 0, 0}, 660 {Z80_SUB, Z80_A, Z80_IX_DISPLACE, 0, 0},
660 NOP2, 661 USE_MAIN,
661 NOP2, 662 USE_MAIN,
662 NOP2, 663 USE_MAIN,
663 NOP2, 664 USE_MAIN,
664 NOP2, 665 USE_MAIN,
665 {Z80_SBC, Z80_A, Z80_REG, Z80_IXH, 0}, 666 {Z80_SBC, Z80_A, Z80_REG, Z80_IXH, 0},
666 {Z80_SBC, Z80_A, Z80_REG, Z80_IXL, 0}, 667 {Z80_SBC, Z80_A, Z80_REG, Z80_IXL, 0},
667 {Z80_SBC, Z80_A, Z80_IX_DISPLACE, 0, 0}, 668 {Z80_SBC, Z80_A, Z80_IX_DISPLACE, 0, 0},
668 NOP2, 669 USE_MAIN,
669 //A 670 //A
670 NOP2, 671 USE_MAIN,
671 NOP2, 672 USE_MAIN,
672 NOP2, 673 USE_MAIN,
673 NOP2, 674 USE_MAIN,
674 {Z80_AND, Z80_A, Z80_REG, Z80_IXH, 0}, 675 {Z80_AND, Z80_A, Z80_REG, Z80_IXH, 0},
675 {Z80_AND, Z80_A, Z80_REG, Z80_IXL, 0}, 676 {Z80_AND, Z80_A, Z80_REG, Z80_IXL, 0},
676 {Z80_AND, Z80_A, Z80_IX_DISPLACE, 0, 0}, 677 {Z80_AND, Z80_A, Z80_IX_DISPLACE, 0, 0},
677 NOP2, 678 USE_MAIN,
678 NOP2, 679 USE_MAIN,
679 NOP2, 680 USE_MAIN,
680 NOP2, 681 USE_MAIN,
681 NOP2, 682 USE_MAIN,
682 {Z80_XOR, Z80_A, Z80_REG, Z80_IXH, 0}, 683 {Z80_XOR, Z80_A, Z80_REG, Z80_IXH, 0},
683 {Z80_XOR, Z80_A, Z80_REG, Z80_IXL, 0}, 684 {Z80_XOR, Z80_A, Z80_REG, Z80_IXL, 0},
684 {Z80_XOR, Z80_A, Z80_IX_DISPLACE, 0, 0}, 685 {Z80_XOR, Z80_A, Z80_IX_DISPLACE, 0, 0},
685 NOP2, 686 USE_MAIN,
686 //B 687 //B
687 NOP2, 688 USE_MAIN,
688 NOP2, 689 USE_MAIN,
689 NOP2, 690 USE_MAIN,
690 NOP2, 691 USE_MAIN,
691 {Z80_OR, Z80_A, Z80_REG, Z80_IXH, 0}, 692 {Z80_OR, Z80_A, Z80_REG, Z80_IXH, 0},
692 {Z80_OR, Z80_A, Z80_REG, Z80_IXL, 0}, 693 {Z80_OR, Z80_A, Z80_REG, Z80_IXL, 0},
693 {Z80_OR, Z80_A, Z80_IX_DISPLACE, 0, 0}, 694 {Z80_OR, Z80_A, Z80_IX_DISPLACE, 0, 0},
694 NOP2, 695 USE_MAIN,
695 NOP2, 696 USE_MAIN,
696 NOP2, 697 USE_MAIN,
697 NOP2, 698 USE_MAIN,
698 NOP2, 699 USE_MAIN,
699 {Z80_CP, Z80_A, Z80_REG, Z80_IXH, 0}, 700 {Z80_CP, Z80_A, Z80_REG, Z80_IXH, 0},
700 {Z80_CP, Z80_A, Z80_REG, Z80_IXL, 0}, 701 {Z80_CP, Z80_A, Z80_REG, Z80_IXL, 0},
701 {Z80_CP, Z80_A, Z80_IX_DISPLACE, 0, 0}, 702 {Z80_CP, Z80_A, Z80_IX_DISPLACE, 0, 0},
702 NOP2, 703 USE_MAIN,
703 //C 704 //C
704 NOP2, 705 USE_MAIN,
705 NOP2, 706 USE_MAIN,
706 NOP2, 707 USE_MAIN,
707 NOP2, 708 USE_MAIN,
708 NOP2, 709 USE_MAIN,
709 NOP2, 710 USE_MAIN,
710 NOP2, 711 USE_MAIN,
711 NOP2, 712 USE_MAIN,
712 NOP2, 713 USE_MAIN,
713 NOP2, 714 USE_MAIN,
714 NOP2, 715 USE_MAIN,
715 NOP2, 716 USE_MAIN,
716 NOP2, 717 USE_MAIN,
717 NOP2, 718 USE_MAIN,
718 NOP2, 719 USE_MAIN,
719 NOP2, 720 USE_MAIN,
720 //D 721 //D
721 NOP2, 722 USE_MAIN,
722 NOP2, 723 USE_MAIN,
723 NOP2, 724 USE_MAIN,
724 NOP2, 725 USE_MAIN,
725 NOP2, 726 USE_MAIN,
726 NOP2, 727 USE_MAIN,
727 NOP2, 728 USE_MAIN,
728 NOP2, 729 USE_MAIN,
729 NOP2, 730 USE_MAIN,
730 NOP2, 731 USE_MAIN,
731 NOP2, 732 USE_MAIN,
732 NOP2, 733 USE_MAIN,
733 NOP2, 734 USE_MAIN,
734 NOP2, 735 USE_MAIN,
735 NOP2, 736 USE_MAIN,
736 NOP2, 737 USE_MAIN,
737 //E 738 //E
738 NOP2, 739 USE_MAIN,
739 {Z80_POP, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0}, 740 {Z80_POP, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0},
740 NOP2, 741 USE_MAIN,
741 {Z80_EX, Z80_IX, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0}, 742 {Z80_EX, Z80_IX, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0},
742 NOP2, 743 USE_MAIN,
743 {Z80_PUSH, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0}, 744 {Z80_PUSH, Z80_IX, Z80_UNUSED, Z80_UNUSED, 0},
744 NOP2, 745 USE_MAIN,
745 NOP2, 746 USE_MAIN,
746 NOP2, 747 USE_MAIN,
747 {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_IX, 0}, 748 {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_IX, 0},
748 NOP2, 749 USE_MAIN,
749 NOP2, 750 USE_MAIN,
750 NOP2, 751 USE_MAIN,
751 NOP2, 752 USE_MAIN,
752 NOP2, 753 USE_MAIN,
753 NOP2, 754 USE_MAIN,
754 //F 755 //F
755 NOP2, 756 USE_MAIN,
756 NOP2, 757 USE_MAIN,
757 NOP2, 758 USE_MAIN,
758 NOP2, 759 USE_MAIN,
759 NOP2, 760 USE_MAIN,
760 NOP2, 761 USE_MAIN,
761 NOP2, 762 USE_MAIN,
762 NOP2, 763 USE_MAIN,
763 NOP2, 764 USE_MAIN,
764 {Z80_LD, Z80_SP, Z80_REG, Z80_IX, 0}, 765 {Z80_LD, Z80_SP, Z80_REG, Z80_IX, 0},
765 NOP2, 766 USE_MAIN,
766 NOP2, 767 USE_MAIN,
767 NOP2, 768 USE_MAIN,
768 NOP2, 769 USE_MAIN,
769 NOP2, 770 USE_MAIN,
770 NOP2 771 USE_MAIN
771 }; 772 };
772 773
773 #define SHIFT_BLOCK_IX(op) \ 774 #define SHIFT_BLOCK_IX(op) \
774 {op, Z80_B, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\ 775 {op, Z80_B, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\
775 {op, Z80_C, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\ 776 {op, Z80_C, Z80_IX_DISPLACE | Z80_DIR, 0, 1},\
851 BIT_BLOCK_IX_REG(Z80_SET, 7), 852 BIT_BLOCK_IX_REG(Z80_SET, 7),
852 }; 853 };
853 854
854 z80inst z80_tbl_iy[256] = { 855 z80inst z80_tbl_iy[256] = {
855 //0 856 //0
856 NOP2, 857 USE_MAIN,
857 NOP2, 858 USE_MAIN,
858 NOP2, 859 USE_MAIN,
859 NOP2, 860 USE_MAIN,
860 NOP2, 861 USE_MAIN,
861 NOP2, 862 USE_MAIN,
862 NOP2, 863 USE_MAIN,
863 NOP2, 864 USE_MAIN,
864 NOP2, 865 USE_MAIN,
865 {Z80_ADD, Z80_IY, Z80_REG, Z80_BC, 0}, 866 {Z80_ADD, Z80_IY, Z80_REG, Z80_BC, 0},
866 NOP2, 867 USE_MAIN,
867 NOP2, 868 USE_MAIN,
868 NOP2, 869 USE_MAIN,
869 NOP2, 870 USE_MAIN,
870 NOP2, 871 USE_MAIN,
871 NOP2, 872 USE_MAIN,
872 //1 873 //1
873 NOP2, 874 USE_MAIN,
874 NOP2, 875 USE_MAIN,
875 NOP2, 876 USE_MAIN,
876 NOP2, 877 USE_MAIN,
877 NOP2, 878 USE_MAIN,
878 NOP2, 879 USE_MAIN,
879 NOP2, 880 USE_MAIN,
880 NOP2, 881 USE_MAIN,
881 NOP2, 882 USE_MAIN,
882 {Z80_ADD, Z80_IY, Z80_REG, Z80_DE, 0}, 883 {Z80_ADD, Z80_IY, Z80_REG, Z80_DE, 0},
883 NOP2, 884 USE_MAIN,
884 NOP2, 885 USE_MAIN,
885 NOP2, 886 USE_MAIN,
886 NOP2, 887 USE_MAIN,
887 NOP2, 888 USE_MAIN,
888 NOP2, 889 USE_MAIN,
889 //2 890 //2
890 NOP2, 891 USE_MAIN,
891 {Z80_LD, Z80_IY, Z80_IMMED, Z80_UNUSED, 0}, 892 {Z80_LD, Z80_IY, Z80_IMMED, Z80_UNUSED, 0},
892 {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0}, 893 {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
893 {Z80_INC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0}, 894 {Z80_INC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
894 {Z80_INC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0}, 895 {Z80_INC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0},
895 {Z80_DEC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0}, 896 {Z80_DEC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0},
896 {Z80_LD, Z80_IYH, Z80_IMMED, Z80_UNUSED, 0}, 897 {Z80_LD, Z80_IYH, Z80_IMMED, Z80_UNUSED, 0},
897 NOP2, 898 USE_MAIN,
898 NOP2, 899 USE_MAIN,
899 {Z80_ADD, Z80_IY, Z80_REG, Z80_IY, 0}, 900 {Z80_ADD, Z80_IY, Z80_REG, Z80_IY, 0},
900 {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT, Z80_UNUSED, 0}, 901 {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
901 {Z80_DEC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0}, 902 {Z80_DEC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
902 {Z80_INC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0}, 903 {Z80_INC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0},
903 {Z80_DEC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0}, 904 {Z80_DEC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0},
904 {Z80_LD, Z80_IYL, Z80_IMMED, Z80_UNUSED, 0}, 905 {Z80_LD, Z80_IYL, Z80_IMMED, Z80_UNUSED, 0},
905 NOP2, 906 USE_MAIN,
906 //3 907 //3
907 NOP2, 908 USE_MAIN,
908 NOP2, 909 USE_MAIN,
909 NOP2, 910 USE_MAIN,
910 NOP2, 911 USE_MAIN,
911 {Z80_INC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0}, 912 {Z80_INC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0},
912 {Z80_DEC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0}, 913 {Z80_DEC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0},
913 {Z80_LD, Z80_USE_IMMED, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, 914 {Z80_LD, Z80_USE_IMMED, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
914 NOP2, 915 USE_MAIN,
915 NOP2, 916 USE_MAIN,
916 {Z80_ADD, Z80_IY, Z80_REG, Z80_SP, 0}, 917 {Z80_ADD, Z80_IY, Z80_REG, Z80_SP, 0},
917 NOP2, 918 USE_MAIN,
918 NOP2, 919 USE_MAIN,
919 NOP2, 920 USE_MAIN,
920 NOP2, 921 USE_MAIN,
921 NOP2, 922 USE_MAIN,
922 NOP2, 923 USE_MAIN,
923 //4 924 //4
924 NOP2, 925 USE_MAIN,
925 NOP2, 926 USE_MAIN,
926 NOP2, 927 USE_MAIN,
927 NOP2, 928 USE_MAIN,
928 {Z80_LD, Z80_B, Z80_REG, Z80_IYH, 0}, 929 {Z80_LD, Z80_B, Z80_REG, Z80_IYH, 0},
929 {Z80_LD, Z80_B, Z80_REG, Z80_IYL, 0}, 930 {Z80_LD, Z80_B, Z80_REG, Z80_IYL, 0},
930 {Z80_LD, Z80_B, Z80_IY_DISPLACE, 0, 0}, 931 {Z80_LD, Z80_B, Z80_IY_DISPLACE, 0, 0},
931 NOP2, 932 USE_MAIN,
932 NOP2, 933 USE_MAIN,
933 NOP2, 934 USE_MAIN,
934 NOP2, 935 USE_MAIN,
935 NOP2, 936 USE_MAIN,
936 {Z80_LD, Z80_C, Z80_REG, Z80_IYH, 0}, 937 {Z80_LD, Z80_C, Z80_REG, Z80_IYH, 0},
937 {Z80_LD, Z80_C, Z80_REG, Z80_IYL, 0}, 938 {Z80_LD, Z80_C, Z80_REG, Z80_IYL, 0},
938 {Z80_LD, Z80_C, Z80_IY_DISPLACE, 0, 0}, 939 {Z80_LD, Z80_C, Z80_IY_DISPLACE, 0, 0},
939 NOP2, 940 USE_MAIN,
940 //5 941 //5
941 NOP2, 942 USE_MAIN,
942 NOP2, 943 USE_MAIN,
943 NOP2, 944 USE_MAIN,
944 NOP2, 945 USE_MAIN,
945 {Z80_LD, Z80_D, Z80_REG, Z80_IYH, 0}, 946 {Z80_LD, Z80_D, Z80_REG, Z80_IYH, 0},
946 {Z80_LD, Z80_D, Z80_REG, Z80_IYL, 0}, 947 {Z80_LD, Z80_D, Z80_REG, Z80_IYL, 0},
947 {Z80_LD, Z80_D, Z80_IY_DISPLACE, 0, 0}, 948 {Z80_LD, Z80_D, Z80_IY_DISPLACE, 0, 0},
948 NOP2, 949 USE_MAIN,
949 NOP2, 950 USE_MAIN,
950 NOP2, 951 USE_MAIN,
951 NOP2, 952 USE_MAIN,
952 NOP2, 953 USE_MAIN,
953 {Z80_LD, Z80_E, Z80_REG, Z80_IYH, 0}, 954 {Z80_LD, Z80_E, Z80_REG, Z80_IYH, 0},
954 {Z80_LD, Z80_E, Z80_REG, Z80_IYL, 0}, 955 {Z80_LD, Z80_E, Z80_REG, Z80_IYL, 0},
955 {Z80_LD, Z80_E, Z80_IY_DISPLACE, 0, 0}, 956 {Z80_LD, Z80_E, Z80_IY_DISPLACE, 0, 0},
956 NOP2, 957 USE_MAIN,
957 //6 958 //6
958 {Z80_LD, Z80_IYH, Z80_REG, Z80_B, 0}, 959 {Z80_LD, Z80_IYH, Z80_REG, Z80_B, 0},
959 {Z80_LD, Z80_IYH, Z80_REG, Z80_C, 0}, 960 {Z80_LD, Z80_IYH, Z80_REG, Z80_C, 0},
960 {Z80_LD, Z80_IYH, Z80_REG, Z80_D, 0}, 961 {Z80_LD, Z80_IYH, Z80_REG, Z80_D, 0},
961 {Z80_LD, Z80_IYH, Z80_REG, Z80_E, 0}, 962 {Z80_LD, Z80_IYH, Z80_REG, Z80_E, 0},
976 {Z80_LD, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, 977 {Z80_LD, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
977 {Z80_LD, Z80_D, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, 978 {Z80_LD, Z80_D, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
978 {Z80_LD, Z80_E, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, 979 {Z80_LD, Z80_E, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
979 {Z80_LD, Z80_H, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, 980 {Z80_LD, Z80_H, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
980 {Z80_LD, Z80_L, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, 981 {Z80_LD, Z80_L, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
981 NOP2, 982 USE_MAIN,
982 {Z80_LD, Z80_A, Z80_IY_DISPLACE | Z80_DIR, 0, 0}, 983 {Z80_LD, Z80_A, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
983 NOP2, 984 USE_MAIN,
984 NOP2, 985 USE_MAIN,
985 NOP2, 986 USE_MAIN,
986 NOP2, 987 USE_MAIN,
987 {Z80_LD, Z80_A, Z80_REG, Z80_IYH, 0}, 988 {Z80_LD, Z80_A, Z80_REG, Z80_IYH, 0},
988 {Z80_LD, Z80_A, Z80_REG, Z80_IYL, 0}, 989 {Z80_LD, Z80_A, Z80_REG, Z80_IYL, 0},
989 {Z80_LD, Z80_A, Z80_IY_DISPLACE, 0, 0}, 990 {Z80_LD, Z80_A, Z80_IY_DISPLACE, 0, 0},
990 NOP2, 991 USE_MAIN,
991 //8 992 //8
992 NOP2, 993 USE_MAIN,
993 NOP2, 994 USE_MAIN,
994 NOP2, 995 USE_MAIN,
995 NOP2, 996 USE_MAIN,
996 {Z80_ADD, Z80_A, Z80_REG, Z80_IYH, 0}, 997 {Z80_ADD, Z80_A, Z80_REG, Z80_IYH, 0},
997 {Z80_ADD, Z80_A, Z80_REG, Z80_IYL, 0}, 998 {Z80_ADD, Z80_A, Z80_REG, Z80_IYL, 0},
998 {Z80_ADD, Z80_A, Z80_IY_DISPLACE, 0, 0}, 999 {Z80_ADD, Z80_A, Z80_IY_DISPLACE, 0, 0},
999 NOP2, 1000 USE_MAIN,
1000 NOP2, 1001 USE_MAIN,
1001 NOP2, 1002 USE_MAIN,
1002 NOP2, 1003 USE_MAIN,
1003 NOP2, 1004 USE_MAIN,
1004 {Z80_ADC, Z80_A, Z80_REG, Z80_IYH, 0}, 1005 {Z80_ADC, Z80_A, Z80_REG, Z80_IYH, 0},
1005 {Z80_ADC, Z80_A, Z80_REG, Z80_IYL, 0}, 1006 {Z80_ADC, Z80_A, Z80_REG, Z80_IYL, 0},
1006 {Z80_ADC, Z80_A, Z80_IY_DISPLACE, 0, 0}, 1007 {Z80_ADC, Z80_A, Z80_IY_DISPLACE, 0, 0},
1007 NOP2, 1008 USE_MAIN,
1008 //9 1009 //9
1009 NOP2, 1010 USE_MAIN,
1010 NOP2, 1011 USE_MAIN,
1011 NOP2, 1012 USE_MAIN,
1012 NOP2, 1013 USE_MAIN,
1013 {Z80_SUB, Z80_A, Z80_REG, Z80_IYH, 0}, 1014 {Z80_SUB, Z80_A, Z80_REG, Z80_IYH, 0},
1014 {Z80_SUB, Z80_A, Z80_REG, Z80_IYL, 0}, 1015 {Z80_SUB, Z80_A, Z80_REG, Z80_IYL, 0},
1015 {Z80_SUB, Z80_A, Z80_IY_DISPLACE, 0, 0}, 1016 {Z80_SUB, Z80_A, Z80_IY_DISPLACE, 0, 0},
1016 NOP2, 1017 USE_MAIN,
1017 NOP2, 1018 USE_MAIN,
1018 NOP2, 1019 USE_MAIN,
1019 NOP2, 1020 USE_MAIN,
1020 NOP2, 1021 USE_MAIN,
1021 {Z80_SBC, Z80_A, Z80_REG, Z80_IYH, 0}, 1022 {Z80_SBC, Z80_A, Z80_REG, Z80_IYH, 0},
1022 {Z80_SBC, Z80_A, Z80_REG, Z80_IYL, 0}, 1023 {Z80_SBC, Z80_A, Z80_REG, Z80_IYL, 0},
1023 {Z80_SBC, Z80_A, Z80_IY_DISPLACE, 0, 0}, 1024 {Z80_SBC, Z80_A, Z80_IY_DISPLACE, 0, 0},
1024 NOP2, 1025 USE_MAIN,
1025 //A 1026 //A
1026 NOP2, 1027 USE_MAIN,
1027 NOP2, 1028 USE_MAIN,
1028 NOP2, 1029 USE_MAIN,
1029 NOP2, 1030 USE_MAIN,
1030 {Z80_AND, Z80_A, Z80_REG, Z80_IYH, 0}, 1031 {Z80_AND, Z80_A, Z80_REG, Z80_IYH, 0},
1031 {Z80_AND, Z80_A, Z80_REG, Z80_IYL, 0}, 1032 {Z80_AND, Z80_A, Z80_REG, Z80_IYL, 0},
1032 {Z80_AND, Z80_A, Z80_IY_DISPLACE, 0, 0}, 1033 {Z80_AND, Z80_A, Z80_IY_DISPLACE, 0, 0},
1033 NOP2, 1034 USE_MAIN,
1034 NOP2, 1035 USE_MAIN,
1035 NOP2, 1036 USE_MAIN,
1036 NOP2, 1037 USE_MAIN,
1037 NOP2, 1038 USE_MAIN,
1038 {Z80_XOR, Z80_A, Z80_REG, Z80_IYH, 0}, 1039 {Z80_XOR, Z80_A, Z80_REG, Z80_IYH, 0},
1039 {Z80_XOR, Z80_A, Z80_REG, Z80_IYL, 0}, 1040 {Z80_XOR, Z80_A, Z80_REG, Z80_IYL, 0},
1040 {Z80_XOR, Z80_A, Z80_IY_DISPLACE, 0, 0}, 1041 {Z80_XOR, Z80_A, Z80_IY_DISPLACE, 0, 0},
1041 NOP2, 1042 USE_MAIN,
1042 //B 1043 //B
1043 NOP2, 1044 USE_MAIN,
1044 NOP2, 1045 USE_MAIN,
1045 NOP2, 1046 USE_MAIN,
1046 NOP2, 1047 USE_MAIN,
1047 {Z80_OR, Z80_A, Z80_REG, Z80_IYH, 0}, 1048 {Z80_OR, Z80_A, Z80_REG, Z80_IYH, 0},
1048 {Z80_OR, Z80_A, Z80_REG, Z80_IYL, 0}, 1049 {Z80_OR, Z80_A, Z80_REG, Z80_IYL, 0},
1049 {Z80_OR, Z80_A, Z80_IY_DISPLACE, 0, 0}, 1050 {Z80_OR, Z80_A, Z80_IY_DISPLACE, 0, 0},
1050 NOP2, 1051 USE_MAIN,
1051 NOP2, 1052 USE_MAIN,
1052 NOP2, 1053 USE_MAIN,
1053 NOP2, 1054 USE_MAIN,
1054 NOP2, 1055 USE_MAIN,
1055 {Z80_CP, Z80_A, Z80_REG, Z80_IYH, 0}, 1056 {Z80_CP, Z80_A, Z80_REG, Z80_IYH, 0},
1056 {Z80_CP, Z80_A, Z80_REG, Z80_IYL, 0}, 1057 {Z80_CP, Z80_A, Z80_REG, Z80_IYL, 0},
1057 {Z80_CP, Z80_A, Z80_IY_DISPLACE, 0, 0}, 1058 {Z80_CP, Z80_A, Z80_IY_DISPLACE, 0, 0},
1058 NOP2, 1059 USE_MAIN,
1059 //C 1060 //C
1060 NOP2, 1061 USE_MAIN,
1061 NOP2, 1062 USE_MAIN,
1062 NOP2, 1063 USE_MAIN,
1063 NOP2, 1064 USE_MAIN,
1064 NOP2, 1065 USE_MAIN,
1065 NOP2, 1066 USE_MAIN,
1066 NOP2, 1067 USE_MAIN,
1067 NOP2, 1068 USE_MAIN,
1068 NOP2, 1069 USE_MAIN,
1069 NOP2, 1070 USE_MAIN,
1070 NOP2, 1071 USE_MAIN,
1071 NOP2, 1072 USE_MAIN,
1072 NOP2, 1073 USE_MAIN,
1073 NOP2, 1074 USE_MAIN,
1074 NOP2, 1075 USE_MAIN,
1075 NOP2, 1076 USE_MAIN,
1076 //D 1077 //D
1077 NOP2, 1078 USE_MAIN,
1078 NOP2, 1079 USE_MAIN,
1079 NOP2, 1080 USE_MAIN,
1080 NOP2, 1081 USE_MAIN,
1081 NOP2, 1082 USE_MAIN,
1082 NOP2, 1083 USE_MAIN,
1083 NOP2, 1084 USE_MAIN,
1084 NOP2, 1085 USE_MAIN,
1085 NOP2, 1086 USE_MAIN,
1086 NOP2, 1087 USE_MAIN,
1087 NOP2, 1088 USE_MAIN,
1088 NOP2, 1089 USE_MAIN,
1089 NOP2, 1090 USE_MAIN,
1090 NOP2, 1091 USE_MAIN,
1091 NOP2, 1092 USE_MAIN,
1092 NOP2, 1093 USE_MAIN,
1093 //E 1094 //E
1094 NOP2, 1095 USE_MAIN,
1095 {Z80_POP, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0}, 1096 {Z80_POP, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
1096 NOP2, 1097 USE_MAIN,
1097 {Z80_EX, Z80_IY, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0}, 1098 {Z80_EX, Z80_IY, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0},
1098 NOP2, 1099 USE_MAIN,
1099 {Z80_PUSH, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0}, 1100 {Z80_PUSH, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
1100 NOP2, 1101 USE_MAIN,
1101 NOP2, 1102 USE_MAIN,
1102 NOP2, 1103 USE_MAIN,
1103 {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_IY, 0}, 1104 {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_IY, 0},
1104 NOP2, 1105 USE_MAIN,
1105 NOP2, 1106 USE_MAIN,
1106 NOP2, 1107 USE_MAIN,
1107 NOP2, 1108 USE_MAIN,
1108 NOP2, 1109 USE_MAIN,
1109 NOP2, 1110 USE_MAIN,
1110 //F 1111 //F
1111 NOP2, 1112 USE_MAIN,
1112 NOP2, 1113 USE_MAIN,
1113 NOP2, 1114 USE_MAIN,
1114 NOP2, 1115 USE_MAIN,
1115 NOP2, 1116 USE_MAIN,
1116 NOP2, 1117 USE_MAIN,
1117 NOP2, 1118 USE_MAIN,
1118 NOP2, 1119 USE_MAIN,
1119 NOP2, 1120 USE_MAIN,
1120 {Z80_LD, Z80_SP, Z80_REG, Z80_IY, 0}, 1121 {Z80_LD, Z80_SP, Z80_REG, Z80_IY, 0},
1121 NOP2, 1122 USE_MAIN,
1122 NOP2, 1123 USE_MAIN,
1123 NOP2, 1124 USE_MAIN,
1124 NOP2, 1125 USE_MAIN,
1125 NOP2, 1126 USE_MAIN,
1126 //TODO: Enable this based on a define 1127 USE_MAIN
1127 {Z80_NOP, Z80_UNUSED, Z80_UNUSED, Z80_UNUSED, 42}
1128 //NOP2
1129 }; 1128 };
1130 1129
1131 #define SHIFT_BLOCK_IY(op) \ 1130 #define SHIFT_BLOCK_IY(op) \
1132 {op, Z80_B, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\ 1131 {op, Z80_B, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\
1133 {op, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\ 1132 {op, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, 1},\
1207 //F 1206 //F
1208 BIT_BLOCK_IY_REG(Z80_SET, 6), 1207 BIT_BLOCK_IY_REG(Z80_SET, 6),
1209 BIT_BLOCK_IY_REG(Z80_SET, 7), 1208 BIT_BLOCK_IY_REG(Z80_SET, 7),
1210 }; 1209 };
1211 1210
1211 enum {
1212 NORMAL,
1213 USE_IX,
1214 USE_IY
1215 };
1216
1212 uint8_t * z80_decode(uint8_t * istream, z80inst * decoded) 1217 uint8_t * z80_decode(uint8_t * istream, z80inst * decoded)
1213 { 1218 {
1214 uint8_t tmp; 1219 uint8_t tmp;
1215 if (*istream == 0xCB) { 1220 uint8_t *start = istream;
1216 istream++; 1221 uint8_t ixiy = NORMAL;
1217 memcpy(decoded, z80_tbl_bit + *istream, sizeof(z80inst)); 1222 uint16_t ixiy_disp = 0x100;
1218 } else if (*istream == 0xDD) { 1223 z80inst *base = NULL;
1219 istream++; 1224 while(!base)
1220 if (*istream == 0xCB) { 1225 {
1221 tmp = *(++istream); 1226 switch (*istream)
1227 {
1228 case 0xCB:
1222 istream++; 1229 istream++;
1223 memcpy(decoded, z80_tbl_ix_bit + *istream, sizeof(z80inst)); 1230 if (ixiy == NORMAL) {
1224 decoded->ea_reg = tmp; 1231 base = z80_tbl_bit + *istream;
1225 } else { 1232 } else if (ixiy == USE_IX) {
1226 memcpy(decoded, z80_tbl_ix + *istream, sizeof(z80inst)); 1233 ixiy_disp = *(istream++);
1227 if ((decoded->addr_mode & 0x1F) == Z80_IX_DISPLACE) { 1234 base = z80_tbl_ix_bit + *istream;
1228 decoded->ea_reg = *(++istream); 1235 } else {
1236 ixiy_disp = *(istream++);
1237 base = z80_tbl_iy_bit + *istream;
1238 }
1239 break;
1240 case 0xED:
1241 istream++;
1242 ixiy = NORMAL;
1243 if (*istream < 0x40 || *istream >= 0xC0) {
1244 base = z80_tbl_extd + 0xBF;
1245 } else {
1246 base = z80_tbl_extd + *istream - 0x40;
1247 }
1248 break;
1249 case 0xDD:
1250 istream++;
1251 ixiy = USE_IX;
1252 break;
1253 case 0xFD:
1254 istream++;
1255 ixiy = USE_IY;
1256 break;
1257 default:
1258 if (ixiy == NORMAL) {
1259 base = z80_tbl_a + *istream;
1260 } else if (ixiy == USE_IX) {
1261 base = z80_tbl_ix + *istream;
1262 } else {
1263 base = z80_tbl_iy + *istream;
1229 } 1264 }
1230 } 1265 }
1231 } else if (*istream == 0xED) { 1266 }
1232 istream++; 1267 if (base->op == Z80_USE_MAIN) {
1233 if (*istream < 0x40 || *istream >= 0xC0) { 1268 base = z80_tbl_a + *istream;
1234 memcpy(decoded, z80_tbl_extd + 0xBF, sizeof(z80inst)); 1269 ixiy = NORMAL;
1235 } else { 1270 }
1236 memcpy(decoded, z80_tbl_extd + *istream-0x40, sizeof(z80inst)); 1271 memcpy(decoded, base, offsetof(z80inst, opcode_bytes));
1272 decoded->opcode_bytes = istream - start + 1;
1273 if (ixiy != NORMAL) {
1274 if (ixiy_disp < 0x100) {
1275 decoded->ea_reg = ixiy_disp;
1276 //don't count displacement byte as an opcode byte
1277 decoded->opcode_bytes--;
1278 } else if ((decoded->addr_mode & 0x1F) == Z80_IX_DISPLACE || (decoded->addr_mode & 0x1F) == Z80_IY_DISPLACE) {
1279 decoded->ea_reg = *(++istream);
1237 } 1280 }
1238 } else if (*istream == 0xFD) {
1239 istream++;
1240 if (*istream == 0xCB) {
1241 tmp = *(++istream);
1242 istream++;
1243 memcpy(decoded, z80_tbl_iy_bit + *istream, sizeof(z80inst));
1244 decoded->ea_reg = tmp;
1245 } else {
1246 memcpy(decoded, z80_tbl_iy + *istream, sizeof(z80inst));
1247 if ((decoded->addr_mode & 0x1F) == Z80_IY_DISPLACE) {
1248 decoded->ea_reg = *(++istream);
1249 }
1250 }
1251 } else {
1252 memcpy(decoded, z80_tbl_a + *istream, sizeof(z80inst));
1253
1254 } 1281 }
1282
1255 if ((decoded->addr_mode & 0x1F) == Z80_IMMED && decoded->op != Z80_RST && decoded->op != Z80_IM) { 1283 if ((decoded->addr_mode & 0x1F) == Z80_IMMED && decoded->op != Z80_RST && decoded->op != Z80_IM) {
1256 decoded->immed = *(++istream); 1284 decoded->immed = *(++istream);
1257 if ((decoded->reg >= Z80_BC && decoded->reg < Z80_UNUSED) || decoded->op == Z80_CALL || decoded->op == Z80_CALLCC || decoded->op == Z80_JP || decoded->op == Z80_JPCC) { 1285 if ((decoded->reg >= Z80_BC && decoded->reg < Z80_UNUSED) || decoded->op == Z80_CALL || decoded->op == Z80_CALLCC || decoded->op == Z80_JP || decoded->op == Z80_JPCC) {
1258 decoded->immed |= *(++istream) << 8; 1286 decoded->immed |= *(++istream) << 8;
1259 } else if (decoded->immed & 0x80) { 1287 } else if (decoded->immed & 0x80) {