Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1846 yogev_ezra 1
//CODE GENERATION DESCRIPTORS
2
// =========================
3
// >>> DESCRIPTION CODES <<<
4
// =========================
5
 
6
//T_:
7
//		DB 
8
//	 [DB ]
9
//	 [DB ]
10
//		DB 
11
//		DB 
12
//		DB 0
13
//OR		DB _END //IF THERE'RE NO MORE INFO ABOUT THIS MNEMONIC
14
 
15
// OPERATION SIZE CODES
16
enum {	_B, //OPERATION MAY BE OF SIZE BYTE,WORD OR DWORD SEIN. THE OPCODE'S
17
		// W BIT INDICATES IF IT'S A BYTE OR WORD OPERATION.
18
		// FOR DWORD OPERATIONS, THE W BIT MUST BE TRUE (WORD OPERATION)
19
		// AND THE RAND:PREFIX MUST BE GENERATED.
20
	_W, //OPERATION SIZE MAY BE WORD OR DWORD.
21
	_D, //OPERATION MAY ONLY BE DWORD.
22
	WB, //1. OPERAND WORD, 2. OPERAND BYTE
23
	_DW,	//1. OPERAND DWORD, 2. OPERAND WORD
24
	BW, //1. OPERAND BYTE, 2. OPERAND WORD
25
	NB, //ONLY BYTE SIZE.
26
	_OW,	//ONLY WORD SIZE.
27
	_OD,	// Only DWORD size
28
	AF};	//ONLY ABSOLUTE FAR 32/48 BIT ADDRESS
29
 
30
#define _JB 1 //OPERAND IS A JUMP - DESTINATION +/-128
31
#define _JW 2 //OPERAND IS A JUMP - DESTINATION +/-32678
32
 
33
// 0-2	 = OPERATION SIZE CODE
34
// 3-4	 = # OF OPERANDS NEEDED.
35
 
36
// # OF OPERANDS
37
#define OL0 0
38
#define OL1 0o10
39
#define OL2 0o20
40
#define OL3 0o30
41
 
42
#define OLBITS		 0o30 //MASKS FOR # OF OPERANDS.
43
#define NOLBITS 	 0o347
44
#define TRANSBITS  0o7	//MASKS FOR OPERATION SIZE CODES.
45
#define NTRANSBITS 0o370
46
 
47
// IF OL1, USE THIS OPERAND TYPES:
48
#define SOJ 0b00000000	//JUMP
49
#define SOE 0b00100000	//EA
50
#define SOR 0b01000000	//REG
51
#define SOC 0b01100000	//CONST
52
#define SO3 0b10000000	//_3
53
#define SOS 0b10100000	//SREG
54
#define SOM 0b11000000	//EA-MEMORY-POINTER
55
#define SOO 0b11100000	//THERE IS INFORMATION USING THE OPERAND SIZE CODE BITS.
56
#define SOO_FS 0o340	//FS-REGISTER
57
#define SOO_GS 0o341	//GS-REGISTER
58
#define SOO_AF 0o342	//ABSOLUTE ADRESS
59
#define SOO_CC 0o343	//SIGNED BYTE
60
#define OPBITS 0b11100000
61
 
62
// IF OL2, USE THOSE INSTEAD:
63
//		00000000B  //DIRECT DESCRIPTOR
64
		//AR,CO
65
#define ERO  0b00100000 //FIXED EA,REG ORDER
66
#define REO  0b01000000 //FIXED REG,EA ORDER
67
#define DER  0b01100000 //EA,REG OR REG,EA DEFINED BY A D-BIT
68
#define ECO  0b10000000 //EA,CONSTANT// SIZE DEFINED BY W-BIT
69
#define ECCO 0b10100000 //EA,CC
70
#define RCO  0b11000000 //REG,CONSTANT// SIZE DEFINED BY W-BIT
71
#define EAO  0b11100000 //EA,? // SECOND OPERAND DESCRIBED BY OLD DESCIPTORS
72
			//?=_1,rCL,CO
73
 
74
// OPERAND TYPE CODES
75
enum {	R,		 //GENERAL REGISTER
76
	E,		 //EFFEKTIVE ADRESS
77
	CO, 	 //CONSTANT
78
	_SR,	 //SEGMENT REGISTER
79
	SYSR,  //SYSTEM REGISTER
80
	_DR,	 //DEBUG REGISTER
81
	_TR,	 //TASK REGISTER
82
	_CR,	 //CONTROL REGISTER
83
	_CR4,  //
84
	_AF,	 //ABSOLUTE 32/48 BIT FAR ADDRESS
85
	AR=11, //AX/AL REGISTER, INDICATED BY OPERATION SIZE
86
	_1};	 //CONSTANT VALUE 1
87
 
88
// IF OL3, USE THIS:
89
// INSTRUCTION WITH THREE OPERANDS ARE ALWAYS OF SIZE WORD.
90
// THE FOLLOWING CODES DESCRIBE THE 3RD OPERAND.
91
enum {	CB3,	 //BYTE CONSTANT
92
	CW3,	 //WORD CONSTANT
93
	CC3,	 //SBYTE CONSTANT
94
	CL3};  //CL REGISTER
95
 
96
// OPCODE DESCRIPTORS
97
enum{ O=1,	 //OPCODE IS A BYTE
98
	OW, 	 //OPCODE IS A WORD
99
	OS, 	 //OPCODE IS A BYTE PLUS A SECOND BYTE THAT IS DESCRIBED BY AN
100
				 //OCTAL STRING.
101
	S,		 //OCTAL STRING FOLLOWS FOR OPCODE
102
	XRM,	 //MODRM BYTE
103
	XPM,	 //MODRM MIT P-FLAG (GRUPPE VON ARITHMETIC INSTRUCTIONS)
104
	XSM,	 //MODRM MIT SEGMENTREGISTER
105
	X0M,X1M,X2M,X3M,X4M,X5M,X6M,X7M //MODRM WITH CONSTANT R DIGIT
106
	};
