123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- /* s12z-dis.h -- Header file for s12z-dis.c and s12z-decode.c
- Copyright (C) 2019-2022 Free Software Foundation, Inc.
- This file is part of the GNU opcodes library.
- This library 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, or (at your option)
- any later version.
- It 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; see the file COPYING3. If not,
- see <http://www.gnu.org/licenses/>. */
- #ifndef S12Z_OPC_H
- #define S12Z_OPC_H
- #include <stdbool.h>
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /* An abstraction used to read machine code from a source. */
- struct mem_read_abstraction_base
- {
- int (*read) (struct mem_read_abstraction_base *, int, size_t, bfd_byte *);
- void (*advance) (struct mem_read_abstraction_base *);
- bfd_vma (*posn) (struct mem_read_abstraction_base *);
- };
- /* Machine code operators.
- These *roughly* correspond to opcodes.
- But describe their purpose rather than their form. */
- enum optr
- {
- OP_INVALID = 0,
- OP_push,
- OP_pull,
- /* Test and branch. */
- OP_tbNE, OP_tbEQ, OP_tbPL, OP_tbMI, OP_tbGT, OP_tbLE,
- /* Decrement and branch. */
- OP_dbNE, OP_dbEQ, OP_dbPL, OP_dbMI, OP_dbGT, OP_dbLE,
- /* Note: sex and exg are the same opcode.
- They are mnemonic changes according to the operands. */
- OP_sex,
- OP_exg,
- /* Shifters. */
- OP_lsl, OP_lsr,
- OP_asl, OP_asr,
- OP_rol, OP_ror,
- /* Bit field operations. */
- OP_bfins, OP_bfext,
- OP_trap,
- OP_ld,
- OP_st,
- OP_cmp,
- OP_stop,
- OP_wai,
- OP_sys,
- OP_minu,
- OP_mins,
- OP_maxu,
- OP_maxs,
- OP_abs,
- OP_adc,
- OP_bit,
- OP_sbc,
- OP_rti,
- OP_clb,
- OP_eor,
- OP_sat,
- OP_nop,
- OP_bgnd,
- OP_brclr,
- OP_brset,
- OP_rts,
- OP_lea,
- OP_mov,
- OP_bra,
- OP_bsr,
- OP_bhi,
- OP_bls,
- OP_bcc,
- OP_bcs,
- OP_bne,
- OP_beq,
- OP_bvc,
- OP_bvs,
- OP_bpl,
- OP_bmi,
- OP_bge,
- OP_blt,
- OP_bgt,
- OP_ble,
- OP_inc,
- OP_clr,
- OP_dec,
- OP_add,
- OP_sub,
- OP_and,
- OP_or,
- OP_tfr,
- OP_jmp,
- OP_jsr,
- OP_com,
- OP_andcc,
- OP_neg,
- OP_orcc,
- OP_bclr,
- OP_bset,
- OP_btgl,
- OP_swi,
- OP_mulu,
- OP_divu,
- OP_modu,
- OP_macu,
- OP_qmulu,
- OP_muls,
- OP_divs,
- OP_mods,
- OP_macs,
- OP_qmuls,
- OPBASE_mul = 0x4000,
- OPBASE_div,
- OPBASE_mod,
- OPBASE_mac,
- OPBASE_qmul,
- n_OPS
- };
- /* Used for operands which mutate their index/base registers.
- Eg ld d0, (s+). */
- enum op_reg_mutation
- {
- OPND_RM_NONE,
- OPND_RM_PRE_DEC,
- OPND_RM_PRE_INC,
- OPND_RM_POST_DEC,
- OPND_RM_POST_INC
- };
- /* The class of an operand. */
- enum opnd_class
- {
- OPND_CL_IMMEDIATE,
- OPND_CL_MEMORY,
- OPND_CL_REGISTER,
- OPND_CL_REGISTER_ALL, /* Used only for psh/pul. */
- OPND_CL_REGISTER_ALL16, /* Used only for psh/pul. */
- OPND_CL_SIMPLE_MEMORY,
- OPND_CL_BIT_FIELD
- };
- /* Base structure of all operands. */
- struct operand
- {
- enum opnd_class cl;
- /* OSIZE determines the size of memory access for
- the operation in which the operand participates.
- It may be -1 which indicates either unknown
- (must be determined by other operands) or if
- it is not applicable for this operation. */
- int osize;
- };
- /* Immediate operands. Eg: #23 */
- struct immediate_operand
- {
- struct operand parent;
- int value;
- };
- /* Bitfield operands. Used only in bfext and bfins
- instructions. */
- struct bitfield_operand
- {
- struct operand parent;
- int width;
- int offset;
- };
- /* Register operands. */
- struct register_operand
- {
- struct operand parent;
- int reg;
- };
- /* Simple memory operands. ie, direct memory,
- no index, no pre/post inc/dec. May be either relative or absolute.
- Eg st d0, 0x123456 */
- struct simple_memory_operand
- {
- struct operand parent;
- bfd_vma addr;
- bfd_vma base;
- bool relative;
- };
- /* Memory operands. Should be able to represent all memory
- operands in the S12Z instruction set which are not simple
- memory operands. */
- struct memory_operand
- {
- struct operand parent;
- /* True for indirect operands: eg [0x123456] */
- bool indirect;
- /* The value of any offset. eg 45 in (45,d7) */
- int base_offset;
- /* Does this operand increment or decrement
- its participating registers. Eg (-s) */
- enum op_reg_mutation mutation;
- /* The number of registers participating in this operand.
- For S12Z this is always in the range [0, 6] (but for most
- instructions it's <= 2). */
- int n_regs;
- /* The participating registers. */
- int regs[6];
- };
- /* Decode a single instruction.
- OPERATOR, OSIZE, N_OPERANDS and OPERANDS are pointers to
- variables which must be provided by the caller.
- N_OPERANDS will be incremented by the number of operands read, so
- you should assign it to something before calling this function.
- OPERANDS must be large enough to contain all operands read
- (which may be up to 6).
- It is the responsibility of the caller to free all operands
- when they are no longer needed.
- Returns the number of bytes read. */
- int decode_s12z (enum optr *myoperator, short *osize,
- int *n_operands, struct operand **operands,
- struct mem_read_abstraction_base *);
- #ifdef __cplusplus
- }
- #endif
- #endif /* S12Z_OPC_H */
|