comparison z80inst.c @ 204:02dfa5962522

Add support for 2-byte IY instructions to decoder
author Mike Pavone <pavone@retrodev.com>
date Tue, 22 Jan 2013 20:24:14 -0800
parents 0ae589d4c3f9
children 19b323614309
comparison
equal deleted inserted replaced
203:0ae589d4c3f9 204:02dfa5962522
763 NOP2, 763 NOP2,
764 NOP2, 764 NOP2,
765 NOP2 765 NOP2
766 }; 766 };
767 767
768
769 z80inst z80_tbl_iy[256] = {
770 //0
771 NOP2,
772 NOP2,
773 NOP2,
774 NOP2,
775 NOP2,
776 NOP2,
777 NOP2,
778 NOP2,
779 NOP2,
780 {Z80_ADD, Z80_IY, Z80_REG, Z80_BC, 0},
781 NOP2,
782 NOP2,
783 NOP2,
784 NOP2,
785 NOP2,
786 NOP2,
787 //1
788 NOP2,
789 NOP2,
790 NOP2,
791 NOP2,
792 NOP2,
793 NOP2,
794 NOP2,
795 NOP2,
796 NOP2,
797 {Z80_ADD, Z80_IY, Z80_REG, Z80_DE, 0},
798 NOP2,
799 NOP2,
800 NOP2,
801 NOP2,
802 NOP2,
803 NOP2,
804 //2
805 NOP2,
806 {Z80_LD, Z80_IY, Z80_IMMED, Z80_UNUSED, 0},
807 {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT | Z80_DIR, Z80_UNUSED, 0},
808 {Z80_INC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
809 {Z80_INC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0},
810 {Z80_DEC, Z80_IYH, Z80_UNUSED, Z80_UNUSED, 0},
811 {Z80_LD, Z80_IYH, Z80_IMMED, Z80_UNUSED, 0},
812 NOP2,
813 NOP2,
814 {Z80_ADD, Z80_IY, Z80_REG, Z80_IY, 0},
815 {Z80_LD, Z80_IY, Z80_IMMED_INDIRECT, Z80_UNUSED, 0},
816 {Z80_DEC, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
817 {Z80_INC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0},
818 {Z80_DEC, Z80_IYL, Z80_UNUSED, Z80_UNUSED, 0},
819 {Z80_LD, Z80_IYL, Z80_IMMED, Z80_UNUSED, 0},
820 NOP2,
821 //3
822 NOP2,
823 NOP2,
824 NOP2,
825 NOP2,
826 {Z80_INC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0},
827 {Z80_DEC, Z80_UNUSED, Z80_IY_DISPLACE, 0, 0},
828 {Z80_LD, Z80_USE_IMMED, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
829 NOP2,
830 NOP2,
831 {Z80_ADD, Z80_IY, Z80_REG, Z80_SP, 0},
832 NOP2,
833 NOP2,
834 NOP2,
835 NOP2,
836 NOP2,
837 NOP2,
838 //4
839 NOP2,
840 NOP2,
841 NOP2,
842 NOP2,
843 {Z80_LD, Z80_B, Z80_REG, Z80_IYH, 0},
844 {Z80_LD, Z80_B, Z80_REG, Z80_IYL, 0},
845 {Z80_LD, Z80_B, Z80_IY_DISPLACE, 0, 0},
846 NOP2,
847 NOP2,
848 NOP2,
849 NOP2,
850 NOP2,
851 {Z80_LD, Z80_C, Z80_REG, Z80_IYH, 0},
852 {Z80_LD, Z80_C, Z80_REG, Z80_IYL, 0},
853 {Z80_LD, Z80_C, Z80_IY_DISPLACE, 0, 0},
854 NOP2,
855 //5
856 NOP2,
857 NOP2,
858 NOP2,
859 NOP2,
860 {Z80_LD, Z80_D, Z80_REG, Z80_IYH, 0},
861 {Z80_LD, Z80_D, Z80_REG, Z80_IYL, 0},
862 {Z80_LD, Z80_D, Z80_IY_DISPLACE, 0, 0},
863 NOP2,
864 NOP2,
865 NOP2,
866 NOP2,
867 NOP2,
868 {Z80_LD, Z80_E, Z80_REG, Z80_IYH, 0},
869 {Z80_LD, Z80_E, Z80_REG, Z80_IYL, 0},
870 {Z80_LD, Z80_E, Z80_IY_DISPLACE, 0, 0},
871 NOP2,
872 //6
873 {Z80_LD, Z80_IYH, Z80_REG, Z80_B, 0},
874 {Z80_LD, Z80_IYH, Z80_REG, Z80_C, 0},
875 {Z80_LD, Z80_IYH, Z80_REG, Z80_D, 0},
876 {Z80_LD, Z80_IYH, Z80_REG, Z80_E, 0},
877 {Z80_LD, Z80_IYH, Z80_REG, Z80_IYH, 0},
878 {Z80_LD, Z80_IYH, Z80_REG, Z80_IYL, 0},
879 {Z80_LD, Z80_H, Z80_IY_DISPLACE, 0, 0},
880 {Z80_LD, Z80_IYH, Z80_REG, Z80_A, 0},
881 {Z80_LD, Z80_IYL, Z80_REG, Z80_B, 0},
882 {Z80_LD, Z80_IYL, Z80_REG, Z80_C, 0},
883 {Z80_LD, Z80_IYL, Z80_REG, Z80_D, 0},
884 {Z80_LD, Z80_IYL, Z80_REG, Z80_E, 0},
885 {Z80_LD, Z80_IYL, Z80_REG, Z80_IYH, 0},
886 {Z80_LD, Z80_IYL, Z80_REG, Z80_IYL, 0},
887 {Z80_LD, Z80_L, Z80_IY_DISPLACE, 0, 0},
888 {Z80_LD, Z80_IYL, Z80_REG, Z80_A, 0},
889 //7
890 {Z80_LD, Z80_B, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
891 {Z80_LD, Z80_C, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
892 {Z80_LD, Z80_D, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
893 {Z80_LD, Z80_E, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
894 {Z80_LD, Z80_H, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
895 {Z80_LD, Z80_L, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
896 NOP2,
897 {Z80_LD, Z80_A, Z80_IY_DISPLACE | Z80_DIR, 0, 0},
898 NOP2,
899 NOP2,
900 NOP2,
901 NOP2,
902 {Z80_LD, Z80_A, Z80_REG, Z80_IYH, 0},
903 {Z80_LD, Z80_A, Z80_REG, Z80_IYL, 0},
904 {Z80_LD, Z80_A, Z80_IY_DISPLACE, 0, 0},
905 NOP2,
906 //8
907 NOP2,
908 NOP2,
909 NOP2,
910 NOP2,
911 {Z80_ADD, Z80_A, Z80_REG, Z80_IYH, 0},
912 {Z80_ADD, Z80_A, Z80_REG, Z80_IYL, 0},
913 {Z80_ADD, Z80_A, Z80_IY_DISPLACE, 0, 0},
914 NOP2,
915 NOP2,
916 NOP2,
917 NOP2,
918 NOP2,
919 {Z80_ADC, Z80_A, Z80_REG, Z80_IYH, 0},
920 {Z80_ADC, Z80_A, Z80_REG, Z80_IYL, 0},
921 {Z80_ADC, Z80_A, Z80_IY_DISPLACE, 0, 0},
922 NOP2,
923 //9
924 NOP2,
925 NOP2,
926 NOP2,
927 NOP2,
928 {Z80_SUB, Z80_A, Z80_REG, Z80_IYH, 0},
929 {Z80_SUB, Z80_A, Z80_REG, Z80_IYL, 0},
930 {Z80_SUB, Z80_A, Z80_IY_DISPLACE, 0, 0},
931 NOP2,
932 NOP2,
933 NOP2,
934 NOP2,
935 NOP2,
936 {Z80_SBC, Z80_A, Z80_REG, Z80_IYH, 0},
937 {Z80_SBC, Z80_A, Z80_REG, Z80_IYL, 0},
938 {Z80_SBC, Z80_A, Z80_IY_DISPLACE, 0, 0},
939 NOP2,
940 //A
941 NOP2,
942 NOP2,
943 NOP2,
944 NOP2,
945 {Z80_AND, Z80_A, Z80_REG, Z80_IYH, 0},
946 {Z80_AND, Z80_A, Z80_REG, Z80_IYL, 0},
947 {Z80_AND, Z80_A, Z80_IY_DISPLACE, 0, 0},
948 NOP2,
949 NOP2,
950 NOP2,
951 NOP2,
952 NOP2,
953 {Z80_XOR, Z80_A, Z80_REG, Z80_IYH, 0},
954 {Z80_XOR, Z80_A, Z80_REG, Z80_IYL, 0},
955 {Z80_XOR, Z80_A, Z80_IY_DISPLACE, 0, 0},
956 NOP2,
957 //B
958 NOP2,
959 NOP2,
960 NOP2,
961 NOP2,
962 {Z80_OR, Z80_A, Z80_REG, Z80_IYH, 0},
963 {Z80_OR, Z80_A, Z80_REG, Z80_IYL, 0},
964 {Z80_OR, Z80_A, Z80_IY_DISPLACE, 0, 0},
965 NOP2,
966 NOP2,
967 NOP2,
968 NOP2,
969 NOP2,
970 {Z80_CP, Z80_A, Z80_REG, Z80_IYH, 0},
971 {Z80_CP, Z80_A, Z80_REG, Z80_IYL, 0},
972 {Z80_CP, Z80_A, Z80_IY_DISPLACE, 0, 0},
973 NOP2,
974 //C
975 NOP2,
976 NOP2,
977 NOP2,
978 NOP2,
979 NOP2,
980 NOP2,
981 NOP2,
982 NOP2,
983 NOP2,
984 NOP2,
985 NOP2,
986 NOP2,
987 NOP2,
988 NOP2,
989 NOP2,
990 NOP2,
991 //D
992 NOP2,
993 NOP2,
994 NOP2,
995 NOP2,
996 NOP2,
997 NOP2,
998 NOP2,
999 NOP2,
1000 NOP2,
1001 NOP2,
1002 NOP2,
1003 NOP2,
1004 NOP2,
1005 NOP2,
1006 NOP2,
1007 NOP2,
1008 //E
1009 NOP2,
1010 {Z80_POP, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
1011 NOP2,
1012 {Z80_EX, Z80_IY, Z80_REG_INDIRECT | Z80_DIR, Z80_SP, 0},
1013 NOP2,
1014 {Z80_PUSH, Z80_IY, Z80_UNUSED, Z80_UNUSED, 0},
1015 NOP2,
1016 NOP2,
1017 NOP2,
1018 {Z80_JP, Z80_UNUSED, Z80_REG_INDIRECT, Z80_IY, 0},
1019 NOP2,
1020 NOP2,
1021 NOP2,
1022 NOP2,
1023 NOP2,
1024 NOP2,
1025 //F
1026 NOP2,
1027 NOP2,
1028 NOP2,
1029 NOP2,
1030 NOP2,
1031 NOP2,
1032 NOP2,
1033 NOP2,
1034 NOP2,
1035 {Z80_LD, Z80_SP, Z80_REG, Z80_IY, 0},
1036 NOP2,
1037 NOP2,
1038 NOP2,
1039 NOP2,
1040 NOP2,
1041 NOP2
1042 };
1043
768 uint8_t * z80_decode(uint8_t * istream, z80inst * decoded) 1044 uint8_t * z80_decode(uint8_t * istream, z80inst * decoded)
769 { 1045 {
770 if (*istream == 0xCB) { 1046 if (*istream == 0xCB) {
771 istream++; 1047 istream++;
772 memcpy(decoded, z80_tbl_bit + *istream, sizeof(z80inst)); 1048 memcpy(decoded, z80_tbl_bit + *istream, sizeof(z80inst));
782 memcpy(decoded, z80_tbl_extd + 0xBF, sizeof(z80inst)); 1058 memcpy(decoded, z80_tbl_extd + 0xBF, sizeof(z80inst));
783 } else { 1059 } else {
784 memcpy(decoded, z80_tbl_extd + *istream-0x40, sizeof(z80inst)); 1060 memcpy(decoded, z80_tbl_extd + *istream-0x40, sizeof(z80inst));
785 } 1061 }
786 } else if (*istream == 0xFD) { 1062 } else if (*istream == 0xFD) {
1063 istream++;
1064 if (*istream == 0xCB) {
1065 } else {
1066 memcpy(decoded, z80_tbl_iy + *istream, sizeof(z80inst));
1067 }
787 } else { 1068 } else {
788 memcpy(decoded, z80_tbl_a + *istream, sizeof(z80inst)); 1069 memcpy(decoded, z80_tbl_a + *istream, sizeof(z80inst));
789 1070
790 } 1071 }
791 if ((decoded->addr_mode & 0x1F) == Z80_IX_DISPLACE || (decoded->addr_mode & 0x1F) == Z80_IY_DISPLACE) { 1072 if ((decoded->addr_mode & 0x1F) == Z80_IX_DISPLACE || (decoded->addr_mode & 0x1F) == Z80_IY_DISPLACE) {
889 "l", 1170 "l",
890 "", 1171 "",
891 "a", 1172 "a",
892 "ixh", 1173 "ixh",
893 "ixl", 1174 "ixl",
1175 "iyh",
1176 "iyl",
894 "i", 1177 "i",
895 "r", 1178 "r",
896 "bc", 1179 "bc",
897 "de", 1180 "de",
898 "hl", 1181 "hl",