107
 
108
byte OVERRIDETAB={0o46,0o56,0o66,0o76,0o144,0o145};
109
// ---- Кодировка регистров
110
enum{ rAL ,rCL ,rDL ,rBL ,rAH ,rCH ,rDH ,rBH, // 0-7	 byte regs
111
	rAX ,rCX ,rDX ,rBX ,rSP ,rBP ,rSI ,rDI, // 8-15  16-bit word regs
112
	rEAX,rECX,rEDX,rEBX,rESP,rEBP,rESI,rEDI,// 16-23 32-bit regs
113
	rCR0,rCR1,rCR2,rCR3,rCR4,rCR5,rCR6,rCR7,// 24-31 control regs
114
	rDR0,rDR1,rDR2,rDR3,rDR4,rDR5,rDR6,rDR7,// 32-39 debug regs
115
	rTR0,rTR1,rTR2,rTR3,rTR4,rTR5,rTR6,rTR7,// 40-47 test regs
116
	rES,rCS,rSS,rDS, rFS,rGS};		// 48-53 seg regs
117
byte Registers={
118
	"AL","CL","DL","BL","AH","CH","DH","BH",
119
	"AX","CX","DX","BX","SP","BP","SI","DI",
120
	"EAX","ECX","EDX","EBX","ESP","EBP","ESI","EDI",
121
	"CR0","CR1","CR2","CR3","CR4","CR5","CR6","CR7",
122
	"DR0","DR1","DR2","DR3","DR4","DR5","DR6","DR7",
123
	"TR0","TR1","TR2","TR3","TR4","TR5","TR6","TR7",
124
	"ES","CS","SS","DS","FS","GS",_END};
125
byte Sizes={"BYTE","WORD","DWORD",_END};
126
 
127
// ---- Описания менмоник
128
byte PCOMMANDS1={
129
		0,		//P FLAG STARTS AT 0
130
		_B+OL2+EAO,AR,CO,S,"0P4",
131
		_B+OL2+DER,S,'0','P','0',XRM,0,
132
		_W+OL2+ECCO,O,0o203,XPM,0,
133
		_B+OL2+ECO,O,0o200,XPM,_END};
134
 
135
byte PCOMMANDS2={
136
		4,		//P FLAG STARTS AT 4
137
		_B+OL1+SOE,O,0xF6,XPM,_END};
138
byte PCOMMANDS3= 0; 	 //P FLAG STARTS AT 0
139
byte PCOMMANDS3_={
140
		_B+OL2+EAO,-1,_1,O,0xD0,XPM,0,
141
		_B+OL2+EAO,-1,rCL,O,0xD2,XPM,0,
142
		_B+OL2+ECCO,O,0xC0,XPM,_END};
143
 
144
byte PCOMMANDS4={
145
		4,		//P FLAG STARTS AT 4
146
		_W+OL2+ERO,OS,0xF,'2','P','3',XRM,0,
147
		WB+OL2+ECO,OW,0xF,0o272,XPM,_END};
