Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //CODE GENERATION DESCRIPTORS
  2. // =========================
  3. // >>> DESCRIPTION CODES <<<
  4. // =========================
  5.  
  6. //T_<MNEMONIC>:
  7. //              DB <TRANSFER SIZE|# OF OPERANDS|ALLOWED OPERANDS>
  8. //       [DB <OPERAND CODES>]
  9. //       [DB <PROCESSOR VERSION>]
  10. //              DB <TYPE OF OPCODE DESCRIPTION>
  11. //              DB <OPCODE DESCRIPTOR>
  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.  
  592.