/* * Interactive disassembler (IDA). * Copyright (c) 1990-99 by Ilfak Guilfanov. * ALL RIGHTS RESERVED. * E-mail: ig@datarescue.com * * */ #ifndef _F2MC_HPP #define _F2MC_HPP #include "../idaidp.hpp" #include #include #include "ins.hpp" #include "../iohandler.hpp" //------------------------------------------------------------------ enum regnum_t { A, // accumulator AL, // accumulator AH, // accumulator PC, // program counter SP, // stack pointer R0, R1, R2, R3, R4, R5, R6, R7, RW0, RW1, RW2, RW3, RW4, RW5, RW6, RW7, RL0, RL1, RL2, RL3, PCB, // program bank register DTB, // data bank register ADB, // additional data bank register SSB, // system stack bank register USB, // user stack bank register CCR, // condition code register DPR, // direct page register rVcs, rVds, // virtual registers for code and data segments SPB, // stack pointer bank register PS, // processor status ILM, // interrupt level mask register RP // register bank pointer }; //------------------------------------------------------------------ // specific processor records #define default_bank segpref #define prefix_bank auxpref_u8[1] #define op_bank auxpref_u8[0] // o_phrase = @reg+(f2mc_index) (f2mc_index if PHRASE_INDEX) #define at specflag1 // number of @ indirections (dtype @ = op.dtype) #define special_mode specflag2 #define MODE_INC 1 #define MODE_INDEX 2 #define f2mc_index specval_shorts.high #define o_reglist o_idpspec0 // o_disp = @reg+value #define addr_dtyp specflag3 #define MODE_BIT 1 #define byte_bit specflag4 //------------------------------------------------------------------ // processor types typedef uchar proctype_t; const proctype_t F2MC16L = 0; const proctype_t F2MC16LX = 1; extern ea_t dataseg; //------------------------------------------------------------------ #define F2MC_MACRO 0x0001 // use instruction macros inline ea_t calc_code_mem(const insn_t &insn, ea_t ea) { return to_ea(insn.cs, ea); } inline ea_t calc_data_mem(ea_t ea) { return (get_sreg(ea, DTB) << 16) | ea; } int get_signed(int byte,int mask); ea_t map_port(ea_t from); int calc_outf(const op_t &x); //------------------------------------------------------------------ void idaapi f2mc_segend(outctx_t &ctx, segment_t *seg); bool idaapi create_func_frame(func_t *pfn); int idaapi is_sp_based(const insn_t &insn, const op_t &x); //------------------------------------------------------------------ struct f2mc_iohandler_t : public iohandler_t { struct f2mc_t ± f2mc_iohandler_t(f2mc_t &_pm, netnode &nn) : iohandler_t(nn), pm(_pm) {} virtual const char *aux_segm() const override { return "FSR"; } virtual bool area_processing(ea_t /*start*/, ea_t /*end*/, const char * /*name*/, const char * /*aclass*/) override; virtual const char *iocallback(const ioports_t &iop, const char *line) override; }; struct f2mc_t : public procmod_t { netnode helper; f2mc_iohandler_t ioh = f2mc_iohandler_t(*this, helper); const char *cfgname = nullptr; proctype_t ptype = F2MC16LX; // contains processor type ushort idpflags = F2MC_MACRO; bool flow = false; virtual ssize_t idaapi on_event(ssize_t msgid, va_list va) override; void load_symbols(int _respect_info); const char *find_sym(ea_t address); const char *find_bit(ea_t address, int bit); bool exist_bits(ea_t ea, int bitl, int bith); void f2mc_set_device_name(int _respect_info); void choose_and_set_device(int flags); inline void choose_device(); const char *set_idp_options( const char *keyword, int value_type, const void * value, bool idb_loaded); void adjust_ea_bit(ea_t &ea, int &bit); void handle_operand(const insn_t &insn, const op_t &x, bool use); int emu(const insn_t &insn); void ana_F2MC16LX(insn_t &insn); int ana(insn_t *_insn); void f2mc_header(outctx_t &ctx); void f2mc_assumes(outctx_t &ctx); void print_segment_register(outctx_t &ctx, int reg, sel_t value); void f2mc_segstart(outctx_t &ctx, segment_t *Srange) const; void f2mc_footer(outctx_t &ctx) const; void save_idpflags() { helper.altset(-1, idpflags); } void load_from_idb(); }; extern int data_id; #define PROCMOD_NODE_NAME "$ f2mc" #define PROCMOD_NAME f2mc #endif // _F2MC_HPP