Repository URL to install this package:
Version:
9.0~241217-2.fc42 ▾
|
#ifndef __ST9_HPP
#define __ST9_HPP
#include "../idaidp.hpp"
#include "ins.hpp"
#include <diskio.hpp>
#include <frame.hpp>
#include <segregs.hpp>
#include "../iohandler.hpp"
#define PROCMOD_NAME st9
#define PROCMOD_NODE_NAME "$ st9"
// Operand flags
#define OP_IS_IND 0x00000001 // Operand is indirect, and should be
// printed between ().
#define OP_IMM_NO_SHIFT 0x00000002 // Operand is immediate, and should not
// be prefixed by the '#' character.
#define OP_REG_WITH_BIT 0x00000004 // Operand is register, and a bit number can be
// found in the "value" field.
#define OP_BIT_COMPL 0x00000008 // Bit number is a complement, and should be
// prefixed by the '!' character.
#define OP_DISPL_FUNC_ARG 0x00000010 // Operand is a displacement, and should be considered
// as a function argument variable.
// Flags for ash.uFlag
#define UAS_ASW 0x00000001 // current assembler is ASW.
inline bool is_ind(const op_t &op)
{
return (op.specflag1 & OP_IS_IND) != 0;
}
inline bool is_imm_no_shift(const op_t &op)
{
return op.type == o_imm && (op.specflag1 & OP_IMM_NO_SHIFT) != 0;
}
inline bool is_reg_with_bit(const op_t &op)
{
return op.type == o_reg && (op.specflag1 & OP_REG_WITH_BIT) != 0;
}
inline bool is_bit_compl(const op_t &op)
{
return (op.specflag1 & OP_BIT_COMPL) != 0;
}
// ST9+ registers :
enum st9_registers
{
rR0,
rR1,
rR2,
rR3,
rR4,
rR5,
rR6,
rR7,
rR8,
rR9,
rR10,
rR11,
rR12,
rR13,
rR14,
rR15,
rR16,
rR17,
rR18,
rR19,
rR20,
rR21,
rR22,
rR23,
rR24,
rR25,
rR26,
rR27,
rR28,
rR29,
rR30,
rR31,
rR32,
rR33,
rR34,
rR35,
rR36,
rR37,
rR38,
rR39,
rR40,
rR41,
rR42,
rR43,
rR44,
rR45,
rR46,
rR47,
rR48,
rR49,
rR50,
rR51,
rR52,
rR53,
rR54,
rR55,
rR56,
rR57,
rR58,
rR59,
rR60,
rR61,
rR62,
rR63,
rR64,
rR65,
rR66,
rR67,
rR68,
rR69,
rR70,
rR71,
rR72,
rR73,
rR74,
rR75,
rR76,
rR77,
rR78,
rR79,
rR80,
rR81,
rR82,
rR83,
rR84,
rR85,
rR86,
rR87,
rR88,
rR89,
rR90,
rR91,
rR92,
rR93,
rR94,
rR95,
rR96,
rR97,
rR98,
rR99,
rR100,
rR101,
rR102,
rR103,
rR104,
rR105,
rR106,
rR107,
rR108,
rR109,
rR110,
rR111,
rR112,
rR113,
rR114,
rR115,
rR116,
rR117,
rR118,
rR119,
rR120,
rR121,
rR122,
rR123,
rR124,
rR125,
rR126,
rR127,
rR128,
rR129,
rR130,
rR131,
rR132,
rR133,
rR134,
rR135,
rR136,
rR137,
rR138,
rR139,
rR140,
rR141,
rR142,
rR143,
rR144,
rR145,
rR146,
rR147,
rR148,
rR149,
rR150,
rR151,
rR152,
rR153,
rR154,
rR155,
rR156,
rR157,
rR158,
rR159,
rR160,
rR161,
rR162,
rR163,
rR164,
rR165,
rR166,
rR167,
rR168,
rR169,
rR170,
rR171,
rR172,
rR173,
rR174,
rR175,
rR176,
rR177,
rR178,
rR179,
rR180,
rR181,
rR182,
rR183,
rR184,
rR185,
rR186,
rR187,
rR188,
rR189,
rR190,
rR191,
rR192,
rR193,
rR194,
rR195,
rR196,
rR197,
rR198,
rR199,
rR200,
rR201,
rR202,
rR203,
rR204,
rR205,
rR206,
rR207,
rR208,
rR209,
rR210,
rR211,
rR212,
rR213,
rR214,
rR215,
rR216,
rR217,
rR218,
rR219,
rR220,
rR221,
rR222,
rR223,
rR224,
rR225,
rR226,
rR227,
rR228,
rR229,
rR230,
rR231,
rR232,
rR233,
rR234,
rR235,
rR236,
rR237,
rR238,
rR239,
rR240,
rR241,
rR242,
rR243,
rR244,
rR245,
rR246,
rR247,
rR248,
rR249,
rR250,
rR251,
rR252,
rR253,
rR254,
rR255,
rRR0,
rRR1,
rRR2,
rRR3,
rRR4,
rRR5,
rRR6,
rRR7,
rRR8,
rRR9,
rRR10,
rRR11,
rRR12,
rRR13,
rRR14,
rRR15,
rRR16,
rRR17,
rRR18,
rRR19,
rRR20,
rRR21,
rRR22,
rRR23,
rRR24,
rRR25,
rRR26,
rRR27,
rRR28,
rRR29,
rRR30,
rRR31,
rRR32,
rRR33,
rRR34,
rRR35,
rRR36,
rRR37,
rRR38,
rRR39,
rRR40,
rRR41,
rRR42,
rRR43,
rRR44,
rRR45,
rRR46,
rRR47,
rRR48,
rRR49,
rRR50,
rRR51,
rRR52,
rRR53,
rRR54,
rRR55,
rRR56,
rRR57,
rRR58,
rRR59,
rRR60,
rRR61,
rRR62,
rRR63,
rRR64,
rRR65,
rRR66,
rRR67,
rRR68,
rRR69,
rRR70,
rRR71,
rRR72,
rRR73,
rRR74,
rRR75,
rRR76,
rRR77,
rRR78,
rRR79,
rRR80,
rRR81,
rRR82,
rRR83,
rRR84,
rRR85,
rRR86,
rRR87,
rRR88,
rRR89,
rRR90,
rRR91,
rRR92,
rRR93,
rRR94,
rRR95,
rRR96,
rRR97,
rRR98,
rRR99,
rRR100,
rRR101,
rRR102,
rRR103,
rRR104,
rRR105,
rRR106,
rRR107,
rRR108,
rRR109,
rRR110,
rRR111,
rRR112,
rRR113,
rRR114,
rRR115,
rRR116,
rRR117,
rRR118,
rRR119,
rRR120,
rRR121,
rRR122,
rRR123,
rRR124,
rRR125,
rRR126,
rRR127,
rRR128,
rRR129,
rRR130,
rRR131,
rRR132,
rRR133,
rRR134,
rRR135,
rRR136,
rRR137,
rRR138,
rRR139,
rRR140,
rRR141,
rRR142,
rRR143,
rRR144,
rRR145,
rRR146,
rRR147,
rRR148,
rRR149,
rRR150,
rRR151,
rRR152,
rRR153,
rRR154,
rRR155,
rRR156,
rRR157,
rRR158,
rRR159,
rRR160,
rRR161,
rRR162,
rRR163,
rRR164,
rRR165,
rRR166,
rRR167,
rRR168,
rRR169,
rRR170,
rRR171,
rRR172,
rRR173,
rRR174,
rRR175,
rRR176,
rRR177,
rRR178,
rRR179,
rRR180,
rRR181,
rRR182,
rRR183,
rRR184,
rRR185,
rRR186,
rRR187,
rRR188,
rRR189,
rRR190,
rRR191,
rRR192,
rRR193,
rRR194,
rRR195,
rRR196,
rRR197,
rRR198,
rRR199,
rRR200,
rRR201,
rRR202,
rRR203,
rRR204,
rRR205,
rRR206,
rRR207,
rRR208,
rRR209,
rRR210,
rRR211,
rRR212,
rRR213,
rRR214,
rRR215,
rRR216,
rRR217,
rRR218,
rRR219,
rRR220,
rRR221,
rRR222,
rRR223,
rRR224,
rRR225,
rRR226,
rRR227,
rRR228,
rRR229,
rRR230,
rRR231,
rRR232,
rRR233,
rRR234,
rRR235,
rRR236,
rRR237,
rRR238,
rRR239,
rRR240,
rRR241,
rRR242,
rRR243,
rRR244,
rRR245,
rRR246,
rRR247,
rRR248,
rRR249,
rRR250,
rRR251,
rRR252,
rRR253,
rRR254,
rRR255,
rr0,
rr1,
rr2,
rr3,
rr4,
rr5,
rr6,
rr7,
rr8,
rr9,
rr10,
rr11,
rr12,
rr13,
rr14,
rr15,
rrr0,
rrr1,
rrr2,
rrr3,
rrr4,
rrr5,
rrr6,
rrr7,
rrr8,
rrr9,
rrr10,
rrr11,
rrr12,
rrr13,
rrr14,
rrr15,
rRW, // register window number
rRP, // register page
rCSR, // code segment register
rDPR0, rDPR1, rDPR2, rDPR3, // Data page registers
st9_lastreg = rDPR3,
};
// ST9 condition codes
enum st9_cond_codes
{
cUNKNOWN,
cF, // always false
cT, // always true
cC, // carry
cNC, // not carry
cZ, // zero
cNZ, // not zero
cPL, // plus
cMI, // minus
cOV, // overflow
cNOV, // no overflow
cEQ, // equal
cNE, // not equal
cGE, // greater than or equal
cLT, // less than
cGT, // greater than
cLE, // less than or equal
cUGE, // unsigned greated than or equal
cUL, // unsigned less than
cUGT, // unsigned greater than
cULE // unsigned less than or equal
};
enum st9_phrases ENUM_SIZE(uint8)
{
fPI, // post incrementation (rr)+
fPD, // pre decrementation -(rr)
fDISP // displacement rrx(rry)
};
inline bool is_jmp_cc(int insn)
{
return insn == st9_jpcc || insn == st9_jrcc;
}
//------------------------------------------------------------------
struct st9_iohandler_t : public iohandler_t
{
struct st9_t ±
st9_iohandler_t(st9_t &_pm, netnode &nn) : iohandler_t(nn), pm(_pm) {}
};
struct st9_t : public procmod_t
{
// The netnode helper.
// Using this node we will save current configuration information in the
// IDA database.
netnode helper;
st9_iohandler_t ioh = st9_iohandler_t(*this, helper);
const char *RegNames[st9_lastreg + 1];
qstrvec_t dynamic_rgnames; // dynamically generated names for rR1..rR255
const char *gr_cmt = nullptr;
int ref_dpr_id; // id of refinfo handler
#define IDP_GR_DEC 0x0001 // print general registers in decimal format
#define IDP_GR_HEX 0x0002 // print general registers in hexadecimal format
#define IDP_GR_BIN 0x0004 // print general registers in binary format
uint32 idpflags = IDP_GR_DEC;
ushort print_style = 3;
bool flow;
virtual ssize_t idaapi on_event(ssize_t msgid, va_list va) override;
const ioport_t *find_sym(ea_t address);
void patch_general_registers();
const char *set_idp_options(
const char *keyword,
int /*value_type*/,
const void * /*value*/,
bool idb_loaded);
int st9_emu(const insn_t &insn);
void handle_operand(const insn_t &insn, const op_t &op, bool lwrite);
bool create_func_frame(func_t *pfn) const;
void st9_assumes(outctx_t &ctx);
void st9_footer(outctx_t &ctx) const;
void st9_segstart(outctx_t &ctx, segment_t *Sarea) const;
void save_idpflags() { helper.altset(-1, idpflags); }
void load_from_idb();
};
extern int data_id;
// exporting our routines
void idaapi st9_header(outctx_t &ctx);
int idaapi st9_ana(insn_t *insn);
ea_t get_dest_addr(const insn_t &insn, const op_t &x);
bool st9_is_switch(switch_info_t *si, const insn_t &insn);
extern const char *const ConditionCodes[];
#endif /* __ST9_HPP */