148
// Однобайтовые инструкции
149
byte T_DAA={	O,0o47,_END};
150
byte T_DAS={	O,0o57,_END};
151
byte T_AAA={	O,0o67,_END};
152
byte T_AAD={	OW,0o325,0o12,_END};
153
byte T_AAM={	OW,0o324,0o12,_END};
154
byte T_AAS={	O,0o77,_END};
155
byte T_CWDE={ O,0o230,_END};
156
byte T_CBW={	OW,0x66,0o230,_END};
157
byte T_CDQ={	O,0o231,_END};
158
byte T_CWD={	OW,0x66,0o231,_END};
159
byte T_XLATB={	O,0o327,_END};
160
byte T_NOP={	O,0o220,_END};
161
byte T_WAIT={ O,0o233,_END};
162
byte T_LOCK={ O,0o360,_END};
163
byte T_HLT={	O,0o364,_END};
164
byte T_INTO={ O,0o316,_END};
165
byte T_IRET={ O,0o317,_END};
166
byte T_POPFD={	O,0o235,_END};
167
byte T_POPF={ OW,0x66,0o235,_END};
168
byte T_PUSHFD={ O,0o234,_END};
169
byte T_PUSHF={	OW,0x66,0o234,_END};			//PUSHF / (#) PUSHFD
170
byte T_SAHF={ O,0o236,_END};
171
byte T_LAHF={ O,0o237,_END};
172
byte T_CMC={	O,0o365,_END};
173
byte T_CLC={	O,0o370,_END};
174
byte T_STC={	O,0o371,_END};
175
byte T_CLI={	O,0o372,_END};
176
byte T_STI={	O,0o373,_END};
177
byte T_CLD={	O,0o374,_END};
178
byte T_STD={	O,0o375,_END};
179
byte T_PUSHAD={ O,0o140,_END};
180
byte T_PUSHA={	OW,0x66,0o140,_END};
181
byte T_POPAD={	O,0o141,_END};
182
byte T_POPA={ OW,0x66,0o141,_END};
183
byte T_INSB={ O,0o154,_END};
184
byte T_INSW={ OW,0x66,0o155,_END};
185
byte T_INSD={ O,0o155,_END};
186
byte T_OUTSB={	O,0o156,_END};
187
byte T_OUTSW={	OW,0x66,0o157,_END};
188
byte T_OUTSD={	O,0o157,_END};
189
byte T_MOVSB={	O,0o244,_END};
190
byte T_MOVSW={	OW,0x66,0o245,_END};
191
byte T_MOVSD={	O,0o245,_END};
192
byte T_CMPSB={	O,0o246,_END};
193
byte T_CMPSW={	OW,0x66,0o247,_END};
194
byte T_CMPSD={	O,0o247,_END};
195
byte T_STOSB={	O,0o252,_END};
196
byte T_STOSW={	OW,0x66,0o253,_END};
197
byte T_STOSD={	O,0o253,_END};
198
byte T_LODSB={	O,0o254,_END};
199
byte T_LODSW={	OW,0x66,0o255,_END};
200
byte T_LODSD={	O,0o255,_END};
201
byte T_SCASB={	O,0o256,_END};
202
byte T_SCASW={	OW,0x66,0o257,_END};
203
byte T_SCASD={	O,0o257,_END};
204
byte T_REP={	O,0o362,_END};
205
byte T_REPE={ O,0o363,_END};
206
byte T_RAND={ O,0o146,_END}; //RAND:
207
byte T_ADDR={ O,0o147,_END}; //ADDR:
208
byte T_LEAVE={	O,0o311,_END};
209
byte T_CLTS={ OW,0xF,6,_END};
210
byte T_INVD={ OW,0xF,0o10,_END};
211
byte T_WBINVD={ OW,0xF,0o11,_END};
212
byte T_WRMSR={	OW,0xF,0x30,_END}; //WRMSR WRITE	EDXEAX TO MODEL SPECIFIC REG #ECX
213
byte T_CPUID={	OW,0xF,0xA2,_END}; //CPUID IF EAX=1 SET EDXEAX TO CPU IDENTIFICATION VALUES
214
byte T_RDMSR={	OW,0xF,0x32,_END}; //RDMSR READ MODEL SPECIFIC REG #ECX TO EDXEAX
215
byte T_RDTSC={	OW,0xF,0x31,_END}; //RDTSC READ TIME STAMP COUNTER TO EDXEAX
216
byte T_RSM={	OW,0xF,0xAA,_END}; //RSM	RESUME FROM SYSTEM MANAGEMENT MODE
217
//===== INTEL PENTIUM PRO INSTRUCTIONS
218
byte T_RDPMC={	OW,0xF,0x33,_END};	//READ PERFORMANCE MONITORING COUNTERS
219
byte T_UD2={	OW,0xF,0xB,_END}; 		 //UNDEFINED INSTRUCTION EXCEPTION
220
byte T_EMMX={ OW,0xF,0x77,_END};	//EMPTY MMX STATE
221
byte T_SALC={ O,0xD6,_END};
222
byte T_ICEBP={	O,0xF1,_END};
223
byte T_PSHIMW={ OW,0xF,0x71,_END};
224
byte T_PSHIMD={ OW,0xF,0x72,_END};
225
byte T_PSHIMQ={ OW,0xF,0x73,_END};
226
 
227
byte T_NOT={	_B+OL1+SOE,O,0xF6,X2M,_END};
228
byte T_NEG={	_B+OL1+SOE,O,0xF6,X3M,_END};
229
byte T_INC={	_W+OL1+SOR,S,"10R",
230
		_B+OL1+SOE,O,0xFE,X0M,_END};
231
byte T_DEC={	_W+OL1+SOR,S,"11R",
232
		_B+OL1+SOE,O,0xFE,X1M,_END};
233
byte T_TEST={ _B+OL2+ERO,O,0o204,XRM,0, //ALPHA:WAS 204O
234
		_B+OL2+REO,O,0o204,XRM,0, //"
235
		_B+OL2+EAO,AR,CO,O,0o250,0,
236
		_B+OL2+ECO,O,0xF6,X0M,_END};
237
// EXTENDED 386 INTEGER MULTIPLICATION
238
byte T_IMUL={ _B+OL1+SOE,O,0xF6,X5M,0,			//IMUL EB
239
		_B+OL2+ECO,O,0xC0,X1M,0,
240
		_B+OL2+EAO,-1,_1,O,0xD0,X1M,0,
241
		_B+OL2+EAO,-1,rCL,O,0xD2,X1M,0,
242
		_W+OL1+REO,OW,0xF,0o257,XRM,0,	//IMUL RW, EW
243
		OL3+REO+CC3,O,0o153,XRM,0,	//IMUL RW, EW, DC
244
		OL3+REO+CW3,O,0o151,XRM,_END};	//IMUL RW, EW, DW
245
byte T_SHLD={ OL3+ERO+CB3,OW,0xF,0o244,XRM,0,
246
		OL3+ERO+CL3,OW,0xF,0o245,XRM,_END};
247
byte T_SHRD={ OL3+ERO+CB3,OW,0xF,0o254,XRM,0,
248
		OL3+ERO+CL3,OW,0xF,0o255,XRM,_END};
249
byte T_MOVSX={	WB+OL2+REO,OW,0xF,0o276,XRM,0,
250
		_DW+OL2+REO,OW,0xF,0o277,XRM,_END};
251
byte T_MOVZX={	WB+OL2+REO,OW,0xF,0o266,XRM,0,
252
		_DW+OL2+REO,OW,0xF,0o267,XRM,_END};
