Files
sigmaker-ida/idasdk76/module/tms320c3/tms320c3x.hpp
2021-10-31 21:20:46 +02:00

174 lines
4.2 KiB
C++

/*
* Interactive disassembler (IDA).
* Copyright (c) 1990-99 by Ilfak Guilfanov.
* ALL RIGHTS RESERVED.
* E-mail: ig@datarescue.com
*
*
*/
#ifndef _TMS320C3X_HPP
#define _TMS320C3X_HPP
#include "../idaidp.hpp"
#include <diskio.hpp>
#include "ins.hpp"
enum regnum_t
{
// Extended-precision registers
r0 = 0,
r1,
r2,
r3,
r4,
r5,
r6,
r7,
// Auxiliary registers
ar0,
ar1,
ar2,
ar3,
ar4,
ar5,
ar6,
ar7,
// Index register n
ir0,
ir1,
bk, // Block-size register
sp, // System-stack pointer
st, // Status register
ie, // CPU/DMA interrupt-enable register
if_reg, // CPU interrupt flag
iof, // I/O flag
rs, // Repeat start-address
re, // Repeat end-address
rc, // Repeat counter
// segment registers
dp, // DP register
rVcs, rVds // virtual registers for code and data segments
};
//------------------------------------------------------------------
// specific processor records
#define phtype specflag1 // o_phrase: phrase type
// 0 "*+arn(NN)"
// 1 "*-arn(NN)"
// 2 "*++arn(NN)"
// 3 "*--arn(NN)"
// 4 "*arn++(NN)"
// 5 "*arn--(NN)"
// 6 "*arn++(NN)%%"
// 7 "*arn--(NN)%%"
// 8 "*+arn(ir0)"
// 9 "*-arn(ir0)"
// a "*++arn(ir0)"
// b "*--arn(ir0)"
// c "*arn++(ir0)"
// d "*arn--(ir0)"
// e "*arn++(ir0)%%"
// f "*arn--(ir0)%%"
// 10 "*+arn(ir1)"
// 11 "*-arn(ir1)"
// 12 "*++arn(ir1)"
// 13 "*--arn(ir1)"
// 14 "*arn++(ir1)"
// 15 "*arn--(ir1)"
// 16 "*arn++(ir1)%%"
// 17 "*arn--(ir1)%%"
// 18 "*arn"
// 19 "*arn++(ir0)B"
#define itype2 segpref // 2-nd command type (within parallel instruction)
#define i2op insnpref // number of first operand that belong to 2-nd insn of parallel instruction
// auxpref flags:
#define DBrFlag 0x80 // Delayed branch flag
#define ImmFltFlag 0x40 // Imm float Value
#include "../iohandler.hpp"
//------------------------------------------------------------------
struct tms320c3x_iohandler_t : public iohandler_t
{
tms320c3x_iohandler_t(netnode &nn) : iohandler_t(nn) {}
virtual bool entry_processing(ea_t &ea, const char *name, const char *cmt) override;
};
struct ctx_t;
struct opcode_t;
struct tms320c3_table_t
{
opcode_t *entries;
int size;
opcode_t &operator[](size_t i);
void create(const opcode_t src_table[], int src_table_size);
~tms320c3_table_t();
};
struct tms320c3x_t : public procmod_t
{
netnode helper;
tms320c3x_iohandler_t ioh = tms320c3x_iohandler_t(helper);
tms320c3_table_t table;
bool flow = false;
virtual ssize_t idaapi on_event(ssize_t msgid, va_list va) override;
bool select_device(int lrespect_info);
const char *idaapi set_idp_options(
const char *keyword,
int /*value_type*/,
const void * /*value*/,
bool /*idb_loaded*/);
int ana(insn_t *insn);
void init_analyzer(void);
void gen_masks(void);
int run_functions(ctx_t &ctx, int value, int entry, int start, int end);
int run_functions2(ctx_t &ctx, int value, int entry, int start, int end);
int emu(const insn_t &insn);
void handle_operand(const insn_t &insn, const op_t &x, flags_t F, bool use);
void header(outctx_t &ctx);
void assumes(outctx_t &ctx);
void print_segment_register(outctx_t &ctx, int reg, sel_t value);
void segstart(outctx_t &ctx, segment_t *seg) const;
void footer(outctx_t &ctx) const;
void gen_stkvar_def(outctx_t &ctx, const member_t *mptr, sval_t v) const;
void load_from_idb();
};
extern int data_id;
#define PROCMOD_NODE_NAME "$ tms320c3x"
#define PROCMOD_NAME tms320c3x
//------------------------------------------------------------------
ea_t calc_code_mem(const insn_t &insn, const op_t &x);
ea_t calc_data_mem(const insn_t &insn, const op_t &x);
regnum_t get_mapped_register(ea_t ea);
const char *get_cond8(char value);
int get_signed(int byte,int mask);
//------------------------------------------------------------------
void idaapi segend(outctx_t &, segment_t *seg);
void idaapi data(outctx_t &ctx);
bool idaapi create_func_frame(func_t *pfn);
int idaapi is_align_insn(ea_t ea);
bool is_basic_block_end(const insn_t &insn);
bool idaapi can_have_type(const op_t &op);
#endif // _TMS320C3X_HPP