Mercurial > repos > blastem
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) { |