253
byte T_BSWAP={	_D+OL1+SOR,OS,0xF,"31R",_END};
254
byte T_BSF={	_W+OL2+REO,OW,0xF,0o274,XRM,_END};
255
byte T_BSR={	_W+OL2+REO,OW,0xF,0o275,XRM,_END};
256
byte T_CMPXCHG={_B+OL2+ERO,OW,0xF,0xB0,XRM,_END};
257
byte T_CMPXCHG486={_B+OL2+ERO,OW,0xF,0xA7,XRM,_END};
258
byte T_CMPXCHG8B={_B+OL2+ERO,OW,0xF,0xC7,XRM,_END};
259
byte T_XADD={ _B+OL2+ERO,OW,0xF,0xC0,XRM,_END};
260
byte T_XCHG={ _W+OL2+EAO,-1,AR,S,"22M", //ALPHA:WAS "22R" BUT GENERATED NOP
261
		_W+OL2+EAO,AR,-1,S,"22R",
262
		_B+OL2+REO,O,0o206,XRM,0,
263
		_B+OL2+ERO,O,0o206,XRM,_END};
264
byte T_MOV=0; 	 //DUMMY BYTE
265
byte T_LEA={	_D+OL2+REO,O,0o215,XRM,_END}; 	//LEA RW, EN	(X != 3)
266
byte T_LSS={	_D+OL2+REO,OW,0xF,0o262,XRM,_END};//LSS RW, EF	(X != 3)
267
byte T_LFS={	_D+OL2+REO,OW,0xF,0o264,XRM,_END};//LFS RW, EF	(X != 3)
268
byte T_LGS={	_D+OL2+REO,OW,0xF,0o265,XRM,_END};//LGS RW, EF	(X != 3)
269
byte T_LES={	_D+OL2+REO,O,0o304,XRM,_END}; 	//LES RW, EF	(X != 3)
270
byte T_LDS={	_D+OL2+REO,O,0o305,XRM,_END}; 	//LDS RW, EF	(X != 3)
271
byte T_SET0={ NB+OL1+SOE,OW,0xF,0o220,X0M,_END};
272
byte T_SET1={ NB+OL1+SOE,OW,0xF,0o221,X0M,_END};
273
byte T_SET2={ NB+OL1+SOE,OW,0xF,0o222,X0M,_END};
274
byte T_SET3={ NB+OL1+SOE,OW,0xF,0o223,X0M,_END};
275
byte T_SET4={ NB+OL1+SOE,OW,0xF,0o224,X0M,_END};
276
byte T_SET5={ NB+OL1+SOE,OW,0xF,0o225,X0M,_END};
277
byte T_SET6={ NB+OL1+SOE,OW,0xF,0o226,X0M,_END};
278
byte T_SET7={ NB+OL1+SOE,OW,0xF,0o227,X0M,_END};
279
byte T_SET8={ NB+OL1+SOE,OW,0xF,0o230,X0M,_END};
280
byte T_SET9={ NB+OL1+SOE,OW,0xF,0o231,X0M,_END};
281
byte T_SETA={ NB+OL1+SOE,OW,0xF,0o232,X0M,_END};
282
byte T_SETB={ NB+OL1+SOE,OW,0xF,0o233,X0M,_END};
283
byte T_SETC={ NB+OL1+SOE,OW,0xF,0o234,X0M,_END};
284
byte T_SETD={ NB+OL1+SOE,OW,0xF,0o235,X0M,_END};
285
byte T_SETE={ NB+OL1+SOE,OW,0xF,0o236,X0M,_END};
286
byte T_SETF={ NB+OL1+SOE,OW,0xF,0o237,X0M,_END};
287
//
288
byte T_JCXZ={ OL1,_JB,O,0o343,_END};
289
byte T_LOOPNZ={ OL1,_JB,O,0o340,_END};
290
byte T_LOOPZ={	OL1,_JB,O,0o341,_END};
291
byte T_LOOP={ OL1,_JB,O,0o342,_END};
292
byte T_J0={ OL1,_JB,O,0o160,0,
293
		OL1,_JW,6,OW,0o17,0o200,_END};
294
byte T_J1={ OL1,_JB,O,0o161,0,
295
		OL1,_JW,6,OW,0o17,0o201,_END};
296
byte T_J2={ OL1,_JB,O,0o162,0,
297
		OL1,_JW,6,OW,0o17,0o202,_END};
298
byte T_J3={ OL1,_JB,O,0o163,0,
299
		OL1,_JW,6,OW,0o17,0o203,_END};
300
byte T_J4={ OL1,_JB,O,0o164,0,
301
		OL1,_JW,6,OW,0o17,0o204,_END};
302
byte T_J5={ OL1,_JB,O,0o165,0,
303
		OL1,_JW,6,OW,0o17,0o205,_END};
304
byte T_J6={ OL1,_JB,O,0o166,0,
305
		OL1,_JW,6,OW,0o17,0o206,_END};
306
byte T_J7={ OL1,_JB,O,0o167,0,
307
		OL1,_JW,6,OW,0o17,0o207,_END};
308
byte T_J8={ OL1,_JB,O,0o170,0,
309
		OL1,_JW,6,OW,0o17,0o210,_END};
310
byte T_J9={ OL1,_JB,O,0o171,0,
311
		OL1,_JW,6,OW,0o17,0o211,_END};
312
byte T_JA={ OL1,_JB,O,0o172,0,
313
		OL1,_JW,6,OW,0o17,0o212,_END};
314
byte T_JB={ OL1,_JB,O,0o173,0,
315
		OL1,_JW,6,OW,0o17,0o213,_END};
316
byte T_JC={ OL1,_JB,O,0o174,0,
317
		OL1,_JW,6,OW,0o17,0o214,_END};
318
byte T_JD={ OL1,_JB,O,0o175,0,
319
		OL1,_JW,6,OW,0o17,0o215,_END};
320
byte T_JE={ OL1,_JB,O,0o176,0,
321
		OL1,_JW,6,OW,0o17,0o216,_END};
322
byte T_JF={ OL1,_JB,O,0o177,0,
323
		OL1,_JW,6,OW,0o17,0o217,_END};
