1 |
/* Copyright 2006-2009, BeatriX |
2 |
* File coded by BeatriX |
3 |
* |
4 |
* This file is part of BeaEngine. |
5 |
* |
6 |
* BeaEngine is free software: you can redistribute it and/or modify |
7 |
* it under the terms of the GNU Lesser General Public License as published by |
8 |
* the Free Software Foundation, either version 3 of the License, or |
9 |
* (at your option) any later version. |
10 |
* |
11 |
* BeaEngine is distributed in the hope that it will be useful, |
12 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 |
* GNU Lesser General Public License for more details. |
15 |
* |
16 |
* You should have received a copy of the GNU Lesser General Public License |
17 |
* along with BeaEngine. If not, see <http://www.gnu.org/licenses/>. */ |
18 |
|
19 |
/* ==================================================================== |
20 |
* Legacy Prefix F0h-Group 1 |
21 |
* ==================================================================== */ |
22 |
void __bea_callspec__ PrefLock(PDISASM pMyDisasm) |
23 |
{ |
24 |
if (!Security(0, pMyDisasm)) return; |
25 |
(*pMyDisasm).Prefix.LockPrefix = InvalidPrefix; |
26 |
GV.EIP_++; |
27 |
(*pMyDisasm).Prefix.Number++; |
28 |
GV.NB_PREFIX++; |
29 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
30 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
31 |
GV.OperandSize = 32; |
32 |
} |
33 |
|
34 |
/* ==================================================================== |
35 |
* Legacy Prefix F2h-Group 1 |
36 |
* ==================================================================== */ |
37 |
void __bea_callspec__ PrefREPNE(PDISASM pMyDisasm) |
38 |
{ |
39 |
if (!Security(0, pMyDisasm)) return; |
40 |
(*pMyDisasm).Prefix.RepnePrefix = SuperfluousPrefix; |
41 |
GV.EIP_++; |
42 |
(*pMyDisasm).Prefix.Number++; |
43 |
GV.NB_PREFIX++; |
44 |
GV.PrefRepne = 1; |
45 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
46 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
47 |
GV.PrefRepne = 0; |
48 |
} |
49 |
|
50 |
/* ==================================================================== |
51 |
* Legacy Prefix F3h-Group 1 |
52 |
* ==================================================================== */ |
53 |
void __bea_callspec__ PrefREPE(PDISASM pMyDisasm) |
54 |
{ |
55 |
if (!Security(0, pMyDisasm)) return; |
56 |
(*pMyDisasm).Prefix.RepPrefix = SuperfluousPrefix; |
57 |
GV.EIP_++; |
58 |
(*pMyDisasm).Prefix.Number++; |
59 |
GV.NB_PREFIX++; |
60 |
GV.PrefRepe = 1; |
61 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
62 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
63 |
GV.PrefRepe = 0; |
64 |
} |
65 |
|
66 |
/* ==================================================================== |
67 |
* Legacy Prefix 2Eh-Group 2 |
68 |
* ==================================================================== */ |
69 |
void __bea_callspec__ PrefSEGCS(PDISASM pMyDisasm) |
70 |
{ |
71 |
if (!Security(0, pMyDisasm)) return; |
72 |
(*pMyDisasm).Prefix.CSPrefix = InUsePrefix; |
73 |
GV.EIP_++; |
74 |
(*pMyDisasm).Prefix.Number++; |
75 |
GV.NB_PREFIX++; |
76 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
77 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
78 |
} |
79 |
|
80 |
/* ==================================================================== |
81 |
* Legacy Prefix 3Eh-Group 2 |
82 |
* ==================================================================== */ |
83 |
void __bea_callspec__ PrefSEGDS(PDISASM pMyDisasm) |
84 |
{ |
85 |
if (!Security(0, pMyDisasm)) return; |
86 |
(*pMyDisasm).Prefix.DSPrefix = InUsePrefix; |
87 |
GV.EIP_++; |
88 |
(*pMyDisasm).Prefix.Number++; |
89 |
GV.NB_PREFIX++; |
90 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
91 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
92 |
} |
93 |
|
94 |
/* ==================================================================== |
95 |
* Legacy Prefix 26h-Group 2 |
96 |
* ==================================================================== */ |
97 |
void __bea_callspec__ PrefSEGES(PDISASM pMyDisasm) |
98 |
{ |
99 |
if (!Security(0, pMyDisasm)) return; |
100 |
(*pMyDisasm).Prefix.ESPrefix = InUsePrefix; |
101 |
GV.EIP_++; |
102 |
(*pMyDisasm).Prefix.Number++; |
103 |
GV.NB_PREFIX++; |
104 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
105 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
106 |
} |
107 |
|
108 |
/* ==================================================================== |
109 |
* Legacy Prefix 64h-Group 2 |
110 |
* ==================================================================== */ |
111 |
void __bea_callspec__ PrefSEGFS(PDISASM pMyDisasm) |
112 |
{ |
113 |
if (!Security(0, pMyDisasm)) return; |
114 |
(*pMyDisasm).Prefix.FSPrefix = InUsePrefix; |
115 |
GV.EIP_++; |
116 |
(*pMyDisasm).Prefix.Number++; |
117 |
GV.NB_PREFIX++; |
118 |
GV.SEGMENTFS = 1; |
119 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
120 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
121 |
} |
122 |
|
123 |
/* ==================================================================== |
124 |
* Legacy Prefix 65h-Group 2 |
125 |
* ==================================================================== */ |
126 |
void __bea_callspec__ PrefSEGGS(PDISASM pMyDisasm) |
127 |
{ |
128 |
if (!Security(0, pMyDisasm)) return; |
129 |
(*pMyDisasm).Prefix.GSPrefix = InUsePrefix; |
130 |
GV.EIP_++; |
131 |
(*pMyDisasm).Prefix.Number++; |
132 |
GV.NB_PREFIX++; |
133 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
134 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
135 |
} |
136 |
|
137 |
|
138 |
/* ==================================================================== |
139 |
* Legacy Prefix 36h-Group 2 |
140 |
* ==================================================================== */ |
141 |
void __bea_callspec__ PrefSEGSS(PDISASM pMyDisasm) |
142 |
{ |
143 |
if (!Security(0, pMyDisasm)) return; |
144 |
(*pMyDisasm).Prefix.SSPrefix = InUsePrefix; |
145 |
GV.EIP_++; |
146 |
(*pMyDisasm).Prefix.Number++; |
147 |
GV.NB_PREFIX++; |
148 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
149 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
150 |
} |
151 |
|
152 |
/* ==================================================================== |
153 |
* Legacy Prefix 66h-Group 3 |
154 |
* ==================================================================== */ |
155 |
void __bea_callspec__ PrefOpSize(PDISASM pMyDisasm) |
156 |
{ |
157 |
if (!Security(0, pMyDisasm)) return; |
158 |
(*pMyDisasm).Prefix.OperandSize = InUsePrefix; |
159 |
GV.EIP_++; |
160 |
(*pMyDisasm).Prefix.Number++; |
161 |
GV.NB_PREFIX++; |
162 |
GV.OriginalOperandSize = GV.OperandSize; /* if GV.OperandSize is used as a mandatory prefix, keep the real operandsize value */ |
163 |
if (GV.Architecture == 16) { |
164 |
GV.OperandSize = 32; |
165 |
} |
166 |
else { |
167 |
if (GV.OperandSize != 64) { |
168 |
GV.OperandSize = 16; |
169 |
} |
170 |
} |
171 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
172 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
173 |
if (GV.Architecture == 16) { |
174 |
GV.OperandSize = 16; |
175 |
} |
176 |
else { |
177 |
GV.OperandSize = 32; |
178 |
} |
179 |
} |
180 |
|
181 |
/* ==================================================================== |
182 |
* Legacy Prefix 67h-Group 4 |
183 |
* ==================================================================== */ |
184 |
void __bea_callspec__ PrefAdSize(PDISASM pMyDisasm) |
185 |
{ |
186 |
if (!Security(0, pMyDisasm)) return; |
187 |
(*pMyDisasm).Prefix.AddressSize = InUsePrefix; |
188 |
GV.EIP_++; |
189 |
(*pMyDisasm).Prefix.Number++; |
190 |
GV.NB_PREFIX++; |
191 |
if (GV.Architecture == 16) { |
192 |
GV.AddressSize = GV.AddressSize << 1; |
193 |
} |
194 |
else { |
195 |
GV.AddressSize = GV.AddressSize >> 1; |
196 |
} |
197 |
|
198 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_); |
199 |
(void) opcode_map1[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
200 |
if (GV.Architecture == 16) { |
201 |
GV.AddressSize = GV.AddressSize >> 1; |
202 |
} |
203 |
else { |
204 |
GV.AddressSize = GV.AddressSize << 1; |
205 |
} |
206 |
|
207 |
} |
208 |
|
209 |
/* ==================================================================== |
210 |
* Escape Prefix 0Fh-two bytes opcodes |
211 |
* ==================================================================== */ |
212 |
void __bea_callspec__ Esc_2byte(PDISASM pMyDisasm) |
213 |
{ |
214 |
if (!Security(0, pMyDisasm)) return; |
215 |
GV.EIP_++; |
216 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_)+0x0F00; |
217 |
(void) opcode_map2[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
218 |
} |
219 |
|
220 |
/* ==================================================================== |
221 |
* Escape Prefix 0F38h-three bytes opcodes |
222 |
* ==================================================================== */ |
223 |
void __bea_callspec__ Esc_tableA4(PDISASM pMyDisasm) |
224 |
{ |
225 |
if (!Security(0, pMyDisasm)) return; |
226 |
GV.EIP_++; |
227 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_)+0x0F3800; |
228 |
(void) opcode_map3[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
229 |
} |
230 |
/* ==================================================================== |
231 |
* Escape Prefix 0F3Ah-three bytes opcodes |
232 |
* ==================================================================== */ |
233 |
void __bea_callspec__ Esc_tableA5(PDISASM pMyDisasm) |
234 |
{ |
235 |
if (!Security(0, pMyDisasm)) return; |
236 |
GV.EIP_++; |
237 |
(*pMyDisasm).Instruction.Opcode = *((UInt8*) (UIntPtr)GV.EIP_)+0x0F3A00; |
238 |
(void) opcode_map4[*((UInt8*) (UIntPtr)GV.EIP_)](pMyDisasm); |
239 |
} |