# HG changeset patch # User Michael Spacefalcon # Date 1396128982 0 # Node ID c5d52666d2eb4749c90fc92505c9b09d68454c09 # Parent 691551f0635b77a6d590fa0058716968b8f0a895 armdis: BX/MRS/MSR decoding implemented diff -r 691551f0635b -r c5d52666d2eb arm7dis/armdis.c --- a/arm7dis/armdis.c Sat Mar 29 20:28:13 2014 +0000 +++ b/arm7dis/armdis.c Sat Mar 29 21:36:22 2014 +0000 @@ -1,6 +1,8 @@ #include #include #include +#include +#include extern char *binfilename; extern u_char *filemap; @@ -107,7 +109,40 @@ dataproc_tstcmp_overlay(off, word) unsigned off, word; { - printf("\n"); + char msrmask[5], *cp; + + if ((word & 0x0FFFFFF0) == 0x012FFF10) { + printf("bx%s\t%s\n", condition_decode[word>>28], + regnames[word&0xF]); + return; + } else if ((word & 0x0FBF0FFF) == 0x010F0000) { + printf("mrs%s\t%s, %cPSR\n", condition_decode[word>>28], + regnames[(word>>12)&0xF], word&0x400000 ? 'S' : 'C'); + return; + } else if ((word & 0x0DB0F000) == 0x0120F000) { + if (!(word & 0x02000000) && (word & 0xFF0)) { + printf("\n"); + return; + } + if (word & 0xF0000) { + cp = msrmask; + if (word & 0x80000) + *cp++ = 'f'; + if (word & 0x40000) + *cp++ = 's'; + if (word & 0x20000) + *cp++ = 'x'; + if (word & 0x10000) + *cp++ = 'c'; + *cp = '\0'; + } else + strcpy(msrmask, "null"); + printf("msr%s\t%cPSR_%s, ", condition_decode[word>>28], + word&0x400000 ? 'S' : 'C', msrmask); + dataproc_op2(word); + return; + } + printf("\n"); } static void