128 lines
4.0 KiB
C++
128 lines
4.0 KiB
C++
/*
|
|
* Interactive disassembler (IDA).
|
|
* Copyright (c) 1990-2001 by Ilfak Guilfanov.
|
|
* ALL RIGHTS RESERVED.
|
|
* E-mail: ig@datarescue.com
|
|
*
|
|
*
|
|
*/
|
|
|
|
#ifndef _I960_HPP
|
|
#define _I960_HPP
|
|
|
|
#include "../idaidp.hpp"
|
|
#include <diskio.hpp>
|
|
#include "ins.hpp"
|
|
#include "../iohandler.hpp"
|
|
|
|
// Absolute offset (<4096) offset exp MEMA o_imm
|
|
// Absolute displacement disp exp MEMB o_imm
|
|
// Register Indirect abase (reg) o_phrase, index=-1, scale=1
|
|
// with offset abase+offset exp(reg) o_displ, index=-1,scale=1
|
|
// with displacement abase+disp exp(reg) o_displ, index=-1,scale=1
|
|
// with index abase+(index*scale) (reg)[reg*scale] o_phrase, index=index
|
|
// with index and displacement abase+(index*scale)+disp exp(reg)[reg*scale] o_displ
|
|
// Index with displacement (index*scale) + disp exp[reg*scale] o_displ, reg=index, index=-1
|
|
// IP with displacement IP+disp+8 exp(IP) o_near
|
|
|
|
#define index specflag1 // o_displ, o_phrase
|
|
#define scale specflag2 // o_displ, o_phrase
|
|
|
|
#define aux_t 0x0001 // .t suffix
|
|
#define aux_f 0x0002 // .f suffix
|
|
#define aux_ip 0x0004 // ip relative addressing
|
|
|
|
//------------------------------------------------------------------
|
|
enum regnum_t
|
|
{
|
|
LR0, LR1, LR2, LR3, LR4, LR5, LR6, LR7,
|
|
LR8, LR9, LR10, LR11, LR12, LR13, LR14, LR15,
|
|
GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7,
|
|
GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15,
|
|
SF0, SF31=SF0+31,
|
|
PC, AC, IP, TC,
|
|
FP0, FP1, FP2, FP3,
|
|
ds, cs,
|
|
MAXREG = cs,
|
|
PFP = LR0,
|
|
SP = LR1,
|
|
RIP = LR2,
|
|
FP = GR15,
|
|
IPND = SF0+0,
|
|
IMSK = SF0+1,
|
|
DMAC = SF0+2,
|
|
};
|
|
|
|
//------------------------------------------------------------------
|
|
ea_t calc_mem(const insn_t &insn, ea_t ea); // map virtual to physical ea
|
|
//------------------------------------------------------------------
|
|
void idaapi i960_header(outctx_t &ctx);
|
|
|
|
void idaapi i960_segend(outctx_t &ctx, segment_t *seg);
|
|
void idaapi i960_assumes(outctx_t &ctx); // function to produce assume directives
|
|
|
|
int idaapi is_align_insn(ea_t ea);
|
|
|
|
//------------------------------------------------------------------
|
|
struct tabent_t
|
|
{
|
|
ushort itype;
|
|
char opnum;
|
|
char dtype;
|
|
};
|
|
|
|
//------------------------------------------------------------------
|
|
struct i960_iohandler_t : public iohandler_t
|
|
{
|
|
struct i960_t ±
|
|
i960_iohandler_t(i960_t &_pm, netnode &nn) : iohandler_t(nn), pm(_pm) {}
|
|
};
|
|
|
|
struct i960_t : public procmod_t
|
|
{
|
|
netnode helper;
|
|
i960_iohandler_t ioh = i960_iohandler_t(*this, helper);
|
|
|
|
ushort idpflags;
|
|
#define IDP_STRICT 0x0001 // Strictly adhere to instruction encodings
|
|
inline bool is_strict(void) { return (idpflags & IDP_STRICT) != 0; }
|
|
void save_idpflags() { helper.altset(-1, idpflags); }
|
|
|
|
#define REG_MIN 0x580
|
|
#define REG_MAX 0x7f4
|
|
struct tabent_t reg_tab_buf[REG_MAX - REG_MIN + 1];
|
|
struct tabent_t *reg_tab = nullptr;
|
|
|
|
bool flow;
|
|
|
|
virtual ssize_t idaapi on_event(ssize_t msgid, va_list va) override;
|
|
|
|
void load_symbols(void);
|
|
const char *find_sym(ea_t address);
|
|
void choose_device();
|
|
const char *set_idp_options(
|
|
const char *keyword,
|
|
int value_type,
|
|
const void * value,
|
|
bool idb_loaded);
|
|
bool ctrl(insn_t &insn, uint32 code);
|
|
bool opmemory(insn_t &insn, op_t &x, uint32 code, char dtype);
|
|
bool mem(insn_t &insn, uint32 code);
|
|
|
|
int i960_ana(insn_t *_insn);
|
|
bool reg(insn_t &insn, uint32 code);
|
|
|
|
void handle_operand(const insn_t &insn, const op_t &x, bool isload);
|
|
int i960_emu(const insn_t &insn);
|
|
|
|
void i960_segstart(outctx_t &ctx, segment_t *Sarea) const;
|
|
void i960_footer(outctx_t &ctx) const;
|
|
|
|
void load_from_idb();
|
|
};
|
|
|
|
extern int data_id;
|
|
#define PROCMOD_NODE_NAME "$ i960"
|
|
#define PROCMOD_NAME i960
|
|
#endif // _I960_HPP
|