home *** CD-ROM | disk | FTP | other *** search
/ Programming Win32 Under the API / ProgrammingWin32UnderTheApiPatVillani.iso / dsasmsrc.zip / print.c < prev    next >
C/C++ Source or Header  |  1999-02-22  |  133KB  |  3,152 lines

  1. //
  2. //
  3. // This program was written by Sang Cho, associate professor at 
  4. //                                       the department of 
  5. //                                       computer science and engineering
  6. //                                       chongju university
  7. // language used: gcc 
  8. //
  9. // date of second release: August 30, 1998 (alpha version)
  10. //
  11. //
  12. //      you can contact me: e-mail address: sangcho@alpha94.chongju.ac.kr
  13. //                            hitel id: chokhas
  14. //                        phone number: (0431) 229-8491    +82-431-229-8491
  15. //
  16. //            real address: Sang Cho
  17. //                      Computer and Information Engineering
  18. //                      ChongJu University
  19. //                      NaeDok-Dong 36 
  20. //                      ChongJu 360-764
  21. //                      South Korea
  22. //
  23. //   Copyright (C) 1997,1998                                 by Sang Cho.
  24. //
  25. // Permission is granted to make and distribute verbatim copies of this
  26. // program provided the copyright notice and this permission notice are
  27. // preserved on all copies.
  28. //
  29. // File: print.c 
  30.  
  31. # define max_col 12
  32. # define my_ON   0
  33. # define my_OFF  1
  34. # define WINAPI
  35.  
  36. # include "disasm.h"
  37.  
  38. LPVOID WINAPI TranslateFunctionName (char *);
  39. void   WINAPI TranslateParameters (char **, char **, char **);
  40. DWORD  Get32Address(DWORD);
  41. int    isGoodAddress(DWORD);
  42. DWORD  AddressCheck(DWORD);
  43. int    isThisSecure(DWORD);
  44. int    referCount(DWORD);
  45. void   showDots();
  46. void   e64toasc();
  47.  
  48. int gotJmpRef = 0;
  49. int specifierFlag = my_OFF;
  50. int lclass=0;
  51. int  ref=0;
  52. int dref=0;
  53. int dmark=0;
  54. int printCol=0;
  55. int tempref[8]={0,};
  56. int temppos[8]={0,};
  57. int reg=-1;
  58.  
  59. char  *reg8String[] = {  "al",  "cl",  "dl",  "bl",  "ah",  "ch",  "dh",  "bh"};
  60. char *reg16String[] = {  "ax",  "cx",  "dx",  "bx",  "sp",  "bp",  "si",  "di"};
  61. char *reg32String[] = { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
  62. char *reg64String[] = { "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7"};
  63. char *SregString [] = {  "es",  "cs",  "ss",  "ds",  "fs",  "gs",  "##",  "##"};
  64. char *mod16String[] = {"bx+si","bx+di","bp+si","bp+di","si","di",  "bp",  "bx"};
  65.  
  66. /* *********************************************************************** */
  67. /* Original Part of grammar generated data                                 */
  68. /* *********************************************************************** */
  69.  
  70.  
  71.  
  72. int  print_m_byte()
  73. {
  74.     if (m_byte>127)     {pr2ntf("-%02X",256-m_byte);}
  75.     else                {pr2ntf("+%02X",m_byte);}
  76.     printCol+=3;
  77.     return m_byte;
  78. }
  79. int  print_m_dword()
  80. {
  81.     if (addressOveride) {pr2ntf("%04X",m_dword);}
  82.     else                {pr2ntf("%08X", m_dword);}
  83.     if (addressOveride) printCol+=4; else printCol+=8;
  84.     return m_dword;
  85. }
  86. int  print_i_byte()
  87. {
  88.     if (i_byte>127)     {pr2ntf("-%02X",256-i_byte);}
  89.     else                {pr2ntf("%02X",i_byte);}
  90.     if (i_byte>127) printCol+=3; else printCol+=2;
  91.     return i_byte;
  92. }
  93. int  print_i_byte32()
  94. {
  95. int r;
  96.     r = ((i_byte>127)?256-i_byte:i_byte);
  97.     if (i_byte>127)
  98.     {
  99.         if (operandOveride||addressOveride) {pr2ntf("-%04X",r);}
  100.         else                                {pr2ntf("-%08X",r);} printCol+=1;
  101.     }
  102.     else
  103.     {
  104.         if (operandOveride||addressOveride) {pr2ntf("%04X",r);} 
  105.         else                                {pr2ntf("%08X",r);} 
  106.     }
  107.     if (operandOveride||addressOveride) printCol+=4; else printCol+=8;
  108.     return r;
  109. }
  110. int  print_i_dword()
  111. {
  112.     if (operandOveride||addressOveride)     {pr2ntf("%04X", i_dword);}
  113.     else                                    {pr2ntf("%08X", i_dword);}
  114.     if (operandOveride||addressOveride) printCol+=4; else printCol+=8;
  115.     return i_dword;
  116. }
  117. int  print_i_word()
  118. {
  119.     pr2ntf("%04X", i_word);
  120.     printCol+=4;
  121.     return i_word;
  122. }
  123. int  print_rel8()
  124. {
  125.     ref = cur_position + i_col + ((i_byte>127)?i_byte-256:i_byte);
  126.     if (addressOveride)  {pr2ntf("%04X",ref);} 
  127.     else                 {pr2ntf("%08X",ref);}
  128.     {   if (i_opcode == 0xEB) lclass = 1; else lclass = 2; }
  129.     if (addressOveride) printCol+=4; else printCol+=8;
  130.     return ref;
  131. }
  132. int  print_rel32()
  133. {
  134.     ref = cur_position + i_col + i_dword;
  135.     if (addressOveride)  {pr2ntf("%04X",ref);} 
  136.     else                 {pr2ntf("%08X",ref);}
  137.     if (addressOveride) printCol+=4; else printCol+=8;
  138.     return ref;
  139. }
  140. int  print_moff()
  141. {
  142.     prefix();
  143.     if(addressOveride)  {pr2ntf("[%04X]",i_dword);}
  144.     else                {pr2ntf("[%08X]",i_dword);}
  145.     if (addressOveride) printCol+=6; else printCol+=10;
  146.     return i_dword;
  147. }
  148. int  r___(int n)
  149. {
  150.     switch(n)
  151.     {
  152.         case  8: pr2ntf("%s", reg8String [regTable[i_mod]]); break;
  153.         case 16: pr2ntf("%s", reg16String[regTable[i_mod]]); break;
  154.         case 32: pr2ntf("%s", reg32String[regTable[i_mod]]); break;
  155.         case 64: pr2ntf("%s", reg64String[regTable[i_mod]]); break;
  156.         default: fatalError=100;
  157.     }
  158.     return i_mod;
  159. }
  160. int  mm____()
  161. {
  162.     pr2ntf("%s", reg64String[regTable[i_mod]]);
  163.     return i_mod;
  164. }
  165. int  mmm___()
  166. {
  167.     pr2ntf("%s", reg64String[rmTable[i_mod]]);
  168.     return i_mod;
  169. }
  170. int  rm_m32 (n)
  171. int n;
  172. {
  173.     switch(n)
  174.     {
  175.         case  8: pr2ntf("%s", reg8String [rmTable[i_mod]]); printCol+=2; break;
  176.         case 16: pr2ntf("%s", reg16String[rmTable[i_mod]]); printCol+=2; break;
  177.         case 32: pr2ntf("%s", reg32String[rmTable[i_mod]]); printCol+=3; break;
  178.         case 64: pr2ntf("%s", reg64String[rmTable[i_mod]]); printCol+=3; break;
  179.         default: fatalError=101;
  180.     }
  181.     return i_mod;
  182. }
  183. int  rm_m16 (n)
  184. int n;
  185. {
  186.     pr2ntf("%s", mod16String[rmTable[i_mod]]); 
  187.     printCol+=strlen(mod16String[rmTable[i_mod]]);
  188.     return i_mod;
  189. }
  190. int  reg_s ()
  191. {
  192.     pr2ntf("%s", reg32String[regTable[i_sib]]);
  193.     printCol+=strlen(reg32String[regTable[i_sib]]);
  194.     return i_sib;
  195. }
  196. int  base()
  197. {
  198.     pr2ntf("%s", reg32String[rmTable[i_sib]]);
  199.     printCol+=strlen(reg32String[rmTable[i_sib]]);
  200.     return i_sib;
  201. }
  202. int  scaledindex()
  203. {
  204. int c;
  205.     c=modTable[i_sib];
  206.     c=c/2;
  207.     if (c>0) c--;
  208.     switch(c)     /* now c is SS of sib byte */
  209.     {
  210.         case  0:               reg_s();              break;
  211.         case  1: pr1ntf("2*"); reg_s(); printCol+=2; break;
  212.         case  2: pr1ntf("4*"); reg_s(); printCol+=2; break;
  213.         case  3: pr1ntf("8*"); reg_s(); printCol+=2; break;
  214.         default: fatalError=103;
  215.     }
  216.     return i_sib;
  217. }
  218. void specifier (n)
  219. int n;
  220.     if (nextMode) return;
  221.     switch(n)
  222.     {
  223.         case  8: pr1ntf("byte");  printCol+=4; break;
  224.         case 16: pr1ntf("word");  printCol+=4; break;
  225.         case 32: pr1ntf("dword"); printCol+=5; break;
  226.         case 64: pr1ntf("qword"); printCol+=5; break;
  227.         default:
  228.     }
  229.     prefix();
  230. }
  231.  
  232. int  prefix()
  233. {
  234.     if (i_psp>1)
  235.     {
  236.                  if  (prefixStack[i_psp-2] ==  38)
  237.             {    pr1ntf (" es:");   printCol+=4;  }
  238.             else if  (prefixStack[i_psp-2] ==  46)
  239.             {    pr1ntf (" cs:");   printCol+=4;  }
  240.             else if  (prefixStack[i_psp-2] ==  54)
  241.             {    pr1ntf (" ss:");   printCol+=4;  }
  242.             else if  (prefixStack[i_psp-2] ==  62)
  243.             {    pr1ntf (" ds:");   printCol+=4;  }
  244.             else if  (prefixStack[i_psp-2] == 100)
  245.             {    pr1ntf (" fs:");   printCol+=4;  }
  246.             else if  (prefixStack[i_psp-2] == 101)
  247.             {    pr1ntf (" gs:");   printCol+=4;  }
  248.     }
  249.     if (i_psp>0)
  250.     {
  251.                  if  (prefixStack[i_psp-1] ==  38)
  252.             {    pr1ntf (" es:");   printCol+=4;  }
  253.             else if  (prefixStack[i_psp-1] ==  46)
  254.             {    pr1ntf (" cs:");   printCol+=4;  }
  255.             else if  (prefixStack[i_psp-1] ==  54)
  256.             {    pr1ntf (" ss:");   printCol+=4;  }
  257.             else if  (prefixStack[i_psp-1] ==  62)
  258.             {    pr1ntf (" ds:");   printCol+=4;  }
  259.             else if  (prefixStack[i_psp-1] == 100)
  260.             {    pr1ntf (" fs:");   printCol+=4;  }
  261.             else if  (prefixStack[i_psp-1] == 101)
  262.             {    pr1ntf (" gs:");   printCol+=4;  }
  263.     }    
  264.     return 1;
  265. }
  266.  
  267. int  r_m_  (n)
  268. {
  269.     if (addressOveride==0) return r_m_32(n);
  270.     else return r_m_16(n);
  271. }
  272.  
  273. int  r_m_32  (int n)
  274. {
  275. int    c, rr;
  276.  
  277.     rr=32;
  278.  
  279.     c=modTable[i_mod];
  280.     switch(c)
  281.     {
  282.         case  1: specifier(n);
  283.                  pr1ntf("["); ref = rm_m32(rr); pr1ntf("]");         
  284.                  printCol+=2; return -1;
  285.         case  2: specifier(n);
  286.                  if (sibTable[i_sib]==1)  /* sib star */ 
  287.                  {
  288.                      pr1ntf("[");
  289.                      if (regTable[i_sib]!=4)
  290.                      {scaledindex(); pr1ntf("+"); gotJmpRef=1;} 
  291.                      ref = print_m_dword(); pr1ntf("]");
  292.                      printCol+=3;
  293.                  }
  294.                  else                     /* sib non star */
  295.                  {
  296.                      pr1ntf("["); base(); pr1ntf("+"); 
  297.                      ref = scaledindex(); pr1ntf("]");
  298.                      printCol+=3;
  299.                  }
  300.                  return ref;
  301.         case  3: specifier(n);
  302.                  pr1ntf("["); ref = print_m_dword(); pr1ntf("]"); 
  303.                  printCol+=2; return ref;
  304.         case  4: specifier(n);
  305.                  pr1ntf("["); rm_m32(rr); 
  306.                  print_m_byte(); pr1ntf("]");
  307.                  printCol+=2; return -1;
  308.         case  5: specifier(n);
  309.                  pr1ntf("["); base();   
  310.                  if (regTable[i_sib]!=4)
  311.                  {pr1ntf("+"); scaledindex(); printCol+=1;} 
  312.                  print_m_byte(); pr1ntf("]");
  313.                  printCol+=2; return -1;
  314.         case  6: specifier(n);
  315.                  pr1ntf("["); rm_m32(rr); 
  316.                  pr1ntf("+"); ref = print_m_dword(); pr1ntf("]");
  317.                  printCol+=3; return ref;
  318.         case  7: specifier(n);
  319.                  pr1ntf("["); base(); pr1ntf("+"); 
  320.                  if (regTable[i_sib]!=4)
  321.                  {scaledindex(); pr1ntf("+"); printCol+=1;}  
  322.                  ref = print_m_dword(); pr1ntf("]");
  323.                  printCol+=3; return ref;
  324.         case  8:
  325.                  rm_m32(n);
  326.                  return -1;
  327.         default: fatalError=105;
  328.     }
  329.     return 1;
  330. }
  331.  
  332. int  r_m_16  (n)
  333. int n;
  334. {
  335. int    c, rr;
  336.  
  337.     rr=16; 
  338.  
  339.     c=mod16Table[i_mod];
  340.     switch(c)
  341.     {
  342.         case  1: specifier(n);
  343.                  pr1ntf("["); rm_m16(rr); pr1ntf("]");         
  344.                  printCol+=2; return -1;
  345.         case  2: specifier(n);
  346.                  pr1ntf("["); ref = print_m_dword(); pr1ntf("]"); 
  347.                  printCol+=2; return ref;
  348.         case  3: specifier(n);
  349.                  pr1ntf("["); rm_m16(rr); 
  350.                  print_m_byte(); pr1ntf("]");
  351.                  printCol+=2; return -1;
  352.         case  4: specifier(n);
  353.                  pr1ntf("["); rm_m16(rr); 
  354.                  pr1ntf("+"); print_m_dword(); pr1ntf("]");
  355.                  printCol+=3; return -1;
  356.         case  5: 
  357.                  rm_m32(n);
  358.                  return -1;
  359.         default: fatalError=105;
  360.     }
  361.     return 1;
  362. }
  363.  
  364.  
  365. int  Sreg__()
  366. {
  367.     pr2ntf("%s", SregString[regTable[i_mod]]);
  368.     printCol+=strlen(SregString[regTable[i_mod]]);
  369.     return i_mod;
  370. }
  371. int  m16_32()
  372. {
  373.     pr1ntf("m16:m32"); ref = r_m_ ( 0);
  374.     printCol+=7;
  375.     return ref;
  376. }
  377. int  m32_32()
  378. {
  379.     pr1ntf("m32:m32"); ref = r_m_ ( 0);
  380.     printCol+=7;
  381.     return ref;
  382. }
  383. int  m_____()
  384. {
  385. int    rr;
  386.  
  387.     if (operandOveride||addressOveride) rr=16; else rr=32;
  388.  
  389.     return r_m_ (rr);
  390. }
  391.  
  392. void nmonicprint()
  393. {
  394.     if (opclass==1) 
  395.     {
  396.         switch(i_opclass)
  397.         {
  398.             case  0: print0case();
  399.                      break;
  400.             case  1: print1case();
  401.                      break;
  402.             case  2: print2case();
  403.                      break;
  404.             case  3: print3case();
  405.                      break;
  406.             case  4: print4case();
  407.                      break; 
  408.             case  5: print5case();
  409.                      break;
  410.             case  6: print6case();
  411.                      break;
  412.             case  7: print7case();
  413.                      break;
  414.             case  8: print8case();
  415.                      break;
  416.             case  9: print9case();
  417.                      break;
  418.             case 10: print10case();
  419.                      break;
  420.             case 11: print11case();
  421.                      break;
  422.             case 12: print12case();
  423.                      break;
  424.             case 13: print13case();   
  425.                      break;
  426.             case 14: print14case();
  427.                      break;
  428.             case 15: print15case();
  429.                      break;
  430.             case 16: print16case();
  431.                      break;
  432.             default:
  433.         }
  434.     }
  435.     else 
  436.     {   
  437.         switch(i_opclass)
  438.         {
  439.             case  0: print20case();
  440.                      break;
  441.             case  1: print21case();
  442.                      break;
  443.             case  2: print22case();
  444.                      break;
  445.             case  3: print23case();
  446.                      break;
  447.             case  4: print24case();
  448.                      break;
  449.             case  5: print25case();
  450.                      break;
  451.             default:
  452.         }
  453.     }    
  454. } /* end of nmonicprint() */
  455.  
  456.  
  457. int addressfix()
  458. {
  459.     //if (GotEof) return 0;
  460.     if (0<NumberOfBytesProcessed) a_loc = NumberOfBytesProcessed;
  461.     cur_position = getRVA(CodeOffset + a_loc + delta)+imageBase;
  462.     i_mod=0; i_dword=0; m_dword=0;
  463.     return 1;
  464. } /* end of addressprint() */
  465.  
  466. int addressprint1(int c)
  467. {
  468. static int cc=0;
  469. int        d, dd;
  470. BYTE       b;
  471.  
  472.     if (GotEof) return 0;    
  473.     //if (nextMode)     return 0;
  474.     if (c>1)  d=1; else  d=c;
  475.     if (cc>1)dd=1; else dd=cc;
  476.     
  477.     if (c!=cc && cc==2 && imb >0)
  478.     {
  479.         bodyprint21(); 
  480.         needspacing=0; imb=0;
  481.         showDots();
  482.     }
  483.  
  484.     if (d!=dd)
  485.     {
  486.         pr1ntf("\n"); needspacing=0; imb=0;
  487.         showDots();
  488.     }
  489.     else 
  490.     {
  491.         if (needspacing){ pr1ntf("\n"); needspacing=0; }
  492.     }
  493.  
  494.     
  495.     if (cur_position==entryPoint+imageBase)
  496.         {pr1ntf("\n//******************** Program Entry Point ********");}
  497.     b=getMap(cur_position); 
  498.          if (b&0x80)  printExportName();
  499.     else if (b&0x40)  printEntryMark();
  500.     else if (b==0x2F) printDataMark();
  501.     else if (b==0x2E) printDataMark();
  502.     else if (b==0x2D) printDataMark();
  503.     else if (b&0x20)  printLabelMark();
  504.  
  505.     if (c!=cc)
  506.     {
  507.         pr2ntf("\n:%08X ", (int)cur_position);
  508.     }
  509.     else 
  510.     {
  511.         if (c<2)
  512.         {pr2ntf("\n:%08X ", (int)cur_position);}
  513.         else if (imb==0)
  514.         { 
  515.             pr2ntf("\n:%08X ", (int)cur_position);
  516.             imb=0;
  517.         }
  518.     }
  519.     cc=c;
  520.     return 1;
  521. } /* end of addressprint() */
  522.  
  523. int addressprint()
  524. {
  525.     addressfix();
  526.     addressprint1(1);
  527.     return 1;
  528. }
  529.  
  530. int bodyprint(int c)
  531. {
  532.          if (c==0) bodyprint0();
  533.     else if (c==1) bodyprint1();
  534.     else if (c==2) bodyprint2();
  535.     else if (c==3) bodyprint3();
  536.     else if (c==4) bodyprint4();
  537.     else if (c==5) bodyprint5();
  538.     else if (c==6) bodyprint6();
  539.     return 1;
  540. }
  541.  
  542. int bodyprint0()
  543. {
  544. int            i,r;
  545.     
  546.     if (GotEof) return 0; 
  547.     if (finished) {finished=0; return 1;}
  548.  
  549.     r=cur_position;
  550.  
  551.     //if (nextMode==0)
  552.     for(i=i_col;i<max_col;i++)pr1ntf("  ");
  553.  
  554.     nmonicprint();
  555.  
  556.     if (nextMode)
  557.     {
  558.         pushTrace(303);
  559.         if (lclass) EnterLabel(lclass, ref, cur_position);
  560.         popTrace();
  561.         //if (dmc)   fatalError=999,dmc=0;
  562.     }
  563.     else
  564.     {
  565.         if (getMap(r)&0x10) printString();
  566.     }
  567.  
  568.     lclass = 0;
  569.     ref   = 0;
  570.     dref   = 0;
  571.     a_loc_save=a_loc;
  572.     i_col_save=i_col;
  573.     i_psp=0; 
  574.     i_col=0;
  575.     addressOveride = 0;
  576.     operandOveride = 0;
  577.     printCol = 0;
  578.  
  579.     return 1;
  580. }
  581.  
  582. int bodyprint1()
  583. {
  584. int       i, j, n;
  585.     
  586.     if (GotEof) return 0; 
  587.  
  588.     pushTrace(302);
  589.     if (nextMode>0)
  590.     EnterLabel(166, m_dword, cur_position);
  591.     else
  592.     {
  593.         for(i=i_col;i<max_col;i++)pr1ntf("  ");
  594.         pr2ntf ("DWORD %08X", m_dword); printCol = 14; 
  595.         for(i=printCol;i<26;i++)pr1ntf(" ");
  596.         n=m_dword; pr1ntf(";; "); 
  597.         j=n%256; n/=256; if(isprint(j)){pr2ntf("%c",j);}else {pr1ntf(".");}
  598.         j=n%256; n/=256; if(isprint(j)){pr2ntf("%c",j);}else {pr1ntf(".");}
  599.         j=n%256; n/=256; if(isprint(j)){pr2ntf("%c",j);}else {pr1ntf(".");} 
  600.                          if(isprint(n)){pr2ntf("%c",n);}else {pr1ntf(".");}
  601.     }
  602.     popTrace();
  603.  
  604.     lclass = 0;
  605.     ref   = 0;
  606.     dref   = 0;
  607.     a_loc_save=a_loc;
  608.     i_col_save=i_col;
  609.     i_psp=0; 
  610.     i_col=0;
  611.     operandOveride = 0;
  612.     printCol=0;
  613.     return 1;
  614. }
  615.  
  616. int bodyprint2()
  617. {
  618. static int   m=16;
  619. BYTE         b;
  620.  
  621.     if ((b=getMap(cur_position))&0x30) dmark=cur_position;
  622.    
  623.     switch(lclass)
  624.     {
  625.         case 515: m=16; break;
  626.         case 517: m=10; break;
  627.         case 518: case 528: 
  628.                   m= 8; break;
  629.         case 524: m=4;
  630.         default:  m=16;
  631.     }
  632.  
  633.     mbytes[imb++]=m_byte;
  634.     if (imb==m || (b=getMap(cur_position+1))==0x2F || b==0x1F) 
  635.         bodyprint21();
  636.     // this place is not good place to process EOF case but it is also very effective.
  637.     //  May.19.1998 sang cho
  638.     if (GotEof)
  639.     { 
  640.         bodyprint21();
  641.         addressfix();
  642.     }
  643.     return 1;
  644. }
  645.  
  646.  
  647.  
  648. int bodyprint21()
  649. {
  650. int           i, j;
  651. unsigned char c;
  652. double        d;
  653. float         f;
  654. char          s[256];
  655.     
  656.     //if (GotEof) return 0; 
  657.  
  658.     for(i=0;i<imb;i++)pr2ntf("%02X ",mbytes[i]);
  659.     for(   ;i<16; i++)pr1ntf("   "); pr1ntf("  ");
  660.  
  661.     j=lclass;
  662.     //for(i=i_col;i<max_col;i++)pr1ntf("  ");   
  663.     //    if (j==515) 
  664.     //{
  665.     //}
  666.     //else 
  667.     if (j==517) 
  668.     {
  669.         e64toasc((PWORD)toFile(dmark),s,16);
  670.         pr2ntf(";; %s",s); printCol+=26; if(d<0) printCol++; 
  671.     }
  672.     //else if (j==518) 
  673.     //{
  674.     //}
  675.     else if (j==524)
  676.     {
  677.         f=*(float *)(toFile(dmark));
  678.         if(f>=0.) {pr1ntf(";;  ");} else {pr1ntf(";; ");}
  679.         pr2ntf("%e",f);
  680.     }
  681.     else if (j==528) 
  682.     {
  683.         d=*(double *)(toFile(dmark));
  684.         if(d>=0.) {pr1ntf(";;  ");} else {pr1ntf(";; ");}
  685.         pr2ntf("%23.16e",d); printCol+=26; if(d<0) printCol++; 
  686.     }
  687.     else            
  688.     {
  689.         for(i=0;i<imb;i++)pr2ntf("%c",isprint(c=mbytes[i])?c:'.');
  690.     }
  691.     if (getMap(cur_position+1)==0x1F); else lclass=0;
  692.  
  693.     imb   = 0;
  694.     //lclass = 0;
  695.     ref   = 0;
  696.     dref   = 0;
  697.     dmark  = 0;
  698.     a_loc_save=a_loc;
  699.     i_col_save=i_col;
  700.     i_psp=0; 
  701.     i_col=0;
  702.     operandOveride = 0;
  703.     return 1;
  704. }
  705.  
  706.  
  707. int bodyprint3()
  708. {
  709.     if (GotEof) return 0; 
  710.     
  711.     imb++;
  712.     
  713.     lclass = 0;
  714.     ref   = 0;
  715.     dref   = 0;
  716.     a_loc_save=a_loc;
  717.     i_col_save=i_col;
  718.     i_psp=0; 
  719.     i_col=0;
  720.     operandOveride = 0;
  721.     return 1;
  722. }
  723.  
  724. int bodyprint4()
  725. {
  726. int  i, j, n;
  727.     
  728.     if (GotEof) return 0; 
  729.     
  730.     n=stringBuf[0];j=0;
  731.     for (i=0;i<n+1;i++)
  732.     {if(j++==16) {pr1ntf("\n          ");j=1;}pr2ntf("%02X ",stringBuf[i]);} 
  733.     for(i=j;i<max_col+4;i++)pr1ntf("   "); pr1ntf("  ");
  734.     pr2ntf (";;p %c",'"');
  735.  
  736.     n=stringBuf[0];
  737.     for (i=1;i<n+1;i++)pr2ntf("%c",stringBuf[i]);
  738.     pr2ntf("%c",'"');
  739.  
  740.     lclass = 0;
  741.     ref   = 0;
  742.     dref   = 0;
  743.     a_loc_save=a_loc;
  744.     i_col_save=i_col;
  745.     i_psp=0; 
  746.     i_col=0;
  747.     operandOveride = 0;
  748.     return 1;
  749. }
  750.  
  751. int bodyprint5()
  752. {
  753. int  i, j;
  754.  
  755.     if (GotEof) return 0; 
  756.     
  757.     i=0; j=0;
  758.     while(stringBuf[i]>-1)
  759.     {if(j++==16) {pr1ntf("\n          ");j=1;}pr2ntf("%02X ",stringBuf[i++]);}
  760.     for(i=j;i<max_col+4;i++)pr1ntf("   "); pr1ntf("  ");
  761.     pr2ntf (";;n %c",'"');
  762.     i=0;
  763.     while(isprint(stringBuf[i])) pr2ntf("%c",stringBuf[i++]);
  764.     pr2ntf("%c",'"');
  765.     
  766.     lclass = 0;
  767.     ref   = 0;
  768.     dref   = 0;
  769.     a_loc_save=a_loc;
  770.     i_col_save=i_col;
  771.     i_psp=0; 
  772.     i_col=0;
  773.     operandOveride = 0;
  774.     return 1;
  775. }
  776.  
  777. int bodyprint6()
  778. {
  779. int       i, j, n;
  780.     
  781.     if (GotEof) return 0; 
  782.  
  783.     pushTrace(392);
  784.     if (nextMode>0);
  785.     else
  786.     {
  787.         for(i=i_col;i<max_col;i++) pr1ntf("  ");
  788.         pr2ntf ("WORD %04X", m_dword); printCol = 9; 
  789.         for(i=printCol;i<26;i++) pr1ntf(" ");
  790.         n=m_dword; pr1ntf(";; "); 
  791.         j=n%256; n/=256; if(isprint(j)) {pr2ntf("%c",j);} else {pr1ntf(".");}
  792.                          if(isprint(n)) {pr2ntf("%c",n);} else {pr1ntf(".");}
  793.     }
  794.     popTrace();
  795.     
  796.     lclass = 0;
  797.     ref   = 0;
  798.     dref   = 0;
  799.     a_loc_save=a_loc;
  800.     i_col_save=i_col;
  801.     i_psp=0; 
  802.     i_col=0;
  803.     operandOveride = 0;
  804.     printCol=0;
  805.     return 1;
  806. }
  807.  
  808. int isEntry(DWORD pos)
  809. {
  810. BYTE   b=getMap(pos);
  811.  
  812.     if (isGoodAddress(pos)
  813.         &&((b&0x40)==0x40)) return 1;
  814.     else return 0;
  815. }
  816.  
  817. int GotName(int class, DWORD pos, DWORD pos1)
  818. {
  819.     int    i;
  820.     int    r;
  821.     char  *p;
  822.     _key_  k;
  823.     PKEY   pk;
  824.                                                 
  825.     r=((int)pos);
  826.     if ((int)lpFile<r&&r<(int)lpFile+fsize)
  827.     {
  828.         k.c_ref=pos; k.c_pos=-1; k.class=0;
  829.         pk = searchBtreeX(&k);
  830.         
  831.         if ((pk!=NULL)&&((int)piNameBuff<=TOINT(pk->c_pos))
  832.           &&(TOINT(pk->c_pos)<(int)piNameBuff+piNameBuffSize))
  833.         {  
  834.             pr1ntf("\n");
  835.             for(i=0;i<28;i++)pr1ntf(" ");
  836.             p=strtok((char *)(pk->c_pos),".");
  837.             if (class<10) {pr2ntf(";;jmp %s",p);} else {pr2ntf(";;call %s",p);}
  838.             pr1ntf(".");
  839.             
  840.             if (*(PBYTE)(r+2)==0x00 && *(PBYTE)(r+3)==0x80)
  841.             {
  842.                 pr2ntf("Thunk:%04X",*(short *)r);
  843.             }
  844.             else
  845.             {
  846.                 p=TranslateFunctionName((char *)r);
  847.                 pr2ntf("%s",p); 
  848.             }
  849.             return 1;
  850.         }
  851.     }
  852.     if ((int)peNameBuff<r&&r<(int)peNameBuff+peNameBuffSize)
  853.     {
  854.         pr1ntf("\n");
  855.         for(i=0;i<28;i++)pr1ntf(" ");
  856.         p=TranslateFunctionName((char *)r);
  857.         pr2ntf(";;%s",p);
  858.         return 1;
  859.     }
  860.     if (isEntry(pos1) && ref!=pos1) 
  861.     {
  862.         pr2ntf(" ;; %08X",(int)pos1);
  863.         return 1;
  864.     }
  865.     return 0;
  866. }
  867.  
  868. int printName(DWORD pos)
  869. {
  870. DWORD          r;
  871. _key_          k, k1, k2, k3;
  872. PKEY           pk;
  873. int            found;
  874.         
  875. // this is very tricky.. i need to be extremely careful. oct.31,1997sangcho
  876.         
  877.         k.c_ref=pos; k.c_pos=-1; k.class=0;
  878.         pk = searchBtree1(&k);
  879.         if(pk==NULL) return 0;
  880.  
  881.         k1=*pk;  
  882.         
  883.         k.c_ref=k1.c_pos; k.c_pos=-1; k.class=0; 
  884.         pk=searchBtreeX(&k);
  885.         if (pk!=NULL) found=1;
  886.         else found=0;
  887.         
  888.         if (found || AddressCheck(k1.c_pos))
  889.         {
  890.             r=k1.c_pos;
  891.             k.c_ref=r;  k.c_pos=-1; k.class=0;
  892.             
  893.             pk = searchBtreeX(&k);
  894.             
  895.             if (pk!=NULL)
  896.             {
  897.                 return GotName(pk->class, pk->c_pos, k1.c_pos);
  898.             }
  899.             
  900.             pk = searchBtree1(&k);
  901.       
  902.             if(pk==NULL) 
  903.             {
  904.                 if (isEntry(k1.c_pos) && ref!=k1.c_pos) 
  905.                 {
  906.                     pr2ntf(" ;; %08X",(int)(k1.c_pos));
  907.                     return 1;
  908.                 }
  909.                 return 0; 
  910.             }
  911.  
  912.             k2=*pk;
  913.             k.c_ref=k2.c_pos; k.c_pos=-1; k.class=0;
  914.             
  915.             pk = searchBtreeX(&k);
  916.             
  917.             if(pk==NULL)
  918.             {
  919.                 if (isEntry(k1.c_pos) && ref!=k1.c_pos) 
  920.                 {
  921.                     pr2ntf(" ;; %08X",(int)(k1.c_pos));
  922.                     return 1;
  923.                 }
  924.                 return 0; 
  925.             }
  926.  
  927.             k3=*pk;
  928.             return GotName(k3.class, k3.c_pos, k1.c_pos);
  929.         }
  930.        
  931.         return 1;
  932. }
  933.  
  934.  
  935. int printExportName1(DWORD ref)
  936. {
  937. int            r;
  938. _key_          k;
  939. PKEY           pk;
  940. PBYTE          p;
  941.         
  942.     k.c_ref=ref; k.c_pos=-1; k.class=0;
  943.     pk = searchBtreeX(&k);
  944.     if(pk==NULL) return 0;
  945.     r=((int)(pk->c_pos));
  946.     if ((int)peNameBuff<r&&r<(int)peNameBuff+peNameBuffSize)
  947.     {
  948.         p=TranslateFunctionName((char *)r);
  949.         pr2ntf("%s",p);
  950.     }
  951.     return 1;
  952. }
  953.  
  954. int printExportName()
  955. {
  956. BYTE          b, d;
  957.     d=getByteFile(cur_position);
  958.     if (d==0xC3) 
  959.     {
  960.         b=getMap(cur_position);
  961.         if (b&0x40) return printEntryMark();
  962.         if (b&0x20) return printLabelMark();
  963.         return 1;
  964.     }
  965.     pr1ntf("\n=========\n");
  966.     printExportName1(cur_position);
  967.     pr1ntf("\n=========");
  968.     return 1;
  969. }
  970.  
  971. int printEntryMark()
  972. {
  973.     pr1ntf("\n=========");
  974.     return 1;
  975. }
  976.  
  977. int printLabelMark()
  978. {
  979.     pr1ntf("\n---------");
  980.     return 1;
  981. }
  982.  
  983. int printDataMark()
  984. {
  985. _key_          k;
  986. PKEY           pk;
  987. int            c;
  988.  
  989.     k.c_ref=cur_position; k.c_pos=-1; k.class=0;
  990.     pk = searchBtree3(&k);
  991.     if (pk==NULL) {pr1ntf("\n---------");return 1;}
  992.     c=pk->class;  lclass=c;
  993.          if (c==514) {pr1ntf("\n#########..DWORD..");}
  994.     else if (c==515) {pr1ntf("\n#########..14/24bytes.");}
  995.     else if (c==516) {pr1ntf("\n#########..WORD...");}
  996.     else if (c==517) {pr1ntf("\n#########..80real..");}
  997.     else if (c==518) {pr1ntf("\n#########..8bytes...");}
  998.     else if (c==524) {pr1ntf("\n#########..32real.");}
  999.     else if (c==528) {pr1ntf("\n#########..64real.");}
  1000.     else             {pr1ntf("\n#########");}
  1001.     return 1;
  1002. }
  1003.  
  1004. int printString()
  1005. {
  1006. DWORD          r;
  1007. _key_          k;
  1008. PKEY           pk;
  1009. PBYTE          p;
  1010.         
  1011.     k.c_ref=cur_position; k.c_pos=-1; k.class=0;
  1012.     pk = searchBtree1(&k);
  1013.     if(pk==NULL) return 0;
  1014.     r=pk->c_pos;
  1015.     p=toFile(r);
  1016.     pr1ntf("\n                      (StringData)");
  1017.     pr2ntf("%c",'"');
  1018.     while(isprint(*p)) {pr2ntf("%c",*p);p++;}
  1019.     if (*p==0x0D && *(p+1)==0x0A) {pr1ntf(" <cr><lf>");}
  1020.     else if (*p==0x0A) 
  1021.     { 
  1022.         pr1ntf(" <lf>");
  1023.         if (*(p+1)==0x0A) {pr1ntf(" <lf>");}    
  1024.     } 
  1025.     else if (*p==0x09)
  1026.     { 
  1027.         pr1ntf(" <t>");
  1028.         if (*(p+1)==0x09) {pr1ntf(" <t>");}
  1029.     }
  1030.     pr2ntf("%c",'"');
  1031.     return 1;
  1032. }
  1033.  
  1034. int print0case()  
  1035. {                 
  1036.     switch(i_opcode)
  1037.     {
  1038.         case 0x06:  pr1ntf("push es"); printCol+=7; break;   
  1039.         case 0x07:  pr1ntf("pop es");  printCol+=6; break;   
  1040.         case 0x0E:  pr1ntf("push cs"); printCol+=7; break;   
  1041.         case 0x16:  pr1ntf("push ss"); printCol+=7; break;     
  1042.         case 0x17:  pr1ntf("pop ss");  printCol+=6; break;    
  1043.         case 0x1E:  pr1ntf("push ds"); printCol+=7; break;     
  1044.         case 0x1F:  pr1ntf("pop ds");  printCol+=6; break;    
  1045.         case 0x27:  pr1ntf("daa");     printCol+=3; break; 
  1046.         case 0x2F:  pr1ntf("das");     printCol+=3; break;     
  1047.         case 0x37:  pr1ntf("aaa");     printCol+=3; break;     
  1048.         case 0x3F:  pr1ntf("aas");     printCol+=3; break;     
  1049.         case 0x40:  if (operandOveride){pr1ntf("inc ax"); printCol+=6;}
  1050.                     else               {pr1ntf("inc eax");printCol+=7;}
  1051.                     break;   
  1052.         case 0x41:  if (operandOveride){pr1ntf("inc cx"); printCol+=6;}
  1053.                     else               {pr1ntf("inc ecx");printCol+=7;}
  1054.                     break;   
  1055.         case 0x42:  if (operandOveride){pr1ntf("inc dx"); printCol+=6;}
  1056.                     else               {pr1ntf("inc edx");printCol+=7;}
  1057.                     break;     
  1058.         case 0x43:  if (operandOveride){pr1ntf("inc bx"); printCol+=6;}
  1059.                     else               {pr1ntf("inc ebx");printCol+=7;}
  1060.                     break;   
  1061.         case 0x44:  if (operandOveride){pr1ntf("inc sp"); printCol+=6;}
  1062.                     else               {pr1ntf("inc esp");printCol+=7;}
  1063.                     break;   
  1064.         case 0x45:  if (operandOveride){pr1ntf("inc bp"); printCol+=6;}
  1065.                     else               {pr1ntf("inc ebp");printCol+=7;}
  1066.                     break;   
  1067.         case 0x46:  if (operandOveride){pr1ntf("inc si"); printCol+=6;}
  1068.                     else               {pr1ntf("inc esi");printCol+=7;}
  1069.                     break;   
  1070.         case 0x47:  if (operandOveride){pr1ntf("inc di"); printCol+=6;}
  1071.                     else               {pr1ntf("inc edi");printCol+=7;}
  1072.                     break;  
  1073.         case 0x48:  if (operandOveride){pr1ntf("dec ax"); printCol+=6;}
  1074.                     else               {pr1ntf("dec eax");printCol+=7;}
  1075.                     break;   
  1076.         case 0x49:  if (operandOveride){pr1ntf("dec cx"); printCol+=6;}
  1077.                     else               {pr1ntf("dec ecx");printCol+=7;}
  1078.                     break;   
  1079.         case 0x4A:  if (operandOveride){pr1ntf("dec dx"); printCol+=6;}
  1080.                     else               {pr1ntf("dec edx");printCol+=7;}
  1081.                     break;     
  1082.         case 0x4B:  if (operandOveride){pr1ntf("dec bx"); printCol+=6;}
  1083.                     else               {pr1ntf("dec ebx");printCol+=7;}
  1084.                     break;   
  1085.         case 0x4C:  if (operandOveride){pr1ntf("dec sp"); printCol+=6;}
  1086.                     else               {pr1ntf("dec esp");printCol+=7;}
  1087.                     break;   
  1088.         case 0x4D:  if (operandOveride){pr1ntf("dec bp"); printCol+=6;}
  1089.                     else               {pr1ntf("dec ebp");printCol+=7;}
  1090.                     break;   
  1091.         case 0x4E:  if (operandOveride){pr1ntf("dec si"); printCol+=6;}
  1092.                     else               {pr1ntf("dec esi");printCol+=7;}
  1093.                     break;   
  1094.         case 0x4F:  if (operandOveride){pr1ntf("dec di"); printCol+=6;}
  1095.                     else               {pr1ntf("dec edi");printCol+=7;}
  1096.                     break; 
  1097.         case 0x50:  if (operandOveride){pr1ntf("push ax"); printCol+=7;}
  1098.                     else               {pr1ntf("push eax");printCol+=8;}
  1099.                     break;   
  1100.         case 0x51:  if (operandOveride){pr1ntf("push cx"); printCol+=7;}
  1101.                     else               {pr1ntf("push ecx");printCol+=8;}
  1102.                     break;   
  1103.         case 0x52:  if (operandOveride){pr1ntf("push dx"); printCol+=7;}
  1104.                     else               {pr1ntf("push edx");printCol+=8;}
  1105.                     break;     
  1106.         case 0x53:  if (operandOveride){pr1ntf("push bx"); printCol+=7;}
  1107.                     else               {pr1ntf("push ebx");printCol+=8;} 
  1108.                     break;   
  1109.         case 0x54:  if (operandOveride){pr1ntf("push sp"); printCol+=7;}
  1110.                     else               {pr1ntf("push esp");printCol+=8;}
  1111.                     break;   
  1112.         case 0x55:  if (operandOveride){pr1ntf("push bp"); printCol+=7;}
  1113.                     else               {pr1ntf("push ebp");printCol+=8;}
  1114.                     break;   
  1115.         case 0x56:  if (operandOveride){pr1ntf("push si"); printCol+=7;}
  1116.                     else               {pr1ntf("push esi");printCol+=8;}
  1117.                     break;   
  1118.         case 0x57:  if (operandOveride){pr1ntf("push di"); printCol+=7;}
  1119.                     else               {pr1ntf("push edi");printCol+=8;}
  1120.                     break;  
  1121.         case 0x58:  if (operandOveride){pr1ntf("pop ax"); printCol+=6;}
  1122.                     else               {pr1ntf("pop eax");printCol+=7;}
  1123.                     break;   
  1124.         case 0x59:  if (operandOveride){pr1ntf("pop cx"); printCol+=6;}
  1125.                     else               {pr1ntf("pop ecx");printCol+=7;}
  1126.                     break;   
  1127.         case 0x5A:  if (operandOveride){pr1ntf("pop dx"); printCol+=6;}
  1128.                     else               {pr1ntf("pop edx");printCol+=7;}
  1129.                     break;     
  1130.         case 0x5B:  if (operandOveride){pr1ntf("pop bx"); printCol+=6;}
  1131.                     else               {pr1ntf("pop ebx");printCol+=7;}
  1132.                     break;   
  1133.         case 0x5C:  if (operandOveride){pr1ntf("pop sp"); printCol+=6;}
  1134.                     else               {pr1ntf("pop esp");printCol+=7;}
  1135.                     break;   
  1136.         case 0x5D:  if (operandOveride){pr1ntf("pop bp"); printCol+=6;}
  1137.                     else               {pr1ntf("pop ebp");printCol+=7;}
  1138.                     break;   
  1139.         case 0x5E:  if (operandOveride){pr1ntf("pop si"); printCol+=6;}
  1140.                     else               {pr1ntf("pop esi");printCol+=7;}
  1141.                     break;   
  1142.         case 0x5F:  if (operandOveride){pr1ntf("pop di"); printCol+=6;}
  1143.                     else               {pr1ntf("pop edi");printCol+=7;}
  1144.                     break; 
  1145.         case 0x60:  pr1ntf("pushad");               printCol+=6;  break;  
  1146.         case 0x61:  pr1ntf("popad");                printCol+=5;  break;   
  1147.         case 0x6C:  pr1ntf("ins byte, port[dx]");   printCol+=18; break;   
  1148.         case 0x6D:  pr1ntf("ins dword, port[dx]");  printCol+=19; break;   
  1149.         case 0x6E:  pr1ntf("outs port[dx], byte");  printCol+=19; break;     
  1150.         case 0x6F:  pr1ntf("outs port[dx], dword"); printCol+=20; break;    
  1151.         case 0x90:  pr1ntf("nop");                  printCol+=3;  break;     
  1152.         case 0x91:  if (operandOveride){pr1ntf("xchg ax, cx")  ;printCol+=11;}
  1153.                     else               {pr1ntf("xchg eax, ecx");printCol+=13;}
  1154.                     break;    
  1155.         case 0x92:  if (operandOveride){pr1ntf("xchg ax, dx")  ;printCol+=11;}
  1156.                     else               {pr1ntf("xchg eax, edx");printCol+=13;}
  1157.                     break; 
  1158.         case 0x93:  if (operandOveride){pr1ntf("xchg ax, bx")  ;printCol+=11;}
  1159.                     else               {pr1ntf("xchg eax, ebx");printCol+=13;}
  1160.                     break;     
  1161.         case 0x94:  if (operandOveride){pr1ntf("xchg ax, sp")  ;printCol+=11;}
  1162.                     else               {pr1ntf("xchg eax, esp");printCol+=13;}
  1163.                     break;     
  1164.         case 0x95:  if (operandOveride){pr1ntf("xchg ax, bp")  ;printCol+=11;}
  1165.                     else               {pr1ntf("xchg eax, ebp");printCol+=13;}
  1166.                     break;     
  1167.         case 0x96:  if (operandOveride){pr1ntf("xchg ax, si")  ;printCol+=11;}
  1168.                     else               {pr1ntf("xchg eax, esi");printCol+=13;}
  1169.                     break;   
  1170.         case 0x97:  if (operandOveride){pr1ntf("xchg ax, di")  ;printCol+=11;}
  1171.                     else               {pr1ntf("xchg eax, edi");printCol+=13;}
  1172.                     break;   
  1173.         case 0x98:  pr1ntf("cbw");                  printCol+=3;  break;   
  1174.         case 0x99:  if (operandOveride) {pr1ntf("cwd");}
  1175.                     else                {pr1ntf("cdq");} printCol+=3;    
  1176.                     break;   
  1177.         case 0x9C:  pr1ntf("pushfd");               printCol+=6;  break;   
  1178.         case 0x9D:  pr1ntf("popfd");                printCol+=5;  break;   
  1179.         case 0x9E:  pr1ntf("sahf");                 printCol+=4;  break;   
  1180.         case 0x9F:  pr1ntf("lahf");                 printCol+=4;  break;   
  1181.         case 0xA4:  pr1ntf("movsb");                printCol+=5;  break;   
  1182.         case 0xA5:  if (operandOveride) {pr1ntf ("movsw");}
  1183.                     else                {pr1ntf ("movsd");} printCol+=5; 
  1184.                     break;   
  1185.         case 0xA6:  pr1ntf("cmpsb");                printCol+=5;  break;   
  1186.         case 0xA7:  if (operandOveride) {pr1ntf ("cmpsw");}
  1187.                     else                {pr1ntf ("cmpsd");} printCol+=5;
  1188.                     break;   
  1189.         case 0xAA:  pr1ntf("stosb");                printCol+=5;  break;
  1190.         case 0xAB:  if (operandOveride) {pr1ntf ("stosw");}
  1191.                     else                {pr1ntf ("stosd");} printCol+=5;
  1192.                     break;    
  1193.         case 0xAC:  pr1ntf("lodsb");                printCol+=5;  break;   
  1194.         case 0xAD:  if (operandOveride) {pr1ntf ("lodsw");}
  1195.                     else                {pr1ntf ("lodsd");} printCol+=5;
  1196.                     break;   
  1197.         case 0xAE:  pr1ntf("scasb");                printCol+=5;  break;   
  1198.         case 0xAF:  if (operandOveride) {pr1ntf ("scasw");}
  1199.                     else                {pr1ntf ("scasd");} printCol+=5;
  1200.                     break;   
  1201.         case 0xC3:  pr1ntf("ret");  needspacing=1;           printCol+=3;
  1202.                     lastAnchor=cur_position+i_col-1;
  1203.                     needJump=1;     needJumpNext=cur_position+i_col;
  1204.                     pushTrace(145);
  1205.                     if(nextMode>0) orMap(lastAnchor, 0x80);
  1206.                     popTrace();
  1207.                     break;   
  1208.         case 0xC9:  pr1ntf("leave");                printCol+=5;  break;   
  1209.         case 0xCB:  pr1ntf("ret(far)");    needspacing=1;    printCol+=8; 
  1210.                     lastAnchor=cur_position+i_col-1;
  1211.                     needJump=1;     needJumpNext=cur_position+i_col;
  1212.                     pushTrace(146);
  1213.                     if(nextMode>0) orMap(lastAnchor, 0x80);
  1214.                     popTrace();
  1215.                     //leaveFlag=cur_position+i_col;
  1216.                     break;   
  1217.         case 0xCC:  pr1ntf("int 03");               printCol+=6;  break;   
  1218.         case 0xCE:  pr1ntf("into");                 printCol+=4;  break;   
  1219.         case 0xCF:  if (operandOveride){pr1ntf ("iret"); printCol+=4;}
  1220.                     else               {pr1ntf ("iretd");printCol+=5;}
  1221.                     break;   
  1222.         case 0xD7:  pr1ntf("xlatb");                printCol+=5;  break;   
  1223.         case 0xEC:  pr1ntf("in al, port[dx]");      printCol+=15; break;   
  1224.         case 0xED:  if (operandOveride){pr1ntf ("in ax, port[dx]"); printCol+=15;}
  1225.                     else               {pr1ntf ("in eax, port[dx]");printCol+=16;}
  1226.                     break;   
  1227.         case 0xEE:  pr1ntf("out port[dx], al");     printCol+=16; break;   
  1228.         case 0xEF:  if (operandOveride){pr1ntf ("out port[dx], ax"); printCol+=16;}
  1229.                     else               {pr1ntf ("out port[dx], eax");printCol+=17;}
  1230.                     break;   
  1231.         case 0xF0:  pr1ntf("lock");                 printCol+=4;  break;   
  1232.         case 0xF4:  pr1ntf("hlt");                  printCol+=3;  break;   
  1233.         case 0xF5:  pr1ntf("cmc");                  printCol+=3;  break;   
  1234.         case 0xF8:  pr1ntf("clc");                  printCol+=3;  break;  
  1235.         case 0xF9:  pr1ntf("stc");                  printCol+=3;  break;   
  1236.         case 0xFA:  pr1ntf("cli");                  printCol+=3;  break;   
  1237.         case 0xFB:  pr1ntf("sti");                  printCol+=3;  break;   
  1238.         case 0xFC:  pr1ntf("cld");                  printCol+=3;  break;     
  1239.         case 0xFD:  pr1ntf("std");                  printCol+=3;  break;
  1240.         default:    fatalError=107;return -1;
  1241.     }
  1242.     return 0;
  1243. }
  1244.  
  1245. int print1case()
  1246. {
  1247.     switch(i_opcode)
  1248.     {
  1249.         case 0x04:  pr1ntf("add al, ");    print_i_byte(); printCol+=8; break;   
  1250.         case 0x0C:  pr1ntf("or al, ");     print_i_byte(); printCol+=7; break;   
  1251.         case 0x14:  pr1ntf("adc al, ");    print_i_byte(); printCol+=8; break;   
  1252.         case 0x1C:  pr1ntf("sbb al, ");    print_i_byte(); printCol+=8; break;     
  1253.         case 0x24:  pr1ntf("and al, ");    print_i_byte(); printCol+=8; break;    
  1254.         case 0x2C:  pr1ntf("sub al, ");    print_i_byte(); printCol+=8; break;     
  1255.         case 0x34:  pr1ntf("xor al, ");    print_i_byte(); printCol+=8; break;    
  1256.         case 0x3C:  pr1ntf("cmp al, ");    print_i_byte(); printCol+=8; break; 
  1257.         case 0x6A:  pr1ntf("push ");       print_i_byte32(); printCol+=5; break;     
  1258.         case 0x70:  pr1ntf("jo ");         print_rel8();   printCol+=3; break;     
  1259.         case 0x71:  pr1ntf("jno ");        print_rel8();   printCol+=4; break;     
  1260.         case 0x72:  pr1ntf("jc ");         print_rel8();   printCol+=3; break;   
  1261.         case 0x73:  pr1ntf("jae ");        print_rel8();   printCol+=4; break;   
  1262.         case 0x74:  pr1ntf("je ");         print_rel8();   printCol+=3; break;   
  1263.         case 0x75:  pr1ntf("jne ");        print_rel8();   printCol+=4; break;   
  1264.         case 0x76:  pr1ntf("jbe ");        print_rel8();   printCol+=4; break;   
  1265.         case 0x77:  pr1ntf("ja ");         print_rel8();   printCol+=3; break;   
  1266.         case 0x78:  pr1ntf("js ");         print_rel8();   printCol+=3; break;   
  1267.         case 0x79:  pr1ntf("jns ");        print_rel8();   printCol+=4; break;   
  1268.         case 0x7A:  pr1ntf("jpe ");        print_rel8();   printCol+=4; break;   
  1269.         case 0x7B:  pr1ntf("jpo ");        print_rel8();   printCol+=4; break;   
  1270.         case 0x7C:  pr1ntf("jl ");         print_rel8();   printCol+=3; break;   
  1271.         case 0x7D:  pr1ntf("jge ");        print_rel8();   printCol+=4; break;   
  1272.         case 0x7E:  pr1ntf("jle ");        print_rel8();   printCol+=4; break;   
  1273.         case 0x7F:  pr1ntf("jg ");         print_rel8();   printCol+=3; break;   
  1274.         case 0xA8:  pr1ntf("test al, ");   print_i_byte(); printCol+=9; break;   
  1275.         case 0xB0:  pr1ntf("mov al, ");    print_i_byte(); printCol+=8; break;   
  1276.         case 0xB1:  pr1ntf("mov cl, ");    print_i_byte(); printCol+=8; break;   
  1277.         case 0xB2:  pr1ntf("mov dl, ");    print_i_byte(); printCol+=8; break;   
  1278.         case 0xB3:  pr1ntf("mov bl, ");    print_i_byte(); printCol+=8; break;   
  1279.         case 0xB4:  pr1ntf("mov ah, ");    print_i_byte(); printCol+=8; break;   
  1280.         case 0xB5:  pr1ntf("mov ch, ");    print_i_byte(); printCol+=8; break;   
  1281.         case 0xB6:  pr1ntf("mov dh, ");    print_i_byte(); printCol+=8; break;   
  1282.         case 0xB7:  pr1ntf("mov bh, ");    print_i_byte(); printCol+=8; break;   
  1283.         case 0xCD:  pr1ntf("int ");        print_i_byte(); printCol+=4; break;   
  1284.         case 0xD4:  pr1ntf("aam ");                        printCol+=4; break;   
  1285.         case 0xD5:  pr1ntf("aad ");                        printCol+=4; break;   
  1286.         case 0xE0:  pr1ntf("loopne ");     print_rel8();   printCol+=7; break;   
  1287.         case 0xE1:  pr1ntf("loope ");      print_rel8();   printCol+=6; break;   
  1288.         case 0xE2:  pr1ntf("loop ");       print_rel8();   printCol+=5; break;   
  1289.         case 0xE3:  pr1ntf("jecxz ");      print_rel8();   printCol+=6; break;   
  1290.         case 0xE4:  pr1ntf("in al, port["); print_i_byte(); pr1ntf("]");  printCol+=13; break;   
  1291.         case 0xE5:  pr1ntf("in eax, port[");print_i_byte(); pr1ntf("]");  printCol+=14; break;   
  1292.         case 0xE6:  pr1ntf("out port["); print_i_byte(); pr1ntf("], al"); printCol+=14; break;   
  1293.         case 0xE7:  pr1ntf("out port["); print_i_byte(); pr1ntf("], eax");printCol+=15; break;
  1294.         case 0xEB:  pr1ntf("jmp ");        ref=print_rel8();                printCol+=4;
  1295.                     if (nextMode>0)
  1296.                     {
  1297.                         if (isThisSecure(ref) || referCount(ref)>2 || 
  1298.                             (opclassSave==2 && (opsave&0x80)) )  
  1299.                         {
  1300.                             lastAnchor=cur_position+i_col-1;
  1301.                             pushTrace(147);
  1302.                             orMap(lastAnchor, 0x80);
  1303.                             popTrace();
  1304.                         }
  1305.                     }
  1306.                     break;
  1307.         default:    fatalError=109;return -1;
  1308.     }
  1309.     return 0;
  1310.  
  1311. }
  1312.  
  1313. int print2case()
  1314. {
  1315.     if (i_opcode==0xC2)
  1316.     {
  1317.         pr2ntf("ret %04X", i_word);    needspacing=1; 
  1318.         needJump=1;     needJumpNext=cur_position+i_col;
  1319.     }
  1320.     else
  1321.     {
  1322.         pr2ntf("ret %04X", i_word);    needspacing=1; 
  1323.         needJump=1;     needJumpNext=cur_position+i_col;
  1324.     }
  1325.     printCol+=8;
  1326.     lastAnchor = cur_position+i_col-1;
  1327.     pushTrace(148);
  1328.     if(nextMode>0) orMap(lastAnchor, 0x80);
  1329.     popTrace();
  1330.     //leaveFlag=cur_position+i_col;
  1331.     return 0;
  1332. }
  1333.  
  1334. int print3case()
  1335. {
  1336.     pr2ntf("enter %04X, ", i_word); print_i_byte();
  1337.     printCol+=10;
  1338.     return 0;
  1339. }
  1340.  
  1341. int print4case()
  1342. {
  1343.     switch(i_opcode)
  1344.     {
  1345.         case 0x05:  if (operandOveride){pr1ntf ("add ex, "); printCol+=8;}
  1346.                     else               {pr1ntf ("add eax, ");printCol+=9;}  
  1347.                     print_i_dword();     
  1348.                     break;   
  1349.         case 0x0D:  if (operandOveride){pr1ntf ("or ax, ");  printCol+=7;}
  1350.                     else               {pr1ntf ("or eax, "); printCol+=8;}   
  1351.                     print_i_dword();     
  1352.                     break;   
  1353.         case 0x15:  if (operandOveride){pr1ntf ("adc ax, "); printCol+=8;}
  1354.                     else               {pr1ntf ("adc eax, ");printCol+=9;}  
  1355.                     print_i_dword();     
  1356.                     break;   
  1357.         case 0x1D:  if (operandOveride){pr1ntf ("sbb ax, "); printCol+=8;}
  1358.                     else               {pr1ntf ("sbb eax, ");printCol+=9;}  
  1359.                     print_i_dword();     
  1360.                     break;     
  1361.         case 0x25:  if (operandOveride){pr1ntf ("and ax, "); printCol+=8;}
  1362.                     else               {pr1ntf ("and eax, ");printCol+=9;}  
  1363.                     print_i_dword();     
  1364.                     break; 
  1365.         case 0x2D:  if (operandOveride){pr1ntf ("sub ax, "); printCol+=8;}
  1366.                     else               {pr1ntf ("sub eax, ");printCol+=9;}  
  1367.                     print_i_dword();     
  1368.                     break;      
  1369.         case 0x35:  if (operandOveride){pr1ntf ("xor ax, "); printCol+=8;}
  1370.                     else               {pr1ntf ("xor eax, ");printCol+=9;}  
  1371.                     print_i_dword();     
  1372.                     break;     
  1373.         case 0x3D:  if (operandOveride){pr1ntf ("cmp ax, "); printCol+=8;}
  1374.                     else               {pr1ntf ("cmp eax, ");printCol+=9;}  
  1375.                     print_i_dword();     
  1376.                     break;  
  1377.         case 0x68:  pr1ntf("push ");    ref=print_i_dword();     // this is OK 
  1378.         // well I really don't know it is reasonably safe to do this.
  1379.         // I think when we push some (possible) address references into stack
  1380.         // there is strong reason to do so. that's why i am doing this. i guess...
  1381.                     lclass=512;         printCol+=5; 
  1382.                     break;     
  1383.         case 0xA0:  pr1ntf("mov al, byte");    print_moff(); printCol+=12;        
  1384.                     break;     
  1385.         case 0xA1:  if (operandOveride){pr1ntf ("mov ax, word");  printCol+=12;}
  1386.                     else               {pr1ntf ("mov eax, dword");printCol+=14;}  
  1387.                     ref=print_moff();
  1388.                     if (isGoodAddress(ref)) 
  1389.                     {if (operandOveride) lclass=516; else lclass=1024;}
  1390.                     break;     
  1391.         case 0xA2:  pr1ntf("mov byte");print_moff();pr1ntf(", al");printCol+=12; 
  1392.                     break;
  1393.         case 0xA3:  if (operandOveride){pr1ntf ("mov word"); printCol+=12;}
  1394.                     else               {pr1ntf ("mov dword");printCol+=14;}
  1395.                     print_moff();
  1396.                     if (operandOveride){pr1ntf (", ax");}
  1397.                     else               {pr1ntf (", eax");}
  1398.                     break;
  1399.         case 0xA9:  if (operandOveride){pr1ntf ("test ax, "); printCol+= 9;}
  1400.                     else               {pr1ntf ("test eax, ");printCol+=10;} 
  1401.                     print_i_dword();     
  1402.                     break;   
  1403.         case 0xB8:  if (operandOveride){pr1ntf ("mov ax, "); printCol+=8;}
  1404.                     else               {pr1ntf ("mov eax, ");printCol+=9;}  
  1405.                     ref=print_i_dword();lclass=1024;     
  1406.                     break;   
  1407.         case 0xB9:  if (operandOveride){pr1ntf ("mov cx, "); printCol+=8;}
  1408.                     else               {pr1ntf ("mov ecx, ");printCol+=9;}  
  1409.                     ref=print_i_dword();lclass=1024;     
  1410.                     break;   
  1411.         case 0xBA:  if (operandOveride){pr1ntf ("mov dx, "); printCol+=8;}
  1412.                     else               {pr1ntf ("mov edx, ");printCol+=9;}  
  1413.                     ref=print_i_dword();lclass=1024;     
  1414.                     break;   
  1415.         case 0xBB:  if (operandOveride){pr1ntf ("mov bx, "); printCol+=8;}
  1416.                     else               {pr1ntf ("mov ebx, ");printCol+=9;}  
  1417.                     ref=print_i_dword();lclass=1024;     
  1418.                     break;   
  1419.         case 0xBC:  if (operandOveride){pr1ntf ("mov sp, "); printCol+=8;}
  1420.                     else               {pr1ntf( "mov esp, ");printCol+=9;}  
  1421.                     ref=print_i_dword();lclass=1024;     
  1422.                     break;   
  1423.         case 0xBD:  if (operandOveride){pr1ntf ("mov bp, "); printCol+=8;}
  1424.                     else               {pr1ntf ("mov ebp, ");printCol+=9;}  
  1425.                     ref=print_i_dword();lclass=1024;     
  1426.                     break;   
  1427.         case 0xBE:  if (operandOveride){pr1ntf ("mov si, "); printCol+=8;}
  1428.                     else               {pr1ntf ("mov esi, ");printCol+=9;}  
  1429.                     ref=print_i_dword();lclass=1024;     
  1430.                     break;   
  1431.         case 0xBF:  if (operandOveride){pr1ntf ("mov di, "); printCol+=8;}
  1432.                     else               {pr1ntf ("mov edi, ");printCol+=9;}  
  1433.                     ref=print_i_dword();lclass=1024;     
  1434.                     break;   
  1435.         case 0xE8:  pr1ntf("call "); 
  1436.                     lclass = 11;        printCol+=5;
  1437.                     ref = print_rel32();
  1438.                     needCall=1;
  1439.                     if (nextMode) {
  1440.                         if (isGoodAddress(ref))
  1441.                         {
  1442.                             needCallRef=ref;
  1443.                             needCallNext=cur_position+i_col;
  1444.                             lastAnchor=cur_position+i_col-1;
  1445.                             pushTrace(158);
  1446.                             if(nextMode>0) orMap(lastAnchor, 0x80);
  1447.                             popTrace();
  1448.                         }
  1449.                         else fatalError=-18;
  1450.                     }
  1451.                     else printName(cur_position); 
  1452.                     break;
  1453.                                         
  1454.         case 0xE9:  pr1ntf("jmp ");  ref = print_rel32();       
  1455.                     lclass =  3;      printCol+=4;
  1456.                     lastAnchor=cur_position+i_col-1;
  1457.                     needJump=1;     needJumpNext=cur_position+i_col;
  1458.                     if (nextMode>0) 
  1459.                     {
  1460.                         if (! isGoodAddress(ref)) {lclass=0; fatalError=990;}
  1461.                         else
  1462.                         {       
  1463.                             pushTrace(149);
  1464.                             orMap(lastAnchor, 0x80);
  1465.                             popTrace();
  1466.                         }
  1467.                     }
  1468.                     else printName(cur_position);
  1469.                     //leaveFlag=cur_position+i_col;
  1470.                     break;            
  1471.         default:    fatalError=111;return -1;
  1472.     }
  1473.     return 0;
  1474.  
  1475. }
  1476.  
  1477. int print5case()
  1478. {
  1479.     if (i_opcode==0x9A)
  1480.     {
  1481.         pr3ntf("call far %04X:%08X", i_word,i_dword);
  1482.         {lclass=15; ref=i_dword;}
  1483.         printCol+=22;
  1484.     }
  1485.     else
  1486.     {
  1487.         pr3ntf("jmp far %04X:%08X", i_word,i_dword);
  1488.         needJump=1;     needJumpNext=cur_position+i_col;
  1489.         {lclass=7; ref=i_dword;}
  1490.         printCol+=21;
  1491.     }
  1492.     return 0;
  1493. }
  1494.  
  1495. int print6case()  
  1496. {
  1497. int    rr;
  1498.  
  1499.     if (operandOveride) rr=16; else rr=32;
  1500.  
  1501.     switch(i_opcode)
  1502.     {
  1503.           case 0x00: pr1ntf("add ");    ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=6; 
  1504.                    if (isGoodAddress(ref)) lclass=520;
  1505.                    break; 
  1506.           case 0x01: pr1ntf("add ");    ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=6; 
  1507.                    if (isGoodAddress(ref)) 
  1508.                    {if (operandOveride) lclass=516; else lclass=514;}
  1509.                    break; 
  1510.           case 0x02: pr1ntf("add ");    r___( 8);  pr1ntf(", ");  ref=r_m_( 8);  printCol+=6; 
  1511.                    if (isGoodAddress(ref)) lclass=520;
  1512.                    break; 
  1513.           case 0x03: pr1ntf("add ");    r___(rr);  pr1ntf(", ");  ref=r_m_(rr);  printCol+=6; 
  1514.                    if (isGoodAddress(ref)) 
  1515.                    {if (operandOveride) lclass=516; else lclass=514;}
  1516.                    break; 
  1517.           case 0x08: pr1ntf("or ");     ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=5; 
  1518.                    if (isGoodAddress(ref)) lclass=520;
  1519.                    break; 
  1520.           case 0x09: pr1ntf("or ");     ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=5; 
  1521.                    if (isGoodAddress(ref)) 
  1522.                    {if (operandOveride) lclass=516; else lclass=514;}
  1523.                    break; 
  1524.           case 0x0A: pr1ntf("or ");     r___( 8);  pr1ntf(", ");  ref=r_m_( 8);  printCol+=5; 
  1525.                    if (isGoodAddress(ref)) lclass=520;
  1526.                    break; 
  1527.           case 0x0B: pr1ntf("or ");     r___(rr);  pr1ntf(", ");  ref=r_m_(rr);  printCol+=5; 
  1528.                    if (isGoodAddress(ref)) 
  1529.                    {if (operandOveride) lclass=516; else lclass=514;}
  1530.                    break; 
  1531.           case 0x10: pr1ntf("adc ");    ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=6; 
  1532.                    if (isGoodAddress(ref)) lclass=520;
  1533.                    break; 
  1534.           case 0x11: pr1ntf("adc ");    ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=6; 
  1535.                    if (isGoodAddress(ref)) 
  1536.                    {if (operandOveride) lclass=516; else lclass=514;}
  1537.                    break; 
  1538.           case 0x12: pr1ntf("adc ");    r___( 8);  pr1ntf(", ");  ref=r_m_( 8);  printCol+=6; 
  1539.                    if (isGoodAddress(ref)) lclass=520;
  1540.                    break; 
  1541.           case 0x13: pr1ntf("adc ");    r___(rr);  pr1ntf(", ");  ref=r_m_(rr);  printCol+=6; 
  1542.                    if (isGoodAddress(ref)) 
  1543.                    {if (operandOveride) lclass=516; else lclass=514;}
  1544.                    break; 
  1545.           case 0x18: pr1ntf("sbb ");    ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=6; 
  1546.                    if (isGoodAddress(ref)) lclass=520;
  1547.                    break; 
  1548.           case 0x19: pr1ntf("sbb ");    ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=6; 
  1549.                    if (isGoodAddress(ref)) 
  1550.                    {if (operandOveride) lclass=516; else lclass=514;}
  1551.                    break; 
  1552.           case 0x1A: pr1ntf("sbb ");    r___( 8);  pr1ntf(", ");  ref=r_m_( 8);  printCol+=6; 
  1553.                    if (isGoodAddress(ref)) lclass=520;
  1554.                    break; 
  1555.           case 0x1B: pr1ntf("sbb ");    r___(rr);  pr1ntf(", ");  ref=r_m_(rr);  printCol+=6; 
  1556.                    if (isGoodAddress(ref)) 
  1557.                    {if (operandOveride) lclass=516; else lclass=514;}
  1558.                    break; 
  1559.           case 0x20: pr1ntf("and ");    ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=6; 
  1560.                    if (isGoodAddress(ref)) lclass=520;
  1561.                    break; 
  1562.           case 0x21: pr1ntf("and ");    ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=6; 
  1563.                    if (isGoodAddress(ref)) 
  1564.                    {if (operandOveride) lclass=516; else lclass=514;}
  1565.                    break; 
  1566.           case 0x22: pr1ntf("and ");    r___( 8);  pr1ntf(", ");  ref=r_m_( 8);  printCol+=6; 
  1567.                    if (isGoodAddress(ref)) lclass=520;
  1568.                    break; 
  1569.           case 0x23: pr1ntf("and ");    r___(rr);  pr1ntf(", ");  ref=r_m_(rr);  printCol+=6; 
  1570.                    if (isGoodAddress(ref)) 
  1571.                    {if (operandOveride) lclass=516; else lclass=514;}
  1572.                    break; 
  1573.           case 0x28: pr1ntf("sub ");    ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=6; 
  1574.                    if (isGoodAddress(ref)) lclass=520;
  1575.                    break; 
  1576.           case 0x29: pr1ntf("sub ");    ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=6; 
  1577.                    if (isGoodAddress(ref)) 
  1578.                    {if (operandOveride) lclass=516; else lclass=514;}
  1579.                    break; 
  1580.           case 0x2A: pr1ntf("sub ");    r___( 8);  pr1ntf(", ");  ref=r_m_( 8);  printCol+=6; 
  1581.                    if (isGoodAddress(ref)) lclass=520;
  1582.                    break; 
  1583.           case 0x2B: pr1ntf("sub ");    r___(rr);  pr1ntf(", ");  ref=r_m_(rr);  printCol+=6; 
  1584.                    if (isGoodAddress(ref)) 
  1585.                    {if (operandOveride) lclass=516; else lclass=514;}
  1586.                    break; 
  1587.           case 0x30: pr1ntf("xor ");    ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=6; 
  1588.                    if (isGoodAddress(ref)) lclass=520;
  1589.                    break; 
  1590.           case 0x31: pr1ntf("xor ");    ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=6; 
  1591.                    if (isGoodAddress(ref)) 
  1592.                    {if (operandOveride) lclass=516; else lclass=514;}
  1593.                    break; 
  1594.           case 0x32: pr1ntf("xor ");    r___( 8);  pr1ntf(", ");  ref=r_m_( 8);  printCol+=6; 
  1595.                    if (isGoodAddress(ref)) lclass=520;
  1596.                    break; 
  1597.           case 0x33: pr1ntf("xor ");    r___(rr);  pr1ntf(", ");  ref=r_m_(rr);  printCol+=6; 
  1598.                    if (isGoodAddress(ref)) 
  1599.                    {if (operandOveride) lclass=516; else lclass=514;}
  1600.                    break; 
  1601.           case 0x38: pr1ntf("cmp ");    ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=6; 
  1602.                    if (isGoodAddress(ref)) lclass=520;
  1603.                    break; 
  1604.           case 0x39: pr1ntf("cmp ");    ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=6; 
  1605.                    if (isGoodAddress(ref)) 
  1606.                    {if (operandOveride) lclass=516; else lclass=514;}
  1607.                    break; 
  1608.           case 0x3A: pr1ntf("cmp ");    r___( 8);  pr1ntf(", ");  ref=r_m_( 8);  printCol+=6; 
  1609.                    if (isGoodAddress(ref)) lclass=520;
  1610.                    break; 
  1611.           case 0x3B: pr1ntf("cmp ");    r___(rr);  pr1ntf(", ");  ref=r_m_(rr);  printCol+=6; 
  1612.                    if (isGoodAddress(ref)) 
  1613.                    {if (operandOveride) lclass=516; else lclass=514;}
  1614.                    break; 
  1615.           case 0x62: pr1ntf("bound ");  r___(rr);  pr1ntf(", ");  ref=m32_32();  printCol+=8; 
  1616.                    if (isGoodAddress(ref)) lclass=518;
  1617.                    break; 
  1618.           case 0x63: pr1ntf("arpl ");   ref=r_m_(16);  pr1ntf(", ");  r___(16);  printCol+=7; 
  1619.                    if (isGoodAddress(ref)) lclass=516;
  1620.                    break; 
  1621.           case 0x84: pr1ntf("test ");   ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=7; 
  1622.                    if (isGoodAddress(ref)) lclass=520;
  1623.                    break; 
  1624.           case 0x85: pr1ntf("test ");   ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=7; 
  1625.                    if (isGoodAddress(ref)) 
  1626.                    {if (operandOveride) lclass=516; else lclass=514;}
  1627.                    break; 
  1628.           case 0x86: pr1ntf("xchg ");   ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=7; 
  1629.                    if (isGoodAddress(ref)) lclass=520;
  1630.                    break; 
  1631.           case 0x87: pr1ntf("xchg ");   ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=7; 
  1632.                    if (isGoodAddress(ref)) 
  1633.                    {if (operandOveride) lclass=516; else lclass=514;}
  1634.                    break; 
  1635.           case 0x88: pr1ntf("mov ");    ref=r_m_( 8);  pr1ntf(", ");  r___( 8);  printCol+=6; 
  1636.                    if (isGoodAddress(ref)) lclass=520;
  1637.                    break; 
  1638.           case 0x89: pr1ntf("mov ");    ref=r_m_(rr);  pr1ntf(", ");  r___(rr);  printCol+=6; 
  1639.                    if (isGoodAddress(ref)) 
  1640.                    {if (operandOveride) lclass=516; else lclass=1024;}
  1641.                    break; 
  1642.           case 0x8A: pr1ntf("mov ");    r___( 8);  pr1ntf(", ");  ref=r_m_( 8);  printCol+=6; 
  1643.                    if (isGoodAddress(ref)) lclass=520;
  1644.                    break; 
  1645.           case 0x8B: pr1ntf("mov ");    r___(rr);  pr1ntf(", ");  ref=r_m_(rr);     printCol+=6; 
  1646.                    reg=regTable[i_mod]; tempref[reg]=ref; temppos[reg]=cur_position;
  1647.                    if (isGoodAddress(ref)) 
  1648.                    {if (operandOveride) lclass=516; else lclass=1024;}
  1649.                    break; 
  1650.           case 0x8C: pr1ntf("mov ");    ref=r_m_(rr);  pr1ntf(", ");  Sreg__();  printCol+=6; 
  1651.                    if (isGoodAddress(ref)) 
  1652.                    {if (operandOveride) lclass=516; else lclass=1024;}
  1653.                    break; 
  1654.           case 0x8D: pr1ntf("lea ");    r___(rr);  pr1ntf(", ");  ref=m_____();  printCol+=6; 
  1655.                    reg=regTable[i_mod]; tempref[reg]=ref; temppos[reg]=cur_position;
  1656.                    if (isGoodAddress(ref)) 
  1657.                    {if (operandOveride) lclass=516; else lclass=514;}
  1658.                    break; 
  1659.           case 0x8E: pr1ntf("mov ");    Sreg__();  pr1ntf(", ");  ref=r_m_(16);  printCol+=6; 
  1660.                    if (isGoodAddress(ref)) lclass=516;
  1661.                    break; 
  1662.           case 0xC4: pr1ntf("les es:"); r___(rr);  pr1ntf(", ");  ref=m16_32();  printCol+=9; 
  1663.                    if (isGoodAddress(ref)) lclass=516;
  1664.                    break; 
  1665.           case 0xC5: pr1ntf("lds es:"); r___(rr);  pr1ntf(", ");  ref=m16_32();  printCol+=9; 
  1666.                    if (isGoodAddress(ref)) lclass=516;
  1667.                    break;
  1668.         default:   fatalError=113;return -1;
  1669.     }
  1670.     return 0;
  1671. }
  1672.  
  1673. int print7case()
  1674. {
  1675. int    rr;
  1676.  
  1677.     if (operandOveride) rr=16; else rr=32;
  1678.  
  1679.     pr1ntf("imul "); r___(rr); 
  1680.     if (modTable[i_mod]<8 || regTable[i_mod]!=rmTable[i_mod])
  1681.     {   pr1ntf(", "); ref=r_m_(rr); printCol+=2;}
  1682.     pr1ntf(", "); 
  1683.     print_i_byte();
  1684.     printCol+=7;
  1685.     if (isGoodAddress(ref)) 
  1686.     {if (operandOveride) lclass=516; else lclass=514;}
  1687.     return 0;
  1688. }
  1689.  
  1690. int print8case()
  1691. {
  1692. int    rr;
  1693.  
  1694.     if (operandOveride) rr=16; else rr=32;
  1695.  
  1696.     pr1ntf("imul "); r___(rr); 
  1697.     if (modTable[i_mod]<8 || regTable[i_mod]!=rmTable[i_mod])
  1698.     {   pr1ntf(", "); ref=r_m_(rr); printCol+=2;}
  1699.     pr1ntf(", "); 
  1700.     print_i_dword();
  1701.     printCol+=7;
  1702.     if (isGoodAddress(ref)) 
  1703.     {if (operandOveride) lclass=516; else lclass=514;}
  1704.     return 0;
  1705. }
  1706.  
  1707. int print9case()
  1708. {
  1709. int    rr;
  1710.  
  1711.     if (operandOveride) rr=16; else rr=32;
  1712.  
  1713.     specifierFlag = my_ON;
  1714.     switch(i_opcode)
  1715.     {
  1716.         case 0x8F: 
  1717.                    if (regTable[i_mod]>0)
  1718.                    {  
  1719.                        fatalError=115;
  1720.                        specifierFlag = my_OFF;
  1721.                        return -1;
  1722.                    }
  1723.                    pr1ntf("pop "); ref=r_m_(rr); printCol+=4;
  1724.                    if (isGoodAddress(ref)) 
  1725.                    {if (operandOveride) lclass=516; else lclass=514;}
  1726.                    break;
  1727.         case 0xD0:
  1728.                    switch(regTable[i_mod])
  1729.                    {
  1730.                        case 0: pr1ntf("rol "); break;
  1731.                        case 1: pr1ntf("ror "); break;
  1732.                        case 2: pr1ntf("rcl "); break;
  1733.                        case 3: pr1ntf("rcr "); break;
  1734.                        case 4: pr1ntf("shl "); break;
  1735.                        case 5: pr1ntf("shr "); break;
  1736.                        case 7: pr1ntf("sar "); break;
  1737.                        default:    fatalError=117;
  1738.                    }
  1739.                    ref=r_m_( 8); pr1ntf(", 1"); printCol+=7;
  1740.                    if (isGoodAddress(ref)) lclass=520;
  1741.                    break;
  1742.         case 0xD1:
  1743.                    switch(regTable[i_mod])
  1744.                    {
  1745.                        case 0: pr1ntf("rol "); break;
  1746.                        case 1: pr1ntf("ror "); break;
  1747.                        case 2: pr1ntf("rcl "); break;
  1748.                        case 3: pr1ntf("rcr "); break;
  1749.                        case 4: pr1ntf("shl "); break;
  1750.                        case 5: pr1ntf("shr "); break;
  1751.                        case 7: pr1ntf("sar "); break;
  1752.                        default:    fatalError=118;
  1753.                    }
  1754.                    ref=r_m_(rr); pr1ntf(", 1"); printCol+=7;
  1755.                    if (isGoodAddress(ref)) 
  1756.                    {if (operandOveride) lclass=516; else lclass=514;}
  1757.                    break;
  1758.         case 0xD2:
  1759.                    switch(regTable[i_mod])
  1760.                    {
  1761.                        case 0: pr1ntf("rol "); break;
  1762.                        case 1: pr1ntf("ror "); break;
  1763.                        case 2: pr1ntf("rcl "); break;
  1764.                        case 3: pr1ntf("rcr "); break;
  1765.                        case 4: pr1ntf("shl "); break;
  1766.                        case 5: pr1ntf("shr "); break;
  1767.                        case 7: pr1ntf("sar "); break;
  1768.                        default:    fatalError=119;
  1769.                    }
  1770.                    ref=r_m_( 8); pr1ntf(", cl"); printCol+=8;
  1771.                    if (isGoodAddress(ref)) lclass=520;
  1772.                    break;
  1773.         case 0xD3:
  1774.                    switch(regTable[i_mod])
  1775.                    {
  1776.                        case 0: pr1ntf("rol "); break;
  1777.                        case 1: pr1ntf("ror "); break;
  1778.                        case 2: pr1ntf("rcl "); break;
  1779.                        case 3: pr1ntf("rcr "); break;
  1780.                        case 4: pr1ntf("shl "); break;
  1781.                        case 5: pr1ntf("shr "); break;
  1782.                        case 7: pr1ntf("sar "); break;
  1783.                        default:    fatalError=121;
  1784.                    }
  1785.                    ref=r_m_(rr); pr1ntf(", cl"); printCol+=8;
  1786.                    if (isGoodAddress(ref)) 
  1787.                    {if (operandOveride) lclass=516; else lclass=514;}
  1788.                    break;
  1789.         case 0xFE:
  1790.                    switch(regTable[i_mod])
  1791.                    {
  1792.                        case 0: pr1ntf("inc "); ref=r_m_( 8); printCol+=4; break;
  1793.                        case 1: pr1ntf("dec "); ref=r_m_( 8); printCol+=4; break;
  1794.                        default: fatalError=123;
  1795.                    }
  1796.                    if (isGoodAddress(ref)) lclass=520;
  1797.                    break;
  1798.         default: fatalError=125;
  1799.     }
  1800.     specifierFlag=my_OFF;
  1801.     return 0;
  1802. }
  1803.  
  1804. int print10case()
  1805. {
  1806. int    rr;
  1807.  
  1808.     if (operandOveride) rr=16; else rr=32;
  1809.  
  1810.     switch(i_opcode)
  1811.     {
  1812.         case 0x80: 
  1813.                    switch(regTable[i_mod])
  1814.                    {
  1815.                        case 0: pr1ntf("add ");  printCol+=6; break;
  1816.                        case 1: pr1ntf("or ");   printCol+=5; break;
  1817.                        case 2: pr1ntf("adc ");  printCol+=6; break;
  1818.                        case 3: pr1ntf("sbb ");  printCol+=6; break;
  1819.                        case 4: pr1ntf("and ");  printCol+=6; break;
  1820.                        case 5: pr1ntf("sub ");  printCol+=6; break;
  1821.                        case 6: pr1ntf("xor ");  printCol+=6; break;
  1822.                        case 7: pr1ntf("cmp ");  printCol+=6; break;
  1823.                        default:    fatalError=127;
  1824.                    }
  1825.                    ref=r_m_( 8); pr1ntf(", "); print_i_byte();
  1826.                    if (isGoodAddress(ref)) lclass=520;
  1827.                    break;
  1828.         case 0x83:
  1829.                    switch(regTable[i_mod])
  1830.                    {
  1831.                        case 0: pr1ntf("add ");  printCol+=6; break;
  1832.                        case 1: pr1ntf("or ");   printCol+=5; break;
  1833.                        case 2: pr1ntf("adc ");  printCol+=6; break;
  1834.                        case 3: pr1ntf("sbb ");  printCol+=6; break;
  1835.                        case 4: pr1ntf("and ");  printCol+=6; break;
  1836.                        case 5: pr1ntf("sub ");  printCol+=6; break;
  1837.                        case 6: pr1ntf("xor ");  printCol+=6; break;
  1838.                        case 7: pr1ntf("cmp ");  printCol+=6; break;
  1839.                        default:    fatalError=129;
  1840.                    }
  1841.                    ref=r_m_(rr); pr1ntf(", "); print_i_byte32();
  1842.                    if (isGoodAddress(ref)) 
  1843.                    {if (operandOveride) lclass=516; else lclass=514;}
  1844.                    break;
  1845.                    
  1846.         case 0xC0:
  1847.                    switch(regTable[i_mod])
  1848.                    {
  1849.                        case 0: pr1ntf("rol ");  break;
  1850.                        case 1: pr1ntf("ror ");  break;
  1851.                        case 2: pr1ntf("rcl ");  break;
  1852.                        case 3: pr1ntf("rcr ");  break;
  1853.                        case 4: pr1ntf("shl ");  break;
  1854.                        case 5: pr1ntf("shr ");  break;
  1855.                        case 7: pr1ntf("sar ");  break;
  1856.                        default:    fatalError=131;
  1857.                    }
  1858.                    ref=r_m_( 8); pr1ntf(", "); printCol+=6; print_i_byte();
  1859.                    if (isGoodAddress(ref)) lclass=520;
  1860.                    break;
  1861.         case 0xC1:
  1862.                    switch(regTable[i_mod])
  1863.                    {
  1864.                        case 0: pr1ntf("rol ");  break;
  1865.                        case 1: pr1ntf("ror ");  break;
  1866.                        case 2: pr1ntf("rcl ");  break;
  1867.                        case 3: pr1ntf("rcr ");  break;
  1868.                        case 4: pr1ntf("shl ");  break;
  1869.                        case 5: pr1ntf("shr ");  break;
  1870.                        case 7: pr1ntf("sar ");  break;
  1871.                        default:    fatalError=133;
  1872.                    }
  1873.                    ref=r_m_(rr); pr1ntf(", "); printCol+=6; print_i_byte();
  1874.                    if (isGoodAddress(ref)) 
  1875.                    {if (operandOveride) lclass=516; else lclass=514;}
  1876.                    break;
  1877.         case 0xC6:
  1878.                    if (regTable[i_mod]==0)
  1879.                    {
  1880.                        pr1ntf("mov "); ref=r_m_( 8); 
  1881.                        pr1ntf(", "); print_i_byte();  printCol+=6; 
  1882.                        if (isGoodAddress(ref)) lclass=520;
  1883.                    }
  1884.                    else fatalError=135;
  1885.                    break;
  1886.         default: fatalError=137;
  1887.     }
  1888.     return 0;
  1889. }
  1890.  
  1891. int print11case()  
  1892. {
  1893. int    rr;
  1894.  
  1895.     if (operandOveride) rr=16; else rr=32;
  1896.  
  1897.     if (i_opcode==0xC7)
  1898.     {
  1899.         if (regTable[i_mod]>0)
  1900.         {
  1901.             fatalError=139;
  1902.             return -1;
  1903.         }
  1904.         pr1ntf("mov "); dref=r_m_(rr); pr1ntf(", "); 
  1905.         ref=print_i_dword();
  1906.         {if (operandOveride) lclass=516; else lclass=514;}
  1907.         if (nextMode>0)
  1908.         {
  1909.             if (isGoodAddress(dref)) EnterLabel(lclass,dref,cur_position);
  1910.             lclass=1024;
  1911.         }
  1912.         printCol+=6; 
  1913.         return 0;
  1914.     }
  1915.     else        /* is should be 0x81 otherwise i*am*in*big*trouble */
  1916.     {
  1917.         switch(regTable[i_mod])
  1918.         {
  1919.             case 0: pr1ntf("add ");  printCol+=6; break;
  1920.             case 1: pr1ntf("or ");   printCol+=5; break;
  1921.             case 2: pr1ntf("adc ");  printCol+=6; break;
  1922.             case 3: pr1ntf("sbb ");  printCol+=6; break;
  1923.             case 4: pr1ntf("and ");  printCol+=6; break;
  1924.             case 5: pr1ntf("sub ");  printCol+=6; break;
  1925.             case 6: pr1ntf("xor ");  printCol+=6; break;
  1926.             case 7: pr1ntf("cmp ");  printCol+=6; break;
  1927.             default:   fatalError=141;
  1928.         }
  1929.         ref=r_m_(rr); pr1ntf(", "); print_i_dword();
  1930.         if (isGoodAddress(ref)) 
  1931.         {if (operandOveride) lclass=516; else lclass=514;}
  1932.     }
  1933.     return 0;
  1934. }
  1935.  
  1936. int print12case()
  1937. {
  1938. int    rr;
  1939.  
  1940.     if (operandOveride) rr=16; else rr=32;
  1941.  
  1942.     switch(i_opcode)
  1943.     {
  1944.         case 0xD8: 
  1945.             if (i_mod<0xC0)
  1946.             {
  1947.                    switch(regTable[i_mod])
  1948.                    {
  1949.                        case 0: pr1ntf("fadd ");   printCol+=5; break;
  1950.                        case 1: pr1ntf("fmul ");   printCol+=5; break;
  1951.                        case 2: pr1ntf("fcom ");   printCol+=5; break;
  1952.                        case 3: pr1ntf("fcomp ");  printCol+=6; break;
  1953.                        case 4: pr1ntf("fsub ");   printCol+=5; break;
  1954.                        case 5: pr1ntf("fsubr ");  printCol+=6; break;
  1955.                        case 6: pr1ntf("fdiv ");   printCol+=5; break;
  1956.                        case 7: pr1ntf("fdivr ");  printCol+=6; break;
  1957.                        default:    fatalError=143;
  1958.                    }
  1959.                    pr1ntf("32real"); ref=r_m_( 0); printCol+=6;
  1960.                    if (isGoodAddress(ref)) lclass=524;
  1961.             }
  1962.             else
  1963.             {
  1964.                 if (i_mod<0xC8)      {pr2ntf("fadd st(0), st(%1d)",  i_mod-0xC0);printCol+=17;}
  1965.                 else if (i_mod <0xD0){pr2ntf("fmul st(0), st(%1d)",  i_mod-0xC8);printCol+=17;}
  1966.                 else if (i_mod==0xD1){pr1ntf("fcom")                            ;printCol+=4; }
  1967.                 else if (i_mod <0xD8){pr2ntf("fcom st(0), st(%1d)",  i_mod-0xD0);printCol+=17;}
  1968.                 else if (i_mod==0xD9){pr1ntf("fcomp")                           ;printCol+=5; }
  1969.                 else if (i_mod <0xE0){pr2ntf("fcomp st(0), st(%1d)", i_mod-0xD8);printCol+=18;}
  1970.                 else if (i_mod <0xE8){pr2ntf("fsub st(0), st(%1d)",  i_mod-0xE0);printCol+=17;}
  1971.                 else if (i_mod <0xF0){pr2ntf("fsubr st(0), st(%1d)", i_mod-0xE8);printCol+=18;}
  1972.                 else if (i_mod <0xF8){pr2ntf("fdiv st(0), st(%1d)",  i_mod-0xF0);printCol+=17;}
  1973.                 else                 {pr2ntf("fdivr st(0), st(%1d)", i_mod-0xF8);printCol+=18;}
  1974.             }
  1975.             break;
  1976.         case 0xD9: 
  1977.             if (i_mod<0xC0)
  1978.             {
  1979.                    switch(regTable[i_mod])
  1980.                    {
  1981.                        case 0: pr1ntf("fld ");   pr1ntf("32real");    ref=r_m_( 0);
  1982.                                printCol+=10;      if (isGoodAddress(ref)) lclass=524;
  1983.                                break;
  1984.                        case 2: pr1ntf("fst ");   pr1ntf("32real");    ref=r_m_( 0);
  1985.                                printCol+=10;      if (isGoodAddress(ref)) lclass=524;
  1986.                                break;
  1987.                        case 3: pr1ntf("fstp ");  pr1ntf("32real");    ref=r_m_( 0);
  1988.                                printCol+=11;      if (isGoodAddress(ref)) lclass=524;
  1989.                                break;
  1990.                        case 4: pr1ntf("fldenv ");pr1ntf("14/28byte"); ref=r_m_( 0);
  1991.                                printCol+=16;      if (isGoodAddress(ref)) lclass=515;
  1992.                                break;
  1993.                        case 5: pr1ntf("fldcw "); pr1ntf("2byte");     ref=r_m_( 0);
  1994.                                printCol+=11;      if (isGoodAddress(ref)) lclass=516;
  1995.                                break;
  1996.                        case 6: pr1ntf("fnstenv ");pr1ntf("14/28byte");ref=r_m_( 0);
  1997.                                printCol+=17;      if (isGoodAddress(ref)) lclass=515;
  1998.                                break;
  1999.                        case 7: pr1ntf("fnstcw ");pr1ntf("2byte");     ref=r_m_( 0);
  2000.                                printCol+=12;      if (isGoodAddress(ref)) lclass=516;
  2001.                                break;
  2002.                        default:    fatalError=145;
  2003.                    }
  2004.             }
  2005.             else
  2006.             {
  2007.                 if (i_mod<0xC8)      {pr2ntf("fld st(%1d)",  i_mod-0xC0) ;printCol+=9; }
  2008.                 else if (i_mod==0xC9){pr1ntf("fxch")                     ;printCol+=4; }
  2009.                 else if (i_mod <0xD0){pr2ntf("fxch st(%1d)",  i_mod-0xC8);printCol+=10;}
  2010.                 else
  2011.                 {
  2012.                     switch(i_mod)
  2013.                     {
  2014.                         case 0xD0: pr1ntf("fnop");      printCol+=4; break;        
  2015.                         case 0xE0: pr1ntf("fchs");        printCol+=4; break;
  2016.                         case 0xE1: pr1ntf("fabs");        printCol+=4; break;
  2017.                         case 0xE4: pr1ntf("ftst");        printCol+=4; break;
  2018.                         case 0xE5: pr1ntf("fxam");        printCol+=4; break;    
  2019.                         case 0xE8: pr1ntf("fld1");        printCol+=4; break;
  2020.                         case 0xE9: pr1ntf("fldl2t");    printCol+=6; break;
  2021.                         case 0xEA: pr1ntf("fldl2e");    printCol+=6; break;
  2022.                         case 0xEB: pr1ntf("fldpi");        printCol+=5; break;
  2023.                         case 0xEC: pr1ntf("fldlg2");    printCol+=6; break;
  2024.                         case 0xED: pr1ntf("fldln2");    printCol+=6; break;
  2025.                         case 0xEE: pr1ntf("fldz");        printCol+=4; break;
  2026.                         case 0xF0: pr1ntf("f2xm1");        printCol+=5; break;
  2027.                         case 0xF1: pr1ntf("fyl2x");        printCol+=5; break;
  2028.                         case 0xF2: pr1ntf("fptan");        printCol+=5; break;
  2029.                         case 0xF3: pr1ntf("fpatan");    printCol+=6; break;
  2030.                         case 0xF4: pr1ntf("fxtract");    printCol+=7; break;
  2031.                         case 0xF5: pr1ntf("fprem1");    printCol+=6; break;
  2032.                         case 0xF6: pr1ntf("fdecstp");    printCol+=7; break;
  2033.                         case 0xF7: pr1ntf("fincstp");    printCol+=7; break;
  2034.                         case 0xF8: pr1ntf("fprem");        printCol+=5; break;
  2035.                         case 0xF9: pr1ntf("fyl2xp1");    printCol+=7; break;
  2036.                         case 0xFA: pr1ntf("fsqrt");        printCol+=5; break;
  2037.                         case 0xFB: pr1ntf("fsincos");    printCol+=7; break;
  2038.                         case 0xFC: pr1ntf("frndint");    printCol+=7; break;
  2039.                         case 0xFD: pr1ntf("fscale");    printCol+=6; break;
  2040.                         case 0xFE: pr1ntf("fsin");        printCol+=4; break;
  2041.                         case 0xFF: pr1ntf("fcos");        printCol+=4; break;
  2042.                         default:   fatalError=202;
  2043.                     }
  2044.                 }
  2045.             }
  2046.             break;
  2047.         case 0xDA: 
  2048.             if (i_mod<0xC0)
  2049.             {
  2050.                    switch(regTable[i_mod])
  2051.                    {
  2052.                        case 0: pr1ntf("fiadd ");  ref=r_m_(rr); printCol+=6; break;
  2053.                        case 1: pr1ntf("fimul ");  ref=r_m_(rr); printCol+=6; break;
  2054.                        case 2: pr1ntf("ficom ");  ref=r_m_(rr); printCol+=6; break;
  2055.                        case 3: pr1ntf("ficomp "); ref=r_m_(rr); printCol+=7; break;
  2056.                        case 4: pr1ntf("fisub ");  ref=r_m_(rr); printCol+=6; break;
  2057.                        case 5: pr1ntf("fisubr "); ref=r_m_(rr); printCol+=7; break;
  2058.                        case 6: pr1ntf("fidiv ");  ref=r_m_(rr); printCol+=6; break;
  2059.                        case 7: pr1ntf("fidivr "); ref=r_m_(rr); printCol+=7; break;
  2060.                        default:    fatalError=204;
  2061.                    }
  2062.                    if (isGoodAddress(ref)) 
  2063.                    {if (operandOveride) lclass=516; else lclass=514;}
  2064.             }
  2065.             else
  2066.             {
  2067.                 if (i_mod<0xC8)      {pr2ntf("fcmovb st(0), st(%1d)", i_mod-0xC0);printCol+=19;}
  2068.                 else if (i_mod <0xD0){pr2ntf("fcmove st(0), st(%1d)", i_mod-0xC8);printCol+=19;}
  2069.                 else if (i_mod <0xD8){pr2ntf("fcmovbe st(0), st(%1d)",i_mod-0xD0);printCol+=20;}
  2070.                 else if (i_mod <0xE0){pr2ntf("fcmovu st(0), st(%1d)", i_mod-0xD8);printCol+=19;}
  2071.                 else if (i_mod==0xE9){pr1ntf("fucompp")                          ;printCol+=7; }
  2072.             }
  2073.             break;
  2074.         case 0xDB: 
  2075.             if (i_mod<0xC0)
  2076.             {
  2077.                    switch(regTable[i_mod])
  2078.                    {
  2079.                        case 0: pr1ntf("fild ");  ref=r_m_(rr);                  printCol+=5; 
  2080.                                if (isGoodAddress(ref)) 
  2081.                                {if (operandOveride) lclass=516; else lclass=514;}
  2082.                                break;
  2083.                        case 2: pr1ntf("fist ");  ref=r_m_(rr);                  printCol+=5; 
  2084.                                if (isGoodAddress(ref)) 
  2085.                                {if (operandOveride) lclass=516; else lclass=514;}
  2086.                                break;
  2087.                        case 3: pr1ntf("fistp "); ref=r_m_(rr);                  printCol+=6; 
  2088.                                if (isGoodAddress(ref)) 
  2089.                                {if (operandOveride) lclass=516; else lclass=514;}
  2090.                                break;
  2091.                        case 5: pr1ntf("fld ");  pr1ntf("80real"); ref=r_m_( 0); printCol+=10;
  2092.                                if (isGoodAddress(ref)) lclass=517;
  2093.                                break;
  2094.                        case 7: pr1ntf("fstp "); pr1ntf("80real"); ref=r_m_( 0); printCol+=11;
  2095.                                if (isGoodAddress(ref)) lclass=517;
  2096.                                break;
  2097.                        default:    fatalError=206;
  2098.                    }
  2099.             }
  2100.             else
  2101.             {
  2102.                 if (i_mod<0xC8)      {pr2ntf("fcmovnb st(0), st(%1d)", i_mod-0xC0);printCol+=20;}
  2103.                 else if (i_mod <0xD0){pr2ntf("fcmovne st(0), st(%1d)", i_mod-0xC8);printCol+=20;}
  2104.                 else if (i_mod <0xD8){pr2ntf("fcmovnbe st(0), st(%1d)",i_mod-0xD0);printCol+=21;}
  2105.                 else if (i_mod <0xE0){pr2ntf("fcmovnu st(0), st(%1d)", i_mod-0xD8);printCol+=20;}
  2106.                 else if (i_mod==0xE2){pr1ntf("fnclex")                            ;printCol+=6;    }
  2107.                 else if (i_mod==0xE3){pr1ntf("fninit")                            ;printCol+=6;    }
  2108.                 else if (i_mod <0xE8) fatalError=208;
  2109.                 else if (i_mod <0xF0){pr2ntf("fucomi st(0), st(%1d)", i_mod-0xE8) ;printCol+=19;}
  2110.                 else if (i_mod <0xF8){pr2ntf("fcomi st(0), st(%1d)", i_mod-0xF0)  ;printCol+=18;}
  2111.             }
  2112.             break;
  2113.         case 0xDC: 
  2114.             if (i_mod<0xC0)
  2115.             {
  2116.                    switch(regTable[i_mod])
  2117.                    {
  2118.                        case 0: pr1ntf("fadd "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11; 
  2119.                                if (isGoodAddress(ref)) lclass=528;
  2120.                                break;
  2121.                        case 1: pr1ntf("fmul "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11; 
  2122.                                if (isGoodAddress(ref)) lclass=528;
  2123.                                break;
  2124.                        case 2: pr1ntf("fcom "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11; 
  2125.                                if (isGoodAddress(ref)) lclass=528;
  2126.                                break;
  2127.                        case 3: pr1ntf("fcomp ");pr1ntf("64real"); ref=r_m_( 0); printCol+=12; 
  2128.                                if (isGoodAddress(ref)) lclass=528;
  2129.                                break;
  2130.                        case 4: pr1ntf("fsub "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11; 
  2131.                                if (isGoodAddress(ref)) lclass=528;
  2132.                                break;
  2133.                        case 5: pr1ntf("fsubr ");pr1ntf("64real"); ref=r_m_( 0); printCol+=12; 
  2134.                                if (isGoodAddress(ref)) lclass=528;
  2135.                                break;
  2136.                        case 6: pr1ntf("fdiv "); pr1ntf("64real"); ref=r_m_( 0); printCol+=11; 
  2137.                                if (isGoodAddress(ref)) lclass=528;
  2138.                                break;
  2139.                        case 7: pr1ntf("fdivr ");pr1ntf("64real"); ref=r_m_( 0); printCol+=12; 
  2140.                                if (isGoodAddress(ref)) lclass=528;
  2141.                                break;
  2142.                        default:    fatalError=210;
  2143.                    }
  2144.             }
  2145.             else
  2146.             {
  2147.                 if (i_mod<0xC8)      {pr2ntf("fadd st(0), st(%1d)", i_mod-0xC0);printCol+=17;}
  2148.                 else if (i_mod <0xD0){pr2ntf("fmul st(0), st(%1d)", i_mod-0xC8);printCol+=17;}
  2149.                 else if (i_mod <0xE0) fatalError=212;
  2150.                 else if (i_mod <0xE8){pr2ntf("fsubr st(0), st(%1d)",i_mod-0xE0);printCol+=18;}
  2151.                 else if (i_mod <0xF0){pr2ntf("fsub st(0), st(%1d)", i_mod-0xD8);printCol+=17;}
  2152.                 else if (i_mod <0xF8){pr2ntf("fdivr st(0), st(%1d)",i_mod-0xF0);printCol+=18;}
  2153.                 else                 {pr2ntf("fdiv st(0), st(%1d)", i_mod-0xF8);printCol+=17;}
  2154.             }
  2155.             break;
  2156.         case 0xDD: 
  2157.             if (i_mod<0xC0)
  2158.             {
  2159.                    switch(regTable[i_mod])
  2160.                    {
  2161.                        case 0: pr1ntf("fld ");  pr1ntf("64real");   ref=r_m_( 0); printCol+=10; 
  2162.                                if (isGoodAddress(ref)) lclass=528;
  2163.                                break;
  2164.                        case 2: pr1ntf("fst ");  pr1ntf("64real");   ref=r_m_( 0); printCol+=10; 
  2165.                                if (isGoodAddress(ref)) lclass=528;
  2166.                                break;
  2167.                        case 3: pr1ntf("fstp "); pr1ntf("64real");   ref=r_m_( 0); printCol+=11; 
  2168.                                if (isGoodAddress(ref)) lclass=528;
  2169.                                break;
  2170.                        case 4: pr1ntf("frstor ");pr1ntf("94/108byte");ref=r_m_( 0);printCol+=17;
  2171.                                if (isGoodAddress(ref)) lclass=519;
  2172.                                break;
  2173.                        case 6: pr1ntf("fnsave ");pr1ntf("94/108byte");ref=r_m_( 0);printCol+=17;
  2174.                                if (isGoodAddress(ref)) lclass=519;
  2175.                                break;
  2176.                        case 7: pr1ntf("fnstsw ");pr1ntf("2byte"); ref=r_m_( 0);   printCol+=12; 
  2177.                                if (isGoodAddress(ref)) lclass=516;
  2178.                                break;
  2179.                        default:    fatalError=214;
  2180.                    }
  2181.             }
  2182.             else
  2183.             {
  2184.                 if (i_mod<0xC8)      {pr2ntf("ffree st(%1d)", i_mod-0xC0);printCol+=11;}
  2185.                 else if (i_mod <0xD0) fatalError=216;
  2186.                 else if (i_mod <0xD8){pr2ntf("fst st(%1d)",   i_mod-0xD0);printCol+=9; }
  2187.                 else if (i_mod <0xE0){pr2ntf("fstp st(%1d)",  i_mod-0xD8);printCol+=10;}
  2188.                 else if (i_mod==0xE1){pr1ntf("fucom")                    ;printCol+=5; }
  2189.                 else if (i_mod <0xE8){pr2ntf("fucom st(%1d)", i_mod-0xE0);printCol+=11;}
  2190.                 else if (i_mod==0xE9){pr1ntf("fucomp")                   ;printCol+=6; }
  2191.                 else if (i_mod <0xF0){pr2ntf("fucomp st(%1d)",i_mod-0xE8);printCol+=12;}
  2192.                 else fatalError=218;
  2193.             }
  2194.             break;
  2195.         case 0xDE: 
  2196.             if (i_mod<0xC0)
  2197.             {
  2198.                    switch(regTable[i_mod])
  2199.                    {
  2200.                        case 0: pr1ntf("fiadd ");  pr1ntf("16int");ref=r_m_( 0); printCol+=6; 
  2201.                                if (isGoodAddress(ref)) lclass=516;
  2202.                                break;
  2203.                        case 1: pr1ntf("fimul ");  pr1ntf("16int");ref=r_m_( 0); printCol+=6; 
  2204.                                if (isGoodAddress(ref)) lclass=516;
  2205.                                break;
  2206.                        case 2: pr1ntf("ficom ");  pr1ntf("16int");ref=r_m_( 0); printCol+=6; 
  2207.                                if (isGoodAddress(ref)) lclass=516;
  2208.                                break;
  2209.                        case 3: pr1ntf("ficomp "); pr1ntf("16int");ref=r_m_( 0); printCol+=7; 
  2210.                                if (isGoodAddress(ref)) lclass=516;
  2211.                                break;
  2212.                        case 4: pr1ntf("fisub ");  pr1ntf("16int");ref=r_m_( 0); printCol+=6; 
  2213.                                if (isGoodAddress(ref)) lclass=516;
  2214.                                break;
  2215.                        case 5: pr1ntf("fisubr "); pr1ntf("16int");ref=r_m_( 0); printCol+=7; 
  2216.                                if (isGoodAddress(ref)) lclass=516;
  2217.                                break;
  2218.                        case 6: pr1ntf("fidiv ");  pr1ntf("16int");ref=r_m_( 0); printCol+=6; 
  2219.                                if (isGoodAddress(ref)) lclass=516;
  2220.                                break;
  2221.                        case 7: pr1ntf("fidivr "); pr1ntf("16int");ref=r_m_( 0); printCol+=7; 
  2222.                                if (isGoodAddress(ref)) lclass=516;
  2223.                                break;
  2224.                        default:    fatalError=220;
  2225.                    }
  2226.             }
  2227.             else
  2228.             {
  2229.                  if(i_mod==0xC1)      {pr1ntf("faddp")                            ;printCol+=5;    }
  2230.                  else if (i_mod <0xC8){pr2ntf("faddp st(%1d), st(0)", i_mod-0xC0) ;printCol+=18;}
  2231.                  else if (i_mod==0xC9){pr1ntf("fmulp")                            ;printCol+=5;    }
  2232.                  else if (i_mod <0xD0){pr2ntf("fmulp st(%1d), st(0)", i_mod-0xC8) ;printCol+=18;}
  2233.                  else if (i_mod==0xD9){pr1ntf("fcompp")                           ;printCol+=6;    }
  2234.                  else if (i_mod <0xE0) fatalError=222;                               
  2235.                  else if (i_mod==0xE1){pr1ntf("fsubrp");                          ;printCol+=6;    }
  2236.                  else if (i_mod <0xE8){pr2ntf("fsubrp st(%1d), st(0)", i_mod-0xE0);printCol+=19;}
  2237.                  else if (i_mod==0xE9){pr1ntf("fsubp")                               ;printCol+=5;    }
  2238.                  else if (i_mod <0xF0){pr2ntf("fsubp st(%1d), st(0)", i_mod-0xE8) ;printCol+=18;}
  2239.                  else if (i_mod==0xF1){pr1ntf("fdivrp")                           ;printCol+=6;    }
  2240.                  else if (i_mod <0xF8){pr2ntf("fdivrp st(%1d), st(0)", i_mod-0xF0);printCol+=18;}
  2241.                  else if (i_mod==0xF9){pr1ntf("fdivp")                            ;printCol+=5;    }
  2242.                  else                 {pr2ntf("fdivp st(%1d), st(0)", i_mod-0xF8) ;printCol+=18;}
  2243.             }
  2244.             break;
  2245.         case 0xDF: 
  2246.             if (i_mod<0xC0)
  2247.             {
  2248.                    switch(regTable[i_mod])
  2249.                    {
  2250.                        case 0: pr1ntf("fild ");  pr1ntf("16int");ref=r_m_( 0); printCol+=10; 
  2251.                                if (isGoodAddress(ref)) lclass=516;
  2252.                                break;
  2253.                        case 2: pr1ntf("fist ");  pr1ntf("16int");ref=r_m_( 0); printCol+=10; 
  2254.                                if (isGoodAddress(ref)) lclass=516;
  2255.                                break;
  2256.                        case 3: pr1ntf("fistp "); pr1ntf("16int");ref=r_m_( 0); printCol+=11; 
  2257.                                if (isGoodAddress(ref)) lclass=516;
  2258.                                break;
  2259.                        case 4: pr1ntf("fbld ");  pr1ntf("80bcd");ref=r_m_( 0); printCol+=10; 
  2260.                                if (isGoodAddress(ref)) lclass=517;
  2261.                                break;
  2262.                        case 5: pr1ntf("fild ");  pr1ntf("64int");ref=r_m_( 0); printCol+=10; 
  2263.                                if (isGoodAddress(ref)) lclass=528;
  2264.                                break;
  2265.                        case 6: pr1ntf("fbstp "); pr1ntf("80bcd");ref=r_m_( 0); printCol+=11; 
  2266.                                if (isGoodAddress(ref)) lclass=517;
  2267.                                break;
  2268.                        case 7: pr1ntf("fistp "); pr1ntf("64int");ref=r_m_( 0); printCol+=11; 
  2269.                                if (isGoodAddress(ref)) lclass=528;
  2270.                                break;
  2271.                        default:                     fatalError=224;
  2272.                    }
  2273.             }
  2274.             else
  2275.             {
  2276.                  if(i_mod <0xDF)       fatalError=226;
  2277.                  else if (i_mod==0xE0){pr1ntf("fnstsw ax")                         ;printCol+=9; }
  2278.                  else if (i_mod <0xE8) fatalError=228;
  2279.                  else if (i_mod <0xF0){pr2ntf("fucomip st(0), st(%1d)", i_mod-0xE8);printCol+=20;}
  2280.                  else if (i_mod <0xF8){pr2ntf("fcomip st(0), st(%1d)", i_mod-0xF0) ;printCol+=19;}
  2281.                  else                  fatalError=230;
  2282.             }
  2283.             break;
  2284.         default:                       fatalError=232;
  2285.     }
  2286.     return 0;
  2287. } /* print12case() */
  2288.  
  2289.  
  2290. int print13case()
  2291. {
  2292. int    rr;
  2293.  
  2294.     if (operandOveride) rr=16; else rr=32;
  2295.  
  2296.     switch(regTable[i_mod])
  2297.     {                             
  2298.         case 0: pr1ntf("inc ");            ref=r_m_(rr);  printCol+=4; 
  2299.                 if (isGoodAddress(ref)) 
  2300.                 {if (operandOveride) lclass=516; else lclass=514;}
  2301.                 break;
  2302.         case 1: pr1ntf("dec ");            ref=r_m_(rr);  printCol+=4; 
  2303.                 if (isGoodAddress(ref)) 
  2304.                 {if (operandOveride) lclass=516; else lclass=514;}
  2305.                 break;
  2306.         case 2: pr1ntf("call ");                      printCol+=4;
  2307.                 ref = r_m_(rr);
  2308.                 lclass=13;
  2309.                 if (nextMode)
  2310.                 {    
  2311.                     if (i_mod>=0xD0)
  2312.                     {
  2313.                         reg=rmTable[i_mod];
  2314.                         if (temppos[reg]+128>cur_position) 
  2315.                         ref=tempref[reg]; temppos[reg]=cur_position;
  2316.                     }
  2317.                 }
  2318.                 else printName(cur_position);
  2319.                 break;
  2320.         case 3: pr1ntf("call ");     ref = m16_32(); lclass=17;  printCol+=4;
  2321.                 break;
  2322.         case 4: pr1ntf("jmp ");                                     printCol+=4;
  2323.                 ref=r_m_(32);
  2324.                 
  2325.                 if (gotJmpRef) 
  2326.                 {   lclass=128+5; gotJmpRef=0;  } 
  2327.                 else lclass=5;
  2328.                 if (i_mod>=0xD0)
  2329.                 {
  2330.                     reg=rmTable[i_mod];
  2331.                     if (temppos[reg]+128>cur_position) 
  2332.                     ref=tempref[reg]; temppos[reg]=cur_position;
  2333.                 }
  2334.                 
  2335.                 needJump=1;     needJumpNext=cur_position+i_col;
  2336.                 if (nextMode)
  2337.                 {
  2338.                     // it is OK to mark anchor...because it will not be erased easily??
  2339.                     lastAnchor=cur_position+i_col-1;
  2340.                     pushTrace(150);
  2341.                     orMap(lastAnchor, 0x80);
  2342.                     popTrace();
  2343.                 }
  2344.                 else printName(cur_position);
  2345.                 break;
  2346.         case 5: pr1ntf("jmp ");      ref = m16_32();   lclass = 9;  printCol+=4;
  2347.                 needJump=1;     needJumpNext=cur_position+i_col;
  2348.                 break;
  2349.         case 6: pr1ntf("push ");     ref =  r_m_(rr);                printCol+=5;
  2350.                 lclass = 513;
  2351.         // well I really don't know it is reasonably safe to do this.
  2352.         // I think when we push some (possible) address references into stack
  2353.         // there is strong reason to do so. that's why i am doing this. i guess...
  2354.                 break;
  2355.         default: fatalError=234;
  2356.     }  
  2357.     return 0;
  2358. }
  2359.  
  2360. int print14case()
  2361. {
  2362. int    rr;
  2363.  
  2364.     if (operandOveride) rr=16; else rr=32;
  2365.  
  2366.     if (i_opcode==0xF6)
  2367.     {
  2368.         switch(regTable[i_mod])
  2369.         {
  2370.             case 0: pr1ntf("test "); ref=r_m_( 8); pr1ntf(", "); print_i_byte(); printCol+=7; 
  2371.                     if (isGoodAddress(ref)) lclass=520;
  2372.                     break;
  2373.             case 2:    pr1ntf("not ");  ref=r_m_( 8);                               printCol+=4; 
  2374.                     if (isGoodAddress(ref)) lclass=520;
  2375.                     break;
  2376.             case 3:    pr1ntf("neg ");  ref=r_m_( 8);                               printCol+=4; 
  2377.                     if (isGoodAddress(ref)) lclass=520;
  2378.                     break;
  2379.             case 4:    pr1ntf("mul ");  ref=r_m_( 8);                               printCol+=4; 
  2380.                     if (isGoodAddress(ref)) lclass=520;
  2381.                     break;
  2382.             case 5:    pr1ntf("imul "); ref=r_m_( 8);                               printCol+=4; 
  2383.                     if (isGoodAddress(ref)) lclass=520;
  2384.                     break;
  2385.             case 6:    pr1ntf("div ");  ref=r_m_( 8);                               printCol+=4; 
  2386.                     if (isGoodAddress(ref)) lclass=520;
  2387.                     break;
  2388.             case 7:    pr1ntf("idiv "); ref=r_m_( 8);                               printCol+=5; 
  2389.                     if (isGoodAddress(ref)) lclass=520;
  2390.                     break;
  2391.             default: fatalError=303;
  2392.         }
  2393.     }
  2394.     else if (i_opcode==0xF7)
  2395.     {
  2396.         switch(regTable[i_mod])
  2397.         {
  2398.             case 0:    pr1ntf("test "); ref=r_m_(rr); pr1ntf(", "); print_i_dword(); printCol+=7; 
  2399.                     break;
  2400.             case 2:    pr1ntf("not ");  ref=r_m_(rr);                                printCol+=4;
  2401.                     break;
  2402.             case 3:    pr1ntf("neg ");  ref=r_m_(rr);                                printCol+=4;
  2403.                     break;
  2404.             case 4:    pr1ntf("mul ");  ref=r_m_(rr);                                printCol+=4; 
  2405.                     break;
  2406.             case 5:    pr1ntf("imul "); ref=r_m_(rr);                                printCol+=5; 
  2407.                     break;
  2408.             case 6:    pr1ntf("div ");  ref=r_m_(rr);                                printCol+=4;
  2409.                     break;
  2410.             case 7:    pr1ntf("idiv "); ref=r_m_(rr);                                printCol+=5; 
  2411.                     break;
  2412.             default: fatalError=305;
  2413.         }
  2414.         if (isGoodAddress(ref)) 
  2415.         {if (operandOveride) lclass=516; else lclass=514;}
  2416.     }
  2417.     else fatalError=307;
  2418.     return 0;
  2419. }
  2420.  
  2421. int print15case()
  2422. {
  2423. int    rr;
  2424.  
  2425.     if (operandOveride) rr=16; else rr=32;
  2426.  
  2427.     if (i_opcode==0xD9)
  2428.     {
  2429.         if (regTable[i_mod]==6)
  2430.         {
  2431.             pr1ntf("fstenv 14/28byte"); ref=r_m_(rr);  printCol+=16;
  2432.             if (isGoodAddress(ref)) lclass=515;
  2433.         }
  2434.         else if (regTable[i_mod]==7)
  2435.         {
  2436.             pr1ntf("fstcw 2byte");      ref=r_m_(rr);  printCol+=11;
  2437.             if (isGoodAddress(ref)) lclass=516;
  2438.         }
  2439.         else fatalError=309;
  2440.     }
  2441.     else if (i_opcode==0xDB)
  2442.     {
  2443.         if (i_mod==0xE2)      {pr1ntf("fclex ");}            
  2444.         else if (i_mod==0xE3) {pr1ntf("finit ");}             
  2445.         else fatalError=311;  printCol+=6;
  2446.     }
  2447.     else if (i_opcode==0xDD)
  2448.     {
  2449.         if (regTable[i_mod]==6)
  2450.         {
  2451.             pr1ntf("fsave 94/108byte"); ref=r_m_(rr); printCol+=16;
  2452.             if (isGoodAddress(ref)) lclass=519;
  2453.         }
  2454.         else if (regTable[i_mod]==7)
  2455.         {
  2456.             pr1ntf("fstsw 2byte");      ref=r_m_(rr); printCol+=11;
  2457.             if (isGoodAddress(ref)) lclass=516;
  2458.         }
  2459.         else fatalError=313;
  2460.     }
  2461.     else if (i_opcode==0xDF)
  2462.     {
  2463.         if (i_mod==0xE0) {pr1ntf("fstsw ax ");}     
  2464.         else fatalError=315;     printCol+=9;
  2465.     }
  2466.     else if (i_opcode==0x9B) {pr1ntf("wait");     printCol+=4;}  
  2467.     else fatalError=317;
  2468.     return 0;
  2469. }
  2470.  
  2471. int print16case()
  2472. {
  2473. int    rr;
  2474.  
  2475.     if (operandOveride) rr=16; else rr=32;
  2476.  
  2477.     if (prefixStack[i_psp-1]==0xF2)
  2478.     {
  2479.         switch(i_opcode)
  2480.         {
  2481.             case 0xA6: pr1ntf("repne cmpsb"); printCol+=11; break;
  2482.             case 0xA7: if (operandOveride) {pr1ntf("repne cmpsw");}
  2483.                        else                {pr1ntf("repne cmpsd");} printCol+=11; break;
  2484.             case 0xAE: pr1ntf("repne scasb"); printCol+=11; break;
  2485.             case 0xAF: if (operandOveride) {pr1ntf("repne scasw");}
  2486.                        else                {pr1ntf("repne scasd");} printCol+=11; break;
  2487.             default: fatalError=319;
  2488.         }
  2489.     }
  2490.     else if (prefixStack[i_psp-1]==0xF3)
  2491.     {
  2492.         switch(i_opcode)
  2493.         {
  2494.             case 0x6C: pr1ntf("rep ins byte"); 
  2495.                        ref=r_m_( 8);pr1ntf(", port[dx]"); printCol+=22; 
  2496.                        if (isGoodAddress(ref)) lclass=520;
  2497.                        break;
  2498.             case 0x6D: if (operandOveride){pr1ntf("rep ins word") ;printCol+=12;}
  2499.                        else               {pr1ntf("rep ins dword");printCol+=13;}
  2500.                        ref=r_m_(rr);pr1ntf(", port[dx]");            printCol+=10;
  2501.                        if (isGoodAddress(ref)) 
  2502.                        {if (operandOveride) lclass=516; else lclass=514;}
  2503.                        break; 
  2504.             case 0x6E: pr1ntf("rep outs port[dx], byte");             printCol+=23;
  2505.                        ref=r_m_( 8);
  2506.                        if (isGoodAddress(ref)) lclass=520;
  2507.                        break;
  2508.             case 0x6F: if (operandOveride){pr1ntf("rep outs port[dx], word");printCol+=23;}
  2509.                        else{pr1ntf("rep outs port[dx], dword")              ;printCol+=24;} 
  2510.                        r_m_(rr); 
  2511.                        break;
  2512.             case 0xA4: pr1ntf("rep movsb");                        printCol+=9;   
  2513.                        break;
  2514.             case 0xA5: if (operandOveride) {pr1ntf("rep movsw");}
  2515.                        else                {pr1ntf("rep movsd");}    printCol+=9;       
  2516.                        break;
  2517.             case 0xA6: pr1ntf("repe cmpsb");                       printCol+=10;   
  2518.                        break;
  2519.             case 0xA7: if (operandOveride) {pr1ntf("repe cmpsw");}
  2520.                        else                {pr1ntf("repe cmpsd");}   printCol+=10;   
  2521.                        break;
  2522.             case 0xAA: pr1ntf("rep stosb");                        printCol+=9;   
  2523.                        break;
  2524.             case 0xAB: if (operandOveride) {pr1ntf("rep stosw");}
  2525.                        else                {pr1ntf("rep stosd");}    printCol+=9;   
  2526.                        break;
  2527.             case 0xAC: pr1ntf("rep lods al");                      printCol+=11;   
  2528.                        break;
  2529.             case 0xAD: if (operandOveride){pr1ntf("rep lods ax") ;printCol+=11;}
  2530.                        else               {pr1ntf("rep lods eax");printCol+=12;}    
  2531.                        break;
  2532.             case 0xAE: pr1ntf("repe scasb");                       printCol+=10;   
  2533.                        break;
  2534.             case 0xAF: if (operandOveride) {pr1ntf("repe scasw");}
  2535.                        else                {pr1ntf("repe scasd");}   printCol+=10;   
  2536.                        break; 
  2537.             default: fatalError=321;
  2538.         }
  2539.     }
  2540.     else fatalError=323;
  2541.     return 0;
  2542. }
  2543.  
  2544. /* *************************************************************** */
  2545. /* *************************************************************** */
  2546. /*         2 byte opcode printing starts here!                     */
  2547. /* *************************************************************** */
  2548. /* *************************************************************** */
  2549. int print20case()
  2550. {
  2551.     switch(i_opcode)
  2552.     {
  2553.         case 0x06:  pr1ntf("clts");      printCol+=4;  break;
  2554.         case 0x08:  pr1ntf("invd");      printCol+=4;  break;
  2555.         case 0x09:  pr1ntf("wbinvd");    printCol+=6;  break; 
  2556.         case 0x0B:  pr1ntf("ud2");       printCol+=3;  break;   
  2557.         case 0x30:  pr1ntf("wrmsr");     printCol+=5;  break;
  2558.         case 0x31:  pr1ntf("rdtsc");     printCol+=5;  break;
  2559.         case 0x32:  pr1ntf("rdmsr");     printCol+=5;  break;
  2560.         case 0x33:  pr1ntf("rdpmc");     printCol+=5;  break;
  2561.         case 0x34:  pr1ntf("sysenter");     printCol+=8;  break;
  2562.         case 0x35:  pr1ntf("sysexit");     printCol+=7;  break;
  2563.         case 0x77:  pr1ntf("emms");      printCol+=4;  break;   
  2564.         case 0xA0:  pr1ntf("push fs");   printCol+=7;  break;   
  2565.         case 0xA1:  pr1ntf("pop fs");    printCol+=6;  break;  
  2566.         case 0xA2:  pr1ntf("cpuid");     printCol+=5;  break;   
  2567.         case 0xA8:  pr1ntf("push gs");   printCol+=7;  break;   
  2568.         case 0xA9:  pr1ntf("pop gs");    printCol+=6;  break;   
  2569.         case 0xAA:  pr1ntf("rsm");         printCol+=3;  break;   
  2570.         case 0xC8:  pr1ntf("bswap eax"); printCol+=9;  break;   
  2571.         case 0xC9:  pr1ntf("bswap ecx"); printCol+=9;  break;   
  2572.         case 0xCA:  pr1ntf("bswap edx"); printCol+=9;  break;   
  2573.         case 0xCB:  pr1ntf("bswap ebx"); printCol+=9;  break;   
  2574.         case 0xCC:  pr1ntf("bswap esp"); printCol+=9;  break;   
  2575.         case 0xCD:  pr1ntf("bswap ebp"); printCol+=9;  break;   
  2576.         case 0xCE:  pr1ntf("bswap esi"); printCol+=9;  break;   
  2577.         case 0xCF:  pr1ntf("bswap edi"); printCol+=9;  break;   
  2578.         default:    fatalError=325;
  2579.     }
  2580.     return 0;
  2581. }
  2582.  
  2583. int print21case()
  2584. {
  2585.     switch(i_opcode)
  2586.     {
  2587.         case 0x80:  pr1ntf("jo ");     printCol+=3;  break;
  2588.         case 0x81:  pr1ntf("jno ");     printCol+=4;  break;
  2589.         case 0x82:  pr1ntf("jb ");     printCol+=3;  break;
  2590.         case 0x83:  pr1ntf("jae ");     printCol+=4;  break;
  2591.         case 0x84:  pr1ntf("je ");     printCol+=3;  break;
  2592.         case 0x85:  pr1ntf("jne ");     printCol+=4;  break;
  2593.         case 0x86:  pr1ntf("jbe ");     printCol+=4;  break;
  2594.         case 0x87:  pr1ntf("ja ");     printCol+=3;  break;
  2595.         case 0x88:  pr1ntf("js ");     printCol+=3;  break;
  2596.         case 0x89:  pr1ntf("jns ");     printCol+=4;  break;
  2597.         case 0x8A:  pr1ntf("jpe ");     printCol+=4;  break;
  2598.         case 0x8B:  pr1ntf("jpo ");     printCol+=4;  break;
  2599.         case 0x8C:  pr1ntf("jl ");     printCol+=3;  break;
  2600.         case 0x8D:  pr1ntf("jge ");     printCol+=4;  break;
  2601.         case 0x8E:  pr1ntf("jle ");     printCol+=4;  break;
  2602.         case 0x8F:  pr1ntf("jg ");     printCol+=3;  break;
  2603.         default:    fatalError=327;
  2604.     }    
  2605.     ref = print_rel32();  lclass =  4; 
  2606.     return 0;
  2607. }
  2608.  
  2609. int print22case()
  2610. {
  2611. int    rr;
  2612.  
  2613.     if (operandOveride) rr=16; else rr=32;
  2614.  
  2615.     switch(i_opcode)
  2616.     {
  2617.         case 0x02: pr1ntf("lar ");       r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=6;
  2618.                    if (isGoodAddress(ref)) 
  2619.                    {if (operandOveride) lclass=516; else lclass=514;}
  2620.                    break;    
  2621.         case 0x03: pr1ntf("lsl ");       r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=6;
  2622.                    if (isGoodAddress(ref)) 
  2623.                    {if (operandOveride) lclass=516; else lclass=514;}
  2624.                    break;    
  2625.         case 0x20: pr1ntf("mov "); r___(rr);pr2ntf(", cr%1d", rmTable[i_mod]);printCol+=9;
  2626.                    break;    
  2627.         case 0x21: pr1ntf("mov "); r___(rr);pr2ntf(", dr%1d", rmTable[i_mod]);printCol+=9; 
  2628.                    break;   
  2629.         case 0x22: pr2ntf("mov cr%1d, ",rmTable[i_mod]);       r___(rr);printCol+=9;
  2630.                    break;    
  2631.         case 0x23: pr2ntf("mov dr%1d, ",rmTable[i_mod]);       r___(rr);printCol+=9;
  2632.                    break;    
  2633.         case 0x40: pr1ntf("cmovo ");     r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
  2634.                    if (isGoodAddress(ref)) 
  2635.                    {if (operandOveride) lclass=516; else lclass=514;}
  2636.                    break;    
  2637.         case 0x41: pr1ntf("cmovno ");    r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
  2638.                    if (isGoodAddress(ref)) 
  2639.                    {if (operandOveride) lclass=516; else lclass=514;}
  2640.                    break;    
  2641.         case 0x42: pr1ntf("cmovb ");     r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
  2642.                    if (isGoodAddress(ref)) 
  2643.                    {if (operandOveride) lclass=516; else lclass=514;}
  2644.                    break;    
  2645.         case 0x43: pr1ntf("cmovae ");    r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
  2646.                    if (isGoodAddress(ref)) 
  2647.                    {if (operandOveride) lclass=516; else lclass=514;}
  2648.                    break;    
  2649.         case 0x44: pr1ntf("cmove ");     r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
  2650.                    if (isGoodAddress(ref)) 
  2651.                    {if (operandOveride) lclass=516; else lclass=514;}
  2652.                    break;    
  2653.         case 0x45: pr1ntf("cmovne ");    r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
  2654.                    if (isGoodAddress(ref)) 
  2655.                    {if (operandOveride) lclass=516; else lclass=514;}
  2656.                    break;    
  2657.         case 0x46: pr1ntf("cmovbe ");    r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
  2658.                    if (isGoodAddress(ref)) 
  2659.                    {if (operandOveride) lclass=516; else lclass=514;}
  2660.                    break;    
  2661.         case 0x47: pr1ntf("cmova ");     r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
  2662.                    if (isGoodAddress(ref)) 
  2663.                    {if (operandOveride) lclass=516; else lclass=514;}
  2664.                    break;    
  2665.         case 0x48: pr1ntf("cmovs ");     r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
  2666.                    if (isGoodAddress(ref)) 
  2667.                    {if (operandOveride) lclass=516; else lclass=514;}
  2668.                    break;    
  2669.         case 0x49: pr1ntf("cmovns ");    r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
  2670.                    if (isGoodAddress(ref)) 
  2671.                    {if (operandOveride) lclass=516; else lclass=514;}
  2672.                    break;    
  2673.         case 0x4A: pr1ntf("cmovpe ");    r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
  2674.                    if (isGoodAddress(ref)) 
  2675.                    {if (operandOveride) lclass=516; else lclass=514;}
  2676.                    break;    
  2677.         case 0x4B: pr1ntf("cmovpo ");    r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
  2678.                    if (isGoodAddress(ref)) 
  2679.                    {if (operandOveride) lclass=516; else lclass=514;}
  2680.                    break;    
  2681.         case 0x4C: pr1ntf("cmovl ");     r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
  2682.                    if (isGoodAddress(ref)) 
  2683.                    {if (operandOveride) lclass=516; else lclass=514;}
  2684.                    break;    
  2685.         case 0x4D: pr1ntf("cmovge ");    r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
  2686.                    if (isGoodAddress(ref)) 
  2687.                    {if (operandOveride) lclass=516; else lclass=514;}
  2688.                    break;    
  2689.         case 0x4E: pr1ntf("cmovle ");    r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=9;
  2690.                    if (isGoodAddress(ref)) 
  2691.                    {if (operandOveride) lclass=516; else lclass=514;}
  2692.                    break;    
  2693.         case 0x4F: pr1ntf("cmovg ");     r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=8;
  2694.                    if (isGoodAddress(ref)) 
  2695.                    {if (operandOveride) lclass=516; else lclass=514;}
  2696.                    break;    
  2697.         case 0x60: pr1ntf("punpcklbw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
  2698.                    if (isGoodAddress(ref)) lclass=518;
  2699.                    break;    
  2700.         case 0x61: pr1ntf("punpcklwd "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
  2701.                    if (isGoodAddress(ref)) lclass=518;
  2702.                    break;    
  2703.         case 0x62: pr1ntf("punpckldq "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
  2704.                    if (isGoodAddress(ref)) lclass=518;
  2705.                    break;    
  2706.         case 0x63: pr1ntf("packsswb ");  mm____();pr1ntf(", ");ref=r_m_(64);printCol+=11;
  2707.                    if (isGoodAddress(ref)) lclass=518;
  2708.                    break;    
  2709.         case 0x64: pr1ntf("pcmpgtb ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2710.                    if (isGoodAddress(ref)) lclass=518;
  2711.                    break;    
  2712.         case 0x65: pr1ntf("pcmpgtw ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2713.                    if (isGoodAddress(ref)) lclass=518;
  2714.                    break;    
  2715.         case 0x66: pr1ntf("pcmpgtd ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2716.                    if (isGoodAddress(ref)) lclass=518;
  2717.                    break;    
  2718.         case 0x67: pr1ntf("packuswb ");  mm____();pr1ntf(", ");ref=r_m_(64);printCol+=11;
  2719.                    if (isGoodAddress(ref)) lclass=518;
  2720.                    break;    
  2721.         case 0x68: pr1ntf("punpckhbw "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
  2722.                    if (isGoodAddress(ref)) lclass=518;
  2723.                    break;    
  2724.         case 0x69: pr1ntf("punpckhwd "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
  2725.                    if (isGoodAddress(ref)) lclass=518;
  2726.                    break;    
  2727.         case 0x6A: pr1ntf("punpckhdq "); mm____();pr1ntf(", ");ref=r_m_(64);printCol+=12;
  2728.                    if (isGoodAddress(ref)) lclass=518;
  2729.                    break;    
  2730.         case 0x6B: pr1ntf("packssdw ");  mm____();pr1ntf(", ");ref=r_m_(64);printCol+=11;
  2731.                    if (isGoodAddress(ref)) lclass=518;
  2732.                    break;    
  2733.         case 0x6E: pr1ntf("movd ");      mm____();pr1ntf(", ");ref=r_m_(rr);printCol+=7;
  2734.                    if (isGoodAddress(ref)) 
  2735.                    {if (operandOveride) lclass=516; else lclass=514;}
  2736.                    break;    
  2737.         case 0x6F: pr1ntf("movq ");      mm____();pr1ntf(", ");ref=r_m_(64);printCol+=7;
  2738.                    if (isGoodAddress(ref)) lclass=518;
  2739.                    break;    
  2740.         case 0x74: pr1ntf("pcmpeqb ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2741.                    if (isGoodAddress(ref)) lclass=518;
  2742.                    break;    
  2743.         case 0x75: pr1ntf("pcmpeqw ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2744.                    if (isGoodAddress(ref)) lclass=518;
  2745.                    break;    
  2746.         case 0x76: pr1ntf("pcmpeqd ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2747.                    if (isGoodAddress(ref)) lclass=518;
  2748.                    break;    
  2749.         case 0x7E: pr1ntf("movd ");      r_m_(rr);pr1ntf(", ");ref=mm____();printCol+=7;
  2750.                    if (isGoodAddress(ref)) lclass=518;
  2751.                    break;    
  2752.         case 0x7F: pr1ntf("movq ");      r_m_(64);pr1ntf(", ");ref=mm____();printCol+=7;
  2753.                    if (isGoodAddress(ref)) lclass=518;
  2754.                    break;    
  2755.         case 0x90: pr1ntf("seto ");      ref=r_m_( 8);                      printCol+=5;
  2756.                    if (isGoodAddress(ref)) lclass=520;
  2757.                    break; 
  2758.         case 0x91: pr1ntf("setno ");     ref=r_m_( 8);                      printCol+=6;
  2759.                    if (isGoodAddress(ref)) lclass=520;
  2760.                    break; 
  2761.         case 0x92: pr1ntf("setb ");      ref=r_m_( 8);                      printCol+=5;
  2762.                    if (isGoodAddress(ref)) lclass=520;
  2763.                    break; 
  2764.         case 0x93: pr1ntf("setae ");     ref=r_m_( 8);                      printCol+=6;
  2765.                    if (isGoodAddress(ref)) lclass=520;
  2766.                    break; 
  2767.         case 0x94: pr1ntf("sete ");      ref=r_m_( 8);                      printCol+=5;
  2768.                    if (isGoodAddress(ref)) lclass=520;
  2769.                    break; 
  2770.         case 0x95: pr1ntf("setne ");     ref=r_m_( 8);                      printCol+=6;
  2771.                    if (isGoodAddress(ref)) lclass=520;
  2772.                    break; 
  2773.         case 0x96: pr1ntf("setbe ");     ref=r_m_( 8);                      printCol+=6;
  2774.                    if (isGoodAddress(ref)) lclass=520;
  2775.                    break; 
  2776.         case 0x97: pr1ntf("seta ");      ref=r_m_( 8);                      printCol+=5;
  2777.                    if (isGoodAddress(ref)) lclass=520;
  2778.                    break; 
  2779.         case 0x98: pr1ntf("sets ");      ref=r_m_( 8);                      printCol+=5;
  2780.                    if (isGoodAddress(ref)) lclass=520;
  2781.                    break; 
  2782.         case 0x99: pr1ntf("setns ");     ref=r_m_( 8);                      printCol+=6;
  2783.                    if (isGoodAddress(ref)) lclass=520;
  2784.                    break; 
  2785.         case 0x9A: pr1ntf("setpe ");     ref=r_m_( 8);                      printCol+=6;
  2786.                    if (isGoodAddress(ref)) lclass=520;
  2787.                    break; 
  2788.         case 0x9B: pr1ntf("setpo ");     ref=r_m_( 8);                      printCol+=6;
  2789.                    if (isGoodAddress(ref)) lclass=520;
  2790.                    break; 
  2791.         case 0x9C: pr1ntf("setl ");      ref=r_m_( 8);                      printCol+=5;
  2792.                    if (isGoodAddress(ref)) lclass=520;
  2793.                    break; 
  2794.         case 0x9D: pr1ntf("setge ");     ref=r_m_( 8);                         printCol+=6;
  2795.                    if (isGoodAddress(ref)) lclass=520;
  2796.                    break; 
  2797.         case 0x9E: pr1ntf("setle ");     ref=r_m_( 8);                         printCol+=6;
  2798.                    if (isGoodAddress(ref)) lclass=520;
  2799.                    break; 
  2800.         case 0x9F: pr1ntf("setg ");      ref=r_m_( 8);                         printCol+=5;
  2801.                    if (isGoodAddress(ref)) lclass=520;
  2802.                    break; 
  2803.         case 0xA3: pr1ntf("bt ");        ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=5;
  2804.                    if (isGoodAddress(ref))
  2805.                    {if (operandOveride) lclass=516; else lclass=514;}
  2806.                    break;    
  2807.         case 0xA5: pr1ntf("shld ");      ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=11;
  2808.                                                   pr1ntf(", cl");       
  2809.                    if (isGoodAddress(ref)) 
  2810.                    {if (operandOveride) lclass=516; else lclass=514;}
  2811.                    break;
  2812.         case 0xAB: pr1ntf("bts ");       ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=6;
  2813.                    if (isGoodAddress(ref)) 
  2814.                    {if (operandOveride) lclass=516; else lclass=514;}
  2815.                    break;    
  2816.         case 0xAD: pr1ntf("shrd ");      ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=11;      
  2817.                                                   pr1ntf(", cl");       
  2818.                    if (isGoodAddress(ref)) 
  2819.                    {if (operandOveride) lclass=516; else lclass=514;}
  2820.                    break;
  2821.         case 0xAF: pr1ntf("imul ");      r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=7;
  2822.                    if (isGoodAddress(ref)) 
  2823.                    {if (operandOveride) lclass=516; else lclass=514;}
  2824.                    break;    
  2825.         case 0xB0: pr1ntf("cmpxchg ");   ref=r_m_( 8);pr1ntf(", ");r___( 8);printCol+=10;
  2826.                    if (isGoodAddress(ref)) lclass=520;
  2827.                    break;    
  2828.         case 0xB1: pr1ntf("cmpxchg ");   ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=10;
  2829.                    if (isGoodAddress(ref)) 
  2830.                    {if (operandOveride) lclass=516; else lclass=514;}
  2831.                    break;    
  2832.         case 0xB2: pr1ntf("lss ");       r___(rr);pr1ntf(", ");ref=m16_32();printCol+=6;
  2833.                    if (isGoodAddress(ref)) lclass=516;
  2834.                    break;   
  2835.         case 0xB3: pr1ntf("btr ");       ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=6;
  2836.                    if (isGoodAddress(ref)) 
  2837.                    {if (operandOveride) lclass=516; else lclass=514;}
  2838.                    break;    
  2839.         case 0xB4: pr1ntf("lfs ");       r___(rr);pr1ntf(", ");ref=m16_32();printCol+=6;
  2840.                    if (isGoodAddress(ref)) lclass=516;
  2841.                    break;   
  2842.         case 0xB5: pr1ntf("lgs ");       r___(rr);pr1ntf(", ");ref=m16_32();printCol+=6;
  2843.                    if (isGoodAddress(ref)) lclass=516;
  2844.                    break;   
  2845.         case 0xB6: pr1ntf("movzx ");     r___(rr);pr1ntf(", ");ref=r_m_( 8);printCol+=8;
  2846.                    if (isGoodAddress(ref)) lclass=520;
  2847.                    break;    
  2848.         case 0xB7: pr1ntf("movzx ");     r___(rr);pr1ntf(", ");ref=r_m_(16);printCol+=8;
  2849.                    if (isGoodAddress(ref)) lclass=516;
  2850.                    break;    
  2851.         case 0xBB: pr1ntf("btc ");       ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=6;
  2852.                    if (isGoodAddress(ref)) 
  2853.                    {if (operandOveride) lclass=516; else lclass=514;}
  2854.                    break;    
  2855.         case 0xBC: pr1ntf("bsf ");       r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=6;
  2856.                    if (isGoodAddress(ref)) 
  2857.                    {if (operandOveride) lclass=516; else lclass=514;}
  2858.                    break;    
  2859.         case 0xBD: pr1ntf("bsr ");         r___(rr);pr1ntf(", ");ref=r_m_(rr);printCol+=6;
  2860.                    if (isGoodAddress(ref)) 
  2861.                    {if (operandOveride) lclass=516; else lclass=514;}
  2862.                    break;    
  2863.         case 0xBE: pr1ntf("movsx ");     r___(rr);pr1ntf(", ");ref=r_m_( 8);printCol+=8;
  2864.                    if (isGoodAddress(ref)) lclass=520;
  2865.                    break;    
  2866.         case 0xBF: pr1ntf("movsx ");     r___(rr);pr1ntf(", ");ref=r_m_(16);printCol+=8;
  2867.                    if (isGoodAddress(ref)) lclass=516;
  2868.                    break;    
  2869.         case 0xC0: pr1ntf("xadd ");      ref=r_m_( 8);pr1ntf(", ");r___( 8);printCol+=7;
  2870.                    if (isGoodAddress(ref)) lclass=520;
  2871.                    break;    
  2872.         case 0xC1: pr1ntf("xadd ");      ref=r_m_(rr);pr1ntf(", ");r___(rr);printCol+=7;
  2873.                    if (isGoodAddress(ref)) 
  2874.                    {if (operandOveride) lclass=516; else lclass=514;}
  2875.                    break;    
  2876.         case 0xD1: pr1ntf("psrlw ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2877.                    if (isGoodAddress(ref)) lclass=518;
  2878.                    break;   
  2879.         case 0xD2: pr1ntf("psrld ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2880.                    if (isGoodAddress(ref)) lclass=518;
  2881.                    break;   
  2882.         case 0xD3: pr1ntf("psrlq ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2883.                    if (isGoodAddress(ref)) lclass=518;
  2884.                    break;   
  2885.         case 0xD5: pr1ntf("pmullw ");    mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
  2886.                    if (isGoodAddress(ref)) lclass=518;
  2887.                    break;   
  2888.         case 0xD8: pr1ntf("psubusb ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2889.                    if (isGoodAddress(ref)) lclass=518;
  2890.                    break;   
  2891.         case 0xD9: pr1ntf("psubusw ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2892.                    if (isGoodAddress(ref)) lclass=518;
  2893.                    break;   
  2894.         case 0xDB: pr1ntf("pand ");      mm____();pr1ntf(", ");ref=r_m_(64);printCol+=7;
  2895.                    if (isGoodAddress(ref)) lclass=518;
  2896.                    break;   
  2897.         case 0xDC: pr1ntf("paddusb ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2898.                    if (isGoodAddress(ref)) lclass=518;
  2899.                    break;   
  2900.         case 0xDD: pr1ntf("paddusw ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2901.                    if (isGoodAddress(ref)) lclass=518;
  2902.                    break;   
  2903.         case 0xDF: pr1ntf("pandn ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2904.                    if (isGoodAddress(ref)) lclass=518;
  2905.                    break;   
  2906.         case 0xE1: pr1ntf("psraw ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2907.                    if (isGoodAddress(ref)) lclass=518;
  2908.                    break;   
  2909.         case 0xE2: pr1ntf("psrad ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2910.                    if (isGoodAddress(ref)) lclass=518;
  2911.                    break;   
  2912.         case 0xE5: pr1ntf("pmulhw ");    mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
  2913.                    if (isGoodAddress(ref)) lclass=518;
  2914.                    break;   
  2915.         case 0xE8: pr1ntf("psubsb ");    mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
  2916.                    if (isGoodAddress(ref)) lclass=518;
  2917.                    break;   
  2918.         case 0xE9: pr1ntf("psubsw ");    mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
  2919.                    if (isGoodAddress(ref)) lclass=518;
  2920.                    break;   
  2921.         case 0xEB: pr1ntf("por ");       mm____();pr1ntf(", ");ref=r_m_(64);printCol+=5;
  2922.                    if (isGoodAddress(ref)) lclass=518;
  2923.                    break;   
  2924.         case 0xEC: pr1ntf("paddsb ");    mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
  2925.                    if (isGoodAddress(ref)) lclass=518;
  2926.                    break;   
  2927.         case 0xED: pr1ntf("paddsw ");    mm____();pr1ntf(", ");ref=r_m_(64);printCol+=9;
  2928.                    if (isGoodAddress(ref)) lclass=518;
  2929.                    break;   
  2930.         case 0xEF: pr1ntf("pxor ");      mm____();pr1ntf(", ");ref=r_m_(64);printCol+=7;
  2931.                    if (isGoodAddress(ref)) lclass=518;
  2932.                    break;   
  2933.         case 0xF1: pr1ntf("psllw ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2934.                    if (isGoodAddress(ref)) lclass=518;
  2935.                    break;   
  2936.         case 0xF2: pr1ntf("pslld ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2937.                    if (isGoodAddress(ref)) lclass=518;
  2938.                    break;   
  2939.         case 0xF3: pr1ntf("psllq ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2940.                    if (isGoodAddress(ref)) lclass=518;
  2941.                    break;   
  2942.         case 0xF5: pr1ntf("pmaddwd ");   mm____();pr1ntf(", ");ref=r_m_(64);printCol+=10;
  2943.                    if (isGoodAddress(ref)) lclass=518;
  2944.                    break;   
  2945.         case 0xF8: pr1ntf("psubb ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2946.                    if (isGoodAddress(ref)) lclass=518;
  2947.                    break;   
  2948.         case 0xF9: pr1ntf("psubw ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2949.                    if (isGoodAddress(ref)) lclass=518;
  2950.                    break;   
  2951.         case 0xFA: pr1ntf("psubd ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2952.                    if (isGoodAddress(ref)) lclass=518;
  2953.                    break;   
  2954.         case 0xFC: pr1ntf("paddb ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2955.                    if (isGoodAddress(ref)) lclass=518;
  2956.                    break;   
  2957.         case 0xFD: pr1ntf("paddw ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2958.                    if (isGoodAddress(ref)) lclass=518;
  2959.                    break;   
  2960.         case 0xFE: pr1ntf("paddd ");     mm____();pr1ntf(", ");ref=r_m_(64);printCol+=8;
  2961.                    if (isGoodAddress(ref)) lclass=518;
  2962.                    break;
  2963.         default: fatalError=329;
  2964.     }
  2965.     return 0;
  2966. }
  2967.  
  2968. int print23case()
  2969. {
  2970. int    rr;
  2971.  
  2972.     if (operandOveride) rr=16; else rr=32;
  2973.  
  2974.     if (i_opcode==0xA4) 
  2975.     {
  2976.         pr1ntf("shld "); r_m_(rr);
  2977.         pr1ntf(", ");    r___(rr);
  2978.         pr1ntf(", ");    print_i_byte();  printCol+=9;
  2979.     }
  2980.     else
  2981.     {
  2982.         pr1ntf("shrd "); r_m_(rr);
  2983.         pr1ntf(", ");    r___(rr);
  2984.         pr1ntf(", ");    print_i_byte();  printCol+=9;
  2985.     }
  2986.     return 0;
  2987. }
  2988.  
  2989. int print24case()
  2990. {
  2991. int    rr;
  2992.  
  2993.     if (operandOveride) rr=16; else rr=32;
  2994.  
  2995.     if (i_opcode==0x00)
  2996.     {    
  2997.         switch(regTable[i_mod])
  2998.         {
  2999.             case 0: pr1ntf("sldt "); ref=r_m_(rr); printCol+=5; 
  3000.                     if (isGoodAddress(ref)) 
  3001.                     {if (operandOveride) lclass=516; else lclass=514;}
  3002.                     break;           
  3003.             case 1: pr1ntf("str ");  ref=r_m_(16); printCol+=4; 
  3004.                     if (isGoodAddress(ref)) lclass=516;
  3005.                     break;
  3006.             case 2: pr1ntf("lldt "); ref=r_m_(16); printCol+=5; 
  3007.                     if (isGoodAddress(ref)) lclass=516;
  3008.                     break;
  3009.             case 3: pr1ntf("ltr ");  ref=r_m_(16); printCol+=4; 
  3010.                     if (isGoodAddress(ref)) lclass=516;
  3011.                     break;
  3012.             case 4: pr1ntf("verr "); ref=r_m_(16); printCol+=5; 
  3013.                     if (isGoodAddress(ref)) lclass=516;
  3014.                     break;
  3015.             case 5: pr1ntf("verw "); ref=r_m_(16); printCol+=5; 
  3016.                     if (isGoodAddress(ref)) lclass=516;
  3017.                     break;
  3018.             default: fatalError=331;
  3019.         }
  3020.     }
  3021.     else if (i_opcode==0x01)
  3022.     {
  3023.         switch(regTable[i_mod])
  3024.         {
  3025.             case 0: pr1ntf("sgdt ");   ref=m_____(); printCol+=5; 
  3026.                     if (isGoodAddress(ref)) 
  3027.                     {if (operandOveride) lclass=516; else lclass=514;}
  3028.                     break;
  3029.             case 1: pr1ntf("sidt ");   ref=m_____(); printCol+=5; 
  3030.                     if (isGoodAddress(ref)) 
  3031.                     {if (operandOveride) lclass=516; else lclass=514;}
  3032.                     break;
  3033.             case 2: pr1ntf("lgdt ");   ref=m16_32(); printCol+=5; 
  3034.                     if (isGoodAddress(ref)) lclass=516;
  3035.                     break;
  3036.             case 3: pr1ntf("lidt ");   ref=m16_32(); printCol+=5; 
  3037.                     if (isGoodAddress(ref)) lclass=516;
  3038.                     break;
  3039.             case 4: pr1ntf("smsw ");   ref=r_m_(rr); printCol+=5; 
  3040.                     if (isGoodAddress(ref)) 
  3041.                     {if (operandOveride) lclass=516; else lclass=514;}
  3042.                     break;
  3043.             case 6: pr1ntf("lmsw ");   ref=r_m_(16); printCol+=5; 
  3044.                     if (isGoodAddress(ref)) lclass=516;
  3045.                     break;
  3046.             case 7: pr1ntf("invlpg "); ref=m_____(); printCol+=7; 
  3047.                     if (isGoodAddress(ref)) 
  3048.                     {if (operandOveride) lclass=516; else lclass=514;}
  3049.                     break;
  3050.             default: fatalError=333;
  3051.         }
  3052.     }
  3053.     else if (i_opcode==0xAE)
  3054.     {
  3055.              if (regTable[i_mod]==0) {pr1ntf("fxsave") ;printCol+=6;}
  3056.         else if (regTable[i_mod]==1) {pr1ntf("fxrstor");printCol+=7;}
  3057.         else fatalError=334;
  3058.     }
  3059.     else if (i_opcode==0xC7 && regTable[i_mod]==1)
  3060.     {
  3061.         pr1ntf("comxchg8b 64bit");     printCol+=15; 
  3062.         m_____();
  3063.     }
  3064.     else fatalError=335;
  3065.     return 0;
  3066. }
  3067.  
  3068. int print25case()
  3069. {
  3070. int    k;
  3071. int    rr;
  3072.  
  3073.     if (operandOveride) rr=16; else rr=32;
  3074.  
  3075.     k = regTable[i_mod];
  3076.     if (i_opcode==0x71)
  3077.     {
  3078.         if (k==2) 
  3079.         {
  3080.             pr1ntf("psrlw "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8; 
  3081.         }
  3082.         else if (k==4)
  3083.         {
  3084.             pr1ntf("psraw "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8; 
  3085.         }
  3086.         else if (k==6)
  3087.         {
  3088.             pr1ntf("psllw "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8; 
  3089.         }
  3090.         else fatalError=337;
  3091.     }
  3092.     else if (i_opcode==0x72)
  3093.     {
  3094.         if (k==2)
  3095.         {
  3096.             pr1ntf("psrld "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8; 
  3097.         }
  3098.         else if (k==4)
  3099.         {
  3100.             pr1ntf("psrad "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8; 
  3101.         }
  3102.         else if (k==6)
  3103.         {
  3104.             pr1ntf("pslld "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8; 
  3105.         }
  3106.         else fatalError=339;
  3107.     }
  3108.     else if (i_opcode==0x73)
  3109.     {
  3110.         if (k==2)
  3111.         {
  3112.             pr1ntf("psrlq "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8; 
  3113.         }
  3114.         else if (k==6)
  3115.         {
  3116.             pr1ntf("psllq "); mmm___(); pr1ntf(", "); print_i_byte(); printCol+=8; 
  3117.         }
  3118.         else fatalError=341;
  3119.     }
  3120.     else if (i_opcode==0xBA)
  3121.     {
  3122.         if (k==4)
  3123.         {
  3124.             pr1ntf("bt ");    ref=r_m_(rr); pr1ntf(", "); print_i_byte32(); printCol+=5;
  3125.             if (isGoodAddress(ref)) 
  3126.             {if (operandOveride) lclass=516; else lclass=514;}
  3127.         }
  3128.         else if (k==5)
  3129.         {
  3130.             pr1ntf("bts ");   ref=r_m_(rr); pr1ntf(", "); print_i_byte32();    printCol+=6; 
  3131.             if (isGoodAddress(ref)) 
  3132.             {if (operandOveride) lclass=516; else lclass=514;}
  3133.         }
  3134.         else if (k==6)
  3135.         {
  3136.             pr1ntf("btr ");   ref=r_m_(rr); pr1ntf(", "); print_i_byte32();    printCol+=6; 
  3137.             if (isGoodAddress(ref)) 
  3138.             {if (operandOveride) lclass=516; else lclass=514;}
  3139.         }
  3140.         else if (k==7)
  3141.         {
  3142.             pr1ntf("btc ");   ref=r_m_(rr); pr1ntf(", "); print_i_byte32();    printCol+=6; 
  3143.             if (isGoodAddress(ref)) 
  3144.             {if (operandOveride) lclass=516; else lclass=514;}
  3145.         }
  3146.         else fatalError=343;
  3147.     }
  3148.     else fatalError=345;
  3149.     return 0;
  3150. }
  3151.