| /* Opcode decoder for the Renesas RL78 | 
 |    Copyright (C) 2011-2023 Free Software Foundation, Inc. | 
 |    Written by DJ Delorie <dj@redhat.com> | 
 |  | 
 |    This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. | 
 |  | 
 |    This program is free software; you can redistribute it and/or modify | 
 |    it under the terms of the GNU General Public License as published by | 
 |    the Free Software Foundation; either version 3 of the License, or | 
 |    (at your option) any later version. | 
 |  | 
 |    This program is distributed in the hope that it will be useful, | 
 |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |    GNU General Public License for more details. | 
 |  | 
 |    You should have received a copy of the GNU General Public License | 
 |    along with this program; if not, write to the Free Software | 
 |    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA | 
 |    02110-1301, USA.  */ | 
 |  | 
 | /* The RL78 decoder in libopcodes is used by the simulator, gdb's | 
 |    analyzer, and the disassembler.  Given an opcode data source, it | 
 |    decodes the next opcode into the following structures.  */ | 
 |  | 
 | #ifndef RL78_OPCODES_H_INCLUDED | 
 | #define RL78_OPCODES_H_INCLUDED | 
 |  | 
 | #ifdef __cplusplus | 
 | extern "C" { | 
 | #endif | 
 |  | 
 | typedef enum { | 
 |   RL78_ISA_DEFAULT, | 
 |   RL78_ISA_G10, | 
 |   RL78_ISA_G13, | 
 |   RL78_ISA_G14, | 
 | } RL78_Dis_Isa; | 
 |  | 
 | /* For the purposes of these structures, the RL78 registers are as | 
 |    follows, despite most of these being memory-mapped and | 
 |    bank-switched:  */ | 
 | typedef enum { | 
 |   RL78_Reg_None, | 
 |   /* The order of these matches the encodings.  */ | 
 |   RL78_Reg_X, | 
 |   RL78_Reg_A, | 
 |   RL78_Reg_C, | 
 |   RL78_Reg_B, | 
 |   RL78_Reg_E, | 
 |   RL78_Reg_D, | 
 |   RL78_Reg_L, | 
 |   RL78_Reg_H, | 
 |   /* The order of these matches the encodings.  */ | 
 |   RL78_Reg_AX, | 
 |   RL78_Reg_BC, | 
 |   RL78_Reg_DE, | 
 |   RL78_Reg_HL, | 
 |   /* Unordered.  */ | 
 |   RL78_Reg_SP, | 
 |   RL78_Reg_PSW, | 
 |   RL78_Reg_CS, | 
 |   RL78_Reg_ES, | 
 |   RL78_Reg_PMC, | 
 |   RL78_Reg_MEM | 
 | } RL78_Register; | 
 |  | 
 | typedef enum | 
 | { | 
 |   RL78_Byte = 0, | 
 |   RL78_Word | 
 | } RL78_Size; | 
 |  | 
 | typedef enum { | 
 |   RL78_Condition_T, | 
 |   RL78_Condition_F, | 
 |   RL78_Condition_C, | 
 |   RL78_Condition_NC, | 
 |   RL78_Condition_H, | 
 |   RL78_Condition_NH, | 
 |   RL78_Condition_Z, | 
 |   RL78_Condition_NZ | 
 | } RL78_Condition; | 
 |  | 
 | typedef enum { | 
 |   RL78_Operand_None = 0, | 
 |   RL78_Operand_Immediate,	/* #addend */ | 
 |   RL78_Operand_Register,	/* reg */ | 
 |   RL78_Operand_Indirect,	/* [reg + reg2 + addend] */ | 
 |   RL78_Operand_Bit,		/* reg.bit */ | 
 |   RL78_Operand_BitIndirect,	/* [reg+reg2+addend].bit */ | 
 |   RL78_Operand_PreDec,		/* [--reg] = push */ | 
 |   RL78_Operand_PostInc		/* [reg++] = pop */ | 
 | } RL78_Operand_Type; | 
 |  | 
 | typedef enum | 
 | { | 
 |   RLO_unknown, | 
 |   RLO_add,			/* d += s */ | 
 |   RLO_addc,			/* d += s + CY */ | 
 |   RLO_and,			/* d &= s (byte, word, bit) */ | 
 |   RLO_branch,			/* pc = d */ | 
 |   RLO_branch_cond,		/* pc = d if cond(src) */ | 
 |   RLO_branch_cond_clear,	/* pc = d if cond(src), and clear(src) */ | 
 |   RLO_break,			/* BRK */ | 
 |   RLO_call,			/* call */ | 
 |   RLO_cmp,			/* cmp d, s */ | 
 |   RLO_divhu,			/* DIVHU */ | 
 |   RLO_divwu,			/* DIVWU */ | 
 |   RLO_halt,			/* HALT */ | 
 |   RLO_mov,			/* d = s */ | 
 |   RLO_mach,			/* MACH */ | 
 |   RLO_machu,			/* MACHU */ | 
 |   RLO_mulu,			/* MULU */ | 
 |   RLO_mulh,			/* MULH */ | 
 |   RLO_mulhu,			/* MULHU */ | 
 |   RLO_nop,			/* NOP */ | 
 |   RLO_or,			/* d |= s */ | 
 |   RLO_ret,			/* RET */ | 
 |   RLO_reti,			/* RETI */ | 
 |   RLO_rol,			/* d <<= s, MSB to LSB and CY */ | 
 |   RLO_rolc,			/* d <<= s, MSB to CY, CY, to LSB */ | 
 |   RLO_ror,			/* d >>= s, LSB to MSB and CY */ | 
 |   RLO_rorc,			/* d >>= s, LSB to CY, CY, to MSB */ | 
 |   RLO_sar,			/* d >>= s, signed */ | 
 |   RLO_sel,			/* rb = s */ | 
 |   RLO_shr,			/* d >>= s, unsigned */ | 
 |   RLO_shl,			/* d <<= s */ | 
 |   RLO_skip,			/* skip next insn is cond(s) */ | 
 |   RLO_stop,			/* STOP */ | 
 |   RLO_sub,			/* d -= s */ | 
 |   RLO_subc,			/* d -= s - CY */ | 
 |   RLO_xch,			/* swap d, s  */ | 
 |   RLO_xor,			/* d ^= s */ | 
 | } RL78_Opcode_ID; | 
 |  | 
 | typedef struct { | 
 |   RL78_Operand_Type  type; | 
 |   int              addend; | 
 |   RL78_Register	   reg : 8; | 
 |   RL78_Register	   reg2 : 8; | 
 |   unsigned char	   bit_number : 4; | 
 |   unsigned char	   condition : 3; | 
 |   unsigned char	   use_es : 1; | 
 | } RL78_Opcode_Operand; | 
 |  | 
 | /* PSW flag bits */ | 
 | #define RL78_PSW_IE	0x80 | 
 | #define RL78_PSW_Z	0x40 | 
 | #define RL78_PSW_RBS1	0x20 | 
 | #define RL78_PSW_AC	0x10 | 
 | #define	RL78_PSW_RBS0	0x08 | 
 | #define	RL78_PSW_ISP1	0x04 | 
 | #define	RL78_PSW_ISP0	0x02 | 
 | #define RL78_PSW_CY	0x01 | 
 |  | 
 | #define	RL78_SFR_SP	0xffff8 | 
 | #define	RL78_SFR_PSW	0xffffa | 
 | #define	RL78_SFR_CS	0xffffc | 
 | #define	RL78_SFR_ES	0xffffd | 
 | #define	RL78_SFR_PMC	0xffffe | 
 | #define	RL78_SFR_MEM	0xfffff | 
 |  | 
 | typedef struct | 
 | { | 
 |   int lineno; | 
 |   RL78_Opcode_ID	id:24; | 
 |   unsigned		flags:8; /* PSW mask, for side effects only */ | 
 |   int			n_bytes; | 
 |   char *		syntax; | 
 |   RL78_Size		size; | 
 |   /* By convention, these are destination, source.  */ | 
 |   RL78_Opcode_Operand	op[2]; | 
 | } RL78_Opcode_Decoded; | 
 |  | 
 | int rl78_decode_opcode (unsigned long, RL78_Opcode_Decoded *, int (*)(void *), void *, RL78_Dis_Isa); | 
 |  | 
 | #ifdef __cplusplus | 
 | } | 
 | #endif | 
 |  | 
 | #endif |