324
byte T_JMP={	OL1,_JB,O,0o353,0,	//JMP SHORT CB
325
		OL1,_JW,5,O,0o351,0,	//JMP NEAR CW
326
		_OW+OL1+SOE,O,0o377,X4M,0}; // JMP NEAR EN
327
byte T_JMPFAR={ _D+OL1+SOE,O,0o377,X5M,0, // JMP FAR EF
328
		OL1+SOO_AF,O,0o352,_END}; //JMP FAR AF
329
byte T_JMPSHORT={
330
		OL1,_JB,O,0o353,_END};			 //JMP SHORT CB
331
byte T_JMPNEAR={OL1,_JW,5,O,0o351,0,			//JMP NEAR CW
332
		_OW+OL1+SOE,O,0o377,X4M,_END}; // JMP NEAR EN
333
byte T_CALL={ OL1,_JW,5,O,0o350,0,			//CALL CW
334
		_OW+OL1+SOE,O,0o377,X2M,0}; 	 //CALL EN
335
byte T_CALLFAR={
336
		OL1+SOO_AF,O,0o232,0,  //CALL AF
337
		_D+OL1+SOE,O,0o377,X3M,_END}; //CALL FAR EF
338
byte T_RETF={ 0,O,0o313,0,		 //RETF/RET FAR
339
		_OW+OL1+SOC,O,0o312,_END}; //RETF DW/RET FAR DW
340
byte T_ENTER={	WB+OL2+EAO,CO,CO,O,0o310,_END};
341
byte T_BOUND={	_W+OL2+REO,O,0o142,XRM,_END}; 		//BOUND RW, ED
342
/*byte T_INT={	NB+OL1+SO3,O,0o314,0, // !!! No interrupts in Win32
343
		NB+OL1+SOC,O,0o315,_END};*/
344
byte T_IN={ NB+OL2+EAO,AR,CO,O,0o344,0, 		 //IN AL, DB
345
		WB+OL2+EAO,AR,CO,O,0o345,0, 		 //IN AX,CO
346
		_B+OL2+EAO,AR,rDX,O,0o354,0,			 //IN AL,DX
347
		_OW+OL2+EAO,AR,rDX,O,0o355,_END}; //IN AX, DX
348
byte T_OUT={	NB+OL2+EAO,CO,AR,O,0o346,0, 		 //OUT DB, AL
349
		BW+OL2+EAO,CO,AR,O,0o347,0, 		 //OUT DB, AX
350
		WB+OL2+EAO,rDX,AR,O,0o356,0,			 //OUT DX, AL
351
		_OW+OL2+EAO,rDX,AR,O,0o357,_END}; //OUT DX, AX
352
byte T_PUSH={ OL1+SOO_CC,O,0o152,0,
353
		_D+OL1+SOR,S,"12R",
354
		_D+OL1+SOE,O,0o377,X6M,0,
355
		_D+OL1+SOC,O,0o150,0,
356
		OL1+SOO_FS,OW,0xF,0o240,0,
357
		OL1+SOO_GS,OW,0xF,0o250,0,
358
		_OW+OL1+SOS,S,"0S6", //WIEDER ANS ENDE PACKEN
359
		_END};
360
byte T_RET={	_OW+OL1+SOC,O,0o302,0, //RET DW
361
		O,0o303,0,_END};	//RET
362
byte T_POP={	_D+OL1+SOR,S,"13R",
363
		_D+OL1+SOE,O,0o217,X0M,0,
364
		OL1+SOO_FS,OW,0xF,0o241,0,
365
		OL1+SOO_GS,OW,0xF,0o251,0,
366
		_OW+OL1+SOS,S,"0S7",_END};
