ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/uae_cpu/readcpu.cpp
(Generate patch)

Comparing BasiliskII/src/uae_cpu/readcpu.cpp (file contents):
Revision 1.6 by gbeauche, 2002-10-02T15:55:09Z vs.
Revision 1.10 by gbeauche, 2007-06-29T16:32:05Z

# Line 255 | Line 255 | static void build_insn (int insn)
255          int pos = 0;
256          int mnp = 0;
257          int bitno = 0;
258 <        char mnemonic[10];
258 >        char mnemonic[64];
259  
260          wordsizes sz = sz_long;
261          int srcgather = 0, dstgather = 0;
# Line 332 | Line 332 | static void build_insn (int insn)
332                      }
333                  }
334                  mnp++;
335 +                if ((unsigned)mnp >= sizeof(mnemonic) - 1) {
336 +                        mnemonic[sizeof(mnemonic) - 1] = 0;
337 +                        fprintf(stderr, "Instruction %s overflow\n", mnemonic);
338 +                        abort();
339 +                }
340              }
341              pos++;
342          }
# Line 749 | Line 754 | static void build_insn (int insn)
754          }
755   #endif
756          
757 +        // Fix flags used information for Scc, Bcc, TRAPcc, DBcc instructions
758 +        if      (       table68k[opc].mnemo == i_Scc
759 +                ||      table68k[opc].mnemo == i_Bcc
760 +                ||      table68k[opc].mnemo == i_DBcc
761 +                ||      table68k[opc].mnemo == i_TRAPcc
762 +                )       {
763 +                switch (table68k[opc].cc) {
764 +                // CC mask:     XNZVC
765 +                //                       8421
766 +                case 0: flags_used = 0x00; break;       /*  T */
767 +                case 1: flags_used = 0x00; break;       /*  F */
768 +                case 2: flags_used = 0x05; break;       /* HI */
769 +                case 3: flags_used = 0x05; break;       /* LS */
770 +                case 4: flags_used = 0x01; break;       /* CC */
771 +                case 5: flags_used = 0x01; break;       /* CS */
772 +                case 6: flags_used = 0x04; break;       /* NE */
773 +                case 7: flags_used = 0x04; break;       /* EQ */
774 +                case 8: flags_used = 0x02; break;       /* VC */
775 +                case 9: flags_used = 0x02; break;       /* VS */
776 +                case 10:flags_used = 0x08; break;       /* PL */
777 +                case 11:flags_used = 0x08; break;       /* MI */
778 +                case 12:flags_used = 0x0A; break;       /* GE */
779 +                case 13:flags_used = 0x0A; break;       /* LT */
780 +                case 14:flags_used = 0x0E; break;       /* GT */
781 +                case 15:flags_used = 0x0E; break;       /* LE */
782 +                }
783 +        }
784 +                
785   #if 1
786          /* gb-- flagdead and flaglive would not have correct information */
787          table68k[opc].flagdead = flags_set;
# Line 776 | Line 809 | void read_table68k (void)
809      for (i = 0; i < n_defs68k; i++) {
810          build_insn (i);
811      }
779        
780        /* Extra fixes in table68k for control flow information and flag usage */
781        for (i = 0; i < 65536; i++) {
782                instrmnem mnemo = (instrmnem)(table68k[i].mnemo);
783                
784 #define IS_CONST_JUMP(opc) \
785                (       ((table68k[opc].mnemo == i_Bcc) && (table68k[opc].cc < 2)) \
786                ||      (table68k[opc].mnemo == i_BSR) \
787                )
788
789                // Fix flags used information for Scc, Bcc, TRAPcc, DBcc instructions
790                int flags_used = table68k[i].flaglive;
791                if      (       (mnemo == i_Scc)
792                        ||      (mnemo == i_Bcc)
793                        ||      (mnemo == i_DBcc)
794                        ||      (mnemo == i_TRAPcc)
795                        )       {
796                        switch (table68k[i].cc) {
797                        // CC mask:     XNZVC
798                        //                       8421
799                        case 0: flags_used = 0x00; break;       /*  T */
800                        case 1: flags_used = 0x00; break;       /*  F */
801                        case 2: flags_used = 0x05; break;       /* HI */
802                        case 3: flags_used = 0x05; break;       /* LS */
803                        case 4: flags_used = 0x01; break;       /* CC */
804                        case 5: flags_used = 0x01; break;       /* CS */
805                        case 6: flags_used = 0x04; break;       /* NE */
806                        case 7: flags_used = 0x04; break;       /* EQ */
807                        case 8: flags_used = 0x02; break;       /* VC */
808                        case 9: flags_used = 0x02; break;       /* VS */
809                        case 10:flags_used = 0x08; break;       /* PL */
810                        case 11:flags_used = 0x08; break;       /* MI */
811                        case 12:flags_used = 0x0A; break;       /* GE */
812                        case 13:flags_used = 0x0A; break;       /* LT */
813                        case 14:flags_used = 0x0E; break;       /* GT */
814                        case 15:flags_used = 0x0E; break;       /* LE */
815                        }
816                }
817                
818                /* Unconditional jumps don't evaluate condition codes, so they
819                   don't actually use any flags themselves */
820                if (IS_CONST_JUMP(i))
821                        flags_used = 0;
822                
823                table68k[i].flaglive = flags_used;
824        }
812   }
813  
814   static int mismatch;
# Line 921 | Line 908 | int get_no_mismatches (void)
908   {
909      return mismatch;
910   }
911 +
912 + const char *get_instruction_name (unsigned int opcode)
913 + {
914 +    struct instr *ins = &table68k[opcode];
915 +    for (int i = 0; lookuptab[i].name[0]; i++) {
916 +        if (ins->mnemo == lookuptab[i].mnemo)
917 +            return lookuptab[i].name;
918 +    }
919 +    abort();
920 +    return NULL;
921 + }
922 +
923 + static char *get_ea_string (amodes mode, wordsizes size)
924 + {
925 +    static char buffer[80];
926 +
927 +    buffer[0] = 0;
928 +    switch (mode){
929 +     case Dreg:
930 +        strcpy (buffer,"Dn");
931 +        break;
932 +     case Areg:
933 +        strcpy (buffer,"An");
934 +        break;
935 +     case Aind:
936 +        strcpy (buffer,"(An)");
937 +        break;
938 +     case Aipi:
939 +        strcpy (buffer,"(An)+");
940 +        break;
941 +     case Apdi:
942 +        strcpy (buffer,"-(An)");
943 +        break;
944 +     case Ad16:
945 +        strcpy (buffer,"(d16,An)");
946 +        break;
947 +     case Ad8r:
948 +        strcpy (buffer,"(d8,An,Xn)");
949 +        break;
950 +     case PC16:
951 +        strcpy (buffer,"(d16,PC)");
952 +        break;
953 +     case PC8r:
954 +         strcpy (buffer,"(d8,PC,Xn)");
955 +        break;
956 +     case absw:
957 +        strcpy (buffer,"(xxx).W");
958 +        break;
959 +     case absl:
960 +        strcpy (buffer,"(xxx).L");
961 +        break;
962 +     case imm:
963 +        switch (size){
964 +         case sz_byte:
965 +            strcpy (buffer,"#<data>.B");
966 +            break;
967 +         case sz_word:
968 +            strcpy (buffer,"#<data>.W");
969 +            break;
970 +         case sz_long:
971 +            strcpy (buffer,"#<data>.L");
972 +            break;
973 +         default:
974 +            break;
975 +        }
976 +        break;
977 +     case imm0:
978 +        strcpy (buffer,"#<data>.B");
979 +        break;
980 +     case imm1:
981 +        strcpy (buffer,"#<data>.W");
982 +        break;
983 +     case imm2:
984 +        strcpy (buffer,"#<data>.L");
985 +        break;
986 +     case immi:
987 +        strcpy (buffer,"#<data>");
988 +        break;
989 +
990 +     default:
991 +        break;
992 +    }
993 +    return buffer;
994 + }
995 +
996 + const char *get_instruction_string (unsigned int opcode)
997 + {
998 +    static char out[100];
999 +    struct instr *ins;
1000 +
1001 +    strcpy (out, get_instruction_name (opcode));
1002 +
1003 +    ins = &table68k[opcode];
1004 +    if (ins->size == sz_byte)
1005 +        strcat (out,".B");
1006 +    if (ins->size == sz_word)
1007 +        strcat (out,".W");
1008 +    if (ins->size == sz_long)
1009 +        strcat (out,".L");
1010 +    strcat (out," ");
1011 +    if (ins->suse)
1012 +        strcat (out, get_ea_string (ins->smode, ins->size));
1013 +    if (ins->duse) {
1014 +        if (ins->suse)
1015 +            strcat (out,",");
1016 +        strcat (out, get_ea_string (ins->dmode, ins->size));
1017 +    }
1018 +    return out;
1019 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines