dsmLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:79k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* dsmLib.c - i80x86 disassembler */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01k,27mar02,hdn  fixed the CALL/JMP ptr16:16/32 offset size (spr 73624)
  8. 01j,30aug01,hdn  added SIMD, sysenter/exit support.
  9.  always print the disassembled address on 8 digits with 0x.
  10. 01i,06may98,fle  added P5 and P6 related instructions and facilities
  11. 01h,14nov94,hdn  changed D->DISR, W->WFUL, S->SEXT, P->POP, A->AX, I->IMM.
  12. 01g,29may94,hdn  removed I80486.
  13. 01f,31aug93,hdn  changed a type of 1st parameter, from char to UCHAR.
  14. 01e,02aug93,hdn  fixed a case that has mod=0,rm=5,disp32 operand.
  15. 01d,01jun93,hdn  updated to 5.1
  16.   - changed functions to ansi style
  17.   - fixed #else and #endif
  18.   - changed VOID to void
  19.   - changed copyright notice
  20. 01c,18mar93,hdn  supported 486 instructions.
  21. 01b,05nov92,hdn  supported "16 bit operand","rep","repne","shift by 1".
  22.  fixed a bug that is about "empty index".
  23. 01a,23jun92,hdn  written. 
  24. */
  25. /*
  26. This library contains everything necessary to print i80x86 object code in
  27. assembly language format. 
  28. The programming interface is via dsmInst(), which prints a single disassembled
  29. instruction, and dsmNbytes(), which reports the size of an instruction.
  30. To disassemble from the shell, use l(), which calls this
  31. library to do the actual work.  See dbgLib for details.
  32. INCLUDE FILE: dsmLib.h
  33. SEE ALSO: dbgLib
  34. */
  35. #include "vxWorks.h"
  36. #include "dsmLib.h"
  37. #include "symLib.h"
  38. #include "string.h"
  39. #include "stdio.h"
  40. #include "errnoLib.h"
  41. /*
  42.  * This table is ordered by the number of bits in an instruction's 
  43.  * two word mask, beginning with the greatest number of bits in masks.  
  44.  * This scheme is used for avoiding conflicts between instructions 
  45.  * when matching bit patterns.  The instruction ops are arranged 
  46.  * sequentially within each group of instructions for a particular 
  47.  * mask so that uniqueness can be easily spotted.  
  48.  */
  49. /* globals */
  50. LOCAL INST inst [] =
  51.     {
  52.     /* OP3 instructions */
  53.     {"ADDSS", itAddss, OP3|MODRM,XMMREG|XMMRM,
  54.      0xf3, 0x0f, 0x58, /* opcode */
  55. 0xff, 0xff, 0xff}, /* mask */
  56.     {"CMPSS", itCmpss, OP3|MODRM|I8,XMMREG|XMMRM,
  57.      0xf3, 0x0f, 0xc2,  /* opcode */
  58. 0xff, 0xff, 0xff}, /* mask */
  59.     {"CVTSI2SS", itCvtsi2ss,    OP3|MODRM|REGRM,XMMREG,
  60.      0xf3, 0x0f, 0x2a,  /* opcode */
  61. 0xff, 0xff, 0xff}, /* mask */
  62.     {"CVTSS2SI", itCvtss2si, OP3|MODRM|REG,XMMRM,
  63.      0xf3, 0x0f, 0x2d,  /* opcode */
  64. 0xff, 0xff, 0xff}, /* mask */
  65.     {"CVTTSS2SI", itCvttss2si, OP3|MODRM|REG,XMMRM,
  66.      0xf3, 0x0f, 0x2c,  /* opcode */
  67. 0xff, 0xff, 0xff}, /* mask */
  68.     {"DIVSS", itDivss, OP3|MODRM,XMMREG|XMMRM,
  69.      0xf3, 0x0f, 0x5e,  /* opcode */
  70. 0xff, 0xff, 0xff}, /* mask */
  71.     {"MAXSS", itMaxss, OP3|MODRM,XMMREG|XMMRM,
  72.      0xf3, 0x0f, 0x5f,  /* opcode */
  73. 0xff, 0xff, 0xff}, /* mask */
  74.     {"MINSS", itMinss, OP3|MODRM,XMMREG|XMMRM,
  75.      0xf3, 0x0f, 0x5d,  /* opcode */
  76. 0xff, 0xff, 0xff}, /* mask */
  77.     {"MOVSS", itMovss,          OP3|MODRM|DISR,XMMREG|XMMRM,
  78.      0xf3, 0x0f, 0x10,  /* opcode */
  79. 0xff, 0xff, 0xfe}, /* mask */
  80.     {"MULSS", itMulss, OP3|MODRM,XMMREG|XMMRM,
  81.      0xf3, 0x0f, 0x59,  /* opcode */
  82. 0xff, 0xff, 0xff}, /* mask */
  83.     {"RCPSS", itRcpss, OP3|MODRM,XMMREG|XMMRM,
  84.      0xf3, 0x0f, 0x53,  /* opcode */
  85. 0xff, 0xff, 0xff}, /* mask */
  86.     {"RSQRTSS", itRsqrtss, OP3|MODRM,XMMREG|XMMRM,
  87.      0xf3, 0x0f, 0x52,  /* opcode */
  88. 0xff, 0xff, 0xff}, /* mask */
  89.     {"SQRTSS", itSqrtss, OP3|MODRM,XMMREG|XMMRM,
  90.      0xf3, 0x0f, 0x51,  /* opcode */
  91. 0xff, 0xff, 0xff}, /* mask */
  92.     {"SUBSS", itSubss, OP3|MODRM,XMMREG|XMMRM,
  93.      0xf3, 0x0f, 0x5c,  /* opcode */
  94. 0xff, 0xff, 0xff}, /* mask */
  95.     {"SFENCE", itSfence, OP3,0,
  96.      0x0f, 0xae, 0xc0, /* opcode */
  97. 0xff, 0xff, 0xc0}, /* mask */
  98.     /* OP2 instructions extended by bits 3,4,5 of MODRM */
  99.     {"BT", itBtI,        OP2|MODRM|I8,0,
  100.      0x0f, 0xba, 0x20,  /* opcode */
  101. 0xff, 0xff, 0x38}, /* mask */
  102.     {"BTC", itBtcI,      OP2|MODRM|I8,0,
  103.      0x0f, 0xba, 0x38, /* opcode */
  104. 0xff, 0xff, 0x38}, /* mask */
  105.     {"BTR", itBtrI,        OP2|MODRM|I8,0,
  106.      0x0f, 0xba, 0x30, /* opcode */
  107. 0xff, 0xff, 0x38}, /* mask */
  108.     {"BTS", itBtsI,       OP2|MODRM|I8,0,
  109.      0x0f, 0xba, 0x28, /* opcode */
  110. 0xff, 0xff, 0x38}, /* mask */
  111.     {"LGDT", itLgdt,     OP2|MODRM,0,
  112.      0x0f, 0x01, 0x10, /* opcode */
  113. 0xff, 0xff, 0x38}, /* mask */
  114.     {"LIDT", itLidt,      OP2|MODRM,0,
  115.      0x0f, 0x01, 0x18, /* opcode */
  116. 0xff, 0xff, 0x38}, /* mask */
  117.     {"LLDT", itLldt,      OP2|MODRM,0,
  118.      0x0f, 0x00, 0x10, /* opcode */
  119. 0xff, 0xff, 0x38}, /* mask */
  120.     {"LMSW", itLmsw,      OP2|MODRM,0,
  121.      0x0f, 0x01, 0x30, /* opcode */
  122. 0xff, 0xff, 0x38}, /* mask */
  123.     {"LTR", itLtr,        OP2|MODRM,0,
  124.      0x0f, 0x00, 0x08, /* opcode */
  125. 0xff, 0xff, 0x38}, /* mask */
  126.     {"SGDT", itSgdt,      OP2|MODRM,0,
  127.      0x0f, 0x01, 0x00, /* opcode */
  128. 0xff, 0xff, 0x38}, /* mask */
  129.     {"SIDT", itSidt,      OP2|MODRM,0,
  130.      0x0f, 0x01, 0x08, /* opcode */
  131. 0xff, 0xff, 0x38}, /* mask */
  132.     {"SLDT", itSldt,      OP2|MODRM,0,
  133.      0x0f, 0x00, 0x00, /* opcode */
  134. 0xff, 0xff, 0x38}, /* mask */
  135.     {"SMSW", itSmsw,      OP2|MODRM,0,
  136.      0x0f, 0x01, 0x20, /* opcode */
  137. 0xff, 0xff, 0x38}, /* mask */
  138.     {"STR", itStr,        OP2|MODRM,0,
  139.      0x0f, 0x00, 0x08, /* opcode */
  140. 0xff, 0xff, 0x38}, /* mask */
  141.     {"VERR", itVerr,       OP2|MODRM,0,
  142.      0x0f, 0x00, 0x20, /* opcode */
  143. 0xff, 0xff, 0x38}, /* mask */
  144.     {"VERW", itVerw,       OP2|MODRM,0,
  145.      0x0f, 0x00, 0x28, /* opcode */
  146. 0xff, 0xff, 0x38}, /* mask */
  147.     {"FXRSTOR", itFxrstor,      OP2|MODRM,0,
  148.                                 0x0f, 0xae, 0x08,       /* opcode */
  149. 0xff, 0xff, 0x38},      /* mask */
  150.     {"FXSAVE", itFxsave,        OP2|MODRM,0,
  151. 0x0f, 0xae, 0x00,       /* opcode */
  152. 0xff, 0xff, 0x38},      /* mask */
  153.     {"LDMXCSR", itLdmxcsr,      OP2|MODRM,0,
  154. 0x0f, 0xae, 0x10,       /* opcode */
  155. 0xff, 0xff, 0x38},      /* mask */
  156.     
  157.     {"STMXCSR", itStmxcsr,      OP2|MODRM,0,
  158. 0x0f, 0xae, 0x18,       /* opcode */
  159. 0xff, 0xff, 0x38},      /* mask */
  160.     {"PREFETCHT0", itPrefetcht0,        OP2|MODRM,0,
  161. 0x0f, 0x18, 0x08,       /* opcode */
  162. 0xff, 0xff, 0x38},      /* mask */
  163.     {"PREFETCHT1", itPrefetcht1,        OP2|MODRM,0,
  164. 0x0f, 0x18, 0x10,       /* opcode */
  165. 0xff, 0xff, 0x38},      /* mask */
  166.     {"PREFETCHT2", itPrefetcht2,        OP2|MODRM,0,
  167. 0x0f, 0x18, 0x18,       /* opcode */
  168. 0xff, 0xff, 0x38},      /* mask */
  169.     {"PREFETCHNTA", itPrefetchnta,      OP2|MODRM,0,
  170. 0x0f, 0x18, 0x00,       /* opcode */
  171. 0xff, 0xff, 0x38},      /* mask */
  172.     {"MOVHLPS", itMovhlps, OP2|MODRM,XMMREG|XMMRM,
  173.      0x0f, 0x12, 0xc0, /* opcode */
  174. 0xff, 0xff, 0xc0}, /* mask */
  175.     {"MOVLHPS", itMovlhps, OP2|MODRM,XMMREG|XMMRM,
  176.      0x0f, 0x16, 0xc0, /* opcode */
  177. 0xff, 0xff, 0xc0}, /* mask */
  178.     /* OP2 instructions */
  179.     {"AAD", itAad,        OP2,0,
  180.     0xd5, 0x0a, 0x00, /* opcode */
  181. 0xff, 0xff, 0x00}, /* mask */
  182.     {"AAM", itAam,        OP2,0,
  183.      0xd4, 0x0a, 0x00, /* opcode */
  184. 0xff, 0xff, 0x00}, /* mask */
  185.     {"BSF", itBsf,        OP2|MODRM|REG,0,
  186.      0x0f, 0xbc, 0x00, /* opcode */
  187. 0xff, 0xff, 0x00}, /* mask */
  188.     {"BSR", itBsr,        OP2|MODRM|REG,0,
  189.      0x0f, 0xbd, 0x00, /* opcode */
  190. 0xff, 0xff, 0x00}, /* mask */
  191.     {"BT", itBtR,         OP2|MODRM|REG,0,
  192.      0x0f, 0xa3, 0x00, /* opcode */
  193. 0xff, 0xff, 0x00}, /* mask */
  194.     {"BTC", itBtcR,       OP2|MODRM|REG,0,
  195.      0x0f, 0xbb, 0x00, /* opcode */
  196. 0xff, 0xff, 0x00}, /* mask */
  197.     {"BTR", itBtrR,       OP2|MODRM|REG,0,
  198.      0x0f, 0xb3, 0x00, /* opcode */
  199. 0xff, 0xff, 0x00}, /* mask */
  200.     {"BTS", itBtsR,       OP2|MODRM|REG,0,
  201.      0x0f, 0xab, 0x00, /* opcode */
  202. 0xff, 0xff, 0x00}, /* mask */
  203.     {"CLTS", itClts,      OP2,0,
  204.      0x0f, 0x06, 0x00, /* opcode */
  205. 0xff, 0xff, 0x00}, /* mask */
  206.     {"CMPXCHG8B", itCmpxchg8b, OP2|MODRM,0,
  207.      0x0f, 0xc7, 0x00, /* opcode */
  208. 0xff, 0xff, 0x00}, /* mask */
  209.     {"CPUID", itCpuid, OP2,0,
  210.      0x0f, 0xa2, 0x00, /* opcode */
  211. 0xff, 0xff, 0x00}, /* mask */
  212.     {"EMMS", itEmms, OP2,0,
  213.      0x0f, 0x77, 0x00, /* opcode */
  214. 0xff, 0xff, 0x00}, /* mask */
  215.     {"F2XM1", itF2xm1, OP2,0,
  216.      ESC|0x01, 0xf0, 0x00, /* opcode */
  217. 0xff, 0xff, 0x00}, /* mask */
  218.     {"FABS", itFabs, OP2,0,
  219.      ESC|0x01, 0xe1, 0x00, /* opcode */
  220. 0xff, 0xff, 0x00}, /* mask */
  221.     {"FCHS", itFchs, OP2,0,
  222.      ESC|0x01, 0xe0, 0x00, /* opcode */
  223. 0xff, 0xff, 0x00}, /* mask */
  224.     {"FCLEX", itFclex, OP2,0,
  225.      ESC|0x03, 0xe2, 0x00, /* opcode */
  226. 0xff, 0xff, 0x00}, /* mask */
  227.     {"FCOMPP", itFcompp, OP2,0,
  228.      ESC|0x06, 0xd9, 0x00, /* opcode */
  229. 0xff, 0xff, 0x00}, /* mask */
  230.     {"FCOS", itFcos, OP2,0,
  231.      ESC|0x01, 0xff, 0x00, /* opcode */
  232. 0xff, 0xff, 0x00}, /* mask */
  233.     {"FDECSTP", itFdecstp, OP2,0,
  234.      ESC|0x01, 0xf6, 0x00, /* opcode */
  235. 0xff, 0xff, 0x00}, /* mask */
  236.     {"FINCSTP", itFincstp, OP2,0,
  237.      ESC|0x01, 0xf7, 0x00, /* opcode */
  238. 0xff, 0xff, 0x00}, /* mask */
  239.     {"FINIT", itFinit, OP2,0,
  240.      ESC|0x03, 0xe3, 0x00, /* opcode */
  241. 0xff, 0xff, 0x00}, /* mask */
  242.     {"FLDZ", itFldZ, OP2,0,
  243.      ESC|0x01, 0xee, 0x00, /* opcode */
  244. 0xff, 0xff, 0x00}, /* mask */
  245.     {"FLD1", itFld1, OP2,0,
  246.      ESC|0x01, 0xe8, 0x00, /* opcode */
  247. 0xff, 0xff, 0x00}, /* mask */
  248.     {"FLDPI", itFldPI, OP2,0,
  249.      ESC|0x01, 0xeb, 0x00, /* opcode */
  250. 0xff, 0xff, 0x00}, /* mask */
  251.     {"FLDL2T", itFldL2T, OP2,0,
  252.      ESC|0x01, 0xe9, 0x00, /* opcode */
  253. 0xff, 0xff, 0x00}, /* mask */
  254.     {"FLDL2E", itFldL2E, OP2,0,
  255.      ESC|0x01, 0xea, 0x00, /* opcode */
  256. 0xff, 0xff, 0x00}, /* mask */
  257.     {"FLDLG2", itFldLG2, OP2,0,
  258.      ESC|0x01, 0xec, 0x00, /* opcode */
  259. 0xff, 0xff, 0x00}, /* mask */
  260.     {"FLDLN2", itFldLN2, OP2,0,
  261.      ESC|0x01, 0xed, 0x00, /* opcode */
  262. 0xff, 0xff, 0x00}, /* mask */
  263.     {"FNOP", itFnop, OP2,0,
  264.      ESC|0x01, 0xd0, 0x00, /* opcode */
  265. 0xff, 0xff, 0x00}, /* mask */
  266.     {"FPATAN", itFpatan, OP2,0,
  267.      ESC|0x01, 0xf3, 0x00, /* opcode */
  268. 0xff, 0xff, 0x00}, /* mask */
  269.     {"FPREM", itFprem, OP2,0,
  270.      ESC|0x01, 0xf8, 0x00, /* opcode */
  271. 0xff, 0xff, 0x00}, /* mask */
  272.     {"FPREM1", itFprem1, OP2,0,
  273.      ESC|0x01, 0xf5, 0x00, /* opcode */
  274. 0xff, 0xff, 0x00}, /* mask */
  275.     {"FPTAN", itFptan, OP2,0,
  276.      ESC|0x01, 0xf2, 0x00, /* opcode */
  277. 0xff, 0xff, 0x00}, /* mask */
  278.     {"FRNDINT", itFrndint, OP2,0,
  279.      ESC|0x01, 0xfc, 0x00, /* opcode */
  280. 0xff, 0xff, 0x00}, /* mask */
  281.     {"FSCALE", itFscale, OP2,0,
  282.      ESC|0x01, 0xfd, 0x00, /* opcode */
  283. 0xff, 0xff, 0x00}, /* mask */
  284.     {"FSIN", itFsin, OP2,0,
  285.      ESC|0x01, 0xfe, 0x00, /* opcode */
  286. 0xff, 0xff, 0x00}, /* mask */
  287.     {"FSINCOS", itFsincos, OP2,0,
  288.      ESC|0x01, 0xfb, 0x00, /* opcode */
  289. 0xff, 0xff, 0x00}, /* mask */
  290.     {"FSQRT", itFsqrt, OP2,0,
  291.      ESC|0x01, 0xfa, 0x00, /* opcode */
  292. 0xff, 0xff, 0x00}, /* mask */
  293.     {"FSTSW", itFstswA, OP2|AX,0,
  294.      ESC|0x07, 0xe0, 0x00, /* opcode */
  295. 0xff, 0xff, 0x00}, /* mask */
  296.     {"FTST", itFtst, OP2,0,
  297.      ESC|0x01, 0xe4, 0x00, /* opcode */
  298. 0xff, 0xff, 0x00}, /* mask */
  299.     {"FUCOMPP", itFucompp, OP2,0,
  300.      ESC|0x02, 0xe9, 0x00, /* opcode */
  301. 0xff, 0xff, 0x00}, /* mask */
  302.     {"FXAM", itFxam, OP2,0,
  303.      ESC|0x01, 0xe5, 0x00, /* opcode */
  304. 0xff, 0xff, 0x00}, /* mask */
  305.     {"FXTRACT", itFxtract, OP2,0,
  306.      ESC|0x01, 0xf4, 0x00, /* opcode */
  307. 0xff, 0xff, 0x00}, /* mask */
  308.     {"FYL2X", itFyl2x, OP2,0,
  309.      ESC|0x01, 0xf1, 0x00, /* opcode */
  310. 0xff, 0xff, 0x00}, /* mask */
  311.     {"FYL2XP1", itFyl2xp1, OP2,0,
  312.      ESC|0x01, 0xf9, 0x00, /* opcode */
  313. 0xff, 0xff, 0x00}, /* mask */
  314.     {"IMUL", itImulRwiRM,  OP2|MODRM|REG,0,
  315.      0x0f, 0xaf, 0x00, /* opcode */
  316. 0xff, 0xff, 0x00}, /* mask */
  317.     {"INVD", itInvd,        OP2,0,
  318.      0x0f, 0x08, 0x00, /* opcode */
  319. 0xff, 0xff, 0x00}, /* mask */
  320.     {"INVLPG", itInvlpg,        OP2|MODRM,0,
  321.      0x0f, 0x01, 0x00, /* opcode */
  322. 0xff, 0xff, 0x00}, /* mask */
  323.     {"LAR", itLar,        OP2|MODRM|REG,0,
  324.      0x0f, 0x02, 0x00, /* opcode */
  325. 0xff, 0xff, 0x00}, /* mask */
  326.     {"LFS", itLfs,        OP2|MODRM|REG,0,
  327.      0x0f, 0xb4, 0x00, /* opcode */
  328. 0xff, 0xff, 0x00}, /* mask */
  329.     {"LGS", itLgs,        OP2|MODRM|REG,0,
  330.      0x0f, 0xb5, 0x00, /* opcode */
  331. 0xff, 0xff, 0x00}, /* mask */
  332.     {"LSL", itLsl,        OP2|MODRM|REG,0,
  333.      0x0f, 0x03, 0x00, /* opcode */
  334. 0xff, 0xff, 0x00}, /* mask */
  335.     {"LSS", itLss,        OP2|MODRM|REG,0,
  336.      0x0f, 0xb2, 0x00, /* opcode */
  337. 0xff, 0xff, 0x00}, /* mask */
  338.     /* 
  339.      * MOV Changes
  340.      * see mask byte 2 changes on next entry.
  341.      * This change is only done on entries that are extact,
  342.      * with exception to opcode byte 2 bit 2
  343.      *
  344.      * {"MOV", itMovC,          OP2|DISR|EEE|MODRM,0,
  345.      *                          0x0f, 0x22, 0x00,
  346.      *                          0xff, 0xff, 0x00},
  347.      */
  348.     {"MOV", itMovC,       OP2|DISR|EEE|MODRM,0,
  349.      0x0f, 0x20, 0x00, /* opcode */
  350. 0xff, 0xfd, 0x00}, /* mask */
  351.     {"MOV", itMovD,       OP2|DISR|EEE|MODRM,0,
  352.      0x0f, 0x21, 0x00, /* opcode */
  353. 0xff, 0xfd, 0x00}, /* mask */
  354.     {"MOV", itMovT,       OP2|DISR|EEE|MODRM,0,
  355.      0x0f, 0x24, 0x00, /* opcode */
  356. 0xff, 0xfd, 0x00}, /* mask */
  357.     /* 
  358.      * MOV Changes
  359.      * see mask byte 2 changes on next entry.
  360.      * This change is only done on entries that are extact,
  361.      * with exception to opcode byte 2 bit 4
  362.      *
  363.      * {"MOVD", itMovd,         OP2|MMXREG|MODRM,0,
  364.      *                          0x0f, 0x7e, 0x00,
  365.      *                          0xff, 0xff, 0x00},
  366.      */
  367.     {"MOVD", itMovd,            OP2|MMXREG|MODRM|DISR,0,
  368.                                 0x0f, 0x6e, 0x00,       /* opcode */
  369. 0xff, 0xef, 0x00},      /* mask */
  370.     {"MOVQ", itMovq,            OP2|MMXREG|MMXRM|MODRM|DISR,0,
  371. 0x0f, 0x6f, 0x00,       /* opcode */
  372. 0xff, 0xef, 0x00},      /* mask */
  373.     {"PACKSSDW", itPackssdw, OP2|MMXREG|MMXRM|MODRM,0,
  374.      0x0f, 0x6b, 0x00, /* opcode */
  375. 0xff, 0xff, 0x00}, /* mask */
  376.     {"PACKSSWB", itPacksswb, OP2|MMXREG|MMXRM|MODRM,0,
  377.      0x0f, 0x63, 0x00, /* opcode */
  378. 0xff, 0xff, 0x00}, /* mask */
  379.     {"PACKUSWB", itPackuswb, OP2|MMXREG|MMXRM|MODRM,0,
  380.      0x0f, 0x67, 0x00, /* opcode */
  381. 0xff, 0xff, 0x00}, /* mask */
  382.     {"PAND", itPand, OP2|MMXREG|MMXRM|MODRM,0,
  383.      0x0f, 0xdb, 0x00, /* opcode */
  384. 0xff, 0xff, 0x00}, /* mask */
  385.     {"PANDN", itPandn, OP2|MMXREG|MMXRM|MODRM,0,
  386.      0x0f, 0xdf, 0x00, /* opcode */
  387. 0xff, 0xff, 0x00}, /* mask */
  388.     {"PMADD", itPmadd, OP2|MMXREG|MMXRM|MODRM,0,
  389.      0x0f, 0xf5, 0x00, /* opcode */
  390. 0xff, 0xff, 0x00}, /* mask */
  391.     {"PMULH", itPmulh, OP2|MMXREG|MMXRM|MODRM,0,
  392.      0x0f, 0xe5, 0x00, /* opcode */
  393. 0xff, 0xff, 0x00}, /* mask */
  394.     {"PMULL", itPmull, OP2|MMXREG|MMXRM|MODRM,0,
  395.      0x0f, 0xd5, 0x00, /* opcode */
  396. 0xff, 0xff, 0x00}, /* mask */
  397.     {"POR", itPor, OP2|MMXREG|MMXRM|MODRM,0,
  398.      0x0f, 0xeb, 0x00, /* opcode */
  399. 0xff, 0xff, 0x00}, /* mask */
  400.     {"PXOR", itPxor, OP2|MMXREG|MMXRM|MODRM,0,
  401.      0x0f, 0xef, 0x00, /* opcode */
  402. 0xff, 0xff, 0x00}, /* mask */
  403.     {"RDTSC", itRdtsc, OP2,0,
  404.      0x0f, 0x31, 0x00, /* opcode */
  405. 0xff, 0xff, 0x00}, /* mask */
  406.     {"RDMSR", itRdmsr, OP2,0,
  407.      0x0f, 0x32, 0x00, /* opcode */
  408. 0xff, 0xff, 0x00}, /* mask */
  409.     {"RDPMC", itRdpmc, OP2,0,
  410.      0x0f, 0x33, 0x00, /* opcode */
  411. 0xff, 0xff, 0x00}, /* mask */
  412.     {"RSM", itRsm, OP2,0,
  413.      0x0f, 0xaa, 0x00, /* opcode */
  414. 0xff, 0xff, 0x00}, /* mask */
  415.     {"SHLD", itShldRMbyI,  OP2|MODRM|REG|I8,0,
  416.      0x0f, 0xa4, 0x00, /* opcode */
  417. 0xff, 0xff, 0x00}, /* mask */
  418.     {"SHLD", itShldRMbyCL,  OP2|MODRM|REG|CL,0,
  419.      0x0f, 0xa5, 0x00, /* opcode */
  420. 0xff, 0xff, 0x00}, /* mask */
  421.     {"SHRD", itShrdRMbyI,  OP2|MODRM|REG|I8,0,
  422.      0x0f, 0xac, 0x00, /* opcode */
  423. 0xff, 0xff, 0x00}, /* mask */
  424.     {"SHRD", itShrdRMbyCL,  OP2|MODRM|REG|CL,0,
  425.      0x0f, 0xad, 0x00, /* opcode */
  426. 0xff, 0xff, 0x00}, /* mask */
  427.     {"SYSENTER", itSysenter, OP2,0,
  428.      0x0f, 0x34, 0x00, /* opcode */
  429. 0xff, 0xff, 0x00}, /* mask */
  430.     {"SYSEXIT", itSysexit, OP2,0,
  431.      0x0f, 0x35, 0x00, /* opcode */
  432. 0xff, 0xff, 0x00}, /* mask */
  433.     {"UD2", itUd2, OP2,0,
  434.      0x0f, 0x0b, 0x00, /* opcode */
  435. 0xff, 0xff, 0x00}, /* mask */
  436.     {"WBINVD", itWbinvd,        OP2,0,
  437.      0x0f, 0x09, 0x00, /* opcode */
  438. 0xff, 0xff, 0x00}, /* mask */
  439.     {"WRMSR", itWrmsr, OP2,0,
  440.      0x0f, 0x30, 0x00, /* opcode */
  441. 0xff, 0xff, 0x00}, /* mask */
  442.     /* SIMD Instructions - 16 bit */
  443.     {"ADDPS", itAddps, OP2|MODRM,XMMREG|XMMRM,
  444.      0x0f, 0x58, 0x00, /* opcode */
  445. 0xff, 0xff, 0x00}, /* mask */
  446.     {"ANDNPS", itAndnps, OP2|MODRM,XMMREG|XMMRM,
  447.      0x0f, 0x55, 0x00, /* opcode */
  448. 0xff, 0xff, 0x00}, /* mask */
  449.     {"ANDPS", itAndps, OP2|MODRM,XMMREG|XMMRM,
  450.      0x0f, 0x54, 0x00, /* opcode */
  451. 0xff, 0xff, 0x00}, /* mask */
  452.     {"CMPPS", itCmpps, OP2|MODRM|I8,XMMREG|XMMRM,
  453.      0x0f, 0xc2, 0x00, /* opcode */
  454. 0xff, 0xff, 0x00}, /* mask */
  455.     {"COMISS", itComiss, OP2|MODRM,XMMREG|XMMRM,
  456.      0x0f, 0x2f, 0x00, /* opcode */
  457. 0xff, 0xff, 0x00}, /* mask */
  458.     {"CVTPI2PS", itCvtpi2ps,    OP2|MODRM|MMXRM,XMMREG,
  459.      0x0f, 0x2a, 0x00, /* opcode */
  460. 0xff, 0xff, 0x00}, /* mask */
  461.     {"CVTPS2PI", itCvtps2pi, OP2|MODRM|MMXREG,XMMRM,
  462.      0x0f, 0x2d, 0x00, /* opcode */
  463. 0xff, 0xff, 0x00}, /* mask */
  464.     {"CVTTPS2PI", itCvttps2pi, OP2|MODRM|MMXREG,XMMRM,
  465.      0x0f, 0x2c, 0x00, /* opcode */
  466. 0xff, 0xff, 0x00}, /* mask */
  467.     {"DIVPS", itDivps, OP2|MODRM,XMMREG|XMMRM,
  468.      0x0f, 0x5e, 0x00, /* opcode */
  469. 0xff, 0xff, 0x00}, /* mask */
  470.     {"MAXPS", itMaxps, OP2|MODRM,XMMREG|XMMRM,
  471.      0x0f, 0x5f, 0x00, /* opcode */
  472. 0xff, 0xff, 0x00}, /* mask */
  473.     {"MINPS", itMinps, OP2|MODRM,XMMREG|XMMRM,
  474.      0x0f, 0x5d, 0x00, /* opcode */
  475. 0xff, 0xff, 0x00}, /* mask */
  476.     {"MOVAPS", itMovaps, OP2|MODRM|DISR,XMMREG|XMMRM,
  477.      0x0f, 0x28, 0x00, /* opcode */
  478. 0xff, 0xfe, 0x00}, /* mask */
  479.     {"MOVHPS", itMovhps, OP2|MODRM|DISR,XMMREG,
  480.      0x0f, 0x16, 0x00, /* opcode */
  481. 0xff, 0xfe, 0x00}, /* mask */
  482.     {"MOVLPS", itMovlps, OP2|MODRM|DISR,XMMREG,
  483.      0x0f, 0x12, 0x00, /* opcode */
  484. 0xff, 0xfe, 0x00}, /* mask */
  485.     {"MOVMSKPS", itMovmskps, OP2|MODRM|REG,XMMRM,
  486.      0x0f, 0x50, 0x00, /* opcode */
  487. 0xff, 0xff, 0x00}, /* mask */
  488.     {"MOVUPS", itMovups, OP2|MODRM|DISR,XMMREG|XMMRM,
  489.      0x0f, 0x10, 0x00, /* opcode */
  490. 0xff, 0xfe, 0x00}, /* mask */
  491.     {"MULPS", itMulps, OP2|MODRM,XMMREG|XMMRM,
  492.      0x0f, 0x59, 0x00, /* opcode */
  493. 0xff, 0xff, 0x00}, /* mask */
  494.     {"ORPS", itOrps, OP2|MODRM,XMMREG|XMMRM,
  495.      0x0f, 0x56, 0x00, /* opcode */
  496. 0xff, 0xff, 0x00}, /* mask */
  497.     {"RCPPS", itRcpps, OP2|MODRM,XMMREG|XMMRM,
  498.      0x0f, 0x53, 0x00, /* opcode */
  499. 0xff, 0xff, 0x00}, /* mask */
  500.     {"RSQRTPS", itRsqrtps, OP2|MODRM,XMMREG|XMMRM,
  501.      0x0f, 0x52, 0x00, /* opcode */
  502. 0xff, 0xff, 0x00}, /* mask */
  503.     {"SHUFPS", itShufps, OP2|MODRM|I8,XMMREG|XMMRM,
  504.      0x0f, 0xc6, 0x00, /* opcode */
  505. 0xff, 0xff, 0x00}, /* mask */
  506.     {"SQRTPS", itSqrtps, OP2|MODRM,XMMREG|XMMRM,
  507.      0x0f, 0x51, 0x00, /* opcode */
  508. 0xff, 0xff, 0x00}, /* mask */
  509.     {"SUBPS", itSubps, OP2|MODRM,XMMREG|XMMRM,
  510.      0x0f, 0x5c, 0x00, /* opcode */
  511. 0xff, 0xff, 0x00}, /* mask */
  512.     {"UCOMISS", itUcomiss, OP2|MODRM,XMMREG|XMMRM,
  513.      0x0f, 0x2e, 0x00, /* opcode */
  514. 0xff, 0xff, 0x00}, /* mask */
  515.     {"UNPCKHPS", itUnpckhps, OP2|MODRM,XMMREG|XMMRM,
  516.      0x0f, 0x15, 0x00, /* opcode */
  517. 0xff, 0xff, 0x00}, /* mask */
  518.     {"UNPCKLPS", itUnpcklps, OP2|MODRM,XMMREG|XMMRM,
  519.      0x0f, 0x14, 0x00, /* opcode */
  520. 0xff, 0xff, 0x00}, /* mask */
  521.     {"XORPS", itXorps, OP2|MODRM,XMMREG|XMMRM,
  522.      0x0f, 0x57, 0x00, /* opcode */
  523. 0xff, 0xff, 0x00}, /* mask */
  524.     {"PAVGB", itPavgb, OP2|MODRM|MMXREG|MMXRM,0,
  525.      0x0f, 0xe0, 0x00, /* opcode */
  526. 0xff, 0xff, 0x00}, /* mask */
  527.     {"PAVGW", itPavgw, OP2|MODRM|MMXREG|MMXRM,0,
  528.      0x0f, 0xe3, 0x00, /* opcode */
  529. 0xff, 0xff, 0x00}, /* mask */
  530.     {"PEXTRW", itPextrw, OP2|DISR|MODRM|MMXREG|REGRM|I8,0,
  531.      0x0f, 0xc5, 0x00, /* opcode */
  532. 0xff, 0xff, 0x00}, /* mask */
  533.     {"PINSRW", itPinsrw, OP2|MODRM|MMXREG|REGRM|I8,0,
  534.      0x0f, 0xc4, 0x00, /* opcode */
  535. 0xff, 0xff, 0x00}, /* mask */
  536.     {"PMAXSW", itPmaxsw, OP2|MODRM|MMXREG|MMXRM,0,
  537.      0x0f, 0xee, 0x00, /* opcode */
  538. 0xff, 0xff, 0x00}, /* mask */
  539.     {"PMAXUB", itPmaxub, OP2|MODRM|MMXREG|MMXRM,0,
  540.      0x0f, 0xde, 0x00, /* opcode */
  541. 0xff, 0xff, 0x00}, /* mask */
  542.     {"PMINSW", itPminsw, OP2|MODRM|MMXREG|MMXRM,0,
  543.      0x0f, 0xea, 0x00, /* opcode */
  544. 0xff, 0xff, 0x00}, /* mask */
  545.     {"PMINUB", itPminub, OP2|MODRM|MMXREG|MMXRM,0,
  546.      0x0f, 0xda, 0x00, /* opcode */
  547. 0xff, 0xff, 0x00}, /* mask */
  548.     {"PMOVMSKB", itPmovmskb, OP2|MODRM|MMXREG|REGRM|DISR,0,
  549.      0x0f, 0xd7, 0x00, /* opcode */
  550. 0xff, 0xff, 0x00}, /* mask */
  551.     {"PMULHUW", itPmulhuw, OP2|MODRM|MMXREG|MMXRM,0,
  552.      0x0f, 0xe4, 0x00, /* opcode */
  553. 0xff, 0xff, 0x00}, /* mask */
  554.     {"PSADBW", itPsadbw, OP2|MODRM|MMXREG|MMXRM,0,
  555.      0x0f, 0xf6, 0x00, /* opcode */
  556. 0xff, 0xff, 0x00}, /* mask */
  557.     {"PSHUFW", itPshufw, OP2|MODRM|MMXREG|MMXRM|I8,0,
  558.      0x0f, 0x70, 0x00, /* opcode */
  559. 0xff, 0xff, 0x00}, /* mask */
  560.     {"MASKMOVQ", itMaskmovq, OP2|MODRM|MMXREG|MMXRM,0,
  561.      0x0f, 0xf7, 0x00, /* opcode */
  562. 0xff, 0xff, 0x00}, /* mask */
  563.     {"MOVNTPS", itMovntps, OP2|MODRM|DISR,XMMREG|XMMRM,
  564.      0x0f, 0x2b, 0x00, /* opcode */
  565. 0xff, 0xff, 0x00}, /* mask */
  566.     {"MOVNTQ", itMovntq, OP2|MODRM|DISR,XMMREG|XMMRM,
  567.      0x0f, 0xe7, 0x00, /* opcode */
  568. 0xff, 0xff, 0x00}, /* mask */
  569.     /* 15 bits mask */
  570.     {"CMPXCHG", itCmpxchg,      OP2|WFUL|MODRM|REG,0,
  571.      0x0f, 0xb0, 0x00, /* opcode */
  572. 0xff, 0xfe, 0x00}, /* mask */
  573.     {"MOVSX", itMovsx,    OP2|WFUL|MODRM|REG,0,
  574.      0x0f, 0xbe, 0x00, /* opcode */
  575. 0xff, 0xfe, 0x00}, /* mask */
  576.     {"MOVZX", itMovzx,    OP2|WFUL|MODRM|REG,0,
  577.      0x0f, 0xb6, 0x00, /* opcode */
  578. 0xff, 0xfe, 0x00}, /* mask */
  579.     {"REP INS", itRins,       OP2|WFUL,0,
  580.      0xf3, 0x6c, 0x00, /* opcode */
  581. 0xff, 0xfe, 0x00}, /* mask */
  582.     {"REP LODS", itRlods,     OP2|WFUL,0,
  583.      0xf3, 0xac, 0x00, /* opcode */
  584. 0xff, 0xfe, 0x00}, /* mask */
  585.     {"REP MOVS", itRmovs,     OP2|WFUL,0,
  586.      0xf3, 0xa4, 0x00, /* opcode */
  587. 0xff, 0xfe, 0x00}, /* mask */
  588.     {"REP OUTS", itRouts,     OP2|WFUL,0,
  589.      0xf3, 0x6e, 0x00, /* opcode */
  590. 0xff, 0xfe, 0x00}, /* mask */
  591.     {"REP STOS", itRstos,     OP2|WFUL,0,
  592.      0xf3, 0xaa, 0x00, /* opcode */
  593. 0xff, 0xfe, 0x00}, /* mask */
  594.     {"REPE CMPS", itRcmps,    OP2|WFUL,0,
  595.      0xf3, 0xa6, 0x00, /* opcode */
  596. 0xff, 0xfe, 0x00}, /* mask */
  597.     {"REPE SCAS", itRscas,    OP2|WFUL,0,
  598.      0xf3, 0xae, 0x00, /* opcode */
  599. 0xff, 0xfe, 0x00}, /* mask */
  600.     {"REPNE CMPS", itRNcmps,  OP2|WFUL,0,
  601.      0xf2, 0xa6, 0x00, /* opcode */
  602. 0xff, 0xfe, 0x00}, /* mask */
  603.     {"REPNE SCAS", itRNscas,  OP2|WFUL,0,
  604.      0xf2, 0xae, 0x00, /* opcode */
  605. 0xff, 0xfe, 0x00}, /* mask */
  606.     {"XADD", itXadd,        OP2|WFUL|MODRM|REG,0,
  607.      0x0f, 0xc0, 0x00, /* opcode */
  608. 0xff, 0xfe, 0x00}, /* mask */
  609.     /* 14 + 5 bits mask */
  610.     {"PSLL", itPsll, OP2|GG|MODRM|MMXRM|I8,0,
  611.      0x0f, 0x70, 0xf0, /* opcode */
  612. 0xff, 0xfc, 0xf8}, /* mask */
  613.     {"PSRA", itPsra, OP2|GG|MODRM|MMXRM|I8,0,
  614.      0x0f, 0x70, 0xe0, /* opcode */
  615. 0xff, 0xfc, 0xf8}, /* mask */
  616.     {"PSRL", itPsrl, OP2|GG|MODRM|MMXRM|I8,0,
  617.      0x0f, 0x70, 0xd0, /* opcode */
  618. 0xff, 0xfc, 0xf8}, /* mask */
  619.     /* 14 bits mask */
  620.     {"PADD", itPadd, OP2|GG|MMXREG|MMXRM|MODRM,0,
  621.      0x0f, 0xfc, 0x00, /* opcode */
  622. 0xff, 0xfc, 0x00}, /* mask */
  623.     {"PADDS", itPadds, OP2|GG|MMXREG|MMXRM|MODRM,0,
  624.      0x0f, 0xec, 0x00, /* opcode */
  625. 0xff, 0xfc, 0x00}, /* mask */
  626.     {"PADDUS", itPaddus, OP2|GG|MMXREG|MMXRM|MODRM,0,
  627.      0x0f, 0xdc, 0x00, /* opcode */
  628. 0xff, 0xfc, 0x00}, /* mask */
  629.     {"PCMPEQ", itPcmpeq, OP2|GG|MMXREG|MMXRM|MODRM,0,
  630.      0x0f, 0x74, 0x00, /* opcode */
  631. 0xff, 0xfc, 0x00}, /* mask */
  632.     {"PCMPGT", itPcmpgt, OP2|GG|MMXREG|MMXRM|MODRM,0,
  633.      0x0f, 0x64, 0x00, /* opcode */
  634. 0xff, 0xfc, 0x00}, /* mask */
  635.     {"PSLL", itPsll, OP2|GG|MMXREG|MMXRM|MODRM,0,
  636.      0x0f, 0xf0, 0x00, /* opcode */
  637. 0xff, 0xfc, 0x00}, /* mask */
  638.     {"PSRA", itPsra, OP2|GG|MMXREG|MMXRM|MODRM,0,
  639.      0x0f, 0xe0, 0x00, /* opcode */
  640. 0xff, 0xfc, 0x00}, /* mask */
  641.     {"PSRL", itPsrl, OP2|GG|MMXREG|MMXRM|MODRM,0,
  642.      0x0f, 0xd0, 0x00, /* opcode */
  643. 0xff, 0xfc, 0x00}, /* mask */
  644.     {"PSUB", itPsub, OP2|GG|MMXREG|MMXRM|MODRM,0,
  645.      0x0f, 0xf8, 0x00, /* opcode */
  646. 0xff, 0xfc, 0x00}, /* mask */
  647.     {"PSUBS", itPsubs, OP2|GG|MMXREG|MMXRM|MODRM,0,
  648.      0x0f, 0xe8, 0x00, /* opcode */
  649. 0xff, 0xfc, 0x00}, /* mask */
  650.     {"PSUBUS", itPsubus, OP2|GG|MMXREG|MMXRM|MODRM,0,
  651.      0x0f, 0xd8, 0x00, /* opcode */
  652. 0xff, 0xfc, 0x00}, /* mask */
  653.     {"PUNPCKH", itPunpckh, OP2|GG|MMXREG|MMXRM|MODRM,0,
  654.      0x0f, 0x68, 0x00, /* opcode */
  655. 0xff, 0xfc, 0x00}, /* mask */
  656.     {"PUNPCKL", itPunpckl, OP2|GG|MMXREG|MMXRM|MODRM,0,
  657.      0x0f, 0x60, 0x00, /* opcode */
  658. 0xff, 0xfc, 0x00},
  659.     /* 13 bits mask */
  660.     {"BSWAP", itBswap,        OP1|MODRM,0,
  661.      0x0f, 0xc8, 0x00, /* opcode */
  662. 0xff, 0xf8, 0x00}, /* mask */
  663.     {"FCMOVB", itFcmovb, OP2|ST,0,
  664.      ESC|0x02, 0xc0, 0x00, /* opcode */
  665. 0xff, 0xf8, 0x00}, /* mask */
  666.     {"FCMOVBE", itFcmovbe, OP2|ST,0,
  667.      ESC|0x02, 0xd0, 0x00, /* opcode */
  668. 0xff, 0xf8, 0x00}, /* mask */
  669.     {"FCMOVE", itFcmove, OP2|ST,0,
  670.      ESC|0x02, 0xc8, 0x00, /* opcode */
  671. 0xff, 0xf8, 0x00}, /* mask */
  672.     {"FCMOVU", itFcmovu, OP2|ST,0,
  673.      ESC|0x02, 0xd8, 0x00, /* opcode */
  674. 0xff, 0xf8, 0x00}, /* mask */
  675.     {"FCMOVNB", itFcmovnb, OP2|ST,0,
  676.      ESC|0x03, 0xc0, 0x00, /* opcode */
  677. 0xff, 0xf8, 0x00}, /* mask */
  678.     {"FCMOVNBE", itFcmovnbe, OP2|ST,0,
  679.      ESC|0x03, 0xd0, 0x00, /* opcode */
  680. 0xff, 0xf8, 0x00}, /* mask */
  681.     {"FCMOVNE", itFcmovne, OP2|ST,0,
  682.      ESC|0x03, 0xc8, 0x00, /* opcode */
  683. 0xff, 0xf8, 0x00}, /* mask */
  684.     {"FCMOVNU", itFcmovnu, OP2|ST,0,
  685.      ESC|0x03, 0xd8, 0x00, /* opcode */
  686. 0xff, 0xf8, 0x00}, /* mask */
  687.     {"FCOM", itFcomST, OP2|ST,0,
  688.      ESC|0x00, 0xd0, 0x00, /* opcode */
  689. 0xff, 0xf8, 0x00}, /* mask */
  690.     {"FCOMI", itFcomi, OP2|ST,0,
  691.      ESC|0x03, 0xf0, 0x00, /* opcode */
  692. 0xff, 0xf8, 0x00}, /* mask */
  693.     {"FCOMP", itFcompST, OP2|ST,0,
  694.      ESC|0x00, 0xd8, 0x00, /* opcode */
  695. 0xff, 0xf8, 0x00}, /* mask */
  696.     {"FFREE", itFfree, OP2|ST,0,
  697.      ESC|0x05, 0xc0, 0x00, /* opcode */
  698. 0xff, 0xf8, 0x00}, /* mask */
  699.     {"FLD", itFldST, OP2|ST,0,
  700.      ESC|0x01, 0xc0, 0x00, /* opcode */
  701. 0xff, 0xf8, 0x00}, /* mask */
  702.     {"FST", itFstST, OP2|ST,0,
  703.      ESC|0x05, 0xd0, 0x00, /* opcode */
  704. 0xff, 0xf8, 0x00}, /* mask */
  705.     {"FSTP", itFstpST, OP2|ST,0,
  706.      ESC|0x05, 0xd8, 0x00, /* opcode */
  707. 0xff, 0xf8, 0x00}, /* mask */
  708.     {"FUCOM", itFucom, OP2|ST,0,
  709.      ESC|0x05, 0xe0, 0x00, /* opcode */
  710. 0xff, 0xf8, 0x00}, /* mask */
  711.     {"FUCOMP", itFucomp, OP2|ST,0,
  712.      ESC|0x05, 0xe8, 0x00, /* opcode */
  713. 0xff, 0xf8, 0x00}, /* mask */
  714.     {"FXCH", itFxch, OP2|ST,0,
  715.      ESC|0x01, 0xc8, 0x00, /* opcode */
  716. 0xff, 0xf8, 0x00}, /* mask */
  717.     {"POP", itPopS,       OP2|SREG3,0,
  718.      0x0f, 0x81, 0x00, /* opcode */
  719. 0xff, 0xc7, 0x00}, /* mask */
  720.     {"PUSH", itPushS,     OP1|SREG3,0,
  721.      0x0f, 0x80, 0x00, /* opcode */
  722. 0xff, 0xc7, 0x00}, /* mask */
  723.     /* 12 + 3 bits mask */
  724.     {"CMOV", itCmovcc, OP2|TTTN|MODRM|REG,0,
  725.      0x0f, 0x40, 0x00, /* opcode */
  726. 0xff, 0xf0, 0x00}, /* mask */
  727.     {"CSET", itCset,      OP2|TTTN|MODRM,0,
  728.      0x0f, 0x90, 0x00, /* opcode */
  729. 0xff, 0xf0, 0x38}, /* mask */
  730.     /* 12 bits mask */
  731.     {"CJMPF", itCjmp,     OP2|TTTN|DIS,0,
  732.      0x0f, 0x80, 0x00, /* opcode */
  733. 0xff, 0xf0, 0x00}, /* mask */
  734.     /* 11 bits mask */
  735.     {"CALL", itCallRM,    OP1|MODRM,0,
  736.      0xff, 0x10, 0x00, /* opcode */
  737. 0xff, 0x38, 0x00}, /* mask */
  738.     {"CALL", itCallSegRM,  OP1|MODRM,0,
  739.      0xff, 0x18, 0x00, /* opcode */
  740. 0xff, 0x38, 0x00}, /* mask */
  741.     {"FADD", itFaddST, OP2|POP|FD|ST,0,
  742.      ESC|0x00, 0xc0, 0x00, /* opcode */
  743. 0xf9, 0xf8, 0x00}, /* mask */
  744.     {"FLDbcd", itFldBCDM, OP1|MODRM,0,
  745.      ESC|0x07, 0x20, 0x00, /* opcode */
  746. 0xff, 0x38, 0x00}, /* mask */
  747.     {"FLDCW", itFldcw, OP1|MODRM,0,
  748.      ESC|0x01, 0x28, 0x00, /* opcode */
  749. 0xff, 0x38, 0x00}, /* mask */
  750.     {"FLDENV", itFldenv, OP1|MODRM,0,
  751.      ESC|0x01, 0x20, 0x00, /* opcode */
  752. 0xff, 0x38, 0x00}, /* mask */
  753.     {"FLDext", itFldERM, OP1|MODRM,0,
  754.      ESC|0x03, 0x28, 0x00, /* opcode */
  755. 0xff, 0x38, 0x00}, /* mask */
  756.     {"FLDint", itFldLIM, OP1|MODRM,0,
  757.      ESC|0x07, 0x28, 0x00, /* opcode */
  758. 0xff, 0x38, 0x00}, /* mask */
  759.     {"FMUL", itFmulST, OP2|POP|FD|ST,0,
  760.      ESC|0x00, 0xc8, 0x00, /* opcode */
  761. 0xf9, 0xf8, 0x00}, /* mask */
  762.     {"FRSTOR", itFrstor, OP1|MODRM,0,
  763.      ESC|0x05, 0x20, 0x00, /* opcode */
  764. 0xff, 0x38, 0x00}, /* mask */
  765.     {"FSAVE", itFsave, OP1|MODRM,0,
  766.      ESC|0x05, 0x30, 0x00, /* opcode */
  767. 0xff, 0x38, 0x00}, /* mask */
  768.     {"FSTCW", itFstcw, OP1|MODRM,0,
  769.      ESC|0x01, 0x38, 0x00, /* opcode */
  770. 0xff, 0x38, 0x00}, /* mask */
  771.     {"FSTENV", itFstenv, OP1|MODRM,0,
  772.      ESC|0x01, 0x30, 0x00, /* opcode */
  773. 0xff, 0x38, 0x00}, /* mask */
  774.     {"FSTPbcd", itFstpBCDM, OP1|MODRM,0,
  775.      ESC|0x07, 0x30, 0x00, /* opcode */
  776. 0xff, 0x38, 0x00}, /* mask */
  777.     {"FSTPext", itFstpERM, OP1|MODRM,0,
  778.      ESC|0x03, 0x38, 0x00, /* opcode */
  779. 0xff, 0x38, 0x00}, /* mask */
  780.     {"FSTPint", itFstpLIM, OP1|MODRM,0,
  781.      ESC|0x07, 0x38, 0x00, /* opcode */
  782. 0xff, 0x38, 0x00}, /* mask */
  783.     {"FSTSW", itFstsw, OP1|MODRM,0,
  784.      ESC|0x05, 0x38, 0x00, /* opcode */
  785. 0xff, 0x38, 0x00}, /* mask */
  786.     {"IMUL", itImulAwiRM,  OP1|WFUL|MODRM|AX,0,
  787.      0xf6, 0x28, 0x00, /* opcode */
  788. 0xff, 0x38, 0x00}, /* mask */
  789.     {"JMP", itJmpRM,      OP1|MODRM,0,
  790.      0xff, 0x20, 0x00, /* opcode */
  791. 0xff, 0x38, 0x00}, /* mask */
  792.     {"JMP", itJmpSegRM,   OP1|MODRM,0,
  793.      0xff, 0x28, 0x00, /* opcode */
  794. 0xff, 0x38, 0x00}, /* mask */
  795.     {"POP", itPopRM,      OP1|MODRM,0,
  796.      0x8f, 0x00, 0x00, /* opcode */
  797. 0xff, 0x38, 0x00}, /* mask */
  798.     {"PUSH", itPushRM,    OP1|MODRM,0,
  799.      0xff, 0x30, 0x00, /* opcode */
  800. 0xff, 0x38, 0x00}, /* mask */
  801.     /* 10 bits mask */
  802.     {"DEC", itDecRM,      OP1|WFUL|MODRM,0,
  803.      0xfe, 0x08, 0x00, /* opcode */
  804. 0xfe, 0x38, 0x00}, /* mask */
  805.     {"DIV", itDiv,        OP1|WFUL|MODRM|AX,0,
  806.      0xf6, 0x30, 0x00, /* opcode */
  807. 0xfe, 0x38, 0x00}, /* mask */
  808.     {"FDIV", itFdivST, OP2|POP|FD|ST,0,
  809.      ESC|0x00, 0xf0, 0x00, /* opcode */
  810. 0xf9, 0xf0, 0x00}, /* mask */
  811.     {"FSUB", itFsubST, OP2|POP|FD|ST,0,
  812.      ESC|0x00, 0xe0, 0x00, /* opcode */
  813. 0xf9, 0xf0, 0x00}, /* mask */
  814.     {"IDIV", itIdiv,      OP1|WFUL|MODRM|AX,0,
  815.      0xf6, 0x38, 0x00, /* opcode */
  816. 0xfe, 0x38, 0x00}, /* mask */
  817.     {"INC", itIncRM,      OP1|WFUL|MODRM,0,
  818.      0xfe, 0x00, 0x00, /* opcode */
  819. 0xfe, 0x38, 0x00}, /* mask */
  820.     {"MOV", itMovItoRM,   OP1|WFUL|MODRM|IMM,0,
  821.      0xc6, 0x00, 0x00, /* opcode */
  822. 0xfe, 0x38, 0x00}, /* mask */
  823.     {"MUL", itMulAwiRM,   OP1|WFUL|MODRM|AX,0,
  824.      0xf6, 0x20, 0x00, /* opcode */
  825. 0xfe, 0x38, 0x00}, /* mask */
  826.     {"NEG", itNeg,        OP1|WFUL|MODRM,0,
  827.      0xf6, 0x18, 0x00, /* opcode */
  828. 0xfe, 0x38, 0x00}, /* mask */
  829.     {"NOT", itNot,        OP1|WFUL|MODRM,0,
  830.      0xf6, 0x10, 0x00, /* opcode */
  831. 0xfe, 0x38, 0x00}, /* mask */
  832.     {"TEST", itTestIanRM,  OP1|WFUL|MODRM|IMM,0,
  833.      0xf6, 0x00, 0x00, /* opcode */
  834. 0xfe, 0x38, 0x00}, /* mask */
  835.     /* 9 bits mask */
  836.     {"ADD", itAddItoRM,   OP1|SEXT|WFUL|MODRM|IMM,0,
  837.      0x80, 0x00, 0x00, /* opcode */
  838. 0xfc, 0x38, 0x00}, /* mask */
  839.     {"ADC", itAdcItoRM,   OP1|SEXT|WFUL|MODRM|IMM,0,
  840.      0x80, 0x10, 0x00, /* opcode */
  841. 0xfc, 0x38, 0x00}, /* mask */
  842.     {"AND", itAndItoRM,   OP1|SEXT|WFUL|MODRM|IMM,0,
  843.      0x80, 0x20, 0x00, /* opcode */
  844. 0xfc, 0x38, 0x00}, /* mask */
  845.     {"CMP", itCmpIwiRM,   OP1|SEXT|WFUL|MODRM|IMM,0,
  846.      0x80, 0x38, 0x00, /* opcode */
  847. 0xfc, 0x38, 0x00}, /* mask */
  848.     {"FADD", itFaddIRM, OP1|MF|MODRM,0,
  849.      ESC|0x00, 0x00, 0x00, /* opcode */
  850. 0xf9, 0x38, 0x00}, /* mask */
  851.     {"FCOM", itFcomIRM, OP1|MF|MODRM,0,
  852.      ESC|0x00, 0x10, 0x00, /* opcode */
  853. 0xf9, 0x38, 0x00}, /* mask */
  854.     {"FCOMP", itFcompIRM, OP1|MF|MODRM,0,
  855.      ESC|0x00, 0x18, 0x00, /* opcode */
  856. 0xf9, 0x38, 0x00}, /* mask */
  857.     {"FLD", itFldIRM, OP1|MF|MODRM,0,
  858.      ESC|0x01, 0x00, 0x00, /* opcode */
  859. 0xf9, 0x38, 0x00}, /* mask */
  860.     {"FMUL", itFmulIRM, OP1|MF|MODRM,0,
  861.      ESC|0x00, 0x08, 0x00, /* opcode */
  862. 0xf9, 0x38, 0x00}, /* mask */
  863.     {"FST", itFstIRM, OP1|MF|MODRM,0,
  864.      ESC|0x01, 0x10, 0x00, /* opcode */
  865. 0xf9, 0x38, 0x00}, /* mask */
  866.     {"FSTP", itFstpIRM, OP1|MF|MODRM,0,
  867.      ESC|0x01, 0x18, 0x00, /* opcode */
  868. 0xf9, 0x38, 0x00}, /* mask */
  869.     {"OR", itOrItoRM,     OP1|SEXT|WFUL|MODRM|IMM,0,
  870.      0x80, 0x08, 0x00, /* opcode */
  871. 0xfc, 0x38, 0x00}, /* mask */
  872.     {"SBB", itSbbIfrRM,   OP1|SEXT|WFUL|MODRM|IMM,0,
  873.      0x80, 0x18, 0x00, /* opcode */
  874. 0xfc, 0x38, 0x00}, /* mask */
  875.     {"SUB", itSubIfrRM,   OP1|SEXT|WFUL|MODRM|IMM,0,
  876.      0x80, 0x28, 0x00, /* opcode */
  877. 0xfc, 0x38, 0x00}, /* mask */
  878.     {"XOR", itXorItoRM,    OP1|SEXT|WFUL|MODRM|IMM,0,
  879.      0x80, 0x30, 0x00, /* opcode */
  880. 0xfc, 0x38, 0x00}, /* mask */
  881.     /* 8 bits mask */
  882.     {"AAA", itAaa,        OP1,0,
  883.      0x37, 0x00, 0x00, /* opcode */
  884. 0xff, 0x00, 0x00}, /* mask */
  885.     {"AAS", itAas,        OP1,0,
  886.      0x3f, 0x00, 0x00, /* opcode */
  887. 0xff, 0x00, 0x00}, /* mask */
  888.     {"ARPL", itArpl,      OP1|MODRM|REG,0,
  889.      0x63, 0x00, 0x00, /* opcode */
  890. 0xff, 0x00, 0x00}, /* mask */
  891.     {"ASIZE", itAsize,    OP1,0,
  892.      0x67, 0x00, 0x00, /* opcode */
  893. 0xff, 0x00, 0x00}, /* mask */
  894.     {"BOUND", itBound,    OP1|MODRM|REG,0,
  895.      0x62, 0x00, 0x00, /* opcode */
  896. 0xff, 0x00, 0x00}, /* mask */
  897.     {"CALL", itCall,      OP1|DIS,0,
  898.      0xe8, 0x00, 0x00, /* opcode */
  899. 0xff, 0x00, 0x00}, /* mask */
  900.     {"CALL", itCallSeg,   OP1|OFFSEL,0,
  901.      0x9a, 0x00, 0x00, /* opcode */
  902. 0xff, 0x00, 0x00}, /* mask */
  903.     {"CBW", itCbw,        OP1,0,
  904.      0x98, 0x00, 0x00, /* opcode */
  905. 0xff, 0x00, 0x00}, /* mask */
  906.     {"CLC", itClc,        OP1,0,
  907.      0xf8, 0x00, 0x00, /* opcode */
  908. 0xff, 0x00, 0x00}, /* mask */
  909.     {"CLD", itCld,        OP1,0,
  910.      0xfc, 0x00, 0x00, /* opcode */
  911. 0xff, 0x00, 0x00}, /* mask */
  912.     {"CLI", itCli,        OP1,0,
  913.      0xfa, 0x00, 0x00, /* opcode */
  914. 0xff, 0x00, 0x00}, /* mask */
  915.     {"CMC", itCmc,        OP1,0,
  916.      0xf5, 0x00, 0x00, /* opcode */
  917. 0xff, 0x00, 0x00}, /* mask */
  918.     {"CS", itCs,          OP1,0,
  919.      0x2e, 0x00, 0x00, /* opcode */
  920. 0xff, 0x00, 0x00}, /* mask */
  921.     {"CWD", itCwd,        OP1,0,
  922.      0x99, 0x00, 0x00, /* opcode */
  923. 0xff, 0x00, 0x00}, /* mask */
  924.     {"DAA", itDaa,        OP1,0,
  925.      0x27, 0x00, 0x00, /* opcode */
  926. 0xff, 0x00, 0x00}, /* mask */
  927.     {"DAS", itDas,        OP1,0,
  928.      0x2f, 0x00, 0x00, /* opcode */
  929. 0xff, 0x00, 0x00}, /* mask */
  930.     {"DS", itDs,          OP1,0,
  931.      0x3e, 0x00, 0x00, /* opcode */
  932. 0xff, 0x00, 0x00}, /* mask */
  933.     {"ENTER", itEnter,    OP1|D16L8,0,
  934.      0xc8, 0x00, 0x00, /* opcode */
  935. 0xff, 0x00, 0x00}, /* mask */
  936.     {"ES", itEs,          OP1,0,
  937.      0x26, 0x00, 0x00, /* opcode */
  938. 0xff, 0x00, 0x00}, /* mask */
  939.     {"FDIV", itFdivIRM, OP1|MF|MODRM,0,
  940.      ESC|0x00, 0x30, 0x00, /* opcode */
  941. 0xf9, 0x30, 0x00}, /* mask */
  942.     {"FS", itFs,          OP1,0,
  943.      0x64, 0x00, 0x00, /* opcode */
  944. 0xff, 0x00, 0x00}, /* mask */
  945.     {"FSUB", itFsubIRM, OP1|MF|MODRM,0,
  946.      ESC|0x00, 0x20, 0x00, /* opcode */
  947. 0xf9, 0x30, 0x00}, /* mask */
  948.     {"GS", itGs,          OP1,0,
  949.      0x65, 0x00, 0x00, /* opcode */
  950. 0xff, 0x00, 0x00}, /* mask */
  951.     {"HLT", itHlt,        OP1,0,
  952.      0xf4, 0x00, 0x00, /* opcode */
  953. 0xff, 0x00, 0x00}, /* mask */
  954.     {"INT", itInt,        OP1|I8,0,
  955.      0xcd, 0x00, 0x00, /* opcode */
  956. 0xff, 0x00, 0x00}, /* mask */
  957.     {"INT", itInt3,       OP1,0,
  958.      0xcc, 0x00, 0x00, /* opcode */
  959. 0xff, 0x00, 0x00}, /* mask */
  960.     {"INTO", itInto,      OP1,0,
  961.      0xce, 0x00, 0x00, /* opcode */
  962. 0xff, 0x00, 0x00}, /* mask */
  963.     {"IRET", itIret,      OP1,0,
  964.      0xcf, 0x00, 0x00, /* opcode */
  965. 0xff, 0x00, 0x00}, /* mask */
  966.     {"JECXZ", itJcxz,      OP1|D8,0,
  967.      0xe3, 0x00, 0x00, /* opcode */
  968. 0xff, 0x00, 0x00}, /* mask */
  969.     {"JMP", itJmpS,       OP1|D8,0,
  970.      0xeb, 0x00, 0x00, /* opcode */
  971. 0xff, 0x00, 0x00}, /* mask */
  972.     {"JMP", itJmpD,       OP1|DIS,0,
  973.      0xe9, 0x00, 0x00, /* opcode */
  974. 0xff, 0x00, 0x00}, /* mask */
  975.     {"JMP", itJmpSeg,     OP1|OFFSEL,0,
  976.      0xea, 0x00, 0x00, /* opcode */
  977. 0xff, 0x00, 0x00}, /* mask */
  978.     {"LAHF", itLahf,      OP1,0,
  979.      0x9f, 0x00, 0x00, /* opcode */
  980. 0xff, 0x00, 0x00}, /* mask */
  981.     {"LDS", itLds,        OP1|MODRM|REG,0,
  982.      0xc5, 0x00, 0x00, /* opcode */
  983. 0xff, 0x00, 0x00}, /* mask */
  984.     {"LEA", itLea,        OP1|MODRM|REG,0,
  985.      0x8d, 0x00, 0x00, /* opcode */
  986. 0xff, 0x00, 0x00}, /* mask */
  987.     {"LEAVE", itLeave,    OP1,0,
  988.      0xc9, 0x00, 0x00, /* opcode */
  989. 0xff, 0x00, 0x00}, /* mask */
  990.     {"LES", itLes,        OP1|MODRM|REG,0,
  991.      0xc4, 0x00, 0x00, /* opcode */
  992. 0xff, 0x00, 0x00}, /* mask */
  993.     {"LOCK", itLock,      OP1,0,
  994.      0xf0, 0x00, 0x00, /* opcode */
  995. 0xff, 0x00, 0x00}, /* mask */
  996.     {"LOOP", itLoop,      OP1|D8,0,
  997.      0xe2, 0x00, 0x00, /* opcode */
  998. 0xff, 0x00, 0x00}, /* mask */
  999.     {"LOOPZ", itLoopz,    OP1|D8,0,
  1000.      0xe1, 0x00, 0x00, /* opcode */
  1001. 0xff, 0x00, 0x00}, /* mask */
  1002.     {"LOOPNZ", itLoopnz,  OP1|D8,0,
  1003.      0xe0, 0x00, 0x00, /* opcode */
  1004. 0xff, 0x00, 0x00}, /* mask */
  1005.     {"NOP", itNop,        OP1,0,
  1006.      0x90, 0x00, 0x00, /* opcode */
  1007. 0xff, 0x00, 0x00}, /* mask */
  1008.     {"OSIZE", itOsize,    OP1,0,
  1009.      0x66, 0x00, 0x00, /* opcode */
  1010. 0xff, 0x00, 0x00}, /* mask */
  1011.     {"POPA", itPopa,      OP1,0,
  1012.      0x61, 0x00, 0x00, /* opcode */
  1013. 0xff, 0x00, 0x00}, /* mask */
  1014.     {"POPF", itPopf,      OP1,0,
  1015.      0x9d, 0x00, 0x00, /* opcode */
  1016. 0xff, 0x00, 0x00}, /* mask */
  1017.     {"PUSHA", itPusha,    OP1,0,
  1018.      0x60, 0x00, 0x00, /* opcode */
  1019. 0xff, 0x00, 0x00}, /* mask */
  1020.     {"PUSHF", itPushf,    OP1,0,
  1021.      0x9c, 0x00, 0x00, /* opcode */
  1022. 0xff, 0x00, 0x00}, /* mask */
  1023.     {"REP", itRep, OP1,0,
  1024.      0xf3, 0x00, 0x00, /* opcode */
  1025. 0xff, 0x00, 0x00}, /* mask */
  1026.     {"REPNE", itRepNe, OP1,0,
  1027.      0xf2, 0x00, 0x00, /* opcode */
  1028. 0xff, 0x00, 0x00}, /* mask */
  1029.     {"RET", itRet,        OP1,0,
  1030.      0xc3, 0x00, 0x00, /* opcode */
  1031. 0xff, 0x00, 0x00}, /* mask */
  1032.     {"RET", itRetI,       OP1|D16,0,
  1033.      0xc2, 0x00, 0x00, /* opcode */
  1034. 0xff, 0x00, 0x00}, /* mask */
  1035.     {"RET", itRetSeg,     OP1,0,
  1036.      0xcb, 0x00, 0x00, /* opcode */
  1037. 0xff, 0x00, 0x00}, /* mask */
  1038.     {"RET", itRetSegI,    OP1|D16,0,
  1039.      0xca, 0x00, 0x00, /* opcode */
  1040. 0xff, 0x00, 0x00}, /* mask */
  1041.     {"SAHF", itSahf,      OP1,0,
  1042.      0x9e, 0x00, 0x00, /* opcode */
  1043. 0xff, 0x00, 0x00}, /* mask */
  1044.     {"SS", itSs,          OP1,0,
  1045.      0x36, 0x00, 0x00, /* opcode */
  1046. 0xff, 0x00, 0x00}, /* mask */
  1047.     {"STC", itStc,        OP1,0,
  1048.      0xf9, 0x00, 0x00, /* opcode */
  1049. 0xff, 0x00, 0x00}, /* mask */
  1050.     {"STD", itStd,        OP1,0,
  1051.      0xfd, 0x00, 0x00, /* opcode */
  1052. 0xff, 0x00, 0x00}, /* mask */
  1053.     {"STI", itSti,        OP1,0,
  1054.      0xfb, 0x00, 0x00, /* opcode */
  1055. 0xff, 0x00, 0x00}, /* mask */
  1056.     {"WAIT", itWait,      OP1,0,
  1057.      0x9b, 0x00, 0x00, /* opcode */
  1058. 0xff, 0x00, 0x00}, /* mask */
  1059.     {"XLAT", itXlat,      OP1|WFUL,0,
  1060.      0xd7, 0x00, 0x00, /* opcode */
  1061. 0xff, 0x00, 0x00}, /* mask */
  1062.     /* 7 bits mask */
  1063.     {"ADC", itAdcItoA,    SF|WFUL|IMM|AX,0,
  1064.      0x14, 0x00, 0x00, /* opcode */
  1065. 0xfe, 0x00, 0x00}, /* mask */
  1066.     {"ADD", itAddItoA,    SF|WFUL|IMM|AX,0,
  1067.      0x04, 0x00, 0x00, /* opcode */
  1068. 0xfe, 0x00, 0x00}, /* mask */
  1069.     {"AND", itAndItoA,    SF|WFUL|IMM|AX,0,
  1070.      0x24, 0x00, 0x00, /* opcode */
  1071. 0xfe, 0x00, 0x00}, /* mask */
  1072.     {"CMP", itCmpIwiA,    SF|WFUL|IMM|AX,0,
  1073.      0x3c, 0x00, 0x00, /* opcode */
  1074. 0xfe, 0x00, 0x00}, /* mask */
  1075.     {"CMPS", itCmps,      OP1|WFUL,0,
  1076.      0xa6, 0x00, 0x00, /* opcode */
  1077. 0xfe, 0x00, 0x00}, /* mask */
  1078.     {"IMUL", itImulRMwiI,  OP1|SEXT|MODRM|REG|IMM,0,
  1079.      0x69, 0x00, 0x00, /* opcode */
  1080. 0xfd, 0x00, 0x00}, /* mask */
  1081.     {"IN", itInF,         OP1|WFUL|PORT|AX,0,
  1082.      0xe4, 0x00, 0x00, /* opcode */
  1083. 0xfe, 0x00, 0x00}, /* mask */
  1084.     {"IN", itInV,         OP1|WFUL|AX,0,
  1085.      0xec, 0x00, 0x00, /* opcode */
  1086. 0xfe, 0x00, 0x00}, /* mask */
  1087.     {"INS", itIns,        OP1|WFUL,0,
  1088.      0x6c, 0x00, 0x00, /* opcode */
  1089. 0xfe, 0x00, 0x00}, /* mask */
  1090.     {"LODS", itLods,      OP1|WFUL,0,
  1091.      0xac, 0x00, 0x00, /* opcode */
  1092. 0xfe, 0x00, 0x00}, /* mask */
  1093.     {"MOV", itMovRMtoS,   OP1|DISR|MODRM|SREG3,0,
  1094.      0x8c, 0x00, 0x00, /* opcode */
  1095. 0xfd, 0x00, 0x00}, /* mask */
  1096.     {"MOVS", itMovs,      OP1|WFUL,0,
  1097.      0xa4, 0x00, 0x00, /* opcode */
  1098. 0xfe, 0x00, 0x00}, /* mask */
  1099.     {"OR", itOrItoA,      SF|WFUL|IMM|AX,0,
  1100.      0x0c, 0x00, 0x00, /* opcode */
  1101. 0xfe, 0x00, 0x00}, /* mask */
  1102.     {"OUT", itOutF,       OP1|WFUL|PORT|AX,0,
  1103.      0xe6, 0x00, 0x00, /* opcode */
  1104. 0xfe, 0x00, 0x00}, /* mask */
  1105.     {"OUT", itOutV,       OP1|WFUL|AX,0,
  1106.      0xee, 0x00, 0x00, /* opcode */
  1107. 0xfe, 0x00, 0x00}, /* mask */
  1108.     {"OUTS", itOuts,      OP1|WFUL,0,
  1109.      0x6e, 0x00, 0x00, /* opcode */
  1110. 0xfe, 0x00, 0x00}, /* mask */
  1111.     {"PUSH", itPushI,     OP1|SEXT|IMM,0,
  1112.      0x68, 0x00, 0x00, /* opcode */
  1113. 0xfd, 0x00, 0x00}, /* mask */
  1114.     {"SBB", itSbbIfrA,    SF|WFUL|IMM|AX,0,
  1115.      0x1c, 0x00, 0x00, /* opcode */
  1116. 0xfe, 0x00, 0x00}, /* mask */
  1117.     {"SCAS", itScas,      OP1|WFUL,0,
  1118.      0xae, 0x00, 0x00, /* opcode */
  1119. 0xfe, 0x00, 0x00}, /* mask */
  1120.     {"SHRO", itRolRMby1,  OP1|WFUL|MODRM|TTT,0,
  1121.      0xd0, 0x00, 0x00, /* opcode */
  1122. 0xfe, 0x00, 0x00}, /* mask */
  1123.     {"SHRO", itRolRMbyCL,  OP1|WFUL|MODRM|TTT|CL,0,
  1124.      0xd2, 0x00, 0x00, /* opcode */
  1125. 0xfe, 0x00, 0x00}, /* mask */
  1126.     {"SHRO", itRolRMbyI,  OP1|WFUL|MODRM|TTT|I8,0,
  1127.      0xc0, 0x00, 0x00, /* opcode */
  1128. 0xfe, 0x00, 0x00}, /* mask */
  1129.     {"STOS", itStos,      OP1|WFUL,0,
  1130.      0xaa, 0x00, 0x00, /* opcode */
  1131. 0xfe, 0x00, 0x00}, /* mask */
  1132.     {"SUB", itSubIfrA,    SF|WFUL|IMM|AX,0,
  1133.      0x2c, 0x00, 0x00, /* opcode */
  1134. 0xfe, 0x00, 0x00}, /* mask */
  1135.     {"TEST", itTestRManR,  OP1|WFUL|MODRM|REG,0,
  1136.      0x84, 0x00, 0x00, /* opcode */
  1137. 0xfe, 0x00, 0x00}, /* mask */
  1138.     {"TEST", itTestIanA,  SF|WFUL|IMM|AX,0,
  1139.      0xa8, 0x00, 0x00, /* opcode */
  1140. 0xfe, 0x00, 0x00}, /* mask */
  1141.     {"XCHG", itXchgRM,    OP1|WFUL|MODRM|REG,0,
  1142.      0x86, 0x00, 0x00, /* opcode */
  1143. 0xfe, 0x00, 0x00}, /* mask */
  1144.     {"XOR", itXorItoA,     SF|WFUL|IMM|AX,0,
  1145.      0x34, 0x00, 0x00, /* opcode */
  1146. 0xfe, 0x00, 0x00}, /* mask */
  1147.     /* 6 bits mask */
  1148.     {"ADC", itAdcRMtoRM,  OP1|DISR|WFUL|MODRM|REG,0,
  1149.      0x10, 0x00, 0x00, /* opcode */
  1150. 0xfc, 0x00, 0x00}, /* mask */
  1151.     {"ADD", itAddRMtoRM,  OP1|DISR|WFUL|MODRM|REG,0,
  1152.      0x00, 0x00, 0x00, /* opcode */
  1153. 0xfc, 0x00, 0x00}, /* mask */
  1154.     {"AND", itAndRMtoRM,  OP1|DISR|WFUL|MODRM|REG,0,
  1155.      0x20, 0x00, 0x00, /* opcode */
  1156. 0xfc, 0x00, 0x00}, /* mask */
  1157.     {"CMP", itCmpRMwiRM,  OP1|DISR|WFUL|MODRM|REG,0,
  1158.      0x38, 0x00, 0x00, /* opcode */
  1159. 0xfc, 0x00, 0x00}, /* mask */
  1160.     {"MOV", itMovRMtoMR,  OP1|DISR|WFUL|MODRM|REG,0,
  1161.      0x88, 0x00, 0x00, /* opcode */
  1162. 0xfc, 0x00, 0x00}, /* mask */
  1163.     {"MOV", itMovAMtoMA,  SF|DISR|WFUL|DIS|AX,0,
  1164.      0xa0, 0x00, 0x00, /* opcode */
  1165. 0xfc, 0x00, 0x00}, /* mask */
  1166.     {"OR", itOrRMtoRM,    OP1|DISR|WFUL|MODRM|REG,0,
  1167.      0x08, 0x00, 0x00, /* opcode */
  1168. 0xfc, 0x00, 0x00}, /* mask */
  1169.     {"POP", itPopS,       OP1|REG,0,
  1170.      0x07, 0x00, 0x00, /* opcode */
  1171. 0xe7, 0x00, 0x00}, /* mask */
  1172.     {"PUSH", itPushS,     OP1|SREG2,0,
  1173.      0x06, 0x00, 0x00, /* opcode */
  1174. 0xe7, 0x00, 0x00}, /* mask */
  1175.     {"SBB", itSbbRMfrRM,  OP1|DISR|WFUL|MODRM|REG,0,
  1176.      0x18, 0x00, 0x00, /* opcode */
  1177. 0xfc, 0x00, 0x00}, /* mask */
  1178.     {"SUB", itSubRMfrRM,  OP1|DISR|WFUL|MODRM|REG,0,
  1179.      0x28, 0x00, 0x00, /* opcode */
  1180. 0xfc, 0x00, 0x00}, /* mask */
  1181.     {"XOR", itXorRMtoRM,   OP1|DISR|WFUL|MODRM|REG,0,
  1182.      0x30, 0x00, 0x00, /* opcode */
  1183. 0xfc, 0x00, 0x00}, /* mask */
  1184.     /* 5 bits mask */
  1185.     {"DEC", itDecR,       SF|REG,0,
  1186.      0x48, 0x00, 0x00, /* opcode */
  1187. 0xf8, 0x00, 0x00}, /* mask */
  1188.     {"INC", itIncR,       SF|REG,0,
  1189.      0x40, 0x00, 0x00, /* opcode */
  1190. 0xf8, 0x00, 0x00}, /* mask */
  1191.     {"POP", itPopR,       SF|REG,0,
  1192.      0x58, 0x00, 0x00, /* opcode */
  1193. 0xf8, 0x00, 0x00}, /* mask */
  1194.     {"PUSH", itPushR,     SF|REG,0,
  1195.      0x50, 0x00, 0x00, /* opcode */
  1196. 0xf8, 0x00, 0x00}, /* mask */
  1197.     {"XCHG", itXchgA,     SF|REG|AX,0,
  1198.      0x90, 0x00, 0x00, /* opcode */
  1199. 0xf8, 0x00, 0x00}, /* mask */
  1200.     /* 4 bits mask */
  1201.     {"CJMPS", itCjmp,     OP1|TTTN|D8,0,
  1202.      0x70, 0x00, 0x00, /* opcode */
  1203. 0xf0, 0x00, 0x00}, /* mask */
  1204.     {"MOV", itMovItoR,    SF|WFUL|REG|IMM,0,
  1205.      0xb0, 0x00, 0x00, /* opcode */
  1206. 0xf0, 0x00, 0x00}, /* mask */
  1207.     {NULL, 0, 0,0,
  1208.      0x00, 0x00, 0x00, /* opcode */
  1209. 0x00, 0x00, 0x00}, /* mask */
  1210.     };
  1211. /* reg[d32=0,1][reg field=0 - 7] */
  1212. LOCAL char *reg[2][8] = 
  1213.     {
  1214.     {"AX",  "CX",  "DX",  "BX",  "SP",  "BP",  "SI",  "DI"},
  1215.     {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"},
  1216.     };
  1217. /* regw[d32=0,1][w bit=0,1][reg field=0 - 7] */
  1218. LOCAL char *regw[2][2][8] = 
  1219.     {
  1220.     {{"AL",  "CL",  "DL",  "BL",  "AH",  "CH",  "DH",  "BH"},
  1221.      {"AX",  "CX",  "DX",  "BX",  "SP",  "BP",  "SI",  "DI"}},
  1222.     {{"AL",  "CL",  "DL",  "BL",  "AH",  "CH",  "DH",  "BH"},
  1223.      {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"}},
  1224.     };
  1225. LOCAL char * regmmx[8] = /* MMX registers */
  1226.     {
  1227.     "MM0", "MM1", "MM2", "MM3", "MM4", "MM5", "MM6", "MM7"
  1228.     };
  1229.     
  1230. LOCAL char * regxmm[8] = /* XMM registers */
  1231.     {
  1232.     "XMM0", "XMM1", "XMM2", "XMM3", "XMM4", "XMM5", "XMM6", "XMM7"
  1233.     };    
  1234. LOCAL char * gg[4] = /* MMX instructions packed granularities */
  1235.     {
  1236.     "B", /* packed bytes                          */
  1237.     "W", /* packed words                          */
  1238.     "D", /* packed double words                   */
  1239.     "Q" /* packed quad words                     */
  1240.     };
  1241. /* immL[d32=0,1][w bit=0,1] */
  1242. LOCAL char immL[2][2] = { {1,2},{1,4} };
  1243. /* segment registers, sreg3[sreg3=0-7] */
  1244. LOCAL char *sreg3[8] = { "ES","CS","SS","DS","FS","GS","--","--" };
  1245. /* segment registers, sreg2[sreg2=0-3] */
  1246. LOCAL char *sreg2[4] = { "ES","CS","SS","DS" };
  1247. /* shift rotate opecodes, ttt[ttt=0-7] */
  1248. LOCAL char *ttt[8] = { "ROL","ROR","RCL","RCR","SHL","SHR","---","SAR" };
  1249. /* conditional jump opecodes, tttn[tttn=0-15] */
  1250. LOCAL char *tttn[16] = 
  1251.     { 
  1252.     "O","NO","B","NB","E","NE","BE","NBE",
  1253.     "S","NS","P","NP","L","NL","LE","NLE"
  1254.     };
  1255. /* control registers, */
  1256. LOCAL char *eeec[8] = { "CR0","---","CR2","CR3","CR4","---","---","---" };
  1257. /* debug registers, */
  1258. LOCAL char *eeed[8] = { "DR0","DR1","DR2","DR3","DR4","DR5","DR6","DR7" };
  1259. /* test registers, */
  1260. LOCAL char *eeet[8] = { "---","---","---","---","---","---","TR6","TR7" };
  1261. /* modrm format */
  1262. LOCAL char *modrm[2][3][8] = 
  1263.     {
  1264.     {{"[BX+SI]", "[BX+DI]",
  1265.       "[BP+SI]", "[BP+DI]",
  1266.       "[SI]", "[DI]",
  1267.       "0x%04x", "[BX]"},
  1268.      {"[BX+SI+%d]", "[BX+DI+%d]", 
  1269.       "[BX+SI+%d]", "[BX+DI+%d]", 
  1270.       "[SI+%d]", "[DI+%d]", 
  1271.       "[BP+%d]", "[BX+%d]"},
  1272.      {"[BX+SI+%d]", "[BX+DI+%d]", 
  1273.       "[BX+SI+%d]", "[BX+DI+%d]",
  1274.       "[SI+%d]", "[DI+%d]", 
  1275.       "[BP+%d]", "[BX+%d]"}},
  1276.     {{"[EAX]", "[ECX]", 
  1277.       "[EDX]", "[EBX]",
  1278.       "sib", "0x%08x", 
  1279.       "[ESI]", "[EDI]"},
  1280.      {"[EAX+%d]", "[ECX+%d]", 
  1281.       "[EDX+%d]", "[EBX+%d]",
  1282.       "sib", "[EBP+%d]", 
  1283.       "[ESI+%d]", "[EDI+%d]"},
  1284.      {"[EAX+%d]", "[ECX+%d]", 
  1285.       "[EDX+%d]", "[EBX+%d]",
  1286.       "sib", "[EBP+%d]", 
  1287.       "[ESI+%d]", "[EDI+%d]"}}
  1288.     };
  1289. /* sib format */
  1290. LOCAL char *sib[3][8] = 
  1291.     {
  1292.     {"[EAX+(%3s%2s)]", "[ECX+(%3s%2s)]", 
  1293.      "[EDX+(%3s%2s)]", "[EBX+(%3s%2s)]",
  1294.      "[ESP+(%3s%2s)]", "[0x%08x+(%3s%2s)]",
  1295.      "[ESI+(%3s%2s)]", "[EDI+(%3s%2s)]"},
  1296.     {"[EAX+(%3s%2s)+%d]", "[ECX+(%3s%2s)+%d]",
  1297.      "[EDX+(%3s%2s)+%d]", "[EBX+(%3s%2s)+%d]",
  1298.      "[ESP+(%3s%2s)+%d]", "[EBP+(%3s%2s)+%d]",
  1299.      "[ESI+(%3s%2s)+%d]", "[EDI+(%3s%2s)+%d]"},
  1300.     {"[EAX+(%3s%2s)+%d]", "[ECX+(%3s%2s)+%d]",
  1301.      "[EDX+(%3s%2s)+%d]", "[EBX+(%3s%2s)+%d]",
  1302.      "[ESP+(%3s%2s)+%d]", "[EBP+(%3s%2s)+%d]",
  1303.      "[ESI+(%3s%2s)+%d]", "[EDI+(%3s%2s)+%d]"}
  1304.     };
  1305. /* scale */
  1306. LOCAL char *scale[4] = { "x1","x2","x4","x8" };
  1307. /* indexR */
  1308. LOCAL char *indexR[8] = { "EAX","ECX","EDX","EBX","no-","EBP","ESI","EDI" };
  1309. /* st */
  1310. LOCAL char *st = "ST(%d)";
  1311. /* mf */
  1312. LOCAL char *mf[4] = { "r32", "---", "r64", "---" };
  1313. /* CMPSS variations */
  1314. LOCAL char *cmpss[8] = { "CMPEQSS",            /* imm = 0 */
  1315.                          "CMPLTSS",            /* imm = 1 */
  1316.                          "CMPLESS",            /* imm = 2 */
  1317.                          "CMPUNORDSS",         /* imm = 3 */
  1318.                          "CMPNEQSS",           /* imm = 4 */
  1319.                          "CMPNLTSS",           /* imm = 5 */
  1320.                          "CMPNLESS",           /* imm = 6 */
  1321.                          "CMPORDSS" };         /* imm = 7 */
  1322. LOCAL char *cmpps[8] = { "CMPEQPS",            /* imm = 0 */
  1323.                          "CMPLTPS",            /* imm = 1 */
  1324.                          "CMPLEPS",            /* imm = 2 */
  1325.                          "CMPUNORDPS",         /* imm = 3 */
  1326.                          "CMPNEQPS",           /* imm = 4 */
  1327.                          "CMPNLTPS",           /* imm = 5 */
  1328.                          "CMPNLEPS",           /* imm = 6 */
  1329.                          "CMPORDPS" };         /* imm = 7 */
  1330. LOCAL int prefixAsize = 0; /* prefix Address Size, 0x67 */
  1331. LOCAL int prefixOsize = 0; /* prefix Operand Size, 0x66 */
  1332. int dsmAsize = 1; /* 32 bits address size */
  1333. int dsmDsize = 1; /* 32 bits data size */
  1334. int dsmDebug = 0; /* debug flag */
  1335. char * instKeeper = NULL; /* keeps instruction string */
  1336. /* forward declarations */
  1337. LOCAL void dsmPass1 (FORMAT_X *pX, FORMAT_Y *pY);
  1338. LOCAL void dsmPass2 (FORMAT_X *pX, FORMAT_Y *pY);
  1339. /*******************************************************************************
  1340. *
  1341. * dsmFind - disassemble one instruction
  1342. *
  1343. * This routine figures out which instruction is pointed to by pD.
  1344. *
  1345. * RETURNS: N/A
  1346. */
  1347. LOCAL void dsmFind
  1348.     (
  1349.     FAST UCHAR *pD, /* Pointer to the instruction */
  1350.     FORMAT_X *pX, /* Pointer to the FORMAT_X */
  1351.     FORMAT_Y *pY  /* Pointer to the FORMAT_Y */
  1352.     )
  1353.     {
  1354.     INST *pI;
  1355.     
  1356.     pX->pD = (char *)pD;
  1357.     if (prefixAsize)
  1358.         pX->a32 = ~dsmAsize & 0x1;
  1359.     else
  1360.         pX->a32 = dsmAsize;
  1361.     if (prefixOsize)
  1362.         pX->d32 = ~dsmDsize & 0x1;
  1363.     else
  1364.         pX->d32 = dsmDsize;
  1365.     pX->w = 1;
  1366.     for (pI = &inst[0]; pI->mask0 != 0; pI++)
  1367.         {
  1368.         if ((pI->op0 == (*pD & pI->mask0)) &&
  1369.          (pI->op1 == (*(pD + 1) & pI->mask1)) &&
  1370.          (pI->op2 == (*(pD + 2) & pI->mask2)))
  1371.          {
  1372.     break;
  1373.          }
  1374. }
  1375.     
  1376.     if (pI->mask0 == 0)
  1377. {
  1378.         errnoSet (S_dsmLib_UNKNOWN_INSTRUCTION);
  1379. if (dsmDebug)
  1380.             printf ("unknown instruction.  pD = 0x%x %x %x %xn",(UCHAR)*pD,
  1381.                 (UCHAR)*(pD + 1), (UCHAR)*(pD + 2), (UCHAR)*(pD + 3));
  1382.         return;
  1383. }
  1384.     
  1385.     pX->pI = pI;
  1386.     
  1387.     dsmPass1 (pX, pY);
  1388.     if (pX->pI->type == itAsize) /* set prefixAsize for next inst. */
  1389. prefixAsize = 1;
  1390.     else
  1391. prefixAsize = 0;
  1392.     if (pX->pI->type == itOsize) /* set prefixOsize for next inst. */
  1393. prefixOsize = 1;
  1394.     else
  1395. prefixOsize = 0;
  1396.     if (dsmDebug)
  1397. {
  1398.         printf ("FORMAT_X INST   pOpc = %sn", pX->pI->pOpc);
  1399.         printf ("                type = 0x%xn", pX->pI->type);
  1400.         printf ("                flag = 0x%xn", pX->pI->flag);
  1401.         printf ("        pD = 0x%x %x %x %xn", (UCHAR)*pX->pD,
  1402.             (UCHAR)*(pX->pD + 1), (UCHAR)*(pX->pD + 2), (UCHAR)*(pX->pD + 3));
  1403.         printf ("        lenO, lenD, lenI = %d, %d, %dn", pX->lenO,
  1404.             pX->lenD, pX->lenI);
  1405.         printf ("        d32, a32 = %d, %dn", pX->d32, pX->a32);
  1406.         printf ("        modrm, sib = %d, %dn", pX->modrm, pX->sib);
  1407.         printf ("        w s d = %d %d %dn", pX->w, pX->s, pX->d);
  1408.         printf ("        mod reg rm = %d %d %dn", pX->mod, pX->reg, pX->rm);
  1409.         printf ("        ss index base = %d %d %dn", pX->ss, pX->index,
  1410.     pX->base);
  1411. }
  1412.     
  1413.     dsmPass2 (pX, pY);
  1414.     
  1415.     if (dsmDebug)
  1416. {
  1417.         printf ("FORMAT_Y len = %dn", pY->len);
  1418.         printf ("        obuf = %sn", pY->obuf);
  1419.         printf ("        rbuf = %sn", pY->rbuf);
  1420.         printf ("        mbuf = %sn", pY->mbuf);
  1421.         printf ("        ibuf = %sn", pY->ibuf);
  1422.         printf ("        dbuf = %sn", pY->dbuf);
  1423. }
  1424.     return;
  1425.     }
  1426. /*******************************************************************************
  1427. *
  1428. * dsmPass1 - fill FORMAT_X structure.
  1429. *
  1430. * RETURNS: N/A
  1431. */
  1432. LOCAL void dsmPass1
  1433.     (
  1434.     FORMAT_X *pX,
  1435.     FORMAT_Y *pY 
  1436.     )
  1437.     {
  1438.     char *pS;
  1439.     /* pX->lenO = size of Opcode in bytes = 1, 2, or 3 */
  1440.     if (pX->pI->flag & OP3)
  1441.         pX->lenO = 3;
  1442.     else if (pX->pI->flag & OP2) 
  1443. pX->lenO = 2;
  1444.     else
  1445. pX->lenO = 1;
  1446.     /* get a Opecode */
  1447.     if (pX->pI->flag & TTTN)
  1448. {
  1449. instKeeper = pX->pI->pOpc;
  1450. pS = tttn[*(pX->pD + pX->lenO - 1) & 0x0f];
  1451. if (pX->pI->type == itCjmp)
  1452.     {
  1453.     bcopy ("J  ", pY->obuf, 3);
  1454.     bcopy (pS, &pY->obuf[1], strlen (pS));
  1455.     }
  1456. if (pX->pI->type == itCset)
  1457.     {
  1458.     bcopy ("SET", pY->obuf, 3);
  1459.     bcopy (pS, &pY->obuf[3], strlen (pS));
  1460.     }
  1461. if (pX->pI->type == itCmovcc)
  1462.     {
  1463.     bcopy ("CMOV", pY->obuf, 4);
  1464.     bcopy (pS, &pY->obuf[4], strlen (pS));
  1465.     }
  1466. pX->pI->pOpc = pY->obuf;
  1467. }
  1468.     if (pX->pI->flag & TTT)
  1469. pX->pI->pOpc = ttt[(*(pX->pD + pX->lenO) & 0x38) >> 3];
  1470.     /* get an MMX granularity */
  1471.     if (pX->pI->flag & GG)
  1472. {
  1473. instKeeper = pX->pI->pOpc;
  1474. pS = gg[*(pX->pD + pX->lenO - 1) & 0x03];
  1475. bcopy (pX->pI->pOpc, pY->obuf, strlen (pX->pI->pOpc));
  1476. bcopy (pS, &pY->obuf[strlen (pX->pI->pOpc)], strlen (pS));
  1477. pX->pI->pOpc = pY->obuf;
  1478. }
  1479.     /* get a W */
  1480.     if (pX->pI->flag & WFUL)
  1481. {
  1482. pX->w = *(pX->pD + pX->lenO - 1) & 0x01;
  1483. if (pX->pI->type == itMovItoR)
  1484.     pX->w = (*pX->pD & 0x08) >> 3;
  1485. }
  1486.     /* get a S */
  1487.     if (pX->pI->flag & SEXT)
  1488. pX->s = (*(pX->pD + pX->lenO - 1) & 0x02) >> 1;
  1489.     /* 
  1490.      * get a D 
  1491.      *
  1492.      * jhw - for our representation of data direction:
  1493.      *           pX->d = 0 is an r/m -> reg transfer 
  1494.      *           pX->d = 1 is a  reg -> r/m transfer
  1495.      */
  1496.     if (pX->pI->flag & DISR)
  1497.         {
  1498.         /* 
  1499.  * MMX instructions reference least significant opcode byte bit 4 for 
  1500.          * data direction information.
  1501.          *
  1502.          * for Intel's representation:
  1503.          *    D bit = 0 is an r/m -> reg transfer 
  1504.          *    D bit = 1 is a  reg -> r/m transfer 
  1505.          */
  1506.                
  1507.         if (pX->pI->flag & (MMXREG|MMXRM))
  1508.             pX->d = (*(pX->pD + pX->lenO - 1) & 0x10) >> 4;
  1509.         /* 
  1510.  * XMM instructions reference least significant opcode byte bit 0 for 
  1511.          * data direction information.
  1512.          *
  1513.          * for Intel's representation:
  1514.          *    D bit = 0 is an r/m -> reg transfer 
  1515.          *    D bit = 1 is a  reg -> r/m transfer 
  1516.          */
  1517.       
  1518.         else if (pX->pI->flag2 & (XMMREG|XMMRM))
  1519.              pX->d = (*(pX->pD + pX->lenO - 1) & 0x01);
  1520.         /* 
  1521.  * all others use least significant byte bit 1 for 
  1522.          * data direction information.
  1523.          * 
  1524.          * BUT... all other instructions use the opposite representation!
  1525.          *
  1526.  * for Intel's representation:
  1527.          *    D bit = 1 is an r/m -> reg transfer 
  1528.          *    D bit = 0 is a  reg -> r/m transfer 
  1529.          */
  1530.         else
  1531.             /* invert the state */
  1532.             pX->d = (*(pX->pD + pX->lenO - 1) & 0x02) ? 0 : 1;
  1533. /* evaluate the special case instructions! */
  1534. /*
  1535.  * PEXTRW is a SIMD instruction, but it operates on MMX
  1536.  * register. Therefore it deviates from the above rules.
  1537.  * The DISR flag is included in the definition because
  1538.  * the data dir is reg -> r/m regardless.
  1539.  */
  1540. if (pX->pI->type == itPextrw)
  1541.             pX->d = 1;
  1542. }
  1543.     /* get a REG */
  1544.     if (pX->pI->flag & SREG2)
  1545.         pX->reg = (*pX->pD & 0x18) >> 3;
  1546.     if (pX->pI->flag & SREG3)
  1547.         pX->reg = (*(pX->pD + pX->lenO) & 0x38) >> 3;
  1548.     if ( (pX->pI->flag & REG) || 
  1549.       (pX->pI->flag & MMXREG) ||
  1550.  (pX->pI->flag2 & XMMREG))    
  1551. {
  1552. if (pX->pI->flag & SF)
  1553.     pX->reg = *pX->pD & 0x07;
  1554. else if (pX->pI->flag & MODRM)
  1555.     pX->reg = (*(pX->pD + pX->lenO) & 0x38) >> 3;
  1556.         else
  1557.             {
  1558.             printf ("dsmLib.c error 0: Invalid opcode flag definition.n");
  1559.             printf ("top = 0x%02x 0x%02x 0x%02x 0x%02xn",
  1560.                     (UCHAR)*pX->pD, (UCHAR)*(pX->pD + 1),
  1561.                     (UCHAR)*(pX->pD + 2), (UCHAR)*(pX->pD + 3));
  1562.             }
  1563. }
  1564.     if (pX->pI->flag & EEE)
  1565.         pX->reg = (*(pX->pD + pX->lenO) & 0x38) >> 3;
  1566.     /* get a ST for 387*/
  1567.     if (pX->pI->flag & ST)
  1568. pX->st = *(pX->pD + pX->lenO - 1) & 0x07;
  1569.     /* get a MF for 387*/
  1570.     if (pX->pI->flag & MF)
  1571. pX->mf = (*pX->pD & 0x06) >> 1;
  1572.     /* get a FD for 387 */
  1573.     if (pX->pI->flag & FD)
  1574. pX->fd = *pX->pD & 0x04;
  1575.     /* get a size of Immediate, 0, 1, 2, 4 */
  1576.     if (pX->pI->flag & I8)
  1577. pX->lenI = 1;
  1578.     if (pX->pI->flag & IMM)
  1579. {
  1580. if (pX->s)
  1581.     pX->lenI = 1;
  1582. else
  1583.     pX->lenI = immL[(int)pX->d32][(int)pX->w];
  1584. }
  1585.     if (pX->pI->flag & OFFSEL)
  1586. {
  1587. /* 
  1588.  * CALL/JMP ptr16:16/32
  1589.  * The operand size attribute determines the size of offset (16/32).
  1590.  * The operand size attribute is the D flag in the segment desc.
  1591.  * The instruction prefix 0x66 can be used to select an operand
  1592.  * size other than the default.
  1593.  */
  1594. if (pX->d32)
  1595.     pX->lenI = 4;
  1596. else
  1597.     pX->lenI = 2;
  1598. }
  1599.     if ((pX->pI->flag & D16L8) || (pX->pI->flag & PORT))
  1600. pX->lenI = 2;
  1601.     /* get a size of Displacement, 0, 1, 2, 4 */
  1602.     if (pX->pI->flag & D8)
  1603. pX->lenD = 1;
  1604.     if (pX->pI->flag & (DIS|D16))
  1605. {
  1606. if (pX->pI->flag & WFUL)
  1607.     {
  1608.     if (pX->pI->type == itMovAMtoMA)
  1609. pX->lenD = immL[(int)pX->a32][(int)pX->w];
  1610.     else
  1611. pX->lenD = immL[(int)pX->d32][(int)pX->w];
  1612.     }
  1613. else
  1614.     pX->lenD = immL[(int)pX->d32][(int)pX->w];
  1615. }
  1616.     if (pX->pI->flag & OFFSEL)
  1617. pX->lenD = 2;
  1618.     if (pX->pI->flag & D16L8)
  1619. pX->lenD = 1;
  1620.     if (pX->pI->flag & MODRM)
  1621. {
  1622. pX->modrm = 1;
  1623. pY->pD = pX->pD + pX->lenO;
  1624. pX->mod = (*pY->pD & 0xc0) >> 6;
  1625. pX->rm = *pY->pD & 0x07;
  1626. if ((pX->a32 == 0) && (pX->mod != 3))
  1627.     {
  1628.     if (pX->mod == 1)
  1629. pX->lenD = 1;
  1630.     else if ((pX->mod == 2) || ((pX->mod == 0) && (pX->rm == 6)))
  1631. pX->lenD = 2;
  1632.     }
  1633. if ((pX->a32 == 1) && (pX->mod != 3))
  1634.     {
  1635.     if (pX->rm == 4)
  1636. {
  1637.         pX->sib = 1;
  1638.         pY->pD = pX->pD + pX->lenO + pX->modrm;
  1639.         pX->ss = (*pY->pD & 0xc0) >> 6;
  1640.         pX->index = (*pY->pD & 0x38) >> 3;
  1641.         pX->base = *pY->pD & 0x07;
  1642.         if (pX->mod == 1)
  1643.     pX->lenD = 1;
  1644.         else if ((pX->mod == 2) || ((pX->mod == 0) && (pX->base == 5)))
  1645.     pX->lenD = 4;
  1646. }
  1647.     else
  1648. {
  1649.         if (pX->mod == 1)
  1650.     pX->lenD = 1;
  1651.         else if ((pX->mod == 2) || ((pX->mod == 0) && (pX->rm == 5)))
  1652.     pX->lenD = 4;
  1653. }
  1654.     }
  1655. }
  1656.     }
  1657.     
  1658. /*******************************************************************************
  1659. *
  1660. * dsmPass2 - fill FORMAT_Y structure.
  1661. *
  1662. * RETURNS: N/A
  1663. */
  1664. LOCAL void dsmPass2
  1665.     (
  1666.     FORMAT_X *pX,
  1667.     FORMAT_Y *pY 
  1668.     )
  1669.     {
  1670.     FAST char *pS = 0;
  1671.     /* get an instruction length, pY->len */
  1672.     pY->len = pX->lenO + pX->modrm + pX->sib + pX->lenD + pX->lenI;
  1673.     /* get an opecode pointer, pY->pOpc */
  1674.     pY->pOpc = pX->pI->pOpc;
  1675.     if (pX->pI->flag & MF)
  1676.         {
  1677.         pS = pY->obuf;
  1678.         if (pX->mf & 1)
  1679.     {
  1680.     bcopy (pX->pI->pOpc, pS + 1, strlen (pX->pI->pOpc));
  1681.     bcopy ("FI", pS, 2);
  1682.     }
  1683.         else
  1684.     {
  1685.     bcopy (pX->pI->pOpc, pS, strlen (pX->pI->pOpc));
  1686.     strcat (pS, mf[(int)pX->mf]);
  1687.     }
  1688.         pY->pOpc = pY->obuf;
  1689.         }
  1690.     if (pX->pI->flag & POP)
  1691.         {
  1692.         bcopy (pX->pI->pOpc, pY->obuf, strlen (pX->pI->pOpc));
  1693.         strcat (pY->obuf, "P");
  1694.         pY->pOpc = pY->obuf;
  1695.         }
  1696.     /* get a register operand buffer, pY->rbuf */
  1697.     if (pX->pI->flag & SREG2)
  1698.         bcopy (sreg2[(int)pX->reg], pY->rbuf, strlen (sreg2[(int)pX->reg]));
  1699.     if (pX->pI->flag & SREG3)
  1700.         bcopy (sreg3[(int)pX->reg], pY->rbuf, strlen (sreg3[(int)pX->reg]));
  1701.     /* get register number */
  1702.     if (pX->pI->flag & REG)
  1703.         {
  1704.         if (pX->pI->flag & WFUL)
  1705.     pS = regw[(int)pX->d32][(int)pX->w][(int)pX->reg];
  1706.         else
  1707.     pS = reg[(int)pX->d32][(int)pX->reg];
  1708.         bcopy (pS, pY->rbuf, strlen (pS));
  1709.         }
  1710.     /* get MMX register number */
  1711.     if (pX->pI->flag & MMXREG)
  1712. {
  1713. pS = regmmx[ (int) pX->reg];
  1714. bcopy (pS, pY->rbuf, strlen (pS));
  1715. }
  1716.     /* XMM register */
  1717.     if (pX->pI->flag2 & XMMREG)
  1718.         {
  1719. pS = regxmm[ (int) pX->reg];
  1720. memcpy ((void *) pY->rbuf, (void *) pS, strlen (pS));
  1721.         }
  1722.     if (pX->pI->flag & EEE)
  1723.         {
  1724.         if (pX->pI->type == itMovC)
  1725.             pS = eeec[(int)pX->reg];
  1726.         else if (pX->pI->type == itMovD)
  1727.             pS = eeed[(int)pX->reg];
  1728.         else if (pX->pI->type == itMovT)
  1729.             pS = eeet[(int)pX->reg];
  1730.         bcopy (pS, pY->rbuf, strlen (pS));
  1731.         pS = reg[(int)pX->d32][(int)pX->rm];
  1732.         bcopy (pS, pY->mbuf, strlen (pS));
  1733.         }
  1734.     if (pX->pI->flag & AX)
  1735.         {
  1736.         if (pX->pI->flag & WFUL)
  1737.     {
  1738.     if (pX->pI->type == itMovAMtoMA)
  1739.         pS = regw[(int)pX->a32][(int)pX->w][0];
  1740.     else
  1741.         pS = regw[(int)pX->d32][(int)pX->w][0];
  1742.     }
  1743.         else
  1744.     pS = reg[(int)pX->d32][0];
  1745.         if (pX->pI->flag & REG)
  1746.             bcopy (pS, pY->ibuf, strlen (pS));
  1747. else
  1748.             bcopy (pS, pY->rbuf, strlen (pS));
  1749.         }
  1750.     if (pX->pI->flag & ST)
  1751.         sprintf (pY->rbuf, st, pX->st);
  1752.     
  1753.     /* get a displacement operand buffer, pY->dbuf */
  1754.     if (pX->pI->flag & (D8|D16|DIS))
  1755.         {
  1756.         pY->pD = pX->pD + pX->lenO + pX->modrm + pX->sib;
  1757.         if (pX->lenD == 1)
  1758.     pY->addr = *(pY->pD);
  1759.         else if (pX->lenD == 2)
  1760.     pY->addr = *(short *)pY->pD;
  1761.         else if (pX->lenD == 4)
  1762.     {
  1763.     if (pX->pI->flag & D16)
  1764.         pY->addr = *(int *)pY->pD & 0x0000ffff;
  1765.     else
  1766.         pY->addr = *(int *)pY->pD;
  1767.     }
  1768. sprintf (pY->dbuf, "0x%x", pY->addr);
  1769.         }
  1770.     if (pX->pI->flag & OFFSEL)
  1771.         sprintf (pY->dbuf, "0x%x", *(USHORT *)(pX->pD + pX->lenO + pX->lenI));
  1772.     
  1773.     if (pX->pI->flag & D16L8)
  1774.         sprintf (pY->dbuf, "0x%x", *(UCHAR *)(pX->pD + pX->lenO + pX->lenI));
  1775.     /* get an immediate operand buffer, pY->ibuf */
  1776.     if (pX->pI->flag & (IMM|I8))
  1777.         {
  1778.         pY->pD = pX->pD + pX->lenO + pX->modrm + pX->sib + pX->lenD;
  1779.         if (pX->lenI == 1)
  1780.     {
  1781.     if (pX->s)
  1782.         sprintf (pY->ibuf, "%d", *pY->pD);
  1783.     else
  1784.         sprintf (pY->ibuf, "0x%x", *(UCHAR *)pY->pD);
  1785.     }
  1786.         if (pX->lenI == 2)
  1787.     sprintf (pY->ibuf, "0x%x", *(USHORT *)pY->pD);
  1788.         if (pX->lenI == 4)
  1789.     sprintf (pY->ibuf, "0x%x", *(UINT *)pY->pD);
  1790.        
  1791.         /* 
  1792.          * CMPSS and CMPPS opcode string is modified based on 
  1793.  * the imm value.
  1794.  */
  1795. if ((pX->pI->type == itCmpps) || (pX->pI->type == itCmpss))
  1796.             {
  1797.             /* verify that (0 < imm < 8) */
  1798.             if (*(UCHAR *)pY->pD < 8)
  1799.                 {
  1800.                 if (pX->pI->type == itCmpps)
  1801.                     pY->pOpc = cmpps[*(UCHAR *)pY->pD];
  1802.                 else 
  1803.                     pY->pOpc = cmpss[*(UCHAR *)pY->pD];
  1804.                 }
  1805.             }
  1806. }
  1807.     if (pX->pI->flag & PORT)
  1808.         sprintf (pY->ibuf, "0x%04x", *(USHORT *)(pX->pD + pX->lenO));
  1809.     if (pX->pI->flag & OFFSEL)
  1810.         {
  1811.         if (pX->lenI == 2)
  1812.             sprintf (pY->ibuf, "0x%x", *(USHORT *)(pX->pD + pX->lenO));
  1813.         else
  1814.             sprintf (pY->ibuf, "0x%x", *(UINT *)(pX->pD + pX->lenO));
  1815.         }
  1816.     if (pX->pI->flag & D16L8)
  1817.         sprintf (pY->ibuf, "0x%x", *(USHORT *)(pX->pD + pX->lenO));
  1818.     if (pX->pI->type == itRolRMby1)
  1819.         sprintf (pY->ibuf, "0x1");
  1820.     /* get a memory operand buffer, pY->mbuf */
  1821.     if (pX->modrm) 
  1822. {
  1823. if (pX->mod == 3)
  1824.             {
  1825.     if (pX->pI->flag & WFUL)
  1826. pS = regw[(int)pX->d32][(int)pX->w][(int)pX->rm];
  1827.     else if (pX->pI->flag & MMXRM)
  1828. pS = regmmx[(int)pX->rm];
  1829.     else if (pX->pI->flag2 & XMMRM)
  1830. pS = regxmm[(int)pX->rm];
  1831.     else /* REGRM defaults to here */
  1832.         pS = reg[(int)pX->d32][(int)pX->rm];
  1833.             bcopy (pS, pY->mbuf, strlen (pS));
  1834.             }
  1835. else
  1836.     {
  1837.     if (pX->a32 == 0)
  1838.                 {
  1839.                 pY->pD = pX->pD + pX->lenO + pX->modrm;
  1840.         pS = modrm[(int)pX->a32][(int)pX->mod][(int)pX->rm];
  1841.                 if (pX->mod == 0)
  1842.             {
  1843.             if (pX->rm == 6)
  1844.                 sprintf (pY->mbuf, pS, *(USHORT *)pY->pD);
  1845.         /* see 01e, pY->addr = *(USHORT *)pY->pD; */
  1846.             else
  1847.                 sprintf (pY->mbuf, pS);
  1848.             }
  1849.                 else if (pX->mod == 1)
  1850.             sprintf (pY->mbuf, pS, *pY->pD);
  1851.                 else if (pX->mod == 2)
  1852.             sprintf (pY->mbuf, pS, *(USHORT *)pY->pD);
  1853.                 }
  1854.     else
  1855.                 {
  1856.                 pY->pD = pX->pD + pX->lenO + pX->modrm;
  1857.         pS = modrm[(int)pX->a32][(int)pX->mod][(int)pX->rm];
  1858.                 if ((pX->sib) && (pX->rm == 4))
  1859.             {
  1860.                     pY->pD += pX->sib;
  1861.             pS = sib[(int)pX->mod][(int)pX->base];
  1862.             if (pX->mod == 0)
  1863.         {
  1864.         if (pX->base == 5)
  1865.                     sprintf (pY->mbuf, pS, *(int *)pY->pD, 
  1866.      indexR[(int)pX->index],
  1867.      scale[(int)pX->ss]);
  1868.                 else
  1869.                     sprintf (pY->mbuf, pS, indexR[(int)pX->index], 
  1870.      scale[(int)pX->ss]);
  1871.         }
  1872.             else if (pX->mod == 1)
  1873.                 sprintf (pY->mbuf, pS, indexR[(int)pX->index],
  1874.  scale[(int)pX->ss], *pY->pD);
  1875.             else if (pX->mod == 2)
  1876.                 sprintf (pY->mbuf, pS, indexR[(int)pX->index],
  1877.  scale[(int)pX->ss], *(int *)pY->pD);
  1878.             }
  1879.                 else 
  1880.             {
  1881.                     if (pX->mod == 0)
  1882.                 {
  1883.                         if (pX->rm == 5)
  1884.                     sprintf (pY->mbuf, pS, *(int *)pY->pD);
  1885.             /* see 01e, pY->addr = *(int *)pY->pD; */
  1886.                 else
  1887.                     sprintf (pY->mbuf, pS);
  1888.                 }
  1889.                     else if (pX->mod == 1)
  1890.                 sprintf (pY->mbuf, pS, *pY->pD);
  1891.             else if (pX->mod == 2)
  1892.                 sprintf (pY->mbuf, pS, *(int *)pY->pD);
  1893.             }
  1894.                 }
  1895.             }
  1896.         }
  1897.     }
  1898. /*******************************************************************************
  1899. *
  1900. * dsmPrint - print FORMAT_Y structure.
  1901. *
  1902. * RETUERNS: N/A
  1903. */
  1904. LOCAL void dsmPrint
  1905.     (
  1906.     FORMAT_X *pX, /* Pointer to the FORMAT_X */
  1907.     FORMAT_Y *pY, /* Pointer to the FORMAT_Y */
  1908.     VOIDFUNCPTR prtAddress  /* Address printing function */
  1909.     )
  1910.     {
  1911.     int flag;
  1912.     char *pS;
  1913.     char *pD = pX->pD;
  1914.     int bytesToPrint;
  1915.     int ix;
  1916.     if (pY->len == 0)
  1917.         pY->len = 1;
  1918.     bytesToPrint = (((pY->len - 1) >> 3) + 1) << 3;
  1919.     /* print out an address */
  1920.     printf ("0x%08x  ", (UINT)pX->pD);
  1921.     /* print out a data */
  1922.     for (ix=0; ix < bytesToPrint; ix++)
  1923. {
  1924. if ((ix & ~0x07) && ((ix & 0x07) == 0))
  1925.     printf ("n          ");
  1926. printf ((ix < pY->len) ? "%02x " : "   ", (UCHAR)*pD++);
  1927. }
  1928.     /* print out the unknown instruction */
  1929.     if (pX->pI == NULL)
  1930. {
  1931. printf (".BYTE          0x%02xn", (UCHAR)*pX->pD);
  1932. return;
  1933. }
  1934.     /* set the operand pointers */
  1935.     flag = pX->pI->flag & 0xfffff;
  1936.     switch (flag)
  1937.         {
  1938.         case REG:
  1939.         case SREG3:
  1940.         case SREG2:
  1941.         case ST:
  1942.             pY->pOpr0 = pY->rbuf;
  1943.     break;
  1944.         case MODRM:
  1945.             pY->pOpr0 = pY->mbuf;
  1946.     if (pX->pI->type == itRolRMby1)
  1947. pY->pOpr1 = pY->ibuf;
  1948.     break;
  1949.         case I8:
  1950.         case IMM:
  1951.             pY->pOpr0 = pY->ibuf;
  1952.     break;
  1953.         case D8:
  1954.         case DIS:
  1955.             pY->pOpr0 = (char *)&pY->addr;
  1956.     break;
  1957.         case D16:
  1958.             pY->pOpr0 = pY->dbuf;
  1959.     break;
  1960.         case (REG|IMM):
  1961.             pY->pOpr0 = pY->rbuf;
  1962.             pY->pOpr1 = pY->ibuf;
  1963.     break;
  1964.         
  1965.         case (MODRM|IMM):
  1966.         case (MODRM|I8):
  1967. case (MODRM|MMXRM|I8):
  1968.             if ((pX->pI->type == itCmpps) || (pX->pI->type == itCmpss))
  1969.                 {
  1970.                 pY->pOpr0 = pY->rbuf;
  1971.                 pY->pOpr1 = pY->mbuf;
  1972.                 }
  1973.             else if (pX->pI->flag2 & XMMREG)
  1974.                 {
  1975.                 pY->pOpr0 = pY->mbuf;
  1976.                 pY->pOpr1 = pY->rbuf;
  1977.                 pY->pOpr2 = pY->ibuf;
  1978.                 }
  1979.             else
  1980. {
  1981. pY->pOpr0 = pY->mbuf;
  1982. pY->pOpr1 = pY->ibuf;
  1983. }
  1984.     break;
  1985.         
  1986.         case (MODRM|REG):
  1987.         case (MODRM|REGRM):
  1988.         case (MODRM|SREG3):
  1989.         case (MODRM|EEE):
  1990.         case (MODRM|MMXREG):
  1991.         case (MODRM|MMXREG|REGRM):
  1992.         case (MODRM|MMXREG|MMXRM):
  1993.         case (MODRM|MMXRM):
  1994.             if (pX->d)
  1995.             {
  1996.                 pY->pOpr0 = pY->mbuf; /* data dir = reg to r/m */
  1997.                 pY->pOpr1 = pY->rbuf;
  1998.             }
  1999.             else
  2000.             {
  2001.                 pY->pOpr0 = pY->rbuf; /* data dir = r/m to reg */
  2002.                 pY->pOpr1 = pY->mbuf;
  2003.             }
  2004.     break;
  2005.         case (MODRM|REG|I8):
  2006. case (MODRM|MMXRM|REG|I8):
  2007.         case (MODRM|MMXREG|REGRM|I8):
  2008.         case (MODRM|MMXREG|MMXRM|I8):
  2009.         case (MODRM|REG|IMM):
  2010.             if ((pX->pI->type == itShldRMbyI) || (pX->pI->type == itShrdRMbyI))
  2011.         {
  2012.         pY->pOpr0 = pY->mbuf;
  2013.         pY->pOpr1 = pY->rbuf;
  2014.         pY->pOpr2 = pY->ibuf;
  2015.         }
  2016.             else if (pX->d)
  2017.         {
  2018.         pY->pOpr0 = pY->mbuf;
  2019.         pY->pOpr1 = pY->rbuf;
  2020.         pY->pOpr2 = pY->ibuf;
  2021. }
  2022.             else
  2023.         {
  2024.         pY->pOpr0 = pY->rbuf;
  2025.         pY->pOpr1 = pY->mbuf;
  2026.         pY->pOpr2 = pY->ibuf;
  2027.         }
  2028.     break;
  2029.         case (MODRM|REG|CL):
  2030.             pY->pOpr0 = pY->mbuf;
  2031.             pY->pOpr1 = pY->rbuf;
  2032.             pY->pOpr2 = "CL";
  2033.     break;
  2034.         case (IMM|AX):
  2035.             pY->pOpr0 = pY->rbuf;
  2036.             pY->pOpr1 = pY->ibuf;
  2037.     break;
  2038.         case (MODRM|AX):
  2039.             pY->pOpr0 = pY->rbuf;
  2040.             pY->pOpr1 = pY->mbuf;
  2041.     break;
  2042.         case (MODRM|CL):
  2043.             pY->pOpr0 = pY->mbuf;
  2044.             pY->pOpr1 = "CL";
  2045.     break;
  2046.         case (DIS|AX):
  2047.             if (pX->d)
  2048.         {
  2049.                 pY->pOpr0 = pY->dbuf;
  2050.                 pY->pOpr1 = pY->rbuf;
  2051.         }
  2052.             else
  2053.         {
  2054.                 pY->pOpr0 = pY->rbuf;
  2055.                 pY->pOpr1 = pY->dbuf;
  2056.         }
  2057.     break;
  2058.         case OFFSEL:
  2059.         case D16L8:
  2060.             pY->pOpr0 = pY->ibuf;
  2061.             pY->pOpr1 = pY->dbuf;
  2062.     break;
  2063.         case (FD|ST):
  2064.             if (pX->fd)
  2065.         {
  2066.                 pY->pOpr0 = pY->rbuf;
  2067.                 pY->pOpr1 = "ST";
  2068.         }
  2069.             else
  2070.         {
  2071.                 pY->pOpr0 = "ST";
  2072.                 pY->pOpr1 = pY->rbuf;
  2073.         }
  2074.     break;
  2075.         case (PORT|AX):
  2076.     if (pX->pI->type == itInF)
  2077. {
  2078. pY->pOpr0 = pY->rbuf;
  2079. pY->pOpr1 = pY->ibuf;
  2080. }
  2081.     else
  2082. {
  2083. pY->pOpr0 = pY->ibuf;
  2084. pY->pOpr1 = pY->rbuf;
  2085. }
  2086.     break;
  2087.         case (REG|AX):
  2088.     pY->pOpr0 = pY->ibuf;
  2089.     pY->pOpr1 = pY->rbuf;
  2090.     break;
  2091.         case AX:
  2092.     if (pX->pI->type == itInV)
  2093. {
  2094. pY->pOpr0 = pY->rbuf;
  2095. pY->pOpr1 = "DX";
  2096. }
  2097.     else if (pX->pI->type == itOutV)
  2098. {
  2099. pY->pOpr0 = "DX";
  2100. pY->pOpr1 = pY->rbuf;
  2101. }
  2102.     else
  2103.                 pY->pOpr0 = pY->rbuf;
  2104.     break;
  2105.         case 0:
  2106.     break;
  2107.         default:
  2108.     printf ("dsmI86.c error 1: Invalid opcode flag definition.n");
  2109.             printf ("top = 0x%02x 0x%02x 0x%02x 0x%02xn",
  2110.      (UCHAR)*pX->pD, (UCHAR)*(pX->pD + 1),
  2111.      (UCHAR)*(pX->pD + 2), (UCHAR)*(pX->pD + 3));
  2112.         }
  2113.     if ((pX->pI->flag2 & XMMREG) || (pX->pI->flag2 & XMMRM))
  2114.         {
  2115.         if (pX->d)
  2116.             {
  2117.             pY->pOpr0 = pY->mbuf; /* data dir = reg to r/m */
  2118.             pY->pOpr1 = pY->rbuf;
  2119.             }
  2120.         else
  2121.             {
  2122.             pY->pOpr0 = pY->rbuf; /* data dir = r/m to reg */
  2123.             pY->pOpr1 = pY->mbuf;
  2124.             }
  2125.         }
  2126.     else if (pX->pI->flag2 != 0)
  2127.         {
  2128. printf ("dsmI86.c error 2: Invalid opcode flag definition.n");
  2129.         printf ("top = 0x%02x 0x%02x 0x%02x 0x%02xn",
  2130.           (UCHAR)*pX->pD, (UCHAR)*(pX->pD + 1),
  2131.         (UCHAR)*(pX->pD + 2), (UCHAR)*(pX->pD + 3));
  2132.         }
  2133.     /* tune up for the special case */
  2134.     if ((pY->pOpr0 == pY->mbuf) && (pY->mbuf[0] == 0))
  2135. pY->pOpr0 = (char *)&pY->addr;
  2136.     if ((pY->pOpr1 == pY->mbuf) && (pY->mbuf[0] == 0))
  2137. pY->pOpr1 = (char *)&pY->addr;
  2138.     if ((pY->pOpr2 == pY->mbuf) && (pY->mbuf[0] == 0))
  2139. pY->pOpr2 = (char *)&pY->addr;
  2140.     /* tune up for "+(no-x1)" */
  2141.     if (pY->mbuf[0] != 0)
  2142. {
  2143.         pS = pY->mbuf;
  2144.         pD = pY->temp;
  2145.         for (ix = 0 ; ix < (int) (strlen (pY->mbuf)) ; ix++)
  2146.     {
  2147.     if ((*pS == '(') && (*(pS+1) == 'n') && (*(pS+2) == 'o'))
  2148. {
  2149.         pS += 7;
  2150. pD -= 1;
  2151. }
  2152.     *pD++ = *pS++;
  2153.     if (*pS == 0)
  2154. break;
  2155.     }
  2156.         bcopy (pY->temp, pY->mbuf, DSM_BUFSIZE32);
  2157. }
  2158.     /* tune up for "+-" */
  2159.     bzero ((char *)pY->temp, DSM_BUFSIZE32);
  2160.     if (pY->mbuf[0] != 0)
  2161. {
  2162.         pS = pY->mbuf;
  2163.         pD = pY->temp;
  2164.         for (ix = 0 ; ix < (int) (strlen (pY->mbuf)) ; ix++)
  2165.     {
  2166.     if ((*pS == '+') && (*(pS+1) == '-'))
  2167.         pS += 1;
  2168.     *pD++ = *pS++;
  2169.     if (*pS == 0)
  2170. break;
  2171.     }
  2172.         bcopy (pY->temp, pY->mbuf, DSM_BUFSIZE32);
  2173. }
  2174.     /* print out the instruction */
  2175.     printf ("%-12s   ", pY->pOpc);
  2176.     if (pY->pOpr0 != 0)
  2177. {
  2178.         if (pY->pOpr0 == (char *)&pY->addr)
  2179.     (*prtAddress) ((int)pX->pD + pY->len + pY->addr);
  2180. else
  2181.     printf ("%s", pY->pOpr0);
  2182. }
  2183.     if (pY->pOpr1 != 0)
  2184. {
  2185. printf (", ");
  2186.         if (pY->pOpr1 == (char *)&pY->addr)
  2187.     (*prtAddress) ((int)pX->pD + pY->len + pY->addr);
  2188. else
  2189.     printf ("%s", pY->pOpr1);
  2190. }
  2191.     if (pY->pOpr2 != 0)
  2192. {
  2193. printf (", ");
  2194.         if (pY->pOpr2 == (char *)&pY->addr)
  2195.     (*prtAddress) ((int)pX->pD + pY->len + pY->addr);
  2196. else
  2197.     printf ("%s", pY->pOpr2);
  2198. }
  2199.     printf ("n");
  2200.     return;
  2201.     }
  2202. /*******************************************************************************
  2203. *
  2204. * nPrtAddress - print addresses as numbers
  2205. *
  2206. * RETURNS: N/A
  2207. */
  2208. LOCAL void nPrtAddress
  2209.     (
  2210.     int address /* address to print */
  2211.     )
  2212.     {
  2213.     printf ("%#x", address); 
  2214.     }
  2215. /**************************************************************************
  2216. *
  2217. * dsmData - disassemble and print a byte as data
  2218. *
  2219. * This routine disassembles and prints a single byte as data (that is,
  2220. * as a .BYTE assembler directive) on standard out.  The disassembled data will
  2221. * be prepended with the address passed as a parameter.
  2222. * RETURNS : The number of words occupied by the data (always 1).
  2223. */
  2224. int dsmData
  2225.     (
  2226.     FAST UCHAR *pD, /* pointer to the data       */
  2227.     int address  /* address prepended to data */
  2228.     )
  2229.     {
  2230.     FORMAT_X formatx;
  2231.     FORMAT_Y formaty;
  2232.     bzero ((char *)&formatx, sizeof (FORMAT_X));
  2233.     bzero ((char *)&formaty, sizeof (FORMAT_Y));
  2234.     
  2235.     formatx.pD = (char *)pD;
  2236.     formaty.len = 1;
  2237.     dsmPrint (&formatx, &formaty, nPrtAddress);
  2238.     return (1);
  2239.     }
  2240. /*******************************************************************************
  2241. *
  2242. * dsmInst - disassemble and print a single instruction
  2243. *
  2244. * This routine disassembles and prints a single instruction on standard
  2245. * output.  The function passed as parameter <prtAddress> is used to print any
  2246. * operands that might be construed as addresses.  The function could be a
  2247. * subroutine that prints a number or looks up the address in a
  2248. * symbol table.  The disassembled instruction will be prepended with the
  2249. * address passed as a parameter.
  2250. * If <prtAddress> is zero, dsmInst() will use a default routine that prints 
  2251. * addresses as hex numbers.
  2252. *
  2253. * ADDRESS PRINTING ROUTINE
  2254. * Many assembly language operands are addresses.  In order to print these
  2255. * addresses symbolically, dsmInst() calls a user-supplied routine, passed as a
  2256. * parameter, to do the actual printing.  The routine should be declared as:
  2257. * .CS
  2258. *     void prtAddress 
  2259. *         (
  2260. *         int    address   /@ address to print @/
  2261. *         )
  2262. * .CE
  2263. * When called, the routine prints the address on standard out in either
  2264. * numeric or symbolic form.  For example, the address-printing routine used
  2265. * by l() looks up the address in the system symbol table and prints the
  2266. * symbol associated with it, if there is one.  If not, it prints the address
  2267. * as a hex number.
  2268. * If the <prtAddress> argument to dsmInst is NULL, a default print routine is
  2269. * used, which prints the address as a hexadecimal number.
  2270. * The directive .DATA.H (DATA SHORT) is printed for unrecognized instructions.
  2271. * The effective address mode is not checked since when the instruction with
  2272. * invalid address mode executed, an exception would happen.
  2273. * INCLUDE FILE: dsmLib.h
  2274. * INTERNAL  
  2275. * The instruction type is defined by the format of instruction's argument 
  2276. * list.  So the order of argument list table should not be changed.  The 
  2277. * default value of size field is defined with a special bit set in the size 
  2278. * offset field.  To distinguish FPU instructions, a special bit is set in 
  2279. * the type field in the instruction table.
  2280. *
  2281. * RETURNS: The number of bytes occupied by the instruction.
  2282. */
  2283. int dsmInst
  2284.     (
  2285.     FAST UCHAR *pD, /* Pointer to the instruction       */
  2286.     int address, /* Address prepended to instruction */
  2287.     VOIDFUNCPTR prtAddress /* Address printing function        */
  2288.     )
  2289.     {
  2290.     FORMAT_X formatx;
  2291.     FORMAT_Y formaty;
  2292.     if (prtAddress == NULL)
  2293.         prtAddress = nPrtAddress;
  2294.     bzero ((char *)&formatx, sizeof (FORMAT_X));
  2295.     bzero ((char *)&formaty, sizeof (FORMAT_Y));
  2296.     
  2297.     dsmFind (pD, &formatx, &formaty);
  2298.     dsmPrint (&formatx, &formaty, prtAddress);
  2299.     if (instKeeper != NULL)
  2300. {
  2301. formatx.pI->pOpc = instKeeper;
  2302. instKeeper = NULL;
  2303. }
  2304.     
  2305.     return ((formaty.len == 0) ? 1 : formaty.len);
  2306.     }
  2307. /*******************************************************************************
  2308. *
  2309. * dsmNbytes - determine the size of an instruction
  2310. *
  2311. * This routine reports the size, in bytes, of an instruction.
  2312. *
  2313. * RETURNS: The size of the instruction, or 0 if the instruction is unrecognized.
  2314. */
  2315. int dsmNbytes
  2316.     (
  2317.     FAST UCHAR *pD  /* Pointer to the instruction */
  2318.     )
  2319.     {
  2320.     FORMAT_X formatx;
  2321.     FORMAT_Y formaty;
  2322.     bzero ((char *)&formatx, sizeof (FORMAT_X));
  2323.     bzero ((char *)&formaty, sizeof (FORMAT_Y));
  2324.     
  2325.     dsmFind (pD, &formatx, &formaty);
  2326.     if (instKeeper != NULL)
  2327. {
  2328. formatx.pI->pOpc = instKeeper;
  2329. instKeeper = NULL;
  2330. }
  2331.     return (formaty.len);
  2332.     }