aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--opcodes/ChangeLog6
-rw-r--r--opcodes/avr-dis.c83
2 files changed, 29 insertions, 60 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index c6d1fea..8df6679 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,9 @@
+2000-04-03 Denis Chertykov <denisc@overta.ru>
+
+ * avr-dis.c: Syntax cleanup.
+ (add0fff): Print the pc relative address as a signed number.
+ (add03f8): Likewise.
+
2000-04-01 Ian Lance Taylor <ian@zembu.com>
* disassemble.c (disassembler_usage): Don't use a prototype. Mark
diff --git a/opcodes/avr-dis.c b/opcodes/avr-dis.c
index 2d7eb94..7876686 100644
--- a/opcodes/avr-dis.c
+++ b/opcodes/avr-dis.c
@@ -26,7 +26,6 @@ typedef unsigned short u16;
typedef unsigned long u32;
#define IFMASK(a,b) ((opcode & (a)) == (b))
-#define CODE_MAX 65537
static char* SREG_flags = "CZNVSHTI";
static char* sect94[] = {"COM","NEG","SWAP","INC","NULL","ASR","LSR","ROR",
@@ -38,8 +37,8 @@ static char* branchs[] = {
"BRCC","BRNE","BRPL","BRVC",
"BRGE","BRHC","BRTC","BRID"
};
-static char* last4[] = {"BLD","BST","SBRC","SBRS"};
+static char* last4[] = {"BLD","BST","SBRC","SBRS"};
static void dispLDD PARAMS ((u16, char *));
@@ -147,8 +146,8 @@ add0fff (op, dest, pc)
char *dest;
int pc;
{
- int opcode = op & 0x0fff;
- sprintf(dest, ".%+-8d ; 0x%06X", opcode * 2, pc + 2 + opcode * 2);
+ int rel_addr = (((op & 0xfff) ^ 0x800) - 0x800) * 2;
+ sprintf(dest, ".%+-8d ; 0x%06X", rel_addr, pc + 2 + rel_addr);
}
@@ -160,8 +159,8 @@ add03f8 (op, dest, pc)
char *dest;
int pc;
{
- int opcode = (op >> 3) & 0x7f;
- sprintf(dest, ".%+-8d ; 0x%06X", opcode * 2, pc + 2 + opcode * 2);
+ int rel_addr = ((((op >> 3) & 0x7f) ^ 0x40) - 0x40) * 2;
+ sprintf(dest, ".%+-8d ; 0x%06X", rel_addr, pc + 2 + rel_addr);
}
@@ -331,49 +330,31 @@ print_insn_avr(addr, info)
}
break;
case 0x1:
- {
- (*prin) (stream, " LD %s,Z+", rd);
- }
+ (*prin) (stream, " LD %s,Z+", rd);
break;
case 0x2:
- {
- (*prin) (stream, " LD %s,-Z", rd);
- }
+ (*prin) (stream, " LD %s,-Z", rd);
break;
case 0x9:
- {
- (*prin) (stream, " LD %s,Y+", rd);
- }
+ (*prin) (stream, " LD %s,Y+", rd);
break;
case 0xa:
- {
- (*prin) (stream, " LD %s,-Y", rd);
- }
+ (*prin) (stream, " LD %s,-Y", rd);
break;
case 0xc:
- {
- (*prin) (stream, " LD %s,X", rd);
- }
+ (*prin) (stream, " LD %s,X", rd);
break;
case 0xd:
- {
- (*prin) (stream, " LD %s,X+", rd);
- }
+ (*prin) (stream, " LD %s,X+", rd);
break;
case 0xe:
- {
- (*prin) (stream, " LD %s,-X", rd);
- }
+ (*prin) (stream, " LD %s,-X", rd);
break;
case 0xf:
- {
- (*prin) (stream, " POP %s", rd);
- }
+ (*prin) (stream, " POP %s", rd);
break;
default:
- {
- (*prin) (stream, " ????");
- }
+ (*prin) (stream, " ????");
break;
}
}
@@ -391,49 +372,31 @@ print_insn_avr(addr, info)
}
break;
case 0x1:
- {
- (*prin) (stream, " ST Z+,%s", rd);
- }
+ (*prin) (stream, " ST Z+,%s", rd);
break;
case 0x2:
- {
- (*prin) (stream, " ST -Z,%s", rd);
- }
+ (*prin) (stream, " ST -Z,%s", rd);
break;
case 0x9:
- {
- (*prin) (stream, " ST Y+,%s", rd);
- }
+ (*prin) (stream, " ST Y+,%s", rd);
break;
case 0xa:
- {
- (*prin) (stream, " ST -Y,%s", rd);
- }
+ (*prin) (stream, " ST -Y,%s", rd);
break;
case 0xc:
- {
- (*prin) (stream, " ST X,%s", rd);
- }
+ (*prin) (stream, " ST X,%s", rd);
break;
case 0xd:
- {
- (*prin) (stream, " ST X+,%s", rd);
- }
+ (*prin) (stream, " ST X+,%s", rd);
break;
case 0xe:
- {
- (*prin) (stream, " ST -X,%s", rd);
- }
+ (*prin) (stream, " ST -X,%s", rd);
break;
case 0xf:
- {
- (*prin) (stream, " PUSH %s", rd);
- }
+ (*prin) (stream, " PUSH %s", rd);
break;
default:
- {
- (*prin) (stream, " ????");
- }
+ (*prin) (stream, " ????");
break;
}
}