Home | History | Annotate | Download | only in opcode
      1 /* Opcode decoder for the Renesas RL78
      2    Copyright (C) 2011-2016 Free Software Foundation, Inc.
      3    Written by DJ Delorie <dj (at) redhat.com>
      4 
      5    This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
     20    02110-1301, USA.  */
     21 
     22 /* The RL78 decoder in libopcodes is used by the simulator, gdb's
     23    analyzer, and the disassembler.  Given an opcode data source, it
     24    decodes the next opcode into the following structures.  */
     25 
     26 #ifndef RL78_OPCODES_H_INCLUDED
     27 #define RL78_OPCODES_H_INCLUDED
     28 
     29 #ifdef __cplusplus
     30 extern "C" {
     31 #endif
     32 
     33 typedef enum {
     34   RL78_ISA_DEFAULT,
     35   RL78_ISA_G10,
     36   RL78_ISA_G13,
     37   RL78_ISA_G14,
     38 } RL78_Dis_Isa;
     39 
     40 /* For the purposes of these structures, the RL78 registers are as
     41    follows, despite most of these being memory-mapped and
     42    bank-switched:  */
     43 typedef enum {
     44   RL78_Reg_None,
     45   /* The order of these matches the encodings.  */
     46   RL78_Reg_X,
     47   RL78_Reg_A,
     48   RL78_Reg_C,
     49   RL78_Reg_B,
     50   RL78_Reg_E,
     51   RL78_Reg_D,
     52   RL78_Reg_L,
     53   RL78_Reg_H,
     54   /* The order of these matches the encodings.  */
     55   RL78_Reg_AX,
     56   RL78_Reg_BC,
     57   RL78_Reg_DE,
     58   RL78_Reg_HL,
     59   /* Unordered.  */
     60   RL78_Reg_SP,
     61   RL78_Reg_PSW,
     62   RL78_Reg_CS,
     63   RL78_Reg_ES,
     64   RL78_Reg_PMC,
     65   RL78_Reg_MEM
     66 } RL78_Register;
     67 
     68 typedef enum
     69 {
     70   RL78_Byte = 0,
     71   RL78_Word
     72 } RL78_Size;
     73 
     74 typedef enum {
     75   RL78_Condition_T,
     76   RL78_Condition_F,
     77   RL78_Condition_C,
     78   RL78_Condition_NC,
     79   RL78_Condition_H,
     80   RL78_Condition_NH,
     81   RL78_Condition_Z,
     82   RL78_Condition_NZ
     83 } RL78_Condition;
     84 
     85 typedef enum {
     86   RL78_Operand_None = 0,
     87   RL78_Operand_Immediate,	/* #addend */
     88   RL78_Operand_Register,	/* reg */
     89   RL78_Operand_Indirect,	/* [reg + reg2 + addend] */
     90   RL78_Operand_Bit,		/* reg.bit */
     91   RL78_Operand_BitIndirect,	/* [reg+reg2+addend].bit */
     92   RL78_Operand_PreDec,		/* [--reg] = push */
     93   RL78_Operand_PostInc		/* [reg++] = pop */
     94 } RL78_Operand_Type;
     95 
     96 typedef enum
     97 {
     98   RLO_unknown,
     99   RLO_add,			/* d += s */
    100   RLO_addc,			/* d += s + CY */
    101   RLO_and,			/* d &= s (byte, word, bit) */
    102   RLO_branch,			/* pc = d */
    103   RLO_branch_cond,		/* pc = d if cond(src) */
    104   RLO_branch_cond_clear,	/* pc = d if cond(src), and clear(src) */
    105   RLO_break,			/* BRK */
    106   RLO_call,			/* call */
    107   RLO_cmp,			/* cmp d, s */
    108   RLO_divhu,			/* DIVHU */
    109   RLO_divwu,			/* DIVWU */
    110   RLO_halt,			/* HALT */
    111   RLO_mov,			/* d = s */
    112   RLO_mach,			/* MACH */
    113   RLO_machu,			/* MACHU */
    114   RLO_mulu,			/* MULU */
    115   RLO_mulh,			/* MULH */
    116   RLO_mulhu,			/* MULHU */
    117   RLO_nop,			/* NOP */
    118   RLO_or,			/* d |= s */
    119   RLO_ret,			/* RET */
    120   RLO_reti,			/* RETI */
    121   RLO_rol,			/* d <<= s, MSB to LSB and CY */
    122   RLO_rolc,			/* d <<= s, MSB to CY, CY, to LSB */
    123   RLO_ror,			/* d >>= s, LSB to MSB and CY */
    124   RLO_rorc,			/* d >>= s, LSB to CY, CY, to MSB */
    125   RLO_sar,			/* d >>= s, signed */
    126   RLO_sel,			/* rb = s */
    127   RLO_shr,			/* d >>= s, unsigned */
    128   RLO_shl,			/* d <<= s */
    129   RLO_skip,			/* skip next insn is cond(s) */
    130   RLO_stop,			/* STOP */
    131   RLO_sub,			/* d -= s */
    132   RLO_subc,			/* d -= s - CY */
    133   RLO_xch,			/* swap d, s  */
    134   RLO_xor,			/* d ^= s */
    135 } RL78_Opcode_ID;
    136 
    137 typedef struct {
    138   RL78_Operand_Type  type;
    139   int              addend;
    140   RL78_Register	   reg : 8;
    141   RL78_Register	   reg2 : 8;
    142   unsigned char	   bit_number : 4;
    143   unsigned char	   condition : 3;
    144   unsigned char	   use_es : 1;
    145 } RL78_Opcode_Operand;
    146 
    147 /* PSW flag bits */
    148 #define RL78_PSW_IE	0x80
    149 #define RL78_PSW_Z	0x40
    150 #define RL78_PSW_RBS1	0x20
    151 #define RL78_PSW_AC	0x10
    152 #define	RL78_PSW_RBS0	0x08
    153 #define	RL78_PSW_ISP1	0x04
    154 #define	RL78_PSW_ISP0	0x02
    155 #define RL78_PSW_CY	0x01
    156 
    157 #define	RL78_SFR_SP	0xffff8
    158 #define	RL78_SFR_PSW	0xffffa
    159 #define	RL78_SFR_CS	0xffffc
    160 #define	RL78_SFR_ES	0xffffd
    161 #define	RL78_SFR_PMC	0xffffe
    162 #define	RL78_SFR_MEM	0xfffff
    163 
    164 typedef struct
    165 {
    166   int lineno;
    167   RL78_Opcode_ID	id:24;
    168   unsigned		flags:8; /* PSW mask, for side effects only */
    169   int			n_bytes;
    170   char *		syntax;
    171   RL78_Size		size;
    172   /* By convention, these are destination, source.  */
    173   RL78_Opcode_Operand	op[2];
    174 } RL78_Opcode_Decoded;
    175 
    176 int rl78_decode_opcode (unsigned long, RL78_Opcode_Decoded *, int (*)(void *), void *, RL78_Dis_Isa);
    177 
    178 #ifdef __cplusplus
    179 }
    180 #endif
    181 
    182 #endif
    183