367
byte T_ARPL={ _W+OL2+ERO,O,0o143,XRM,_END}; //ARPL ES, RW
368
byte T_SLDT={ _OW+OL1+SOE,OW,0xF,0,X0M,_END}; 	//SLDT EW
369
byte T_STR={	_OW+OL1+SOE,OW,0xF,0,X1M,_END}; 	//STR EW
370
byte T_LLDT={ _OW+OL1+SOE,OW,0xF,0,X2M,_END}; 	//LLDT EW
371
byte T_LTR={	_OW+OL1+SOE,OW,0xF,0,X3M,_END}; 	//LTR EW
372
byte T_VERR={ _OW+OL1+SOE,OW,0xF,0,X4M,_END}; 	//VERR EW
373
byte T_VERW={ _OW+OL1+SOE,OW,0xF,0,X5M,_END}; 	//VERW EW
374
byte T_LAR={	_OW+OL1+REO,OW,0xF,2,XRM,_END}; 	//LAR RW, EW
375
byte T_LSL={	_OW+OL1+REO,OW,0xF,3,XRM,_END}; 	//LSL RW, EW
376
byte T_SGDT={ _OW+OL1+SOM,OW,0xF,1,X0M,_END}; 	//SGDT EP
377
byte T_SIDT={ _OW+OL1+SOM,OW,0xF,1,X1M,_END}; 	//SIDT EP
378
byte T_LGDT={ _OW+OL1+SOM,OW,0xF,1,X2M,_END}; 	//LGDT EP
379
byte T_LIDT={ _OW+OL1+SOM,OW,0xF,1,X3M,_END}; 	//LIDT EP
380
byte T_SMSW={ _OW+OL1+SOE,OW,0xF,1,X4M,_END}; 	//SMSW EW
381
byte T_LMSW={ _OW+OL1+SOE,OW,0xF,1,X6M,_END}; 	//LMSW EW
382
//===== X486 INSTRUCTIONS
383
byte T_INVLPD={ _OW+OL1+SOM,OW,0xF,0o20,X7M,_END};	//INVLPG EA
384
//===== INTEL PENTIUM INSTRUCTIONS
385
byte T_CMPX8={	_OW+OL1+SOE,OW,0xF,0xC7,X1M,_END}; //CMPX8 EW 5 IF EDXEAX=MQ THEN MQ:=ECXEBX, ELSE EAXEDX:=MQ
386
byte T_CMOV={ _W+OL2,REO,OW,0xF,0x40,XRM,_END};
387
//===== MMX INSTRUCTIONS
388
byte T_EMMS={ _END};
389
byte T_UMOV={ _B+OL2,DER,OW,0xF,0x10,XRM,_END};
390
#define _Q 1
391
#define MMXE 1
392
#define MMXP 1
393
#define MMXPI 1
394
#define MMXPE 1
395
#define MMXEP 1
396
byte T_PUNPCKLBW={	_D+OL2,MMXE,OW,0xF,0x60,_END};
397
byte T_PUNPCKLWD={	_D+OL2,MMXE,OW,0xF,0x61,_END};
398
byte T_PUNPCKLDQ={	_D+OL2,MMXE,OW,0xF,0x62,_END};
399
byte T_PACKSSWB={ _Q+OL2,MMXE,OW,0xF,0x63,_END};
400
byte T_PCMPGTB={	_Q+OL2,MMXE,OW,0xF,0x64,_END};
401
byte T_PCMPGTW={	_Q+OL2,MMXE,OW,0xF,0x65,_END};
402
byte T_PCMPGTD={	_Q+OL2,MMXE,OW,0xF,0x66,_END};
403
byte T_PACKUSWB={ _Q+OL2,MMXE,OW,0xF,0x67,_END};
404
byte T_PCMPEQB={	_Q+OL2,MMXE,OW,0xF,0x74,_END};
405
byte T_PCMPEQW={	_Q+OL2,MMXE,OW,0xF,0x75,_END};
406
byte T_PCMPEQD={	_Q+OL2,MMXE,OW,0xF,0x76,_END};
407
byte T_PSRLW={		_Q+OL2,MMXE,OW,0xF,0xD1,_END};
408
byte T_PSRLD={		_Q+OL2,MMXE,OW,0xF,0xD2,_END};
409
byte T_PSRLQ={		_Q+OL2,MMXE,OW,0xF,0xD3,_END};
410
byte T_PMULLW={ 	_Q+OL2,MMXE,OW,0xF,0xD5,_END};
411
byte T_PSRAW={		_Q+OL2,MMXE,OW,0xF,0xE1,_END};
412
byte T_PSRAD={		_Q+OL2,MMXE,OW,0xF,0xE2,_END};
413
byte T_PMULHW={ 	_Q+OL2,MMXE,OW,0xF,0xE5,_END};
414
byte T_PSLLW={		_Q+OL2,MMXE,OW,0xF,0xF1,_END};
415
byte T_PSLLD={		_Q+OL2,MMXE,OW,0xF,0xF2,_END};
416
byte T_PSLLQ={		_Q+OL2,MMXE,OW,0xF,0xF3,_END};
417
byte T_PMADDWD={	_Q+OL2,MMXE,OW,0xF,0xF5,_END};
418
byte T_PUNPCKHBW={	_Q+OL2,MMXE,OW,0xF,0x68,_END};
419
byte T_PUNPCKHWD={	_Q+OL2,MMXE,OW,0xF,0x69,_END};
420
byte T_PUNPCKHDQ={	_Q+OL2,MMXE,OW,0xF,0x6A,_END};
421
byte T_PACKSSDW={ _Q+OL2,MMXE,OW,0xF, 0x6B,_END};
422
byte T_MOVD={ 	_D+OL2,MMXPE,OW,0xF,0x6E,0,
423
			_Q+OL2,MMXEP,OW,0xF,0x7E,_END};
424
byte T_MOVQ={ 	_Q+OL2,MMXE,OW,0xF,0x6F,0,
425
			_Q+OL2,MMXE,OW,0xF,0x7F,_END};
426
byte T_PSUBUSB={	_Q+OL2,MMXE,OW,0xF,0xD8,_END};
427
byte T_PSUBUSW={	_Q+OL2,MMXE,OW,0xF,0xD9,_END};
428
byte T_PAND={ 	_Q+OL2,MMXE,OW,0xF,0xDB,_END};
429
byte T_PADDUSB={	_Q+OL2,MMXE,OW,0xF,0xDC,_END};
430
byte T_PADDUSW={	_Q+OL2,MMXE,OW,0xF,0xDD,_END};
431
byte T_PANDN={		_Q+OL2,MMXE,OW,0xF,0xDF,_END};
432
byte T_PSUBSB={ 	_Q+OL2,MMXE,OW,0xF,0xE8,_END};
433
byte T_PSUBSW={ 	_D+OL2,MMXE,OW,0xF,0xE9,_END};
434
byte T_POR={		_Q+OL2,MMXE,OW,0xF,0xEB,_END};
435
byte T_PADDSB={ 	_Q+OL2,MMXE,OW,0xF,0xEC,_END};
436
byte T_PADDSW={ 	_Q+OL2,MMXE,OW,0xF,0xED,_END};
437
byte T_PXOR={ 	_Q+OL2,MMXE,OW,0xF,0xEF,_END};
438
byte T_PSUBB={		_Q+OL2,MMXE,OW,0xF,0xF8,_END};
439
byte T_PSUBW={		_Q+OL2,MMXE,OW,0xF,0xF9,_END};
440
byte T_PSUBD={		_Q+OL2,MMXE,OW,0xF,0xFA,_END};
441
byte T_PADDB={		_Q+OL2,MMXE,OW,0xF,0xFC,_END};
442
byte T_PADDW={		_Q+OL2,MMXE,OW,0xF,0xFD,_END};
443
byte T_PADDD={		_Q+OL2,MMXE,OW,0xF,0xFE,_END};
444
byte T_PSRL={ 	_Q+OL2,MMXPI,OW,0xF,_END};
445
byte T_PSRA={ 	_Q+OL2,MMXPI,OW,0xF,_END};
446
byte T_PSLL={ 	_Q+OL2,MMXE,OW,0xF,_END};
447
 
