Mercurial > repos > blastem
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", |