update to ida 7.6, add builds
This commit is contained in:
99
idasdk76/module/78k0s/emu.cpp
Normal file
99
idasdk76/module/78k0s/emu.cpp
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* Interactive disassembler (IDA).
|
||||
* Copyright (c) 1990-2001 by Ilfak Guilfanov.
|
||||
* ALL RIGHTS RESERVED.
|
||||
* E-mail: ig@datarescue.com
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include "78k_0s.hpp"
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
void DataSet(const insn_t &insn, const op_t &x, ea_t EA, int isload)
|
||||
{
|
||||
insn.create_op_data(EA, x);
|
||||
insn.add_dref(EA, x.offb, isload ? dr_R : dr_W);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void nec78k0s_t::handle_operand(const op_t &x, bool forced_op, bool isload, const insn_t &insn)
|
||||
{
|
||||
switch ( x.type )
|
||||
{
|
||||
case o_phrase:
|
||||
case o_void:
|
||||
case o_reg:
|
||||
break;
|
||||
|
||||
case o_imm:
|
||||
case o_displ:
|
||||
set_immd(insn.ea);
|
||||
if ( !forced_op )
|
||||
{
|
||||
ushort addr = ushort(x.addr);
|
||||
if ( x.type == o_displ )
|
||||
{
|
||||
addr += (ushort)insn.ip;
|
||||
addr += insn.size;
|
||||
uint32 offb = map_code_ea(insn, addr, x.n);
|
||||
DataSet(insn, x, offb, isload);
|
||||
}
|
||||
else if ( op_adds_xrefs(get_flags(insn.ea), x.n) )
|
||||
{
|
||||
insn.add_off_drefs(x, dr_O, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case o_bit:
|
||||
case o_mem:
|
||||
DataSet(insn, x, map_code_ea(insn, x), isload);
|
||||
break;
|
||||
|
||||
case o_near:
|
||||
{
|
||||
ea_t ea = to_ea(insn.cs, x.addr);
|
||||
int iscall = has_insn_feature(insn.itype, CF_CALL);
|
||||
insn.add_cref(ea, x.offb, iscall ? fl_CN : fl_JN);
|
||||
if ( iscall )
|
||||
flow = func_does_return(ea);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
warning("%a: %s,%d: bad optype %d", insn.ea, insn.get_canon_mnem(ph), x.n, x.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------
|
||||
int nec78k0s_t::emu(const insn_t &insn)
|
||||
{
|
||||
uint32 Feature = insn.get_canon_feature(ph);
|
||||
flow = (Feature & CF_STOP) == 0;
|
||||
|
||||
bool flag1 = is_forced_operand(insn.ea, 0);
|
||||
bool flag2 = is_forced_operand(insn.ea, 1);
|
||||
bool flag3 = is_forced_operand(insn.ea, 2);
|
||||
|
||||
if ( Feature & CF_USE1 )
|
||||
handle_operand(insn.Op1, flag1, 1, insn);
|
||||
if ( Feature & CF_USE2 )
|
||||
handle_operand(insn.Op2, flag2, 1, insn);
|
||||
if ( Feature & CF_USE3 )
|
||||
handle_operand(insn.Op3, flag3, 1, insn);
|
||||
if ( Feature & CF_CHG1 )
|
||||
handle_operand(insn.Op1, flag1, 0, insn);
|
||||
if ( Feature & CF_CHG2 )
|
||||
handle_operand(insn.Op2, flag2, 0, insn);
|
||||
if ( Feature & CF_CHG3 )
|
||||
handle_operand(insn.Op3, flag3, 0, insn);
|
||||
|
||||
if ( Feature & CF_JUMP )
|
||||
remember_problem(PR_JUMP, insn.ea);
|
||||
|
||||
if ( flow )
|
||||
add_cref(insn.ea, insn.ea + insn.size, fl_F);
|
||||
|
||||
return 1;
|
||||
}
|
||||
Reference in New Issue
Block a user