448
byte Mnemonics={
449
// FIRST OF ALL THE COMMANDS WITH A P-FLAG. THIS"LL MAKE THINGS EASIER FOR
450
// COMPARISON IN THE PARSE ENGINE
451
	//P1=0-7
452
	"ADD","OR","ADC","SBB/BC","AND","SUB","XOR","CMP",
453
	//P2=4-7
454
	"MUL","-","DIV","IDIV",
455
	//			IMUL ENTFERNT
456
	//P3=0-5/7
457
	"ROL","ROR","RCL","RCR","SHL/AL","SHR","-","SAR",
458
	//P4=4-7
459
	"BT","BTS","BTR","BTC",
460
	// USUAL COMMANDS
461
	"NOT","NEG","INC","DEC","TEST", "IMUL","SHLD","SHRD",
462
	"DAA","DAS","AAA","AAS","AAM","AAD",
463
	"MOVSX","MOVZX","CBW","CWDE","CWD","CDQ",
464
	"BSWAP","XLAT/LATB","BSF","BSR",
465
	"CMPXCHG","CMPXCHG486","CMPXCHG8B","XADD",
466
	"NOP","WAIT","LOCK","HLT",	//"INT",
467
	"INTO","IRET",
468
	"POPF","POPFD","PUSHF","PUSHFD","SAHF","LAHF",
469
	"CMC","CLC","STC","CLI","STI","CLD","STD",
470
	"PUSH","PUSHA","PUSHAD","POP","POPA","POPAD",
471
	"XCHG","MOV","LEA","LSS","LFS","LGS","LES","LDS",
472
	"ADDR","RAND",
473
	"IN","OUT","INSB","INSW","INSD","OUTSB","OUTSW","OUTSD",
474
	"MOVSB","MOVSW","MOVSD","CMPSB","CMPSW","CMPSD",
475
	"STOSB","STOSW","STOSD","LODSB","LODSW","LODSD",
476
	"SCASB","SCASW","SCASD","REP/EPNE/EPNZ","REPE/EPZ",
477
	"JCXZ/ECXZ","LOOP","LOOPZ/OOPE","LOOPNZ/OOPNE",
478
	"JO","JNO","JC/B/NAE","JNC/AE/NB",
479
	"JE/Z","JNE/NZ","JBE/NA","JA/NBE",
480
	"JS","JNS","JP/PE","JNP/PO","JL/NGE","JGE/NL",
481
	"JLE/NG","JG/NLE",
482
	"SETO","SETNO","SETC/ETB/ETNAE","SETNC/ETAE/ETNB",
483
	"SETE/ETZ","SETNE/ETNZ","SETBE/ETNA","SETA/ETNBE",
484
	"SETS","SETNS","SETP/ETPE","SETNP/ETPO","SETL/ETNGE","SETGE/ETNL",
485
	"SETLE/ETNG","SETG/ETNLE",
486
	"JMPS","JMPN","JMPF","JMP",
487
	"CALL","CALLF","RET","RETF",
488
	"ENTER","LEAVE","BOUND","ARPL",
489
	"SLDT","STR","LLDT","LTR","VERR","VERW","LAR","LSL",
490
	"SGDT","SIDT","LGDT","LIDT","SMSW","LMSW","CLTS",
491
	"INVD","WBINVD","INVLPD",
492
	//INTEL PENTIUM COMMANDS
493
	"WRMSR","CMPX8/MPXCHG8B","CPUID","RDMSR","RDTSC","RSM",
494
	//INTEL PENTIUM PRO INSTRUCTIONS
495
	"RDPMC","UD2","EMMX","SETALC",
496
	//MMX INSTRUCTIONS
497
	"MOVD","MOVQ",			 //MOVE MMX REG
498
	"PACKUS/PACKUSWB",			 //PACK MMX REG WITH UNSIGNED SATURATION
499
	"PACKSSWB","PACKSSDW",		 //PACK MMX REG WITH SIGNED SATURATION
500
	"PUNPCKHBW","PUNPCKHWD",
501
	"PUNPCKHDQ",		 //UNPACK HIGH ORDER
502
	"PUNPCKLBW","PUNPCKLWD",
503
	"PUNPCKLDQ", //UNPACK LOW ORDER
504
	"PADDB","PADDW","PADDD", //ADD MMX REG WITH WRAP-AROUND
505
	"PADDSB","PADDSW",		 //" WITH SIGNED SATURATION
506
	"PADDUSB","PADDUSW",		 //" WITH UNSIGNED SATURATION
507
	"PSUBB","PSUBW","PSUBD", //SUBTRACT MMX REG
508
	"PSUBSB","PSUBSW","PSUBUSB","PSUBUSW",
509
	"PMULH/PMULHW","PMULL/PMULLW","PMADD/PMADDWD",
510
	"PSLLW","PSLLD","PSLLQ","PSRLW","PSRLD","PSRLQ",
511
	"PSRAW","PSRAD","PCMPEQB","PCMPEQW","PCMPEQD",
512
	"PCMPGTB","PCMPGTW","PCMPGTD","PAND","PANDN","POR","PXOR","EMMS",_END};
