-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathemu.cpp
More file actions
129 lines (106 loc) · 2.76 KB
/
emu.cpp
File metadata and controls
129 lines (106 loc) · 2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* IDP emulator for KIRK - (c) Proxima 2023
*/
#include "kirk.hpp"
// ********** x-invalid: --invalid--
static int KIRK_emu_x_invalid(const insn_t& insn)
{
return 0;
}
static int KIRK_emu_standard_insn(const insn_t& insn)
{
if (insn.Op1.type == o_mem)
{
insn.add_dref(insn.Op1.addr, insn.ea, dr_O);
}
if (insn.Op2.type == o_mem)
{
insn.add_dref(insn.Op2.addr, insn.ea, dr_O);
}
return insn.size;
}
static int KIRK_emu_call_branch(const insn_t& insn)
{
unsigned int val;
if (insn.Op1.type == o_near)
{
val = insn.Op1.addr;
}
else {
val = insn.Op1.value;
}
cref_t flag = has_insn_feature(insn.itype, CF_CALL) ? fl_CN : fl_JN;
insn_add_cref(insn, val, 0, flag);
return 4;
}
// Emulator entry
int kirk_t::kirk_emu(const insn_t& insn)
{
int len;
switch (insn.itype)
{
case KIRK_INSN_X_INVALID:
len = KIRK_emu_x_invalid(insn); break;
case KIRK_INSN_00_NOP:
case KIRK_INSN_08_STORE2:
case KIRK_INSN_09_STORE:
case KIRK_INSN_0A_MOVX:
case KIRK_INSN_0B_MOV32:
case KIRK_INSN_0C_MOVY:
case KIRK_INSN_0D_MOV32A:
case KIRK_INSN_0E_MOV32AA:
case KIRK_INSN_10_CMPX:
case KIRK_INSN_11_CMPI:
case KIRK_INSN_12_CMPPLUS:
case KIRK_INSN_13_CMPA:
case KIRK_INSN_16_SUBA:
case KIRK_INSN_19_ADDI:
case KIRK_INSN_1B_ADDA:
case KIRK_INSN_21_ADDC:
case KIRK_INSN_29_SUBI:
case KIRK_INSN_30_OP30:
case KIRK_INSN_38_OP38:
case KIRK_INSN_39_ANDI:
case KIRK_INSN_3A_ANDA:
case KIRK_INSN_41_MOV8:
case KIRK_INSN_43_MOV16:
case KIRK_INSN_44_ORA:
case KIRK_INSN_49_XORI:
case KIRK_INSN_4B_XORA:
case KIRK_INSN_4E_XORX:
case KIRK_INSN_53_MOV128:
case KIRK_INSN_80_INC32:
case KIRK_INSN_88_DEC32:
case KIRK_INSN_89_OP89:
case KIRK_INSN_8B_OP8B:
case KIRK_INSN_90_LSH:
case KIRK_INSN_98_NAND:
case KIRK_INSN_A0_SETMODE:
case KIRK_INSN_B0_BYTESWAP:
case KIRK_INSN_C0_TEST:
case KIRK_INSN_C3_CHECK3:
case KIRK_INSN_C6_CHECK6:
case KIRK_INSN_C7_CHECK7:
case KIRK_INSN_C8_BITSET:
case KIRK_INSN_C9_CHECK9:
case KIRK_INSN_D0_BITCLEAR:
case KIRK_INSN_DA_CLRZ:
case KIRK_INSN_DB_SETZ:
case KIRK_INSN_F0_RET:
case KIRK_INSN_F8_INTR:
len = KIRK_emu_standard_insn(insn); break;
case KIRK_INSN_62_JZ:
case KIRK_INSN_68_JNZ:
case KIRK_INSN_E0_B:
case KIRK_INSN_E1_BNZ:
case KIRK_INSN_E2_BZ:
case KIRK_INSN_E3_BGT:
case KIRK_INSN_E4_BLT:
case KIRK_INSN_E8_CALL:
case KIRK_INSN_E9_CALL2:
len = KIRK_emu_call_branch(insn); break;
default: len = 0; break;
}
if (len && !has_insn_feature(insn.itype, CF_STOP))
insn_add_cref(insn, insn.ea + len, 0, fl_F);
return 1;
}