Repository URL to install this package:
Version:
9.0~241217-2.fc42 ▾
|
/************************************************************************/
/* Disassembler for Samsung SAM8 processors */
/************************************************************************/
#ifndef _SAM8_HPP
#define _SAM8_HPP
#include "../idaidp.hpp"
#include "ins.hpp"
// special insn definitions
#define fl_workingReg specflag1
#define fl_regPair specflag2
#define v_bit specval
#define v_phrase_reg specval_shorts.low
#define v_phrase_idxreg specval_shorts.high
#define c_condition auxpref_u8[0]
#define o_cmem o_mem
#define o_cmem_ind o_idpspec1 // @code address in first 256 bytes
#define o_emem o_idpspec2
#define o_reg_bit o_idpspec3
// offset to code segment
#define SAM8_CODESEG_START 0
#define SAM8_CODESEG_SIZE 0x10000
// offset to external data segment
#define SAM8_EDATASEG_START 0x800000
#define SAM8_EDATASEG_SIZE 0x10000
// utility stuff
#define top_nibble(VALUE) ((VALUE & 0xf0) >> 4)
#define bottom_nibble(VALUE) (VALUE & 0xf)
extern const char *const ccNames[];
/************************************************************************/
/* Registers (we'll be handling these with custom code ) */
/************************************************************************/
enum sam8_registers
{
rVcs, rVds // these 2 registers are required by the IDA kernel
};
/************************************************************************/
/* Indirect addressing modes without a displacement */
/************************************************************************/
enum sam8_phrases
{
fIndReg, // @register
fIdxReg, // #reg[Rn]
fIdxEAddr, // #addr[rr] (DATA)
fIdxCAddr, // #addr[rr] (CODE)
};
/************************************************************************/
/* Condition codes */
/************************************************************************/
enum sam8_cc
{
ccNone = 0xff,
ccF = 0,
ccLT,
ccLE,
ccULE,
ccOV,
ccMI,
ccEQ, // == Z
ccC, // == ULT
ccT,
ccGE,
ccGT,
ccUGT,
ccNOV,
ccPL,
ccNE, // == NZ
ccUGE, // == NC
cc_last,
};
/************************************************************************/
/* Common functions */
/************************************************************************/
void idaapi sam8_header(outctx_t &ctx);
int idaapi ana(insn_t *_insn);
void idaapi sam8_out_data(outctx_t &ctx, bool analyze_only);
/************************************************************************/
struct sam8_t : public procmod_t
{
bool flow = false;
virtual ssize_t idaapi on_event(ssize_t msgid, va_list va) override;
void handle_operand(const insn_t &insn, const op_t &x, bool loading);
int emu(const insn_t &insn);
void sam8_segstart(outctx_t &ctx, segment_t *Sarea) const;
void sam8_footer(outctx_t &ctx) const;
};
#endif