513
 
514
dword TAB_MNEMONICS={
515
	#T_NOT,#T_NEG,#T_INC,#T_DEC,#T_TEST,
516
	#T_IMUL,#T_SHLD,#T_SHRD,
517
	#T_DAA,#T_DAS,#T_AAA,#T_AAS,#T_AAM,#T_AAD,
518
	#T_MOVSX,#T_MOVZX,#T_CBW,#T_CWDE,#T_CWD,#T_CDQ,
519
	#T_BSWAP,#T_XLATB,
520
	#T_BSF,#T_BSR,#T_CMPXCHG,#T_CMPXCHG486,#T_CMPXCHG8B,#T_XADD,
521
	#T_NOP,#T_WAIT,#T_LOCK,#T_HLT,
522
//	#T_INT,
523
	#T_INTO,#T_IRET,
524
	#T_POPF,#T_POPFD,#T_PUSHF,#T_PUSHFD,
525
	#T_SAHF,#T_LAHF,
526
	#T_CMC,#T_CLC,#T_STC,#T_CLI,#T_STI,#T_CLD,#T_STD,
527
	#T_PUSH,#T_PUSHA,#T_PUSHAD,
528
	#T_POP,#T_POPA,#T_POPAD,
529
	#T_XCHG,#T_MOV,
530
	#T_LEA,#T_LSS,#T_LFS,#T_LGS,#T_LES,#T_LDS,
531
	#T_ADDR,#T_RAND,
532
	#T_IN,#T_OUT,
533
	#T_INSB,#T_INSW,#T_INSD,
534
	#T_OUTSB,#T_OUTSW,#T_OUTSD,
535
	#T_MOVSB,#T_MOVSW,#T_MOVSD,
536
	#T_CMPSB,#T_CMPSW,#T_CMPSD,
537
	#T_STOSB,#T_STOSW,#T_STOSD,
538
	#T_LODSB,#T_LODSW,#T_LODSD,
539
	#T_SCASB,#T_SCASW,#T_SCASD,
540
	#T_REP,
541
	#T_REPE,
542
	#T_JCXZ,#T_LOOP,#T_LOOPZ,#T_LOOPNZ,
543
	#T_J0,#T_J1,#T_J2,#T_J3,
544
	#T_J4,#T_J5,#T_J6,#T_J7,
545
	#T_J8,#T_J9,#T_JA,#T_JB,
546
	#T_JC,#T_JD,#T_JE,#T_JF,
547
	#T_SET0,#T_SET1,#T_SET2,#T_SET3,
548
	#T_SET4,#T_SET5,#T_SET6,#T_SET7,
549
	#T_SET8,#T_SET9,#T_SETA,#T_SETB,
550
	#T_SETC,#T_SETD,#T_SETE,#T_SETF,
551
	#T_JMPSHORT,#T_JMPNEAR,#T_JMPFAR,#T_JMP,
552
	#T_CALL,#T_CALLFAR,
553
	#T_RET,#T_RETF,
554
	#T_ENTER,#T_LEAVE,
555
	#T_BOUND,#T_ARPL,
556
	#T_SLDT,#T_STR,#T_LLDT,#T_LTR,#T_VERR,#T_VERW,
557
	#T_LAR,#T_LSL,
558
	#T_SGDT,#T_SIDT,#T_LGDT,#T_LIDT,
559
	#T_SMSW,#T_LMSW,#T_CLTS,
560
	#T_INVD,#T_WBINVD,#T_INVLPD,
561
//INTEL PENTIUM INSTRUCTIONS
562
	#T_WRMSR,#T_CMPX8,#T_CPUID,#T_RDMSR,#T_RDTSC,#T_RSM,
563
//INTEL PENTIUM PRO INSTRUCTIONS
564
	#T_RDPMC,#T_UD2,#T_EMMX,#T_SALC,
565
//MMX INSTRUCTIONS
566
	#T_MOVD,#T_MOVQ,		//MOVE MMX REG
567
	#T_PACKUSWB,					 //PACK MMX REG WITH UNSIGNED SATURATION
568
	#T_PACKSSWB,#T_PACKSSDW,	//PACK MMX REG WITH SIGNED SATURATION
569
	#T_PUNPCKHBW,#T_PUNPCKHWD,#T_PUNPCKHDQ, //UNPACK HIGH ORDER
570
	#T_PUNPCKLBW,#T_PUNPCKLWD,#T_PUNPCKLDQ, //UNPACK LOW ORDER
571
	#T_PADDB,#T_PADDW,#T_PADDD,  //ADD MMX REG WITH WRAP-AROUND
572
	#T_PADDSB,#T_PADDSW,		//" WITH SIGNED SATURATION
573
	#T_PADDUSB,#T_PADDUSW,		//" WITH UNSIGNED SATURATION
574
	#T_PSUBB,#T_PSUBW,#T_PSUBD,  //SUBTRACT MMX REG
575
	#T_PSUBSB,#T_PSUBSW,
576
	#T_PSUBUSB,#T_PSUBUSW,
577
	#T_PMULHW,
578
	#T_PMULLW,
579
	#T_PMADDWD,
580
	#T_PSLLW,#T_PSLLD,#T_PSLLQ,
581
	#T_PSRLW,#T_PSRLD,#T_PSRLQ,
582
	#T_PSRAW,#T_PSRAD,
583
	#T_PCMPEQB,#T_PCMPEQW,#T_PCMPEQD,
584
	#T_PCMPGTB,#T_PCMPGTW,#T_PCMPGTD,
585
	#T_PAND,
586
	#T_PANDN,
587
	#T_POR,
588
	#T_PXOR,
589
	#T_EMMS};
590
 
591