FreeCalypso > hg > freecalypso-reveng
changeset 89:c5d52666d2eb
armdis: BX/MRS/MSR decoding implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sat, 29 Mar 2014 21:36:22 +0000 |
parents | 691551f0635b |
children | f68d8e7a904f |
files | arm7dis/armdis.c |
diffstat | 1 files changed, 36 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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 <sys/types.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> +#include <strings.h> extern char *binfilename; extern u_char *filemap; @@ -107,7 +109,40 @@ dataproc_tstcmp_overlay(off, word) unsigned off, word; { - printf("<dataproc overlay with S=0 for tst/cmp>\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("<invalid MSR>\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("<invalid BX/MRS/MSR>\n"); } static void