aboutsummaryrefslogtreecommitdiff
path: root/opcodes/rl78-dis.c
diff options
context:
space:
mode:
Diffstat (limited to 'opcodes/rl78-dis.c')
-rw-r--r--opcodes/rl78-dis.c49
1 files changed, 46 insertions, 3 deletions
diff --git a/opcodes/rl78-dis.c b/opcodes/rl78-dis.c
index a2298ce..25d0baf 100644
--- a/opcodes/rl78-dis.c
+++ b/opcodes/rl78-dis.c
@@ -24,8 +24,10 @@
#include <stdio.h>
#include "bfd.h"
+#include "elf-bfd.h"
#include "dis-asm.h"
#include "opcode/rl78.h"
+#include "elf/rl78.h"
#define DEBUG_SEMANTICS 0
@@ -80,8 +82,8 @@ indirect_type (int t)
}
}
-int
-print_insn_rl78 (bfd_vma addr, disassemble_info * dis)
+static int
+print_insn_rl78_common (bfd_vma addr, disassemble_info * dis, RL78_Dis_Isa isa)
{
int rv;
RL78_Data rl78_data;
@@ -94,7 +96,7 @@ print_insn_rl78 (bfd_vma addr, disassemble_info * dis)
rl78_data.pc = addr;
rl78_data.dis = dis;
- rv = rl78_decode_opcode (addr, &opcode, rl78_get_byte, &rl78_data);
+ rv = rl78_decode_opcode (addr, &opcode, rl78_get_byte, &rl78_data, isa);
dis->bytes_per_line = 10;
@@ -327,3 +329,44 @@ print_insn_rl78 (bfd_vma addr, disassemble_info * dis)
return rv;
}
+
+int
+print_insn_rl78 (bfd_vma addr, disassemble_info * dis)
+{
+ return print_insn_rl78_common (addr, dis, RL78_ISA_DEFAULT);
+}
+
+int
+print_insn_rl78_g10 (bfd_vma addr, disassemble_info * dis)
+{
+ return print_insn_rl78_common (addr, dis, RL78_ISA_G10);
+}
+
+int
+print_insn_rl78_g13 (bfd_vma addr, disassemble_info * dis)
+{
+ return print_insn_rl78_common (addr, dis, RL78_ISA_G13);
+}
+
+int
+print_insn_rl78_g14 (bfd_vma addr, disassemble_info * dis)
+{
+ return print_insn_rl78_common (addr, dis, RL78_ISA_G14);
+}
+
+disassembler_ftype
+rl78_get_disassembler (bfd *abfd)
+{
+ int cpu = abfd->tdata.elf_obj_data->elf_header->e_flags & E_FLAG_RL78_CPU_MASK;
+ switch (cpu)
+ {
+ case E_FLAG_RL78_G10:
+ return print_insn_rl78_g10;
+ case E_FLAG_RL78_G13:
+ return print_insn_rl78_g13;
+ case E_FLAG_RL78_G14:
+ return print_insn_rl78_g14;
+ default:
+ return print_insn_rl78;
+ }
+}