FreeCalypso > hg > freecalypso-reveng
diff arm7dis/armdis.c @ 87:f7fba8518fa2
armdis: skeleton compiles
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sat, 29 Mar 2014 00:23:16 +0000 |
parents | 537cf2245d98 |
children | 691551f0635b |
line wrap: on
line diff
--- a/arm7dis/armdis.c Fri Mar 28 07:01:27 2014 +0000 +++ b/arm7dis/armdis.c Sat Mar 29 00:23:16 2014 +0000 @@ -4,30 +4,79 @@ extern char *binfilename; extern u_char *filemap; -extern u_long disasm_len, base_vma; +extern unsigned disasm_len, base_vma; extern unsigned get_u16(), get_u32(); +extern char *regnames[16], *condition_decode[16]; + +static void +arm_branch(off, word) + unsigned off, word; +{ + unsigned dest; + + dest = (word & 0x00FFFFFF) << 2; + if (dest & 0x02000000) + dest |= 0xFC000000; + dest += base_vma + off + 8; + printf("b%s%s\t0x%x\n", word&0x1000000 ? "l" : "", + condition_decode[word>>28], dest); +} + void arm_disasm_line(off) - u_long off; + unsigned off; { - u_long word; + unsigned word; word = get_u32(filemap + off); printf("%8x:\t%08x\t", base_vma + off, word); if ((word >> 28) == 0xF) { - printf("invalid\n"); + printf("invalid-F\n"); return; } - - + switch ((word >> 24) & 0xF) { + case 0: + case 1: + printf("<data processing, register operand>\n"); + return; + case 2: + case 3: + printf("<data processing, immediate operand>\n"); + return; + case 4: + case 5: + printf("<ldr/str, immediate offset>\n"); + return; + case 6: + case 7: + printf("<ldr/str, register offset>\n"); + return; + case 8: + case 9: + printf("<ldm/stm>\n"); + return; + case 0xA: + case 0xB: + arm_branch(off, word); + return; + case 0xC: + case 0xD: + case 0xE: + printf("<COPROCESSOR>\n"); + return; + case 0xF: + printf("swi%s\t0x%x\n", condition_decode[word>>28], + word & 0xFFFFFF); + return; + } } main(argc, argv) char **argv; { - u_long off; + unsigned off; common_init(argc, argv, 4); for (off = 0; off < disasm_len; off += 4)