SHARE
TWEET

Untitled

a guest Mar 13th, 2014 342 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;- Simple x86/x64-Disassembler V_0.69
  2. ;- "Helle" Klaus Helbing, December 06, 2011
  3. ;- Tested with PB 4.60 (x86/x64), Windows XP Prof. SP3 (32-Bit) / Windows 7 (64-Bit), FAsm 1.69.35, CPU Intel i7-2600 and AMD FX-8120
  4. ;- Sources:
  5. ;-- Microsoft Portable Executable and Common Object File Format Specification, Revision 8.2 - September 21, 2010
  6. ;-- Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2A #253666-039US May 2011 and Volume 2B #253667-039US May 2011
  7. ;-- Intel® Advanced Vector Extensions Programming Reference, Ref. #319433-011 June 2011
  8. ;-- 3DNow! Technology Manual, AMD 21928
  9. ;-- AMD Extensions to the 3DNow! and MMX Instruction Sets Manual, AMD 22466
  10. ;-- AMD64 Architecture Programmer’s Manual, Volume 3 #24594-Rev.3.16-September 2011 and Volume 4 #26568-Rev.3.13-September 2011
  11.  
  12. Global AST.l                 ;Anfang Section Table
  13. Global Zeile.l               ;Zeile im ListIconGadget
  14. Global ZeilePEP.l            ;Zeile des Programm-Einstiegspunktes im ListIconGadget
  15. Global Buffer.q              ;allokierter Speicher für die Datei
  16. Global ANS.l                 ;Anzahl der Sections
  17. Global IB.q                  ;Image-Base   die Quads für Ansicht 64-Bit-File unter 32-Bit-OS!
  18. Global PEP.l                 ;Programm-Einstiegspunkt
  19. Global SZ.l                  ;Sections-Zähler
  20. Global FL.l                  ;für Flag-Ermittlung der einzelnen Sections
  21. Global BZ.q                  ;Zeiger in Buffer
  22. Global OS.q                  ;Offset Section
  23. Global SO.q                  ;Section-Offset innerhalb der Datei
  24. Global LF.q                  ;File-Länge
  25. Global SL.q                  ;Sections-Länge
  26. Global SRVA.q                ;RVA der Section
  27. Global ProgA.q               ;niedrigst mögliche Adresse
  28. Global ProgE.q               ;höchst mögliche Adresse
  29. Global NoString.l            ;ob Strings für Informatioms-Anzeige gesucht werden sollen
  30. Global Adr.l                 ;ob gerade eine Adressierung aktiv ist
  31. Global Komma.l               ;ob Komma(s) gesetzt werden soll(en)
  32. Global CSS.l                 ;Instruktion benutzt das C-Segment
  33. Global DSS.l                 ;Instruktion benutzt das D-Segment
  34. Global ESS.l                 ;Instruktion benutzt das E-Segment
  35. Global FSS.l                 ;Instruktion benutzt das F-Segment
  36. Global GSS.l                 ;Instruktion benutzt das G-Segment
  37. Global SSS.l                 ;Instruktion benutzt das S-Segment
  38. Global OPF.l                 ;für FPU-Opcodes
  39. Global IsProg64.l            ;1=ist 64-Bit-File
  40. Global REX.l                 ;64-Bit-Präfix
  41. Global REXEX.l               ;Merker
  42. Global LVEX.l                ;AVX
  43. Global RVEX.l                ;AVX
  44. Global WVEX.l                ;AVX
  45. Global mmmmm.l               ;AVX
  46. Global pp.l                  ;AVX
  47. Global vvvv.l                ;AVX
  48. Global XY$                   ;AVX
  49. Global OPAVX.l               ;AVX
  50. Global Var1.l                ;AVX
  51. Global IMM8.l                ;AVX
  52.    Global BVEX.l
  53.    Global XVEX.l
  54. Global Adr3264.l = 8         ;für Adress-Anzeige, 8 für 32-Bit als Standard (erstmal)
  55. Global Adr64.q               ;Add-Korrektur-Wert für 64-Bit-Adress-Berechnung, berücksichtigt nachfolgende Strings
  56. Global IsvonMSBytes.l        ;Merker
  57. Global RSPZ.q                ;rel.Sprungziel
  58. Global RSE.q                 ;rel.Sections-Ende
  59. Global XRVA.q                ;Hilfs-Variable
  60. Global X.q                   ;Hilfs-Variable
  61. Global SPZ.q                 ;Sprungziel
  62. Global DLLAdr.q              ;DLLAddress
  63. Global NoCode.l              ;Merker
  64. Global NOF.l                 ;DLL: Number Of Functions
  65. Global DLL.l                 ;Merker
  66. Global GID.l                 ;GadgetID
  67. Global CPUInfo.l             ;CPU-Balloon-Tipp
  68. Global OS3264.l              ;ob 64-Bit-OS (=1)
  69. Global MemAdd64.q            ;64-Bit-Adress-Korrektur wenn imm folgt
  70.  
  71. Global AES.l        = $0000D0     ;für CPUID   erstmal Rot für nicht vorhanden
  72. Global AMDLM.l      = $0000D0
  73. Global AMDMISAL16.l = $0000D0
  74. Global AVX.l        = $0000D0
  75. Global AVX2.l       = $0000D0
  76. Global BMI.l        = $0000D0
  77. Global CLFSH.l      = $0000D0
  78. Global CMOV.l       = $0000D0
  79. Global CX16.l       = $0000D0
  80. Global CX8.l        = $0000D0
  81. Global CVT16.l      = $0000D0
  82. Global DNOW.l       = $0000D0
  83. Global EDNOW.l      = $0000D0
  84. Global EMMX.l       = $0000D0
  85. Global FMA.l        = $0000D0
  86. Global FMA4.l       = $0000D0
  87. Global FXSR.l       = $0000D0
  88. Global LWP.l        = $0000D0
  89. Global LZCNT.l      = $0000D0
  90. Global MMX.l        = $0000D0
  91. Global MONITOR.l    = $0000D0
  92. Global MOVBE.l      = $0000D0
  93. Global MSR.l        = $0000D0
  94. Global OSXSAVE.l    = $0000D0
  95. Global PCLMULQDQ.l  = $0000D0
  96. Global POPCNT.l     = $0000D0
  97. Global RDTSC.l      = $0000D0
  98. Global RDTSCP.l     = $0000D0
  99. Global SEP.l        = $0000D0
  100. Global SMX.l        = $0000D0
  101. Global SSE.l        = $0000D0
  102. Global SSE2.l       = $0000D0
  103. Global SSE3.l       = $0000D0
  104. Global SSSE3.l      = $0000D0
  105. Global SSE41.l      = $0000D0
  106. Global SSE42.l      = $0000D0
  107. Global SSE4A.l      = $0000D0
  108. Global TBM.l        = $0000D0
  109. Global VMX.l        = $0000D0
  110. Global SVM.l        = $0000D0
  111. Global XOP.l        = $0000D0
  112. Global XSAVE.l      = $0000D0
  113. Global XSAVEOPT.l   = $0000D0
  114.  
  115. Global Bit0.l  = $1          ;für SSE3, XSAVEOPT
  116. Global Bit1.l  = $2          ;für PCLMULQDQ
  117. Global Bit2.l  = $4          ;für MONITOR, SVM
  118. Global Bit3.l  = $8          ;für BMI
  119. Global Bit4.l  = $10         ;für RDTSC
  120. Global Bit5.l  = $20         ;für VMX, MSR, LZCNT, AVX2
  121. Global Bit6.l  = $40         ;für SMX, SSE4A
  122. Global Bit7.l  = $80         ;für AMDMISAL16
  123. Global Bit8.l  = $100        ;für CMPXCHG8B
  124. Global Bit9.l  = $200        ;für SSSE3
  125. Global Bit11.l = $800        ;für SEP, XOP
  126. Global Bit12.l = $1000       ;für FMA
  127. Global Bit13.l = $2000       ;für CMPXCHG16B
  128. Global Bit15.l = $8000       ;für (F)CMOVcc, LWP
  129. Global Bit16.l = $10000      ;für FMA4
  130. Global Bit18.l = $40000      ;für CVT16
  131. Global Bit19.l = $80000      ;für SSE4.1, CLFSH
  132. Global Bit20.l = $100000     ;für SSE4.2
  133. Global Bit21.l = $200000     ;für TBM
  134. Global Bit22.l = $400000     ;für MOVBE, EMMX
  135. Global Bit23.l = $800000     ;für MMX, POPCNT
  136. Global Bit24.l = $1000000    ;für FXSR
  137. Global Bit25.l = $2000000    ;für SSE, AES
  138. Global Bit26.l = $4000000    ;für SSE2, XSAVE
  139. Global Bit27.l = $8000000    ;für OSXSAVE, RDTSCP
  140. Global Bit28.l = $10000000   ;für AVX
  141. Global Bit29.l = $20000000   ;für AMDLM
  142. Global Bit30.l = $40000000   ;für Extended 3DNow!
  143. Global Bit31.l = $80000000   ;für 3DNow!
  144.  
  145. Global XMM.l                 ;Merker
  146. ;Bedeutung XMM:
  147. ;0=kein MMX- oder XMM-Register   1=MMX,MMX   2=XMM,XMM   3=MMX,32-Bit   4=XMM,32-Bit
  148. ;5=32-Bit,XMM   6=32-Bit,MMX   7=XMM,MMX   8=MMX,XMM
  149.  
  150. Global Main$ = "Helles simple x86/x64-Disassembler V_0.69"
  151. Global Option$ = "   (for options use the right mouse-button!)"
  152. Global Date$ = ", December 06, 2011"
  153. Global MN$                   ;Mnemonik-String
  154. Global OP$                   ;Opcode-String
  155. Global Fort$ = "Total Progress, actually Section : "
  156. Global No64$ = "No 64-Bit-Instruction!"     ;z.B. meine heissgeliebten BCD´s (eine Träne kullert...)
  157.  
  158. Global AES$        = "AES"
  159. Global AMDLM$      = "AMDLM"
  160. Global AMDMISAL16$ = "AMDMISAL16"
  161. Global AVX$        = "AVX"
  162. Global AVX2$       = "AVX2"
  163. Global BMI$        = "BMI"
  164. Global CLFSH$      = "CLFSH"
  165. Global CMOV$       = "(F)CMOV"
  166. Global CX16$       = "CX16"
  167. Global CX8$        = "CX8"
  168. Global CVT16$      = "CVT16"
  169. Global DNOW$       = "3DNow!"
  170. Global EDNOW$      = "Ext3DNow!"
  171. Global EMMX$       = "(E)MMX"
  172. Global FMA$        = "FMA"
  173. Global FMA4$       = "FMA4"
  174. Global FXSR$       = "FXSR"
  175. Global LWP$        = "LWP"
  176. Global LZCNT$      = "LZCNT"
  177. Global MMX$        = "MMX"
  178. Global MONITOR$    = "MONITOR"
  179. Global MOVBE$      = "MOVBE"
  180. Global MSR$        = "MSR"
  181. Global OSXSAVE$    = "OSXSAVE"
  182. Global PCLMULQDQ$  = "PCLMULQDQ"
  183. Global POPCNT$     = "POPCNT"
  184. Global RDTSC$      = "RDTSC"
  185. Global RDTSCP$     = "RDTSCP"
  186. Global SEP$        = "SEP"
  187. Global SMX$        = "SMX"
  188. Global SSE$        = "SSE"
  189. Global SSE2$       = "SSE2"
  190. Global SSE3$       = "SSE3"
  191. Global SSSE3$      = "SSSE3"
  192. Global SSE41$      = "SSE4.1"
  193. Global SSE42$      = "SSE4.2"
  194. Global SSE4A$      = "SSE4A"
  195. Global SVM$        = "SVM"
  196. Global TBM$        = "TBM"
  197. Global VMX$        = "VMX"
  198. Global XOP$        = "XOP"
  199. Global XSAVE$      = "XSAVE"
  200. Global XSAVEOPT$   = "XSAVEOPT"
  201.  
  202. Global ProzessorString$ = Space(49)    ;der String kann max.48 Zeichen lang sein + Zerobyte
  203. Global ProzStrAdr.l
  204.  
  205.   Global Bin.l     ;für AVX-Test
  206.   Global File$     ;für AVX-Test
  207.  Global Bit$
  208. Global WindowID.q
  209. Global ProgID.q
  210. Global ProcessHandle.q
  211. Global BaseAdr.q
  212. Global EndAdr.q
  213. Global AnfAdresse.q
  214. Global Size.q
  215. Global Status.l
  216. Global MaxAdr.q
  217. Global MinAdr.q
  218. Global Eigner.l
  219.  
  220. Global Quit.l
  221. Global FileExt.l
  222.  
  223. ;- Konstanten
  224. #PROCESSOR_ARCHITECTURE_AMD64     = $0009        ;für Test, ob 32- oder 64-Bit-OS
  225. #IMAGE_NT_SIGNATURE               = $00004550    ;"PE  "
  226. #IMAGE_FILE_MACHINE_I386          = $014C        ;sollte so ausreichen (ohne I486 usw.); lt. MS (s.Quellen) nur noch so. Für ältere Files evtl. erweitern
  227. #IMAGE_FILE_MACHINE_AMD64               = $8664        ;64-Bit-File
  228. #IMAGE_SIZEOF_SHORT_NAME          = $00000008    ;Länge des Section-Namens
  229. #IMAGE_SIZEOF_SECTION_HEADER      = $00000028    ;Grösse der Section-Header
  230. #IMAGE_SCN_CNT_INITIALIZED_DATA   = $00000040    ;Section enthält initialisierte Daten
  231. #IMAGE_SCN_CNT_UNINITIALIZED_DATA = $00000080    ;Section enthält nicht-initialisierte Daten
  232. #IMAGE_SCN_MEM_EXECUTE            = $20000000    ;Section ist ausführbar
  233. #IMAGE_SCN_MEM_READ               = $40000000    ;Section ist lesbar
  234. #IMAGE_SCN_MEM_WRITE              = $80000000    ;Section ist beschreibbar
  235. #IMAGE_FILE_DLL                   = $2000        ;DLL-Flag
  236. #NbProcessesMax = 10000
  237.  
  238. Global MBI64.q = AllocateMemory(64)              ;MEMORY_BASIC_INFORMATION, hat Tücken (16-Byte-Alignment für 64-Bit-OS) als Structure
  239. Global MBI64A.q = MBI64 + (16 - (MBI64 & $0F))   ;Alignment16
  240.  
  241. Global Dim ZArray.l(200)                    ;hier lieber 200 !
  242. Global Dim ArrayAdr.s(1)                    ;ReDim unten
  243. Global Dim ProcessesArray.l(#NbProcessesMax)
  244.  
  245. Global NewList Search.l()    ;for search results                  
  246. Global NewList DLLEP.l()     ;for dll-entrypoint
  247.  
  248. ;- Strukturen (in PB integriert)
  249. Global I_D_H.IMAGE_DOS_HEADER
  250. Global I_F_H.IMAGE_FILE_HEADER
  251. Global I_E_D.IMAGE_EXPORT_DIRECTORY
  252. Global S_I.SYSTEM_INFO
  253. Global M_B_I.MEMORY_BASIC_INFORMATION
  254.  
  255. ;- Strukturen (nicht in PB integriert)
  256. Structure IMAGE_SECTION_HEADER
  257.   Name.s{#IMAGE_SIZEOF_SHORT_NAME}          ;8 bytes
  258.   VirtualSize.l
  259.   VirtualAddress.l
  260.   SizeOfRawData.l
  261.   PointerToRawData.l
  262.   PointerToRelocations.l
  263.   PointerToLinenumbers.l
  264.   NumberOfRelocations.w
  265.   NumberOfLinenumbers.w
  266.   Characteristics.l
  267. EndStructure
  268. Global I_S_H.IMAGE_SECTION_HEADER
  269.  
  270. Structure Item
  271.   Address.s
  272.   Opcode.s
  273.   Mnemonic.s
  274.   ASCII.s
  275. EndStructure
  276.  
  277. Global Dim Daten.Item(16)                   ;Platzhalter, ReDim in Main()
  278.  
  279. Prototype IsWoW64(Handle, BOOL)
  280.  
  281. Procedure ListIcon_Callback(hwnd, msg, wparam, lparam)     ;thanks to edel for the tip!
  282.   Protected *hdr.NMHDR
  283.   Protected *di.NMLVDISPINFO
  284.   Protected *cd.NMLVCUSTOMDRAW
  285.  
  286.   If msg = #WM_NOTIFY
  287.     *hdr = lparam
  288.     If *hdr\code = #LVN_GETDISPINFO
  289.       *di = lparam
  290.       If *di\item\iSubItem = 0
  291.         PStr.i = @Daten(*di\item\iItem)\Address
  292.        ElseIf *di\item\iSubItem = 1
  293.         PStr.i = @Daten(*di\item\iItem)\Opcode
  294.        ElseIf *di\item\iSubItem = 2
  295.         PStr.i = @Daten(*di\item\iItem)\Mnemonic
  296.        Else      
  297.         PStr.i = @Daten(*di\item\iItem)\ASCII
  298.       EndIf
  299.       *di\item\pszText = PStr
  300.       ProcedureReturn #True
  301.     EndIf
  302.  
  303.     *cd.NMLVCUSTOMDRAW = lparam
  304.     If *cd\nmcd\hdr\hWndFrom = GID And *cd\nmcd\hdr\code = #NM_CUSTOMDRAW
  305.       Select *cd\nmcd\dwDrawStage
  306.         Case #CDDS_PREPAINT
  307.           ProcedureReturn #CDRF_NOTIFYITEMDRAW
  308.         Case #CDDS_ITEMPREPAINT
  309.           If *cd\nmcd\dwItemSpec = ZeilePEP And FileExt = 0
  310.             *cd\clrTextBk = $00FF00         ;green for program-entrypoint
  311.            Else
  312.              *cd\clrTextBk = $CCFFFF        ;light-yellow for code      
  313.           EndIf
  314.  
  315.           ForEach Search()
  316.             If *cd\nmcd\dwItemSpec = Search()
  317.               *cd\clrTextBk = $0ECCBB       ;olive for found instruction
  318.             EndIf
  319.           Next
  320.  
  321.           ForEach DLLEP()
  322.             If *cd\nmcd\dwItemSpec = DLLEP()
  323.               *cd\clrTextBk = $EECCBB       ;light-blue for dll-entrypoint
  324.             EndIf
  325.           Next
  326.  
  327.       EndSelect
  328.     EndIf
  329.   EndIf
  330.   ProcedureReturn #PB_ProcessPureBasicEvents
  331. EndProcedure
  332.  
  333. Procedure Header_Infos()
  334.   If OpenWindow(2, 0, 0, 820, 400, " Header-Infos of " + File$, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  335.     GID_HI = ListIconGadget(30, 10, 10, 800, 380, "Offset", 80, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  336.     SetGadgetFont(30, FontID(0))  
  337.     AddGadgetColumn(30, 1, "Value", 120)
  338.     AddGadgetColumn(30, 2, "Description", 575)
  339.     SpaltID_HI = SendMessage_(GID_HI, #LVM_GETHEADER, #Null, #Null)  ;Spaltenbreite nicht veränderbar
  340.     EnableWindow_(SpaltID_HI, 0)            ;wieder veränderbar: EnableWindow_(SpaltID_HI, 1)
  341.  
  342. ;Structure IMAGE_DOS_HEADER  ;equal for 32- and 64-bit, use structure. Filled in Main()
  343. ;  e_magic.w
  344. ;  e_cblp.w
  345. ;  e_cp.w
  346. ;  e_crlc.w
  347. ;  e_cparhdr.w
  348. ;  e_minalloc.w
  349. ;  e_maxalloc.w
  350. ;  e_ss.w
  351. ;  e_sp.w
  352. ;  e_csum.w
  353. ;  e_ip.w
  354. ;  e_cs.w
  355. ;  e_lfarlc.w
  356. ;  e_ovno.w
  357. ;  e_res.w[4]
  358. ;  e_oemid.w
  359. ;  e_oeminfo.w
  360. ;  e_res2.w[10]
  361. ;  e_lfanew.l
  362. ;EndStructure
  363.  
  364.     AddGadgetItem(30, -1, "$00000000")
  365.     SetGadgetItemText(30, 0, "$" + RSet(Hex(I_D_H\e_magic), 4, "0"), 1)
  366.     SetGadgetItemText(30, 0, "IMAGE_DOS_HEADER\e_magic - magic number ($4D5A = ´MZ´ = Mark Zbikowski)", 2)
  367.  
  368.     AddGadgetItem(30, -1, "$00000002")
  369.     SetGadgetItemText(30, 1, "$" + RSet(Hex(I_D_H\e_cblp), 4, "0"), 1)
  370.     SetGadgetItemText(30, 1, "IMAGE_DOS_HEADER\e_cblp - bytes on last page of file", 2)
  371.  
  372.     AddGadgetItem(30, -1, "$00000004")
  373.     SetGadgetItemText(30, 2, "$" + RSet(Hex(I_D_H\e_cp), 4, "0"), 1)
  374.     SetGadgetItemText(30, 2, "IMAGE_DOS_HEADER\e_cp - pages in file (1 page = 512 bytes)", 2)
  375.  
  376.     AddGadgetItem(30, -1, "$00000006")
  377.     SetGadgetItemText(30, 3, "$" + RSet(Hex(I_D_H\e_crlc), 4, "0"), 1)
  378.     SetGadgetItemText(30, 3, "IMAGE_DOS_HEADER\e_crlc - relocations", 2)
  379.  
  380.     AddGadgetItem(30, -1, "$00000008")
  381.     SetGadgetItemText(30, 4, "$" + RSet(Hex(I_D_H\e_cparhdr), 4, "0"), 1)
  382.     SetGadgetItemText(30, 4, "IMAGE_DOS_HEADER\e_cparhdr - size of header in paragraphs (1 paragraph = 16 bytes)", 2)
  383.  
  384.     AddGadgetItem(30, -1, "$0000000A")
  385.     SetGadgetItemText(30, 5, "$" + RSet(Hex(I_D_H\e_minalloc), 4, "0"), 1)
  386.     SetGadgetItemText(30, 5, "IMAGE_DOS_HEADER\e_minalloc - minimum extra paragraphs needed", 2)
  387.  
  388.     AddGadgetItem(30, -1, "$0000000C")
  389.     SetGadgetItemText(30, 6, "$" + RSet(Hex(I_D_H\e_maxalloc), 4, "0"), 1)
  390.     SetGadgetItemText(30, 6, "IMAGE_DOS_HEADER\e_maxalloc - maximum extra paragraphs needed", 2)
  391.  
  392.     AddGadgetItem(30, -1, "$0000000E")
  393.     SetGadgetItemText(30, 7, "$" + RSet(Hex(I_D_H\e_ss), 4, "0"), 1)
  394.     SetGadgetItemText(30, 7, "IMAGE_DOS_HEADER\e_ss - initial (relative) SS value", 2)
  395.  
  396.     AddGadgetItem(30, -1, "$00000010")
  397.     SetGadgetItemText(30, 8, "$" + RSet(Hex(I_D_H\e_sp), 4, "0"), 1)
  398.     SetGadgetItemText(30, 8, "IMAGE_DOS_HEADER\e_sp - initial SP value", 2)
  399.  
  400.     AddGadgetItem(30, -1, "$00000012")
  401.     SetGadgetItemText(30, 9, "$" + RSet(Hex(I_D_H\e_csum), 4, "0"), 1)
  402.     SetGadgetItemText(30, 9, "IMAGE_DOS_HEADER\e_csum - checksum", 2)
  403.  
  404.     AddGadgetItem(30, -1, "$00000014")
  405.     SetGadgetItemText(30, 10, "$" + RSet(Hex(I_D_H\e_ip), 4, "0"), 1)
  406.     SetGadgetItemText(30, 10, "IMAGE_DOS_HEADER\e_ip - initial IP value", 2)
  407.  
  408.     AddGadgetItem(30, -1, "$00000016")
  409.     SetGadgetItemText(30, 11, "$" + RSet(Hex(I_D_H\e_cs), 4, "0"), 1)
  410.     SetGadgetItemText(30, 11, "IMAGE_DOS_HEADER\e_cs - initial (relative) CS value", 2)
  411.  
  412.     AddGadgetItem(30, -1, "$00000018")
  413.     SetGadgetItemText(30, 12, "$" + RSet(Hex(I_D_H\e_lfarlc), 4, "0"), 1)
  414.     SetGadgetItemText(30, 12, "IMAGE_DOS_HEADER\e_lfarlc - file address of relocation table", 2)
  415.  
  416.     AddGadgetItem(30, -1, "$0000001A")
  417.     SetGadgetItemText(30, 13, "$" + RSet(Hex(I_D_H\e_ovno), 4, "0"), 1)
  418.     SetGadgetItemText(30, 13, "IMAGE_DOS_HEADER\e_ovno - overlay number", 2)
  419.  
  420.     For i = 28 To 34 Step 2
  421.       AddGadgetItem(30, -1, "$" + RSet(Hex(i), 8, "0"))
  422.       SetGadgetItemText(30, i / 2, "$" + RSet(Hex(PeekW(@I_D_H\e_res - 28 + i) & $FFFF), 4, "0"), 1)
  423.       SetGadgetItemText(30, i / 2, "IMAGE_DOS_HEADER\e_res - reserved word", 2)
  424.     Next
  425.  
  426.     AddGadgetItem(30, -1, "$00000024")
  427.     SetGadgetItemText(30, 18, "$" + RSet(Hex(I_D_H\e_oemid), 4, "0"), 1)
  428.     SetGadgetItemText(30, 18, "IMAGE_DOS_HEADER\e_oemid - OEM identifier (for e_oeminfo)", 2)
  429.  
  430.     AddGadgetItem(30, -1, "$00000026")
  431.     SetGadgetItemText(30, 19, "$" + RSet(Hex(I_D_H\e_oeminfo), 4, "0"), 1)
  432.     SetGadgetItemText(30, 19, "IMAGE_DOS_HEADER\e_oeminfo - OEM information; e_oemid specific", 2)
  433.  
  434.     For i = 40 To 58 Step 2
  435.       AddGadgetItem(30, -1, "$" + RSet(Hex(i), 8, "0"))
  436.       SetGadgetItemText(30, i / 2, "$" + RSet(Hex(PeekW(@I_D_H\e_res2 - 40 + i) & $FFFF), 8, "0"), 1)
  437.       SetGadgetItemText(30, i / 2, "IMAGE_DOS_HEADER\e_res2 - reserved word", 2)
  438.     Next
  439.  
  440.     AddGadgetItem(30, -1, "$0000003C")
  441.     SetGadgetItemText(30, 30, "$" + RSet(Hex(I_D_H\e_lfanew), 8, "0"), 1)
  442.     SetGadgetItemText(30, 30, "IMAGE_DOS_HEADER\e_lfanew - file address of new exe header", 2)
  443.  
  444.     c = $00d0ff                             ;Farbe
  445.     For m = 0 To 30
  446.       SetGadgetItemColor(30, m, #PB_Gadget_BackColor, c, -1)
  447.     Next
  448.     c = (c + $800000) & $FFFFFF             ;Farbe ändern
  449.     i = 31
  450.     OP1 = 0
  451.     For n = $40 To I_D_H\e_lfanew - 1
  452.       AddGadgetItem(30, -1, "$" + RSet(Hex(n), 8, "0"))
  453.       OP = PeekA(Buffer + n) & $FF
  454.       Select OP                             ;only for any strings!
  455.         Case $0E
  456.         SetGadgetItemText(30, i, "$0E", 1)
  457.         SetGadgetItemText(30, i, "DOS Stub Program: PUSH CS", 2)
  458.         i + 1
  459.         Case $1F
  460.         SetGadgetItemText(30, i, "$1F", 1)
  461.         SetGadgetItemText(30, i, "DOS Stub Program: POP DS", 2)
  462.         i + 1
  463.         Case $90
  464.         SetGadgetItemText(30, i, "$90", 1)
  465.         SetGadgetItemText(30, i, "DOS Stub Program: NOP", 2)
  466.         i + 1
  467.         Case $B4
  468.         SetGadgetItemText(30, i, "$B409", 1)
  469.         SetGadgetItemText(30, i, "DOS Stub Program: MOV AH , $09   ;DOS-function display string", 2)
  470.         i + 1 : n + 1
  471.         Case $B8
  472.         SetGadgetItemText(30, i, "$B8014C", 1)
  473.         SetGadgetItemText(30, i, "DOS Stub Program: MOV AX , $4C01 ;DOS-function terminate program", 2)
  474.         i + 1 : n + 2
  475.         Case $BA
  476.         OP$ = "$BA" + RSet(Hex(PeekB(Buffer + n + 1) & $FF), 2, "0") + RSet(Hex(PeekB(Buffer + n + 2) & $FF), 2, "0")
  477.         OP1 = PeekW(Buffer + n + 1) & $FFFF
  478.         SetGadgetItemText(30, i, OP$, 1)
  479.         SetGadgetItemText(30, i, "DOS Stub Program: MOV DX , $" + RSet(Hex(OP1), 4, "0") + " ;offset to string", 2)
  480.         i + 1 : n + 2
  481.         Case $CD
  482.         SetGadgetItemText(30, i, "$CD21", 1)
  483.         SetGadgetItemText(30, i, "DOS Stub Program: INT $21", 2)
  484.         i + 1 : n + 1
  485.       EndSelect
  486.  
  487.       If OP1 > 0 And n = OP1 + $40          ;begin string
  488.         j = OP1 + $40
  489.         DOS$ = "´"
  490.         DosChar = PeekA(Buffer + j)
  491.         While DosChar <> $0D And DosChar <> $0A And DosChar <> $24   ;CR, LF or "$"
  492.           DOS$ + Chr(DosChar)
  493.           j + 1
  494.           DosChar = PeekA(Buffer + j)
  495.         Wend
  496.         DOS$ + "´"
  497.         SetGadgetItemText(30, i, "String", 1)
  498.         SetGadgetItemText(30, i, "DOS Stub Program: " + DOS$, 2)
  499.  
  500.         For m = 31 To i
  501.           SetGadgetItemColor(30, m, #PB_Gadget_BackColor, c, -1)
  502.         Next
  503.         c = (c + $800000) & $FFFFFF
  504.         i + 1
  505.         Break
  506.       EndIf
  507.     Next
  508.  
  509. ;Structure IMAGE_NT_HEADERS
  510. ;  Signature.l
  511. ;  FileHeader.IMAGE_FILE_HEADER
  512. ;  OptionalHeader.IMAGE_OPTIONAL_HEADER
  513. ;EndStructure
  514.  
  515.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew), 8, "0"))
  516.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew) & $FFFFFFFF), 8, "0"), 1)
  517.     SetGadgetItemText(30, i, "IMAGE_NT_HEADERS\Signature - signature ($50450000 = ´PE  ´ = Portable Executable)", 2)
  518.     SetGadgetItemColor(30, i, #PB_Gadget_BackColor, c, -1)
  519.     c = (c + $800000) & $FFFFFF
  520.     i + 1 : a = i
  521.  
  522. ;Structure IMAGE_FILE_HEADER ;equal for 32- and 64-bit, use structure. Filled in Main()
  523. ;  Machine.w
  524. ;  NumberOfSections.w
  525. ;  TimeDateStamp.l
  526. ;  PointerToSymbolTable.l
  527. ;  NumberOfSymbols.l
  528. ;  SizeOfOptionalHeader.w
  529. ;  Characteristics.w
  530. ;EndStructure
  531.  
  532.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 4), 8, "0"))
  533.     SetGadgetItemText(30, i, "$" + RSet(Hex(I_F_H\Machine & $FFFF), 4, "0"), 1)
  534.     SetGadgetItemText(30, i, "IMAGE_FILE_HEADER\Machine - machine-type (I386: $014C = 32-Bit, AMD64: $8664 = 64-Bit)", 2)
  535.     i + 1
  536.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 6), 8, "0"))
  537.     SetGadgetItemText(30, i, "$" + RSet(Hex(I_F_H\NumberOfSections & $FFFF), 4, "0"), 1)
  538.     SetGadgetItemText(30, i, "IMAGE_FILE_HEADER\NumberOfSections - number of sections (max.96)", 2)
  539.     i + 1
  540.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 8), 8, "0"))
  541.     SetGadgetItemText(30, i, "$" + RSet(Hex(I_F_H\TimeDateStamp & $FFFFFFFF), 8, "0"), 1)
  542.     SetGadgetItemText(30, i, "IMAGE_FILE_HEADER\TimeDateStamp - time date stamp ($" + RSet(Hex(I_F_H\TimeDateStamp & $FFFFFFFF), 8, "0") + " = " + FormatDate("%mm/%dd/%yyyy/%hh:%ii:%ss", I_F_H\TimeDateStamp & $FFFFFFFF) + ")", 2)
  543.     i + 1
  544.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 12), 8, "0"))
  545.     SetGadgetItemText(30, i, "$" + RSet(Hex(I_F_H\PointerToSymbolTable & $FFFFFFFF), 4, "0"), 1)
  546.     SetGadgetItemText(30, i, "IMAGE_FILE_HEADER\PointerToSymbolTable - pointer to symbol table", 2)
  547.     i + 1
  548.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 16), 8, "0"))
  549.     SetGadgetItemText(30, i, "$" + RSet(Hex(I_F_H\NumberOfSymbols & $FFFFFFFF), 4, "0"), 1)
  550.     SetGadgetItemText(30, i, "IMAGE_FILE_HEADER\NumberOfSymbols - number of symbols", 2)
  551.     i + 1
  552.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 20), 8, "0"))
  553.     SetGadgetItemText(30, i, "$" + RSet(Hex(I_F_H\SizeOfOptionalHeader & $FFFF), 4, "0"), 1)
  554.     SetGadgetItemText(30, i, "IMAGE_FILE_HEADER\SizeOfOptionalHeader - size of optional header", 2)
  555.     i + 1
  556.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 22), 8, "0"))
  557.     SetGadgetItemText(30, i, "$" + RSet(Hex(I_F_H\Characteristics & $FFFF), 4, "0"), 1)
  558.     SetGadgetItemText(30, i, "IMAGE_FILE_HEADER\Characteristics - characteristics", 2)
  559.  
  560.     For m = a To i
  561.       SetGadgetItemColor(30, m, #PB_Gadget_BackColor, c, -1)
  562.     Next
  563.     c = (c + $800000) & $FFFFFF
  564.     i + 1 : a = i
  565.  
  566. ;Structure IMAGE_OPTIONAL_HEADER  ;not equal for 32- and 64-bit, use Buffer
  567. ;  Magic.w
  568. ;  MajorLinkerVersion.b
  569. ;  MinorLinkerVersion.b
  570. ;  SizeOfCode.l
  571. ;  SizeOfInitializedData.l
  572. ;  SizeOfUninitializedData.l
  573. ;  AddressOfEntryPoint.l
  574. ;  BaseOfCode.l
  575. ;  BaseOfData.l                             ;only for 32-bit-file!
  576. ;  ImageBase.i
  577. ;  SectionAlignment.l
  578. ;  FileAlignment.l
  579. ;  MajorOperatingSystemVersion.w
  580. ;  MinorOperatingSystemVersion.w
  581. ;  MajorImageVersion.w
  582. ;  MinorImageVersion.w
  583. ;  MajorSubsystemVersion.w
  584. ;  MinorSubsystemVersion.w
  585. ;  Win32VersionValue.l
  586. ;  SizeOfImage.l
  587. ;  SizeOfHeaders.l
  588. ;  CheckSum.l
  589. ;  Subsystem.w
  590. ;  DllCharacteristics.w
  591. ;  SizeOfStackReserve.i
  592. ;  SizeOfStackCommit.i
  593. ;  SizeOfHeapReserve.i
  594. ;  SizeOfHeapCommit.i
  595. ;  LoaderFlags.l
  596. ;  NumberOfRvaAndSizes.l
  597. ;  DataDirectory.IMAGE_DATA_DIRECTORY[16]
  598. ;EndStructure
  599.  
  600.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 24), 8, "0"))
  601.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekW(Buffer + I_D_H\e_lfanew + 24) & $FFFF), 4, "0"), 1)
  602.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\Magic - magic number ($010B = PE32 (32-bit), $020B = PE32+ (64-bit))", 2)
  603.     i + 1
  604.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 26), 8, "0"))
  605.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekB(Buffer + I_D_H\e_lfanew + 26) & $FF), 2, "0"), 1)
  606.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\MajorLinkerVersion - major linker version", 2)
  607.     i + 1
  608.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 27), 8, "0"))
  609.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekB(Buffer + I_D_H\e_lfanew + 27) & $FF), 2, "0"), 1)
  610.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\MinorLinkerVersion - minor linker version", 2)
  611.     i + 1
  612.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 28), 8, "0"))
  613.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 28) & $FFFFFFFF), 8, "0"), 1)
  614.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfCode - size of code", 2)
  615.     i + 1
  616.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 32), 8, "0"))
  617.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 32) & $FFFFFFFF), 8, "0"), 1)
  618.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfInitializedData - size of initialized data", 2)
  619.     i + 1
  620.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 36), 8, "0"))
  621.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 36) & $FFFFFFFF), 8, "0"), 1)
  622.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfUninitializedData - size of uninitialized data", 2)
  623.     i + 1
  624.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 40), 8, "0"))
  625.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 40) & $FFFFFFFF), 8, "0"), 1)
  626.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\AddressOfEntryPoint - address of entry point (+ image base)", 2)
  627.     i + 1
  628.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 44), 8, "0"))
  629.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 44) & $FFFFFFFF), 8, "0"), 1)
  630.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\BaseOfCode - base of code", 2)
  631.     i + 1
  632.     If PeekW(Buffer + I_D_H\e_lfanew + 24) & $FFFF = $010B ;= 32-bit-file
  633.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 48), 8, "0"))
  634.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 48) & $FFFFFFFF), 8, "0"), 1)
  635.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\BaseOfData - base of data", 2)
  636.       i + 1
  637.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 52), 8, "0"))
  638.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 52) & $FFFFFFFF), 8, "0"), 1)
  639.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\ImageBase - image base", 2)
  640.       i + 1
  641.      Else                                                  ;= 64-bit-file
  642.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 48), 8, "0"))
  643.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekQ(Buffer + I_D_H\e_lfanew + 48)), 16, "0"), 1)
  644.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\ImageBase - image base", 2)    
  645.       i + 1
  646.     EndIf
  647.  
  648.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 56), 8, "0"))
  649.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 56) & $FFFFFFFF), 8, "0"), 1)
  650.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SectionAlignment - section alignment", 2)
  651.     i + 1
  652.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 60), 8, "0"))
  653.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 60) & $FFFFFFFF), 8, "0"), 1)
  654.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\FileAlignment - file alignment", 2)
  655.     i + 1
  656.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 64), 8, "0"))
  657.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekW(Buffer + I_D_H\e_lfanew + 64) & $FFFF), 4, "0"), 1)
  658.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\MajorOperatingSystemVersion - required major operating system version", 2)
  659.     i + 1
  660.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 66), 8, "0"))
  661.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekW(Buffer + I_D_H\e_lfanew + 66) & $FFFF), 4, "0"), 1)
  662.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\MinorOperatingSystemVersion - required minor operating system version", 2)
  663.     i + 1
  664.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 68), 8, "0"))
  665.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekW(Buffer + I_D_H\e_lfanew + 68) & $FFFF), 4, "0"), 1)
  666.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\MajorImageVersion - major image version", 2)
  667.     i + 1
  668.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 70), 8, "0"))
  669.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekW(Buffer + I_D_H\e_lfanew + 70) & $FFFF), 4, "0"), 1)
  670.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\MinorImageVersion - minor image version", 2)
  671.     i + 1
  672.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 72), 8, "0"))
  673.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekW(Buffer + I_D_H\e_lfanew + 72) & $FFFF), 4, "0"), 1)
  674.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\MajorSubsystemVersion - major subsystem version", 2)
  675.     i + 1
  676.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 74), 8, "0"))
  677.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekW(Buffer + I_D_H\e_lfanew + 74) & $FFFF), 4, "0"), 1)
  678.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\MinorSubsystemVersion - minor subsystem version", 2)
  679.     i + 1
  680.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 76), 8, "0"))
  681.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 76) & $FFFFFFFF), 8, "0"), 1)
  682.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\Win32VersionValue - Win32 version value", 2)
  683.     i + 1
  684.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 80), 8, "0"))
  685.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 80) & $FFFFFFFF), 8, "0"), 1)
  686.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfImage - size of image", 2)
  687.     i + 1
  688.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 84), 8, "0"))
  689.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 84) & $FFFFFFFF), 8, "0"), 1)
  690.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfHeaders - size of headers", 2)
  691.     i + 1
  692.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 88), 8, "0"))
  693.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + 88) & $FFFFFFFF), 8, "0"), 1)
  694.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\CheckSum - image file checksum", 2)
  695.     i + 1
  696.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 92), 8, "0"))
  697.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekW(Buffer + I_D_H\e_lfanew + 92) & $FFFF), 4, "0"), 1)
  698.     k = PeekW(Buffer + I_D_H\e_lfanew + 92) & $FFFF
  699.     Select k                                ;all for fun
  700.       Case 0
  701.         SubSys$ = "0 = unknown subsystem"
  702.       Case 1
  703.         SubSys$ = "1 = device drivers and native Windows processes"
  704.       Case 2
  705.         SubSys$ = "2 = Windows Graphical User Interface (GUI) subsystem"
  706.       Case 3
  707.         SubSys$ = "3 = Windows character subsystem"
  708.       Case 7
  709.         SubSys$ = "7 = Posix character subsystem"
  710.       Case 9
  711.         SubSys$ = "9 = Windows CE"
  712.       Case 10
  713.         SubSys$ = "10 = Extensible Firmware Interface (EFI) application"
  714.       Case 11
  715.         SubSys$ = "11 = Extensible Firmware Interface (EFI) driver with boot services"
  716.       Case 12
  717.         SubSys$ = "12 = Extensible Firmware Interface (EFI) driver with run-time services"
  718.       Case 13
  719.         SubSys$ = "13 = Extensible Firmware Interface (EFI) ROM image"
  720.       Case 14
  721.         SubSys$ = "14 = XBOX"
  722.     EndSelect
  723.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\Subsystem - " + SubSys$, 2)
  724.     i + 1
  725.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + 94), 8, "0"))
  726.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekW(Buffer + I_D_H\e_lfanew + 94) & $FFFF), 4, "0"), 1)
  727.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\DllCharacteristics - dll-characteristics", 2)
  728.     i + 1 : j = 96                          ;j = address-pointer
  729.     If PeekW(Buffer + I_D_H\e_lfanew + 24) & $FFFF = $010B ;= 32-bit-file
  730.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  731.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  732.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfStackReserve - size of stack reserve", 2)
  733.       i + 1 : j + 4
  734.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  735.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  736.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfStackCommit - size of stack commit", 2)
  737.       i + 1 : j + 4
  738.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  739.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  740.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfHeapReserve - size of heap reserve", 2)
  741.       i + 1 : j + 4
  742.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  743.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  744.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfHeapCommit - size of heap commit", 2)
  745.       i + 1 : j + 4
  746.      Else                                                  ;= 64-bit-file
  747.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  748.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekQ(Buffer + I_D_H\e_lfanew + j)), 16, "0"), 1)
  749.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfStackReserve - size of stack reserve", 2)
  750.       i + 1 : j + 8
  751.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  752.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekQ(Buffer + I_D_H\e_lfanew + j)), 16, "0"), 1)
  753.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfStackCommit - size of stack commit", 2)
  754.       i + 1 : j + 8
  755.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  756.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekQ(Buffer + I_D_H\e_lfanew + j)), 16, "0"), 1)
  757.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfHeapReserve - size of heap reserve", 2)
  758.       i + 1 : j + 8
  759.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  760.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekQ(Buffer + I_D_H\e_lfanew + j)), 16, "0"), 1)
  761.       SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\SizeOfHeapCommit - size of heap commit", 2)
  762.       i + 1 : j + 8
  763.     EndIf
  764.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  765.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  766.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\LoaderFlags - loader flags", 2)
  767.     i + 1 : j + 4
  768.     AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  769.     SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  770.     SetGadgetItemText(30, i, "IMAGE_OPTIONAL_HEADER\NumberOfRvaAndSizes - number of data-directory entries ", 2)
  771.  
  772.     For m = a To i
  773.       SetGadgetItemColor(30, m, #PB_Gadget_BackColor, c, -1)
  774.     Next
  775.     c = (c + $800000) & $FFFFFF
  776.     k = PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF     ;k = 16 is not sure!
  777.     i + 1 : a = i : j + 4
  778.     If k                                    ;loop?      
  779.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  780.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  781.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ExportTable - export table address", 2)
  782.       i + 1 : j + 4
  783.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  784.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  785.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ExportTable - export table size", 2)
  786.       i + 1 : j + 4 : k - 1
  787.     EndIf
  788.     If k    
  789.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  790.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  791.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ImportTable - import table address", 2)
  792.       i + 1 : j + 4
  793.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  794.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  795.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ImportTable - import table size", 2)
  796.       i + 1 : j + 4 : k - 1
  797.     EndIf
  798.     If k    
  799.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  800.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  801.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ResourceTable - resource table address", 2)
  802.       i + 1 : j + 4
  803.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  804.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  805.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ResourceTable - resource table size", 2)
  806.       i + 1 : j + 4 : k - 1
  807.     EndIf
  808.     If k    
  809.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  810.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  811.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ExceptionTable - exception table address", 2)
  812.       i + 1 : j + 4
  813.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  814.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  815.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ExceptionTable - exception table size", 2)
  816.       i + 1 : j + 4 : k - 1
  817.     EndIf
  818.     If k    
  819.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  820.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  821.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\CertificateTable - certificate table address", 2)
  822.       i + 1 : j + 4
  823.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  824.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  825.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\CertificateTable - certificate table size", 2)
  826.       i + 1 : j + 4 : k - 1
  827.     EndIf
  828.     If k    
  829.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  830.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  831.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\BaseRelocationTable - base relocation table address", 2)
  832.       i + 1 : j + 4
  833.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  834.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  835.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\BaseRelocationTable - base relocation table size", 2)
  836.       i + 1 : j + 4 : k - 1
  837.     EndIf
  838.     If k    
  839.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  840.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  841.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\DebuggingInformationStart - debugging information starting address", 2)
  842.       i + 1 : j + 4
  843.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  844.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  845.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\DebuggingInformationStart - debugging information starting size", 2)
  846.       i + 1 : j + 4 : k - 1
  847.     EndIf
  848.     If k    
  849.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  850.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  851.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ArchitectureSpecificData - architecture-specific data address", 2)
  852.       i + 1 : j + 4
  853.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  854.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  855.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ArchitectureSpecificData - architecture-specific data size", 2)
  856.       i + 1 : j + 4 : k - 1
  857.     EndIf
  858.     If k    
  859.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  860.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  861.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\GlobalPointerRegister - global pointer register address", 2)
  862.       i + 1 : j + 4
  863.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  864.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  865.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\GlobalPointerRegister - global pointer register size", 2)
  866.       i + 1 : j + 4 : k - 1
  867.     EndIf
  868.     If k    
  869.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  870.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  871.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ThreadLocalStorage - thread local storage (TLS) table address", 2)
  872.       i + 1 : j + 4
  873.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  874.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  875.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ThreadLocalStorage - thread local storage (TLS) table size", 2)
  876.       i + 1 : j + 4 : k - 1
  877.     EndIf
  878.     If k    
  879.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  880.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  881.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\LoadConfigurationTable - load configuration table address", 2)
  882.       i + 1 : j + 4
  883.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  884.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  885.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\LoadConfigurationTable - load configuration table size", 2)
  886.       i + 1 : j + 4 : k - 1
  887.     EndIf
  888.     If k    
  889.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  890.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  891.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\BoundImportTable - bound import table address", 2)
  892.       i + 1 : j + 4
  893.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  894.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  895.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\BoundImportTable - bound import table size", 2)
  896.       i + 1 : j + 4 : k - 1
  897.     EndIf
  898.     If k    
  899.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  900.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  901.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ImportAddressTable - import address table address", 2)
  902.       i + 1 : j + 4
  903.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  904.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  905.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\ImportAddressTable - import address table size", 2)
  906.       i + 1 : j + 4 : k - 1
  907.     EndIf
  908.     If k    
  909.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  910.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  911.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\DelayImportDescriptor - delay import descriptor address", 2)
  912.       i + 1 : j + 4
  913.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  914.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  915.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\DelayImportDescriptor - delay import descriptor size", 2)
  916.       i + 1 : j + 4 : k - 1
  917.     EndIf
  918.     If k    
  919.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  920.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  921.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\CLRHeader - CLR header address", 2)
  922.       i + 1 : j + 4
  923.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  924.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  925.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\CLRHeader - CLR header size", 2)
  926.       i + 1 : j + 4 : k - 1
  927.     EndIf
  928.     While k    
  929.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  930.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  931.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\Reserved - reserved", 2)
  932.       i + 1 : j + 4
  933.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  934.       SetGadgetItemText(30, i, "$" + RSet(Hex(PeekL(Buffer + I_D_H\e_lfanew + j) & $FFFFFFFF), 8, "0"), 1)
  935.       SetGadgetItemText(30, i, "IMAGE_DATA_DIRECTORY\Reserved - reserved", 2)
  936.       i + 1 : j + 4 : k - 1
  937.     Wend
  938.    ;now must (I_D_H\e_lfanew + j) = AST, see Main()
  939.  
  940.     For m = a To i - 1
  941.       SetGadgetItemColor(30, m, #PB_Gadget_BackColor, c, -1)
  942.     Next
  943.     c = (c + $800000) & $FFFFFF
  944.     a = i
  945.  
  946. ;Structure IMAGE_SECTION_HEADER   ;equal for 32- and 64-bit, use structure
  947. ;  Name.s{#IMAGE_SIZEOF_SHORT_NAME}          ;8 bytes
  948. ;  VirtualSize.l
  949. ;  VirtualAddress.l
  950. ;  SizeOfRawData.l
  951. ;  PointerToRawData.l
  952. ;  PointerToRelocations.l
  953. ;  PointerToLinenumbers.l
  954. ;  NumberOfRelocations.w
  955. ;  NumberOfLinenumbers.w
  956. ;  Characteristics.l
  957. ;EndStructure
  958.  
  959.     k = 0 : d = 0
  960.     For n = 1 To I_F_H\NumberOfSections
  961.       CopyMemory(Buffer + I_D_H\e_lfanew + j, @I_S_H, SizeOf(I_S_H))  ;fill Structure IMAGE_SECTION_HEADER
  962.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))
  963.       SetGadgetItemText(30, i, Mid(I_S_H\Name, 1, 8), 1)
  964.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\Name", 2)
  965.       i + 1 : j + 8
  966.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  967.       SetGadgetItemText(30, i, "$" + RSet(Hex(I_S_H\VirtualSize & $FFFFFFFF), 8, "0"), 1)
  968.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\VirtualSize", 2)
  969.       i + 1 : j + 4
  970.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  971.       SetGadgetItemText(30, i, "$" + RSet(Hex(I_S_H\VirtualAddress & $FFFFFFFF), 8, "0"), 1)
  972.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\VirtualAddress", 2)
  973.       i + 1 : j + 4
  974.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  975.       SetGadgetItemText(30, i, "$" + RSet(Hex(I_S_H\SizeOfRawData & $FFFFFFFF), 8, "0"), 1)
  976.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\SizeOfRawData", 2)
  977.       i + 1 : j + 4
  978.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  979.       SetGadgetItemText(30, i, "$" + RSet(Hex(I_S_H\PointerToRawData & $FFFFFFFF), 8, "0"), 1)
  980.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\PointerToRawData", 2)
  981.       i + 1 : j + 4
  982.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  983.       SetGadgetItemText(30, i, "$" + RSet(Hex(I_S_H\PointerToRelocations & $FFFFFFFF), 8, "0"), 1)
  984.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\PointerToRelocations", 2)
  985.       i + 1 : j + 4
  986.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  987.       SetGadgetItemText(30, i, "$" + RSet(Hex(I_S_H\PointerToLinenumbers & $FFFFFFFF), 8, "0"), 1)
  988.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\PointerToLinenumbers", 2)
  989.       i + 1 : j + 4
  990.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  991.       SetGadgetItemText(30, i, "$" + RSet(Hex(I_S_H\NumberOfRelocations & $FFFF), 4, "0"), 1)
  992.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\NumberOfRelocations", 2)
  993.       i + 1 : j + 2
  994.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  995.       SetGadgetItemText(30, i, "$" + RSet(Hex(I_S_H\NumberOfLinenumbers & $FFFF), 4, "0"), 1)
  996.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\NumberOfLinenumbers", 2)
  997.       i + 1 : j + 2
  998.       AddGadgetItem(30, -1, "$" + RSet(Hex(I_D_H\e_lfanew + j), 8, "0"))      
  999.       SF = I_S_H\Characteristics  & $FFFFFFFF             ;Flags ermitteln
  1000.       SetGadgetItemText(30, i, "$" + RSet(Hex(SF & $FFFFFFFF), 8, "0"), 1)
  1001.       SF$ = " ("
  1002.       If SF & #IMAGE_SCN_MEM_READ
  1003.         SF$ + "Read"
  1004.       EndIf
  1005.       If SF & #IMAGE_SCN_MEM_WRITE
  1006.         SF$ + " and Write"
  1007.       EndIf
  1008.       If SF & #IMAGE_SCN_MEM_EXECUTE
  1009.         SF$ + " , executable Code"
  1010.       EndIf
  1011.       If SF & #IMAGE_SCN_CNT_INITIALIZED_DATA
  1012.         SF$ + " , initializated Datas"
  1013.       EndIf
  1014.       If SF & #IMAGE_SCN_CNT_UNINITIALIZED_DATA
  1015.         SF$ + " , non initializated Datas"
  1016.       EndIf
  1017.       SF$ + ")"
  1018.       SetGadgetItemText(30, i, "IMAGE_SECTION_HEADER\Characteristics" + SF$, 2)
  1019.       i + 1 : j + 4
  1020.  
  1021.       For m = a + d To i
  1022.         SetGadgetItemColor(30, m, #PB_Gadget_BackColor, c, -1)
  1023.       Next
  1024.       c = (c + $800000) & $FFFFFF
  1025.       d + 10
  1026.  
  1027.       k + #IMAGE_SIZEOF_SECTION_HEADER
  1028.     Next
  1029.  
  1030.     SetActiveGadget(30)
  1031.   EndIf
  1032. EndProcedure
  1033.  
  1034. Procedure CPUInfo(Title$, Text$)
  1035.   CPUInfo = CreateWindowEx_(#WS_EX_TOPMOST, #TOOLTIPS_CLASS, #Null, #WS_POPUP | #TTS_ALWAYSTIP | #TTS_BALLOON, 0, 0, 0, 0, 0, 0, 0, 0)
  1036.   SendMessage_(CPUInfo, #TTM_SETTITLE, #TOOLTIP_INFO_ICON, @Title$)
  1037.   Balloon.TOOLINFO\cbSize = SizeOf(TOOLINFO)
  1038.   Balloon\lpszText = @Text$
  1039.   SendMessage_(CPUInfo, #TTM_ADDTOOL, 0, @Balloon)
  1040.   SendMessage_(CPUInfo, #TTM_TRACKACTIVATE, 1, @Balloon)
  1041.  ProcedureReturn CPUInfo
  1042. EndProcedure
  1043.  
  1044. Procedure FuncInfo()                        ;Versuch, Sprungziel nach möglicher API-Funktion aufzulösen
  1045.   If IsProg64
  1046.     RSPZ = SPZ + IB + SRVA                  ;rel.Sprungziel
  1047.     k = 0
  1048.     For n = 1 To ANS                        ;um "Sprungziel" in der Datei zu ermitteln
  1049.       CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  1050.       XRVA = I_S_H\VirtualAddress
  1051.       X = XRVA + I_S_H\SizeOfRawData        ;+ Länge der Section
  1052.       RSE = IB + XRVA + I_S_H\SizeOfRawData - 1  ;rel.Ende der Sections
  1053.       If RSPZ < RSE                         ;Sprungziel in dieser Section ?
  1054.         SPZ = RSPZ - IB - XRVA + I_S_H\PointerToRawData    ;"Sprungziel" in der Datei
  1055.         Break
  1056.       EndIf
  1057.       k + #IMAGE_SIZEOF_SECTION_HEADER
  1058.     Next
  1059.     k = 0
  1060.     For n = 1 To ANS
  1061.       CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  1062.       XRVA = I_S_H\VirtualAddress           ;RVA der Sections
  1063.       X = XRVA + I_S_H\SizeOfRawData        ;+ Länge der Section
  1064.       SPZ = RSPZ - IB
  1065.       If SPZ < X                            ;SPZ in dieser Section ?
  1066.         SPZ - XRVA + I_S_H\PointerToRawData ;+ Offset dieser Section
  1067.         Break
  1068.       EndIf
  1069.       k + #IMAGE_SIZEOF_SECTION_HEADER
  1070.     Next
  1071.     If SPZ > LF Or SPZ < 0                  ;Schutzmassnahme z.B. wenn Code nicht vollständig auflösbar oder Käse ist
  1072.       ProcedureReturn
  1073.     EndIf
  1074.     SPZ = PeekL(Buffer + SPZ)
  1075.     For m = n To ANS
  1076.       CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  1077.       XRVA = I_S_H\VirtualAddress           ;RVA der Sections
  1078.       X = XRVA + I_S_H\SizeOfRawData        ;+ Länge der Section
  1079.       If SPZ < X                            ;SPZ in dieser Section ?
  1080.         SPZ - XRVA + I_S_H\PointerToRawData ;+ Offset dieser Section
  1081.         If SPZ > LF Or SPZ < 0              ;Schutzmassnahme z.B. wenn Code nicht vollständig auflösbar oder Käse ist
  1082.           Break
  1083.         EndIf
  1084.         XF = I_S_H\Characteristics          ;Flags ermitteln
  1085.         If XF & #IMAGE_SCN_MEM_EXECUTE = 0  ;Test, ob Section ausführbar oder nicht
  1086.           Info$ = PeekS(Buffer + SPZ + 2, $FF)   ;+2 wegen Word Ordnungs-Nr.
  1087.           If Info$ <> ""
  1088.             MN$ + "  (" + Chr(34) + Info$ + Chr(34) ; + " / "
  1089.             For i = Buffer + SPZ + 3 To Buffer + I_S_H\PointerToRawData + I_S_H\SizeOfRawData - 4
  1090.               If PeekL(i) & $5F5F5FFF = $4C4C442E     ;".DLL" oder ".dll"
  1091.                 For j = i  To Buffer + SPZ + 3 Step -1
  1092.                   If PeekB(j) = 0           ;Zero-Byte
  1093.                     Break
  1094.                   EndIf
  1095.                 Next
  1096.                 DLL$ = PeekS(j + 1, $FF)
  1097.                 If DLL$ <> ""
  1098.                   MN$ + " / " + DLL$
  1099.                 EndIf
  1100.                 Break
  1101.               EndIf
  1102.             Next
  1103.             DLL$ = ""
  1104.             MN$ + ")"
  1105.           EndIf
  1106.           Break
  1107.         EndIf
  1108.       EndIf
  1109.       k + #IMAGE_SIZEOF_SECTION_HEADER
  1110.     Next
  1111.    Else
  1112.     RSPZ = PeekL(Buffer + BZ - 4)           ;Sprungziel
  1113.     RSE = IB + SRVA + SL - 1                ;rel.Sections-Ende
  1114.     If (RSPZ > RSE) And Len(OP$) > 10       ;Sprungziel also nicht mehr in dieser Section
  1115.       k = 0                                 ; Len hier wegen 2-Byte-Call
  1116.       For n = 1 To ANS
  1117.         CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  1118.         RSE = IB + I_S_H\VirtualAddress + I_S_H\SizeOfRawData - 1    ;rel.Ende der Sections
  1119.         If RSPZ < RSE                       ;Sprungziel in dieser Section ?
  1120.           SPZ = RSPZ - IB - I_S_H\VirtualAddress + I_S_H\PointerToRawData ;"Sprungziel" in der Datei
  1121.           Break
  1122.         EndIf
  1123.         k + #IMAGE_SIZEOF_SECTION_HEADER
  1124.       Next
  1125.       If (SPZ & $7FFFFFFF) < (LF & $7FFFFFFF)    ;Schutzmassnahme wenn Code nicht vollständig auflösbar
  1126.         SPZ = PeekL(Buffer + (SPZ & $7FFFFFFF))  ;neues Sprungziel
  1127.         k = 0
  1128.         For n = 1 To ANS
  1129.           CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  1130.           X = I_S_H\VirtualAddress + I_S_H\SizeOfRawData   ;+ Länge der Section
  1131.           If (SPZ & $7FFFFFFF) < X          ;SPZ in dieser Section ?
  1132.             SPZ = (SPZ & $7FFFFFFF) - I_S_H\VirtualAddress + I_S_H\PointerToRawData ;+ Offset dieser Section
  1133.             If SPZ < 0
  1134.               Break
  1135.             EndIf
  1136.             XF = I_S_H\Characteristics      ;Flags ermitteln
  1137.             If XF & #IMAGE_SCN_MEM_EXECUTE = 0   ;Test, ob Section ausführbar oder nicht
  1138.               Info$ = PeekS(Buffer + (SPZ & $7FFFFFFF) + 2, $FF)     ;+2 wegen Word Ordnungs-Nr.
  1139.               If Info$ <> ""
  1140.                 MN$ + "  (" + Chr(34) + Info$ + Chr(34)
  1141.                 For i = Buffer + SPZ + 3 To Buffer + I_S_H\PointerToRawData + I_S_H\SizeOfRawData - 4
  1142.                   If PeekL(i) & $5F5F5FFF = $4C4C442E ;".DLL" oder ".dll"
  1143.                     For j = i  To Buffer + SPZ + 3 Step -1 ;die 3 ist sehr vorsichtig
  1144.                       If PeekB(j) = 0       ;Zero-Byte
  1145.                         Break
  1146.                       EndIf
  1147.                     Next
  1148.                     DLL$ = PeekS(j + 1, $FF)
  1149.                     If DLL$ <> ""
  1150.                       MN$ + " / " + DLL$
  1151.                     EndIf
  1152.                     Break
  1153.                   EndIf
  1154.                 Next
  1155.                 DLL$ = ""                   ;für alle Fälle
  1156.                 MN$ + ")"
  1157.               EndIf
  1158.               Break
  1159.             EndIf
  1160.           EndIf
  1161.           k + #IMAGE_SIZEOF_SECTION_HEADER
  1162.         Next
  1163.       EndIf
  1164.     EndIf
  1165.   EndIf
  1166. EndProcedure
  1167.  
  1168. Procedure RegisterCR(VAR1)
  1169.   VAR1 & %00000111
  1170.   Select VAR1
  1171.     Case 0
  1172.       MN$ + "CR0"
  1173.     Case 1                                  ;reserviert
  1174.        NoCode = 1
  1175.     Case 2
  1176.       MN$ + "CR2"
  1177.     Case 3
  1178.       MN$ + "CR3"
  1179.     Case 4
  1180.       MN$ + "CR4"
  1181.     Case 5 To 7                             ;reserviert
  1182.       NoCode = 1
  1183.     Case 8                                  ;64-Bit
  1184.       If IsProg64
  1185.         MN$ + "CR8"
  1186.        Else
  1187.         NoCode = 1
  1188.       EndIf
  1189.     Case 9 To 15                            ;reserviert
  1190.       NoCode = 1
  1191.   EndSelect
  1192.   If Komma
  1193.     MN$ + " , " : Komma - 1
  1194.   EndIf
  1195. EndProcedure
  1196.  
  1197. Procedure RegisterDR(VAR1)
  1198.   VAR1 & %00000111
  1199.   MN$ + "DR" + Str(VAR1)                    ;0-7
  1200.   If Komma
  1201.     MN$ + " , " : Komma - 1
  1202.   EndIf
  1203. EndProcedure
  1204.  
  1205. Procedure RegisterSR(VAR1)
  1206.   VAR1 & %00000111
  1207.   Select VAR1
  1208.     Case 0
  1209.       MN$ + "ES"
  1210.     Case 1
  1211.       MN$ + "CS"
  1212.     Case 2
  1213.       MN$ + "SS"
  1214.     Case 3
  1215.       MN$ + "DS"
  1216.     Case 4
  1217.       MN$ + "FS"
  1218.     Case 5
  1219.       MN$ + "GS"
  1220.     Case 6 To 7                             ;reserviert
  1221.       NoCode = 1
  1222.   EndSelect
  1223.   If Komma
  1224.     MN$ + " , " : Komma - 1
  1225.   EndIf
  1226. EndProcedure
  1227.  
  1228. Procedure Register32(VAR1, VAR2)            ;VAR2=Zusatzzeichen oder 1=16-Bit-Register
  1229.   If IsvonMSBytes = 0                       ;von MSBytes wäre 1
  1230.     VAR1 & %00000111
  1231.     If REX And REXEX
  1232.       VAR1 | (REX & %000000100) << 1
  1233.       REXEX = 0
  1234.      ElseIf REX
  1235.       VAR1 | (REX & %000000001) << 3
  1236.     EndIf
  1237.   EndIf
  1238.   IsvonMSBytes = 0
  1239.  
  1240.   If Adr = 0 And (XMM = 2 Or XMM = 4 Or XMM = 7) ;4 für z.B. MOVD XMM0,EAX
  1241.    ;- XMM-Register
  1242.     MN$ + "XMM" + Str(VAR1)                 ;0-15
  1243.     If Komma And Adr = 0
  1244.       MN$ + " , " : Komma - 1
  1245.     EndIf
  1246.  ProcedureReturn
  1247.    ElseIf Adr = 0 And (XMM = 1 Or XMM = 3 Or XMM = 8) ;3 für z.B. MOVD MM0,EAX
  1248.    ;- MMX-Register
  1249.     MN$ + "MM" + Str(VAR1)                  ;0-7
  1250.     If Komma And Adr = 0
  1251.       MN$ + " , " : Komma - 1
  1252.     EndIf
  1253.  ProcedureReturn
  1254.   EndIf
  1255.  
  1256.   If (XMM = 0) And (Adr = 0) And ((VAR2 = 1) And XMM <> 255) Or Mid(OP$, 1, 2) = "66" Or ((Mid(OP$, 4, 2) = "66") And Mid(OP$, 1, 2) = "67")    ;Register-Override und keine Adressierung
  1257.     ;- 16-Bit-Register, nicht für Adressierung!
  1258.     Select VAR1
  1259.       Case 0
  1260.         MN$ + "AX"
  1261.       Case 1
  1262.         MN$ + "CX"
  1263.       Case 2
  1264.         MN$ + "DX"
  1265.       Case 3
  1266.         MN$ + "BX"
  1267.       Case 4
  1268.         MN$ + "SP"
  1269.       Case 5
  1270.         MN$ + "BP"
  1271.       Case 6
  1272.         MN$ + "SI"
  1273.       Case 7
  1274.         MN$ + "DI"
  1275.       Case 8
  1276.         MN$ + "R8W"
  1277.       Case 9
  1278.         MN$ + "R9W"
  1279.       Case 10
  1280.         MN$ + "R10W"
  1281.       Case 11
  1282.         MN$ + "R11W"
  1283.       Case 12
  1284.         MN$ + "R12W"
  1285.       Case 13
  1286.         MN$ + "R13W"
  1287.       Case 14
  1288.         MN$ + "R14W"
  1289.       Case 15
  1290.         MN$ + "R15W"
  1291.     EndSelect
  1292.     If Komma And Adr = 0
  1293.       MN$ + " , " : Komma - 1
  1294.     EndIf
  1295.  ProcedureReturn
  1296.   EndIf
  1297.   ;- 16-Bit-Register, für Adressierung! Aber in 32-Bit-Umgebung!
  1298.   If Mid(OP$, 1, 2) = "67" And Adr = 1 And IsProg64 = 0
  1299.     Select VAR1
  1300.       Case 0
  1301.         MN$ + "BX + SI"
  1302.       Case 1
  1303.         MN$ + "BX + DI"
  1304.       Case 2
  1305.         MN$ + "BP + SI"
  1306.       Case 3
  1307.         MN$ + "BP + DI"
  1308.       Case 4
  1309.         MN$ + "SI"
  1310.       Case 5
  1311.         MN$ + "DI"
  1312.       Case 6
  1313.         MN$ + ""
  1314.       Case 7
  1315.         MN$ + "BX"
  1316.     EndSelect
  1317.   Select VAR2
  1318.     Case 0 To 1                             ;bei XMM wird die 1 durchgereicht!
  1319.       If Komma And Adr = 0
  1320.         MN$ + " , " : Komma - 1
  1321.       EndIf
  1322.     Case 2
  1323.       MN$ + " + "
  1324.     Case 3
  1325.       MN$ + " ]" : Adr = 0
  1326.       If Komma
  1327.         MN$ + " , " : Komma - 1
  1328.       EndIf
  1329.   EndSelect
  1330.  ProcedureReturn
  1331.   EndIf
  1332.  
  1333.   ;- 64-Bit-Register
  1334.   If ((Mid(OP$, 1, 2) <> "67") Or (Mid(OP$, 1, 2) = "67" And Adr = 0)) And ((REX & %00001000) Or (IsProg64 And Adr))
  1335.     Select VAR1
  1336.       Case 0
  1337.         MN$ + "RAX"
  1338.       Case 1
  1339.         MN$ + "RCX"
  1340.       Case 2
  1341.         MN$ + "RDX"
  1342.       Case 3
  1343.         MN$ + "RBX"
  1344.       Case 4
  1345.         MN$ + "RSP"
  1346.       Case 5
  1347.         MN$ + "RBP"
  1348.       Case 6
  1349.         MN$ + "RSI"
  1350.       Case 7
  1351.         MN$ + "RDI"
  1352.       Case 8
  1353.         MN$ + "R8"
  1354.       Case 9
  1355.         MN$ + "R9"
  1356.       Case 10
  1357.         MN$ + "R10"
  1358.       Case 11
  1359.         MN$ + "R11"
  1360.       Case 12
  1361.         MN$ + "R12"
  1362.       Case 13
  1363.         MN$ + "R13"
  1364.       Case 14
  1365.         MN$ + "R14"
  1366.       Case 15
  1367.         MN$ + "R15"
  1368.     EndSelect
  1369.    Else
  1370.     ;- 32-Bit-Register
  1371.     Select VAR1
  1372.       Case 0
  1373.         MN$ + "EAX"
  1374.       Case 1
  1375.         MN$ + "ECX"
  1376.       Case 2
  1377.         MN$ + "EDX"
  1378.       Case 3
  1379.         MN$ + "EBX"
  1380.       Case 4
  1381.         MN$ + "ESP"
  1382.       Case 5
  1383.         MN$ + "EBP"
  1384.       Case 6
  1385.         MN$ + "ESI"
  1386.       Case 7
  1387.         MN$ + "EDI"
  1388.       Case 8
  1389.         MN$ + "R8D"
  1390.       Case 9
  1391.         MN$ + "R9D"
  1392.       Case 10
  1393.         MN$ + "R10D"
  1394.       Case 11
  1395.         MN$ + "R11D"
  1396.       Case 12
  1397.         MN$ + "R12D"
  1398.       Case 13
  1399.         MN$ + "R13D"
  1400.       Case 14
  1401.         MN$ + "R14D"
  1402.       Case 15
  1403.         MN$ + "R15D"
  1404.     EndSelect
  1405.   EndIf
  1406.  
  1407.   Select VAR2
  1408.     Case 0 To 1                             ;bei XMM wird die 1 durchgereicht!
  1409.       If Komma And Adr = 0
  1410.         MN$ + " , " : Komma - 1
  1411.       EndIf
  1412.     Case 2
  1413.       MN$ + " + "
  1414.     Case 3
  1415.       MN$ + " ]" : Adr = 0
  1416.       If Komma
  1417.         MN$ + " , " : Komma - 1
  1418.       EndIf
  1419.   EndSelect
  1420. EndProcedure
  1421.  
  1422. Procedure Register8(VAR1, VAR2)
  1423.   VAR1 & %00000111
  1424.   If IsvonMSBytes = 0                       ;von MSBytes wäre 1
  1425.     If REX And REXEX
  1426.       VAR1 | (REX & %000000100) << 1
  1427.       REXEX = 0
  1428.      ElseIf REX
  1429.       VAR1 | (REX & %000000001) << 3
  1430.     EndIf
  1431.   EndIf
  1432.   IsvonMSBytes = 0
  1433.   If REX                                    ;also 64-Bit und REX
  1434.     Select VAR1
  1435.       Case 0
  1436.         MN$ + "AL"
  1437.       Case 1
  1438.         MN$ + "CL"
  1439.       Case 2
  1440.         MN$ + "DL"
  1441.       Case 3
  1442.         MN$ + "BL"
  1443.       Case 4
  1444.         MN$ + "SPL"
  1445.       Case 5
  1446.         MN$ + "BPL"
  1447.       Case 6
  1448.         MN$ + "SIL"
  1449.       Case 7
  1450.         MN$ + "DIL"
  1451.       Case 8
  1452.         MN$ + "R8L"                         ;oder R8B - R15B
  1453.       Case 9
  1454.         MN$ + "R9L"
  1455.       Case 10
  1456.         MN$ + "R10L"
  1457.       Case 11
  1458.         MN$ + "R11L"
  1459.       Case 12
  1460.         MN$ + "R12L"
  1461.       Case 13
  1462.         MN$ + "R13L"
  1463.       Case 14
  1464.         MN$ + "R14L"
  1465.       Case 15
  1466.         MN$ + "R15L"
  1467.     EndSelect
  1468.    Else
  1469.     Select VAR1
  1470.       Case 0
  1471.         MN$ + "AL"
  1472.       Case 1
  1473.         MN$ + "CL"
  1474.       Case 2
  1475.         MN$ + "DL"
  1476.       Case 3
  1477.         MN$ + "BL"
  1478.       Case 4
  1479.         MN$ + "AH"
  1480.       Case 5
  1481.         MN$ + "CH"
  1482.       Case 6
  1483.         MN$ + "DH"
  1484.       Case 7
  1485.         MN$ + "BH"
  1486.     EndSelect
  1487.   EndIf
  1488.   Select VAR2
  1489.     Case 0
  1490.       If Komma And Adr = 0
  1491.         MN$ + " , " : Komma - 1
  1492.       EndIf
  1493.     Case 2
  1494.       MN$ + " + "
  1495.     Case 3
  1496.       MN$ + " ]" : Adr = 0
  1497.       If Komma
  1498.         MN$ + " , " : Komma - 1
  1499.       EndIf
  1500.   EndSelect
  1501. EndProcedure
  1502.  
  1503. Procedure RegisterST(VAR1)                  ;FPU-Register
  1504.   Select VAR1
  1505.     Case 0
  1506.       MN$ + "ST0"
  1507.     Case 1
  1508.       MN$ + "ST1"
  1509.     Case 2
  1510.       MN$ + "ST2"
  1511.     Case 3
  1512.       MN$ + "ST3"
  1513.     Case 4
  1514.       MN$ + "ST4"
  1515.     Case 5
  1516.       MN$ + "ST5"
  1517.     Case 6
  1518.       MN$ + "ST6"
  1519.     Case 7
  1520.       MN$ + "ST7"
  1521.   EndSelect
  1522. EndProcedure
  1523.  
  1524. Procedure Pointer(VAR1)
  1525.   Select VAR1
  1526.     Case 0                                  ;Byte
  1527.       MN$ + "byte ptr "
  1528.     Case 1                                  ;Word
  1529.       MN$ + "word ptr "
  1530.     Case 2                                  ;DWord
  1531.       MN$ + "dword ptr "
  1532.     Case 3                                  ;QWord
  1533.       MN$ + "qword ptr "
  1534.     Case 4                                  ;TWord   Microsoft:TByte
  1535.       MN$ + "tword ptr "
  1536.     Case 5                                  ;DQWord  Microsoft:OWord
  1537.       MN$ + "dqword ptr "
  1538.     Case 6
  1539.       MN$ + "28-byte-ptr "                  ;FPU, FSTENV 32-Bit
  1540.     Case 7
  1541.       MN$ + "512-byte-ptr "                 ;FPU, FXSAVE
  1542.     Case 8
  1543.       MN$ + "14-byte-ptr "                  ;FPU, FSTENV 16-Bit
  1544.     Case 9
  1545.       MN$ + "108-byte-ptr "                 ;FPU, FSAVE/FRSTOR 32-Bit
  1546.     Case 10
  1547.       MN$ + "94-byte-ptr "                  ;FPU, FSAVE/FRSTOR 16-Bit
  1548.     Case 11
  1549.       MN$ + "yword ptr "                    ;YMM
  1550.   EndSelect
  1551.   If CSS
  1552.     MN$ + "CS: "
  1553.     CSS = 0
  1554.   EndIf
  1555.   If DSS
  1556.     MN$ + "DS: "
  1557.     DSS = 0
  1558.   EndIf
  1559.   If ESS
  1560.     MN$ + "ES: "
  1561.     ESS = 0
  1562.   EndIf
  1563.   If FSS
  1564.     MN$ + "FS: "
  1565.     FSS = 0
  1566.   EndIf
  1567.   If GSS
  1568.     MN$ + "GS: "
  1569.     GSS = 0
  1570.   EndIf
  1571.   If SSS
  1572.     MN$ + "SS: "
  1573.     SSS = 0
  1574.   EndIf
  1575.   MN$ + "[ "
  1576.   Adr = 1                                   ;jetzt im Adressierungs-Modus, wichtig für Override
  1577. EndProcedure
  1578.  
  1579. Procedure Strings(VAR1, VAR2)               ;VAR1=Anzahl Bytes, VAR2=ob Klammer
  1580.   If ((Mid(OP$, 1, 2) = "66" And XMM = 0) And VAR1 = 4 And Adr = 0) Or ((Mid(OP$, 1, 2) = "67" And Mid(OP$, 4, 2) = "66" And XMM = 0) And VAR1 = 4 And Adr = 0) Or ((Mid(OP$, 1, 2) = "67" And XMM = 0) And VAR1 = 4 And Adr = 1)
  1581.     VAR1 = 2                                ;zwangsweise setzen
  1582.   EndIf
  1583.   For k = 1 To VAR1
  1584.     OP = PeekB(Buffer + BZ) & $FF
  1585.     OP$ + RSet(Hex(OP), 2, "0") + " "
  1586.     BZ + 1
  1587.   Next
  1588.   If IsProg64 And Adr And Mid(MN$, Len(MN$) - 1, 1) = "["  ;64-Bit-Adressierung, Test auf Klammer, da die Sprungziel-Ermittlung nur für blanke Adresse gilt!
  1589.     SPZ = PeekL(Buffer + BZ - 4) + BZ - SO + Adr64    ;Sprungziel
  1590.     SPZH$ = RSet(Hex(SPZ + MemAdd64 + IB + SRVA), 16, "0")   ;MemAdd64=Korrektur für evtl. folgendem Imm-Wert  
  1591.     SPZ$ = ""
  1592.     For k = 1 To Adr3264 - 1 Step 2
  1593.       SPZ$ + Mid(SPZH$, k, 2) + " "
  1594.     Next
  1595.     SPZ$ = Mid(SPZ$, 1, Len(SPZ$) - 1)      ;Kosmetik, letztes " " wieder entfernen für Anzeige
  1596.     MN$ + SPZ$
  1597.     Adr64 = 0
  1598.    Else
  1599.     OPL = Len(OP$)
  1600.     For k = VAR1 To 1 Step -1
  1601.       OPL - 3
  1602.       MN1$ + Mid(OP$, OPL, 3)
  1603.     Next
  1604.     MN$ + Mid(MN1$, 2, Len(MN1$)-1)
  1605.   EndIf
  1606.   If VAR2 = 2
  1607.     MN$ + " ]" : Adr = 0                    ;abschliessende Klammer setzen
  1608.     If Komma
  1609.       MN$ + " , " : Komma - 1
  1610.     EndIf
  1611.   EndIf
  1612.   MemAdd64 = 0                              ;hier richtig!
  1613. EndProcedure
  1614.  
  1615. Procedure MSBytes(VAR1, VAR2)               ;VAR2=Pointer-Grösse bzw. Reg-Grösse für Reg-Reg
  1616.   MOD = VAR1 >> 6                           ;MOD selbst bleibt bei 64-Bit unverändert!
  1617.   RM = VAR1 & %00000111
  1618.  
  1619.   If VAR2 < 8                               ;FPU div.Sicherungen
  1620.     If (Mid(OP$, 1, 2) = "66" And XMM = 0 And REX < $48) Or (Mid(OP$, 1, 2) = "67" And (Mid(OP$, 4, 2) = "66" And XMM = 0)) ;Register- oder Address-Override
  1621.       VAR2 >> 1                             ;zwangsweise reduzieren
  1622.       Adr64 >> 1                            ;hier auch ändern!
  1623.       If MemAdd64 > 1
  1624.         MemAdd64 >> 1
  1625.       EndIf
  1626.     EndIf
  1627.   EndIf
  1628.  
  1629.   Select MOD
  1630.     Case %00
  1631.       Select RM
  1632.         Case %100                           ;SIB-Byte folgt
  1633.           SIB = PeekB(Buffer + BZ) & $FF    ;also einlesen
  1634.           OP$ + RSet(Hex(SIB), 2, "0") + " "
  1635.           NoString = 1                      ;keine API-Funktion einlesen usw.          
  1636.           BZ + 1
  1637.           S = SIB >> 6
  1638.           I = (SIB & %00111000) >> 3
  1639.           B = SIB & %00000111
  1640.           If REX
  1641.             B | (REX & %00000001) << 3
  1642.             I | (REX & %00000010) << 2
  1643.           EndIf
  1644.           Select B
  1645.             Case %101
  1646.               Select I
  1647.                 Case %100                   ;wäre Register ESP/RSP, Adressierung disp32
  1648.                   Pointer(VAR2)             ;erstmal so
  1649.                   Adr = 0
  1650.                   Strings(4, 2)
  1651.                 Default
  1652.                   MN$ + "dword ptr [ " : Adr = 1
  1653.                   Strings(4, 0)
  1654.                   MN$ + " + "
  1655.                   If REX
  1656.                     IsvonMSBytes = 1
  1657.                   EndIf
  1658.                   Register32(I, 0)
  1659.                   If S
  1660.                     MN$ + " * " + Str(1 << S)
  1661.                   EndIf
  1662.                   MN$ + " ]" : Adr = 0
  1663.                   If Komma
  1664.                     MN$ + " , " : Komma - 1
  1665.                   EndIf
  1666.               EndSelect
  1667.             Default
  1668.               Select I
  1669.                 Case %100
  1670.                   Pointer(VAR2)
  1671.                   If REX
  1672.                     IsvonMSBytes = 1
  1673.                   EndIf
  1674.                   Register32(B, 0)
  1675.                   MN$ + " ]"    : Adr = 0
  1676.                    If Komma
  1677.                     MN$ + " , " : Komma - 1
  1678.                   EndIf
  1679.                 Default
  1680.                   Pointer(VAR2)
  1681.                   If REX
  1682.                      IsvonMSBytes = 1
  1683.                   EndIf
  1684.                   Register32(B, 2)
  1685.                   If REX
  1686.                     IsvonMSBytes = 1
  1687.                   EndIf
  1688.                   Register32(I, 0)
  1689.                   If S
  1690.                     MN$ + " * " + Str(1 << S)
  1691.                   EndIf
  1692.                   MN$ + " ]" : Adr = 0
  1693.                   If Komma
  1694.                     MN$ + " , " : Komma - 1
  1695.                   EndIf
  1696.               EndSelect
  1697.           EndSelect
  1698.         Case %101                           ;direkte (32-Bit-)Adresse
  1699.           If Mid(OP$, 1, 2) = "66" And XMM = 0 And REX < $48 And VAR2 <> 8 And VAR2 <> 10 And VAR2 <> 11     ;Operand Override  VAR2 für FPU 16-Bit
  1700.           Pointer(VAR2 >> 1)
  1701.           Adr = 1
  1702.          Else
  1703.            Pointer(VAR2)
  1704.           EndIf
  1705.           Strings(4, 0)
  1706.           MN$ + " ]" : Adr = 0
  1707.           If Komma
  1708.             MN$ + " , " : Komma - 1
  1709.           EndIf
  1710.         Default                             ;kein SIB-Byte
  1711.           Pointer(VAR2)
  1712.           If REX
  1713.             RM | (REX & %00000001) << 3
  1714.             IsvonMSBytes = 1
  1715.           EndIf
  1716.           Register32(RM, 3)                 ;3 = "]"
  1717.        EndSelect
  1718.  
  1719.     Case %01                                ;mit 8-Bit-Adress-Versatz, 1 weiteres Byte einlesen
  1720.       Select RM
  1721.         Case %100                           ;SIB-Byte folgt
  1722.           SIB = PeekB(Buffer + BZ) & $FF    ;also einlesen
  1723.           OP$ + RSet(Hex(SIB), 2, "0") + " "
  1724.           BZ + 1
  1725.           S = SIB >> 6
  1726.           I = (SIB & %00111000) >> 3
  1727.           B = SIB & %00000111
  1728.           If REX
  1729.             B | (REX & %00000001) << 3
  1730.             I | (REX & %00000010) << 2
  1731.           EndIf
  1732.           Select I
  1733.             Case %100
  1734.               Select S
  1735.                 Case %00                    ;EA=Address+[B]
  1736.                   Pointer(VAR2)
  1737.                   If REX
  1738.                     IsvonMSBytes = 1
  1739.                   EndIf
  1740.                   Register32(B, 0)
  1741.                   OPP = PeekB(Buffer + BZ) & $FF
  1742.                   OP$ + RSet(Hex(OPP), 2, "0") + " "
  1743.                   If OPP >= $80
  1744.                     MN$ + " - "
  1745.                     OPP = ((~OPP) + 1) & $FF     ;NEG
  1746.                    Else
  1747.                     MN$ + " + "
  1748.                   EndIf
  1749.                   MN$ + RSet(Hex(OPP), 2, "0") + " ]" : Adr = 0
  1750.                   If Komma
  1751.                     MN$ + " , " : Komma - 1
  1752.                   EndIf
  1753.                   BZ + 1
  1754.                 Default
  1755.                   NoCode = 1
  1756.               EndSelect
  1757.             Default                         ;EA=Address+[B+S*I]
  1758.               Pointer(VAR2)
  1759.               If REX
  1760.                 IsvonMSBytes = 1
  1761.               EndIf
  1762.               Register32(B, 2)
  1763.               If REX
  1764.                 IsvonMSBytes = 1
  1765.               EndIf
  1766.               Register32(I, 0)
  1767.               If S
  1768.                 MN$ + " * " + Str(1 << S)
  1769.               EndIf
  1770.               OPP = PeekB(Buffer + BZ) & $FF
  1771.               OP$ + RSet(Hex(OPP), 2, "0") + " "
  1772.               If OPP >= $80
  1773.                 MN$ + " - "
  1774.                 OPP = ((~OPP) + 1) & $FF    ;NEG
  1775.                Else
  1776.                 MN$ + " + "
  1777.               EndIf
  1778.               MN$ + RSet(Hex(OPP), 2, "0") + " ]" : Adr = 0
  1779.               If Komma
  1780.                 MN$ + " , " : Komma - 1
  1781.               EndIf
  1782.               BZ + 1
  1783.           EndSelect
  1784.         Default                             ;kein SIB-Byte, EA=Address+[R/M]
  1785.           Pointer(VAR2)
  1786.           If REX
  1787.             VAR1 & %00000111
  1788.             VAR1 | (REX & %00000001) << 3   ;Bit0=Register-Erweiterung
  1789.             IsvonMSBytes = 1
  1790.           EndIf
  1791.           Register32(VAR1, 0)
  1792.           OPP = PeekB(Buffer + BZ) & $FF
  1793.           OP$ + RSet(Hex(OPP), 2, "0") + " "
  1794.           If OPP >= $80
  1795.             MN$ + " - "
  1796.             OPP = ((~OPP) + 1) & $FF        ;NEG
  1797.            Else
  1798.             MN$ + " + "
  1799.           EndIf
  1800.           MN$ + RSet(Hex(OPP), 2, "0") + " ]" : Adr = 0
  1801.           If Komma
  1802.             MN$ + " , " : Komma - 1
  1803.           EndIf
  1804.           BZ + 1
  1805.       EndSelect
  1806.  
  1807.     Case %10                                ;Adresse 32-bittig
  1808.       Select RM
  1809.         Case %100                           ;SIB-Byte folgt
  1810.           SIB = PeekB(Buffer + BZ) & $FF    ;also einlesen
  1811.           OP$ + RSet(Hex(SIB), 2, "0") + " "
  1812.           BZ + 1
  1813.           S = SIB >> 6
  1814.           I = (SIB & %00111000) >> 3
  1815.           B = SIB & %00000111
  1816.           If REX
  1817.             B | (REX & %00000001) << 3
  1818.             I | (REX & %00000010) << 2
  1819.           EndIf
  1820.           Select I
  1821.             Case %100
  1822.               Select S
  1823.                 Case %00                    ;EA=Address+[B]
  1824.                   Pointer(VAR2)
  1825.                   If REX
  1826.                     IsvonMSBytes = 1
  1827.                   EndIf
  1828.                   Register32(B, 2)          ;2="+", also hier nur "vorwärts
  1829.                  Strings(4, 2)             ;4=4 Bytes, 2=abschliessende Klammer setzen
  1830.                Default
  1831.                  NoCode = 1
  1832.              EndSelect
  1833.            Default                         ;EA=Address+[B+S*I]
  1834.              Pointer(VAR2)
  1835.              If REX
  1836.                IsvonMSBytes = 1
  1837.              EndIf
  1838.              Register32(B, 2)
  1839.              If REX
  1840.                IsvonMSBytes = 1
  1841.              EndIf
  1842.              Register32(I, 0)
  1843.              If S
  1844.                MN$ + " * " + Str(1 << S) + " + "
  1845.               Else
  1846.                MN$ + " + "
  1847.              EndIf
  1848.              Strings(4, 2)                 ;4=4 Bytes, 2=abschliessende Klammer setzen
  1849.          EndSelect
  1850.        Default                             ;kein SIB-Byte, EA=Address+[R/M]
  1851.          Pointer(VAR2)
  1852.          If REX
  1853.            VAR1 & %00000111
  1854.            VAR1 | (REX & %00000001) << 3   ;Bit0=Register-Erweiterung
  1855.            IsvonMSBytes = 1
  1856.          EndIf
  1857.          Register32(VAR1, 2)
  1858.          Strings(4, 2)                     ;4=4 Bytes, 2=abschliessende Klammer setzen
  1859.      EndSelect
  1860.  
  1861.    Case %11                                ;Register
  1862.      If VAR2 = 0                           ;0=Byte, 1=Word, 2=DWord
  1863.        Register8(VAR1, 0)
  1864.       Else
  1865.        If VAR2 <> 1
  1866.          VAR2 = 0
  1867.        EndIf
  1868.        Register32(VAR1, VAR2)              ;& %00000111 erfolgt in Procedure Register32!
  1869.      EndIf
  1870.  EndSelect
  1871. EndProcedure
  1872.  
  1873. Procedure Sprung_short()
  1874.  SPZ = PeekB(Buffer + BZ)
  1875.  OP$ + RSet(Hex(SPZ & $FF), 2, "0")
  1876.  BZ + 1
  1877.  SPZ = PeekB(Buffer + BZ - 1) + BZ - SO    ;Sprungziel
  1878.  SPZH$ = RSet(Hex(SPZ + IB + SRVA), Adr3264, "0")
  1879.  SPZ$ = ""
  1880.  For k = 1 To Adr3264 - 1 Step 2
  1881.    SPZ$ + Mid(SPZH$, k, 2) + " "
  1882.  Next
  1883.  MN$ + SPZ$ + " ( short )"
  1884.  If Mid(OP$, 1, 2) = "2E"                  ;Test auf Branch Hints
  1885.    MN$ + "   ( Branch Hint : No )"
  1886.    CSS = 0
  1887.   ElseIf Mid(OP$, 1, 2) = "3E"
  1888.    MN$ + "   ( Branch Hint : Yes )"
  1889.    DSS = 0
  1890.  EndIf
  1891. EndProcedure
  1892.  
  1893. Procedure Sprung_near_long()
  1894.  SPZ = PeekL(Buffer + BZ)
  1895.  For k = 1 To 4
  1896.    OP = PeekB(Buffer + BZ) & $FF
  1897.    OP$ + RSet(Hex(OP), 2, "0") + " "
  1898.    BZ + 1
  1899.  Next
  1900.  SPZ = PeekL(Buffer + BZ - 4) + BZ - SO    ;Sprungziel
  1901.  SPZH$ = RSet(Hex(SPZ + IB + SRVA), Adr3264, "0")
  1902.  SPZ$ = ""
  1903.  For k = 1 To Adr3264 - 1 Step 2
  1904.    SPZ$ + Mid(SPZH$, k, 2) + " "
  1905.  Next
  1906.  MN$ + SPZ$
  1907.  If Mid(OP$, 1, 2) = "2E"                  ;Test auf Branch Hints
  1908.    MN$ + "   ( Branch Hint : No )"
  1909.    CSS = 0
  1910.   ElseIf Mid(OP$, 1, 2) = "3E"
  1911.    MN$ + "   ( Branch Hint : Yes )"
  1912.    DSS = 0
  1913.  EndIf
  1914. EndProcedure
  1915.  
  1916. Procedure Ev(VAR1, VAR2)                    ;VAR1 = Operanden-Grösse (Byte, Word,...)
  1917.  Komma = VAR2
  1918.  If VAR1 = 10 And (REX & %00001000)
  1919.    VAR1 = 3
  1920.   ElseIf VAR1 = 10
  1921.    VAR1 = 2
  1922.  EndIf
  1923.  OP = PeekB(Buffer + BZ) & $FF
  1924.  OP$ + RSet(Hex(OP), 2, "0") + " "
  1925.  BZ + 1
  1926.  MSBytes(OP, VAR1)
  1927.  If XMM = 5                                ;das nächste Register soll ein XMM-Register sein!
  1928.    XMM = 2
  1929.  EndIf
  1930.  If XMM = 6                                ;das nächste Register soll ein MMX-Register sein!
  1931.    XMM = 1
  1932.  EndIf
  1933.  If REX
  1934.    REXEX = 1
  1935.  EndIf
  1936.  Register32(OP >> 3, 0)
  1937. EndProcedure
  1938.  
  1939. Procedure Gv(VAR1, VAR2)
  1940.  Komma = VAR2
  1941.  If VAR1 = 10 And (REX & %00001000)
  1942.    VAR1 = 3
  1943.   ElseIf VAR1 = 10
  1944.    VAR1 = 2
  1945.  EndIf
  1946.  OP = PeekB(Buffer + BZ) & $FF
  1947.  OP$ + RSet(Hex(OP), 2, "0") + " "
  1948.  BZ + 1
  1949.  If REX
  1950.    REXEX = 1
  1951.  EndIf
  1952.  Register32(OP >> 3, 0)
  1953.  If XMM = 5                                ;das nächste Register soll ein XMM-Register sein!
  1954.    XMM = 2
  1955.  EndIf
  1956.  If XMM = 6                                ;das nächste Register soll ein MMX-Register sein!
  1957.    XMM = 1
  1958.  EndIf
  1959.  If XMM = 4                                ;das nächste Register soll wieder ein General-Register sein!
  1960.    XMM = 255                               ;bei Null Problem mit Präfix $66, so lassen
  1961.  EndIf
  1962.  If XMM = 3                                ;das nächste Register soll wieder ein General-Register sein!
  1963.    XMM = 255
  1964.  EndIf
  1965.  If XMM = 7                                ;das nächste Register soll ein MMX-Register sein!
  1966.    XMM = 1
  1967.  EndIf
  1968.  If XMM = 8                                ;das nächste Register soll ein XMM-Register sein!
  1969.    XMM = 2
  1970.  EndIf
  1971.  If REX
  1972.    OP | ((REX & %00000001) << 3)
  1973.  EndIf
  1974.  MSBytes(OP, VAR1)                         ;VAR1=0=Byte, 1=Word, 2=DWord usw.
  1975. EndProcedure
  1976.  
  1977. Procedure Eb(VAR1)                          ;VAR1=0 für z.B. SETcc (nur ein Register)
  1978.  OP = PeekB(Buffer + BZ) & $FF
  1979.  OP$ + RSet(Hex(OP), 2, "0") + " "
  1980.  BZ + 1
  1981.  MSBytes(OP, 0)                            ;VAR2=0=Byte
  1982.  If VAR1
  1983.    If REX
  1984.      REXEX = 1
  1985.    EndIf
  1986.    Register8(OP >> 3, 0)
  1987.  EndIf
  1988. EndProcedure
  1989.  
  1990. Procedure Gb()
  1991.  OP = PeekB(Buffer + BZ) & $FF
  1992.  OP$ + RSet(Hex(OP), 2, "0") + " "
  1993.  BZ + 1
  1994.  Register8(OP >> 3, 0)
  1995.  MSBytes(OP, 0)                            ;VAR2=0=Byte
  1996. EndProcedure
  1997.  
  1998. Procedure AVX()                             ;AVX, AES, FMA
  1999. ;Under Construction!
  2000. MN$ = "" ;nur solange nicht komplett
  2001.  Var1 = 0                                  ;für z.B. VBROADCAST
  2002.  BZ + 1
  2003.  OP = PeekB(Buffer + BZ) & $FF
  2004.  OP$ + RSet(Hex(OP), 2, "0") + " "
  2005.  BZ + 1
  2006.  
  2007.  OPAVX = PeekB(Buffer + BZ) & $FF
  2008.  OP$ + RSet(Hex(OPAVX), 2, "0") + " "
  2009.  
  2010.  Select OP
  2011.  
  2012.  
  2013.    Case $0C
  2014.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2015.        Case %00011                         ;=$0F3A
  2016.          Select pp
  2017.            Case 1                          ;=$66
  2018.              MN$ = "VBLENDPS  "
  2019.              MemAdd64 = 1
  2020.              IMM8 = 1
  2021.          EndSelect
  2022.      EndSelect
  2023.    ;----------------------
  2024.    Case $0D
  2025.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2026.        Case %00011                         ;=$0F3A
  2027.          Select pp
  2028.            Case 1                          ;=$66
  2029.              MN$ = "VBLENDPD  "
  2030.              MemAdd64 = 1
  2031.              IMM8 = 1
  2032.          EndSelect
  2033.      EndSelect
  2034.    ;----------------------
  2035.  
  2036.  
  2037.  
  2038.    Case $17
  2039.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2040.        Case %00011                         ;=$0F3A
  2041.          Select pp
  2042.            Case 1                          ;=$66
  2043.              MN$ = "VEXTRACTPS  " : Var1 = 2
  2044.              XMM = -2
  2045.              vvvv = 255                    ;=unused
  2046.              MemAdd64 = 1
  2047.              IMM8 = 4
  2048.          EndSelect
  2049.      EndSelect
  2050.    ;----------------------
  2051.    Case $18
  2052.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2053.        Case %00010                         ;=$0F38
  2054.          Select pp
  2055.            Case 1                          ;=$66
  2056.              MN$ = "VBROADCASTSS  " : Var1 = 2  ;dword
  2057.              vvvv = 255                    ;=unused
  2058.          EndSelect
  2059.        Case %00011                         ;=$0F3A
  2060.          Select pp
  2061.            Case 1                          ;=$66
  2062.              MN$ = "VINSERTF128  " : Var1 = 5   ;dqword
  2063.              MemAdd64 = 1
  2064.              IMM8 = 10
  2065.          EndSelect      
  2066.      EndSelect
  2067.    ;----------------------
  2068.    Case $19
  2069.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2070.        Case %00010                         ;=$0F38
  2071.          Select pp
  2072.            Case 1                          ;=$66
  2073.              MN$ = "VBROADCASTSD  " : Var1 = 3  ;qword
  2074.              vvvv = 255                    ;=unused          
  2075.          EndSelect
  2076.        Case %00011                         ;=$0F3A
  2077.          Select pp
  2078. ;            Case 1                          ;=$66     NEU!
  2079. ;              MN$ = "VEXTRACTF128  " : Var1 = 5  ;dqword       ;lt. NASM 2.07 XMM-Register; lt.Intel aber YMM (richtig)
  2080. ;              XMM = -2  ;Tag später für 2.Register=YMM    
  2081. ;              vvvv = 255                    ;=unused
  2082. ;              MemAdd64 = 1
  2083. ;              IMM8 = 4
  2084. ;LVEX = 0 ;ist von NASM gesetzt!  
  2085.          EndSelect
  2086.      EndSelect
  2087.    ;----------------------
  2088.  
  2089.    Case $1A
  2090.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2091.        Case %00010                         ;=$0F38
  2092.          Select pp
  2093.            Case 1                          ;=$66
  2094.              MN$ = "VBROADCASTF128  " : Var1 = 5     ;dqword          
  2095.              vvvv = 255                    ;=unused
  2096.          EndSelect
  2097.      EndSelect
  2098.    ;----------------------
  2099.  
  2100.    Case $21
  2101.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2102.        Case %00011                         ;=$0F3A
  2103.          Select pp
  2104.            Case 1                          ;=$66
  2105.              MN$ = "VINSERTPS  " : Var1 = 2
  2106.              MemAdd64 = 1
  2107.              IMM8 = 1
  2108.          EndSelect
  2109.      EndSelect
  2110.    ;------------------------
  2111.  
  2112.  
  2113.  
  2114.    Case $2A
  2115.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2116.        Case %00001                         ;=$0F
  2117.          Select pp
  2118.            Case 3                          ;=$F2
  2119.              MN$ = "VCVTSI2SD  "
  2120.              XMM = 254
  2121.              If WVEX
  2122.                Var1 = 3                    ;qword
  2123.               Else
  2124.                Var1 = 2                    ;dword
  2125.              EndIf
  2126.            Case 2                          ;=$F3
  2127.              MN$ = "VCVTSI2SS  "
  2128.              XMM = 255
  2129.              If WVEX
  2130.                Var1 = 3                    ;qword
  2131.               Else
  2132.                Var1 = 2                    ;dword
  2133.              EndIf
  2134.          EndSelect
  2135.      EndSelect
  2136.    ;------------------------
  2137.  
  2138.  
  2139.  
  2140.    Case $2C
  2141.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2142.        Case %00001                         ;=$0F
  2143.          Select pp
  2144.            Case 3                          ;=$F2
  2145.              MN$ = "VCVTTSD2SI  " : Var1 = 3    ;qword
  2146.              XMM = -1                      ;Klimmzug wegen Prefix 67h ! Verhindert Reduzierung auf word ptr in Strings()
  2147.              OP = (PeekB(Buffer + BZ) & $FF) >> 3
  2148.              REX | RVEX >> 3               ;Register-Erweiterung
  2149.              REX | WVEX
  2150.              Klimm.b = PeekB(@OP$)         ;oh je... aber wegen"67"  
  2151.              PokeB(@OP$, 0)
  2152.              Komma = 1
  2153.              Register32(OP, 0)
  2154.              PokeB(@OP$, Klimm)            ;wieder herstellen
  2155.              vvvv = 255                    ;=unused
  2156.              REX = 0                       ;muss
  2157.            Case 2                          ;=$F3
  2158.              MN$ = "VCVTTSS2SI  " : Var1 = 2    ;dword
  2159.              XMM = -1                      ;Klimmzug wegen Prefix 67h ! Verhindert Reduzierung auf word ptr in Strings()
  2160.              OP = (PeekB(Buffer + BZ) & $FF) >> 3
  2161.              REX | RVEX >> 3               ;Register-Erweiterung
  2162.              REX | WVEX
  2163.              Klimm.b = PeekB(@OP$)         ;oh je... aber wegen"67"  
  2164.              PokeB(@OP$, 0)
  2165.              Komma = 1
  2166.              Register32(OP, 0)
  2167.              PokeB(@OP$, Klimm)            ;wieder herstellen
  2168.              vvvv = 255                    ;=unused
  2169.              REX = 0                       ;muss
  2170.          EndSelect
  2171.      EndSelect
  2172.    ;------------------------
  2173.    Case $2D
  2174.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2175.        Case %00001                         ;=$0F
  2176.          Select pp
  2177.            Case 3                          ;=$F2
  2178.              MN$ = "VCVTSD2SI  " : Var1 = 3     ;qword
  2179.              XMM = -1                      ;Klimmzug wegen Prefix 67h ! Verhindert Reduzierung auf word ptr in Strings()
  2180.              OP = (PeekB(Buffer + BZ) & $FF) >> 3
  2181.              REX | RVEX >> 3               ;Register-Erweiterung
  2182.              REX | WVEX
  2183.              Klimm.b = PeekB(@OP$)         ;oh je... aber wegen"67"  
  2184.              PokeB(@OP$, 0)
  2185.              Komma = 1
  2186.              Register32(OP, 0)
  2187.              PokeB(@OP$, Klimm)            ;wieder herstellen
  2188.              vvvv = 255                    ;=unused
  2189.              REX = 0                       ;muss
  2190.            Case 2                          ;=$F3
  2191.              MN$ = "VCVTSS2SI  " : Var1 = 2     ;dword
  2192.              XMM = -1                      ;Klimmzug wegen Prefix 67h ! Verhindert Reduzierung auf word ptr in Strings()
  2193.              OP = (PeekB(Buffer + BZ) & $FF) >> 3
  2194.              REX | RVEX >> 3               ;Register-Erweiterung
  2195.              REX | WVEX
  2196.              Klimm.b = PeekB(@OP$)         ;oh je... aber wegen"67"  
  2197.              PokeB(@OP$, 0)
  2198.              Komma = 1
  2199.              Register32(OP, 0)
  2200.              PokeB(@OP$, Klimm)            ;wieder herstellen
  2201.              vvvv = 255                    ;=unused
  2202.              REX = 0                       ;muss
  2203.          EndSelect
  2204.      EndSelect
  2205.    ;------------------------
  2206.  
  2207.  
  2208.    Case $2F
  2209.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2210.        Case %00001                         ;=$0F
  2211.          Select pp
  2212.            Case 1                          ;=$66
  2213.              MN$ = "VCOMISD  " : Var1 = 3  ;qword
  2214.            Default
  2215.              MN$ = "VCOMISS  " : Var1 = 2  ;dword
  2216.          EndSelect
  2217.        vvvv = 255                          ;=unused
  2218.      EndSelect
  2219.    ;------------------------
  2220.  
  2221.    Case $40
  2222.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2223.        Case %00011                         ;=$0F3A
  2224.          Select pp
  2225.            Case 1                          ;=$66
  2226.              MN$ = "VDPPS  "
  2227.          EndSelect
  2228.          MemAdd64 = 1
  2229.          IMM8 = 1
  2230.      EndSelect
  2231.    ;------------------------
  2232.    Case $41
  2233.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2234.        Case %00011                         ;=$0F3A
  2235.          Select pp
  2236.            Case 1                          ;=$66
  2237.              MN$ = "VDPPD  "
  2238.          EndSelect
  2239.          MemAdd64 = 1
  2240.          IMM8 = 1
  2241.      EndSelect
  2242.    ;------------------------
  2243.  
  2244.  
  2245.  
  2246.  
  2247.    Case $4A
  2248.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2249.        Case %00011                         ;=$0F3A
  2250.          Select pp
  2251.            Case 1                          ;=$66
  2252.              MN$ = "VBLENDVPS  "
  2253.              MemAdd64 = 1
  2254.              IMM8 = 2
  2255.          EndSelect
  2256.      EndSelect
  2257.    ;----------------------
  2258.    Case $4B
  2259.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2260.        Case %00011                         ;=$0F3A
  2261.          Select pp
  2262.            Case 1                          ;=$66
  2263.              MN$ = "VBLENDVPD  "
  2264.              MemAdd64 = 1
  2265.              IMM8 = 2
  2266.          EndSelect
  2267.      EndSelect
  2268.    ;----------------------
  2269.  
  2270.  
  2271.  
  2272.    Case $54
  2273.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2274.        Case %00001                         ;=$0F
  2275.          Select pp
  2276.            Case 1                          ;=$66
  2277.              MN$ = "VANDPD  "
  2278.            Default
  2279.              MN$ = "VANDPS  "
  2280.          EndSelect
  2281.      EndSelect
  2282.    ;------------------------
  2283.    Case $55
  2284.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2285.        Case %00001                         ;=$0F
  2286.          Select pp
  2287.            Case 1                          ;=$66
  2288.              MN$ = "VANDNPD  "
  2289.            Default
  2290.              MN$ = "VANDNPS  "
  2291.          EndSelect
  2292.      EndSelect
  2293.    ;------------------------
  2294.  
  2295.    Case $58
  2296.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2297.        Case %00001                         ;=$0F
  2298.          Select pp
  2299.            Case 1                          ;=$66
  2300.              MN$ = "VADDPD  "
  2301.            Case 3                          ;=$F2
  2302.              MN$ = "VADDSD  " : Var1 = 3   ;qword
  2303.            Case 2                          ;=$F3
  2304.              MN$ = "VADDSS  " : Var1 = 2   ;dword
  2305.            Default
  2306.              MN$ = "VADDPS  "
  2307.          EndSelect
  2308.      EndSelect
  2309.    ;------------------------
  2310.  
  2311.  
  2312.  
  2313.    Case $5A
  2314.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2315.        Case %00001                         ;=$0F
  2316.          Select pp
  2317.            Case 1                          ;=$66
  2318.              MN$ = "VCVTPD2PS  " : Var1 = 21    ;wird modifiziert
  2319.              vvvv = 255                    ;=unused
  2320.            Case 3                          ;=$F2
  2321.              MN$ = "VCVTSD2SS  " : Var1 = 3
  2322.            Case 2                          ;=$F3
  2323.              MN$ = "VCVTSS2SD  " : Var1 = 2
  2324.            Default
  2325.              MN$ = "VCVTPS2PD  " : Var1 = 20    ;wird modifiziert
  2326.              vvvv = 255                    ;=unused
  2327.          EndSelect
  2328.      EndSelect
  2329.    ;------------------------
  2330.    Case $5B
  2331.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2332.        Case %00001                         ;=$0F
  2333.          Select pp
  2334.            Case 1                          ;=$66
  2335.              MN$ = "VCVTPS2DQ  "
  2336.              vvvv = 255                    ;=unused
  2337.            Case 2                          ;=$F3
  2338.              MN$ = "VCVTTPS2DQ  "
  2339.              vvvv = 255                    ;=unused
  2340.            Default
  2341.              MN$ = "VCVTDQ2PS  "
  2342.              vvvv = 255                    ;=unused
  2343.          EndSelect
  2344.      EndSelect
  2345.    ;------------------------
  2346.  
  2347.  
  2348.    Case $5E
  2349.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2350.        Case %00001                         ;=$0F
  2351.          Select pp
  2352.            Case 1                          ;=$66
  2353.              MN$ = "VDIVPD  "
  2354.            Case 3                          ;=$F2
  2355.              MN$ = "VDIVSD  " : Var1 = 3   ;qword
  2356.            Case 2                          ;=$F3
  2357.              MN$ = "VDIVSS  " : Var1 = 2   ;dword
  2358.            Default
  2359.              MN$ = "VDIVPS  "
  2360.          EndSelect
  2361.      EndSelect
  2362.    ;------------------------
  2363.  
  2364.    Case $7C
  2365.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2366.        Case %00001                         ;=$0F
  2367.          Select pp
  2368.            Case 1                          ;=$66
  2369.              MN$ = "VHADDPD  "
  2370.            Case 3                          ;=$F2
  2371.              MN$ = "VHADDPS  "
  2372.          EndSelect
  2373.      EndSelect
  2374.    ;----------------------
  2375.    Case $7D
  2376.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2377.        Case %00001                         ;=$0F
  2378.          Select pp
  2379.            Case 1                          ;=$66
  2380.              MN$ = "VHSUBPD  "
  2381.            Case 3                          ;=$F2
  2382.              MN$ = "VHSUBPS  "
  2383.          EndSelect
  2384.      EndSelect
  2385.    ;----------------------
  2386.  
  2387.    Case $BD
  2388.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2389.        Case %00010                         ;=$0F38
  2390.          Select pp
  2391.            Case 1                          ;=$66
  2392.              MN$ = "VFNMADD231SS  " : Var1 = 2  ;dword
  2393.          EndSelect
  2394.      EndSelect
  2395.    ;----------------------
  2396.  
  2397.  
  2398.    Case $C2
  2399.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2400.        Case %00001                         ;=$0F
  2401.          Select pp
  2402.            Case 1                          ;=$66
  2403.              MN$ = "VCMPPD  "
  2404.            Case 3                          ;=$F2
  2405.              MN$ = "VCMPSD  " : Var1 = 3   ;qword
  2406.            Case 2                          ;=$F3
  2407.              MN$ = "VCMPSS  " : Var1 = 2   ;dword
  2408.            Default
  2409.              MN$ = "VCMPPS  "
  2410.          EndSelect
  2411.          MemAdd64 = 1
  2412.          IMM8 = 1
  2413.      EndSelect
  2414.    ;------------------------
  2415.  
  2416.  
  2417.  
  2418.  
  2419.  
  2420.    Case $D0
  2421.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2422.        Case %00001                         ;=$0F
  2423.          Select pp
  2424.            Case 1                          ;=$66
  2425.              MN$ = "VADDSUBPD  "
  2426.            Case 3                          ;=$F2
  2427.              MN$ = "VADDSUBPS  "
  2428.          EndSelect
  2429.      EndSelect
  2430.    ;----------------------
  2431.  
  2432.    Case $DB
  2433.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2434.        Case %00010                         ;=$0F38
  2435.          Select pp
  2436.            Case 1                          ;=$66
  2437.              MN$ = "VAESIMC  "
  2438.              vvvv = 255                    ;=unused
  2439.          EndSelect
  2440.      EndSelect
  2441.    ;----------------------
  2442.    Case $DC
  2443.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2444.        Case %00010                         ;=$0F38
  2445.          Select pp
  2446.            Case 1                          ;=$66
  2447.              MN$ = "VAESENC  "
  2448.          EndSelect
  2449.      EndSelect
  2450.    ;----------------------
  2451.    Case $DD
  2452.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2453.        Case %00010                         ;=$0F38
  2454.          Select pp
  2455.            Case 1                          ;=$66
  2456.              MN$ = "VAESENCLAST  "
  2457.          EndSelect
  2458.      EndSelect
  2459.    ;----------------------
  2460.    Case $DE
  2461.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2462.        Case %00010                         ;=$0F38
  2463.          Select pp
  2464.            Case 1                          ;=$66
  2465.              MN$ = "VAESDEC  "
  2466.          EndSelect
  2467.      EndSelect
  2468.    ;----------------------
  2469.    Case $DF
  2470.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2471.        Case %00010                         ;=$0F38
  2472.          Select pp
  2473.            Case 1                          ;=$66
  2474.              MN$ = "VAESDECLAST  "
  2475.          EndSelect
  2476.        Case %00011                         ;=$0F3A
  2477.          Select pp
  2478.            Case 1                          ;=$66
  2479.              MN$ = "VAESKEYGENASSIST  "
  2480.              MemAdd64 = 1
  2481.              IMM8 = 1
  2482.              vvvv = 255                    ;=unused
  2483.          EndSelect
  2484.      EndSelect
  2485.    ;----------------------
  2486.  
  2487.    Case $E6
  2488.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2489.        Case %00001                         ;=$0F
  2490.          Select pp
  2491.            Case 1                          ;=$66
  2492.              MN$ = "VCVTTPD2DQ  " : Var1 = 21   ;wird modifiziert
  2493.            Case 3                          ;=$F2
  2494.              MN$ = "VCVTPD2DQ  " : Var1 = 21    ;wird modifiziert
  2495.            Case 2                          ;=$F3
  2496.              MN$ = "VCVTDQ2PD  " : Var1 = 20    ;wird modifiziert
  2497.          EndSelect
  2498.        vvvv = 255                          ;=unused
  2499.      EndSelect
  2500.    ;------------------------
  2501.  
  2502.  
  2503.  
  2504.    Case $F0
  2505.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2506.        Case %00001                         ;=$0F
  2507.          Select pp
  2508.            Case 3                          ;=$F2
  2509.              MN$ = "VLDDQU  " : Var1 = 21  ;wird modifiziert
  2510.          EndSelect
  2511.        vvvv = 255                          ;=unused
  2512.      EndSelect
  2513.    ;------------------------
  2514.  
  2515.  
  2516.    Case $F7
  2517.      Select mmmmm                          ;%00001=$0F, %00010=$0F38, %00011=$0F3A
  2518.        Case %00001                         ;=$0F
  2519.          Select pp
  2520.            Case 1                          ;=$66
  2521.              MN$ = "VMASKMOVDQU  "
  2522.          EndSelect
  2523.        vvvv = 255                          ;=unused
  2524.      EndSelect
  2525.    ;------------------------
  2526.  
  2527.  
  2528.  
  2529.  EndSelect
  2530.  
  2531.  BZ + 1
  2532.  
  2533.  If LVEX And Var1 <> 21
  2534.    XY$ = "YMM"
  2535.    If Var1 = 0                             ;nur neu setzen, wenn noch nicht explizit gesetzt wurde, z.B. VBROADCAST
  2536.      Var1 = 11
  2537.    EndIf
  2538.   Else
  2539.    XY$ = "XMM"
  2540.    If Var1 = 0
  2541.      Var1 = 5
  2542.    EndIf  
  2543.  EndIf
  2544.  
  2545.  If XMM > 0                                ;z.B VCVTSD2SI ist -1
  2546.    MN$ + XY$ + Str(((OPAVX >> 3) & %111) | RVEX)     ;RVEX for 8-15 1.Operand
  2547.    MN$ + " , "
  2548.  EndIf
  2549.  
  2550.  If Var1 = 21                              ;z.B. VCVTPD2DQ
  2551.    If LVEX
  2552.      XY$ = "YMM"
  2553.      Var1 = 11
  2554.     Else
  2555.      Var1 = 5
  2556.    EndIf
  2557.  EndIf  
  2558.  
  2559.  If Var1 = 20                              ;z.B. VCVTDQ2PD
  2560.    XY$ = "XMM"
  2561.    If LVEX
  2562.      Var1 = 5
  2563.     Else
  2564.      Var1 = 3
  2565.    EndIf
  2566.  EndIf
  2567.  
  2568.  If vvvv < 250                             ;=unused
  2569.    MN$ + XY$ + Str(vvvv) + " , "           ;vvvv 2.Operand
  2570.  EndIf
  2571.  
  2572.  If IMM8 = 10                              ;hier mal so für z.B. VINSERTF128
  2573.    IMM8 = 1
  2574.    XY$ = "XMM"
  2575.  EndIf
  2576.  
  2577. EndProcedure
  2578.  
  2579. Procedure FPU()                             ;FPU-Instruktionen
  2580.  MODRM = PeekB(Buffer + BZ) & $FF
  2581.  MOD = MODRM >> 6
  2582.  SPEC = (MODRM >> 3) & %00000111
  2583.  RM = MODRM & %00000111
  2584.  OP$ + RSet(Hex(MODRM), 2, "0") + " "
  2585.  BZ + 1
  2586.  Select OPF                                ;$D8 bis $DF, kommt von Procedure_Codes()
  2587.    Case $D8
  2588.      Select MOD
  2589.        Case %11                            ;MODRM > $BF
  2590.          Select SPEC
  2591.            Case 0
  2592.              MN$ = "FADD  ST0 , "
  2593.              RegisterST(RM)
  2594.            Case 1
  2595.              MN$ = "FMUL  ST0 , "
  2596.              RegisterST(RM)
  2597.            Case 2
  2598.              MN$ = "FCOM  "                ;ohne "ST0"
  2599.              RegisterST(RM)
  2600.            Case 3
  2601.              MN$ = "FCOMP  "
  2602.              RegisterST(RM)
  2603.            Case 4
  2604.              MN$ = "FSUB  ST0 , "
  2605.              RegisterST(RM)
  2606.            Case 5
  2607.              MN$ = "FSUBR  ST0 , "
  2608.              RegisterST(RM)
  2609.            Case 6
  2610.              MN$ = "FDIV  ST0 , "
  2611.              RegisterST(RM)
  2612.            Case 7
  2613.              MN$ = "FDIVR  ST0 , "
  2614.              RegisterST(RM)
  2615.          EndSelect
  2616.        Default                             ;MODRM $0 bis $BF
  2617.          Select SPEC
  2618.            Case 0
  2619.              MN$ = "FADD  "                ;Single Precision
  2620.              MSBytes(MODRM, 2)             ;2=DWord
  2621.            Case 1
  2622.              MN$ = "FMUL  "                ;Single Precision
  2623.              MSBytes(MODRM, 2)             ;2=DWord
  2624.            Case 2
  2625.              MN$ = "FCOM  "                ;Single Precision
  2626.              MSBytes(MODRM, 2)             ;2=DWord
  2627.            Case 3
  2628.              MN$ = "FCOMP  "               ;Single Precision
  2629.              MSBytes(MODRM, 2)             ;2=DWord
  2630.            Case 4
  2631.              MN$ = "FSUB  "                ;Single Precision
  2632.              MSBytes(MODRM, 2)             ;2=DWord
  2633.            Case 5
  2634.              MN$ = "FSUBR  "               ;Single Precision
  2635.              MSBytes(MODRM, 2)             ;2=DWord
  2636.            Case 6
  2637.              MN$ = "FDIV  "                ;Single Precision
  2638.              MSBytes(MODRM, 2)             ;2=DWord
  2639.            Case 7
  2640.              MN$ = "FDIVR  "               ;Single Precision
  2641.              MSBytes(MODRM, 2)             ;2=DWord
  2642.          EndSelect
  2643.      EndSelect
  2644.  
  2645.    Case $D9
  2646.      Select MOD
  2647.        Case %11                            ;MODRM > $BF
  2648.          Select SPEC
  2649.            Case 0
  2650.              MN$ = "FLD  "
  2651.              RegisterST(RM)
  2652.            Case 1
  2653.              MN$ = "FXCH  "
  2654.              RegisterST(RM)
  2655.            Case 3
  2656.              MN$ = "FSTP  "                ;Alias
  2657.              RegisterST(RM)
  2658.              MN$ + "   ( Alias for FSTP, but don´t signal stack underflow ! )"    
  2659.          EndSelect
  2660.          Select MODRM
  2661.            Case $D0                        ;$D1 bis $DF und andere sind reserviert
  2662.              MN$ = "FNOP "                 ;Space for Search!
  2663.            Case $E0
  2664.              MN$ = "FCHS "
  2665.            Case $E1
  2666.              MN$ = "FABS "
  2667.            Case $E4
  2668.              MN$ = "FTST "
  2669.            Case $E5
  2670.              MN$ = "FXAM "
  2671.            Case $E8
  2672.              MN$ = "FLD1 "
  2673.            Case $E9
  2674.              MN$ = "FLDL2T "
  2675.            Case $EA
  2676.              MN$ = "FLDL2E "
  2677.            Case $EB
  2678.              MN$ = "FLDPI "
  2679.            Case $EC
  2680.              MN$ = "FLDLG2 "
  2681.            Case $ED
  2682.              MN$ = "FLDLN2 "
  2683.            Case $EE
  2684.              MN$ = "FLDZ "
  2685.            Case $F0
  2686.              MN$ = "F2XM1 "
  2687.            Case $F1
  2688.              MN$ = "FYL2X "
  2689.            Case $F2
  2690.              MN$ = "FPTAN "
  2691.            Case $F3
  2692.              MN$ = "FPATAN "
  2693.            Case $F4
  2694.              MN$ = "FXTRACT "
  2695.            Case $F5
  2696.              MN$ = "FPREM1 "
  2697.            Case $F6
  2698.              MN$ = "FDECSTP "
  2699.            Case $F7
  2700.              MN$ = "FINCSTP "
  2701.            Case $F8
  2702.              MN$ = "FPREM "
  2703.            Case $F9
  2704.              MN$ = "FYL2XP1 "
  2705.            Case $FA
  2706.              MN$ = "FSQRT "
  2707.            Case $FB
  2708.              MN$ = "FSINCOS "
  2709.            Case $FC
  2710.              MN$ = "FRNDINT "
  2711.            Case $FD
  2712.              MN$ = "FSCALE "
  2713.            Case $FE
  2714.              MN$ = "FSIN "
  2715.            Case $FF
  2716.              MN$ = "FCOS "
  2717.          EndSelect
  2718.        Default                             ;MODRM $0 bis $BF
  2719.          Select SPEC
  2720.            Case 0
  2721.              MN$ = "FLD  "                 ;Single Precision
  2722.              MSBytes(MODRM, 2)             ;2=DWord
  2723.            Case 1
  2724.              NoCode = 1
  2725.            Case 2
  2726.              MN$ = "FST  "                 ;Single Precision
  2727.              MSBytes(MODRM, 2)             ;2=DWord
  2728.            Case 3
  2729.              MN$ = "FSTP  "                ;Single Precision
  2730.              MSBytes(MODRM, 2)             ;2=DWord
  2731.            Case 4
  2732.              MN$ = "FLDENV  "
  2733.              MSBytes(MODRM, 6)             ;6=28-byte-ptr
  2734.            Case 5
  2735.              MN$ = "FLDCW  "
  2736.              MSBytes(MODRM, 1)             ;1=Word
  2737.            Case 6
  2738.              If Daten(Zeile - 1)\Mnemonic = "WAIT "
  2739.                MN$ = "FSTENV  "
  2740.                OP$ = "9B " + OP$
  2741.                Zeile - 1
  2742.                If Mid(OP$, 4, 2) = "66"
  2743.                  MSBytes(MODRM, 8)         ;8=14-byte-ptr
  2744.                 Else
  2745.                  MSBytes(MODRM, 6)         ;6=28-byte-ptr
  2746.                EndIf
  2747.                MN$ + "   ( 9B = (F)WAIT )"
  2748.                If Mid(OP$, 4, 2) = "66"
  2749.                  MN$ + "   ( = FSTENVW )"
  2750.                 Else
  2751.                  MN$ + "   ( = FSTENVD )"
  2752.                EndIf
  2753.               Else
  2754.                MN$ = "FNSTENV  "
  2755.                If Mid(OP$, 1, 2) = "66"
  2756.                  MSBytes(MODRM, 8)         ;8=14-byte-ptr
  2757.                 Else
  2758.                  MSBytes(MODRM, 6)         ;6=28-byte-ptr
  2759.                EndIf
  2760.                If Mid(OP$, 1, 2) = "66"
  2761.                  MN$ + "   ( = FNSTENVW )"
  2762.                 Else
  2763.                  MN$ + "   ( = FNSTENVD )"
  2764.                EndIf
  2765.              EndIf
  2766.            Case 7
  2767.              If Daten(Zeile - 1)\Mnemonic = "WAIT "
  2768.                MN$ = "FSTCW  "
  2769.                OP$ = "9B " + OP$
  2770.                Zeile - 1
  2771.                MSBytes(MODRM, 1)           ;1=Word
  2772.                MN$ + "   ( 9B = (F)WAIT )"
  2773.               Else
  2774.                MN$ = "FNSTCW  "
  2775.                MSBytes(MODRM, 1)           ;1=Word
  2776.              EndIf
  2777.          EndSelect
  2778.      EndSelect
  2779.  
  2780.    Case $DA
  2781.      Select MOD
  2782.        Case %11                            ;MODRM > $BF
  2783.          Select SPEC
  2784.            Case 0
  2785.              MN$ = "FCMOVB  "
  2786.              RegisterST(RM)
  2787.            Case 1
  2788.              MN$ = "FCMOVE  "
  2789.              RegisterST(RM)
  2790.            Case 2
  2791.              MN$ = "FCMOVBE  "
  2792.              RegisterST(RM)
  2793.            Case 3
  2794.              MN$ = "FCMOVU  "
  2795.              RegisterST(RM)
  2796.          EndSelect
  2797.          Select MODRM
  2798.            Case $E9
  2799.              MN$ = "FUCOMPP "
  2800.          EndSelect
  2801.        Default                             ;MODRM $0 bis $BF
  2802.          Select SPEC
  2803.            Case 0
  2804.              MN$ = "FIADD  "               ;Single Precision
  2805.              MSBytes(MODRM, 2)             ;2=DWord
  2806.            Case 1
  2807.              MN$ = "FIMUL  "               ;Single Precision
  2808.              MSBytes(MODRM, 2)             ;2=DWord
  2809.            Case 2
  2810.              MN$ = "FICOM  "               ;Single Precision
  2811.              MSBytes(MODRM, 2)             ;2=DWord
  2812.            Case 3
  2813.              MN$ = "FICOMP  "              ;Single Precision
  2814.              MSBytes(MODRM, 2)             ;2=DWord
  2815.            Case 4
  2816.              MN$ = "FISUB  "               ;Single Precision
  2817.              MSBytes(MODRM, 2)             ;2=DWord
  2818.            Case 5
  2819.              MN$ = "FISUBR  "              ;Single Precision
  2820.              MSBytes(MODRM, 2)             ;2=DWord
  2821.            Case 6
  2822.              MN$ = "FIDIV  "               ;Single Precision
  2823.              MSBytes(MODRM, 2)             ;2=DWord
  2824.            Case 7
  2825.              MN$ = "FIDIVR  "              ;Single Precision
  2826.              MSBytes(MODRM, 2)             ;2=DWord
  2827.          EndSelect
  2828.      EndSelect
  2829.  
  2830.    Case $DB
  2831.      Select MOD
  2832.        Case %11                            ;MODRM > $BF
  2833.          Select SPEC
  2834.            Case 0
  2835.              MN$ = "FCMOVNB  "
  2836.              RegisterST(RM)
  2837.            Case 1
  2838.              MN$ = "FCMOVNE  "
  2839.              RegisterST(RM)
  2840.            Case 2
  2841.              MN$ = "FCMOVNBE  "
  2842.              RegisterST(RM)
  2843.            Case 3
  2844.              MN$ = "FCMOVNU  "
  2845.              RegisterST(RM)
  2846.            Case 5
  2847.              MN$ = "FUCOMI  "
  2848.              RegisterST(RM)
  2849.            Case 6
  2850.              MN$ = "FCOMI  "
  2851.              RegisterST(RM)
  2852.          EndSelect
  2853.          Select MODRM
  2854.            Case $E0
  2855.              If Daten(Zeile - 1)\Mnemonic = "WAIT "
  2856.                MN$ = "FENI "
  2857.                OP$ = "9B " + OP$
  2858.                Zeile - 1
  2859.                MN$ + "   ( 9B = (F)WAIT )"
  2860.               Else
  2861.                MN$ = "FNENI "
  2862.              EndIf              
  2863.            Case $E1
  2864.              If Daten(Zeile - 1)\Mnemonic = "WAIT "
  2865.                MN$ = "FDISI "
  2866.                OP$ = "9B " + OP$
  2867.                Zeile - 1
  2868.                MN$ + "   ( 9B = (F)WAIT )"
  2869.               Else
  2870.                MN$ = "FNDISI "
  2871.              EndIf              
  2872.            Case $E2
  2873.              If Daten(Zeile - 1)\Mnemonic = "WAIT "
  2874.                MN$ = "FCLEX "
  2875.                OP$ = "9B " + OP$
  2876.                Zeile - 1
  2877.                MN$ + "   ( 9B = (F)WAIT )"
  2878.               Else
  2879.                MN$ = "FNCLEX "
  2880.              EndIf              
  2881.            Case $E3
  2882.              If Daten(Zeile - 1)\Mnemonic = "WAIT "
  2883.                MN$ = "FINIT "
  2884.                OP$ = "9B " + OP$
  2885.                Zeile - 1
  2886.                MN$ + "   ( 9B = (F)WAIT )"
  2887.               Else
  2888.                MN$ = "FNINIT "
  2889.              EndIf
  2890.            Case $E4              
  2891.              MN$ = "FSETPM   (Set Protected Mode, only for 287-Co-Processor, all others = FNOP"              
  2892.          EndSelect
  2893.        Default                             ;MODRM $0 bis $BF
  2894.          Select SPEC
  2895.            Case 0
  2896.              MN$ = "FILD  "                ;Single Precision
  2897.              MSBytes(MODRM, 2)             ;2=DWord
  2898.            Case 1
  2899.              MN$ = "FISTTP  "              ;Single Precision
  2900.              MSBytes(MODRM, 2)             ;2=DWord
  2901.            Case 2
  2902.              MN$ = "FIST  "                ;Single Precision
  2903.              MSBytes(MODRM, 2)             ;2=DWord
  2904.            Case 3
  2905.              MN$ = "FISTP  "               ;Single Precision
  2906.              MSBytes(MODRM, 2)             ;2=DWord
  2907.            Case 4
  2908.              NoCode = 1
  2909.            Case 5
  2910.              MN$ = "FLD  "                 ;Extended Precision 10-Bit
  2911.              MSBytes(MODRM, 4)             ;4=TWord
  2912.            Case 6
  2913.              NoCode = 1
  2914.            Case 7
  2915.              MN$ = "FSTP  "                ;Extended Precision 10-Bit
  2916.              MSBytes(MODRM, 4)             ;4=TWord
  2917.          EndSelect
  2918.      EndSelect
  2919.  
  2920.    Case $DC
  2921.      Select MOD
  2922.        Case %11                            ;MODRM > $BF
  2923.          Select SPEC
  2924.            Case 0
  2925.              MN$ = "FADD  "
  2926.              RegisterST(RM)
  2927.              MN$ + " , ST0"
  2928.            Case 1
  2929.              MN$ = "FMUL  "
  2930.              RegisterST(RM)
  2931.              MN$ + " , ST0"
  2932.            Case 2
  2933.              MN$ = "FCOM  "                ;Alias
  2934.              RegisterST(RM)
  2935.            Case 3
  2936.              MN$ = "FCOMP  "               ;Alias
  2937.              RegisterST(RM)
  2938.            Case 4
  2939.              MN$ = "FSUBR  "
  2940.              RegisterST(RM)
  2941.              MN$ + " , ST0"
  2942.            Case 5
  2943.              MN$ = "FSUB  "
  2944.              RegisterST(RM)
  2945.              MN$ + " , ST0"
  2946.            Case 6
  2947.              MN$ = "FDIVR  "
  2948.              RegisterST(RM)
  2949.              MN$ + " , ST0"
  2950.            Case 7
  2951.              MN$ = "FDIV  "
  2952.              RegisterST(RM)
  2953.              MN$ + " , ST0"
  2954.          EndSelect
  2955.        Default                             ;MODRM $0 bis $BF
  2956.          Select SPEC
  2957.            Case 0
  2958.              MN$ = "FADD  "                ;Double Precision
  2959.              MSBytes(MODRM, 3)             ;3=QWord
  2960.            Case 1
  2961.              MN$ = "FMUL  "                ;Double Precision
  2962.              MSBytes(MODRM, 3)             ;3=QWord
  2963.            Case 2
  2964.              MN$ = "FCOM  "                ;Double Precision
  2965.              MSBytes(MODRM, 3)             ;3=QWord
  2966.            Case 3
  2967.              MN$ = "FCOMP  "               ;Double Precision
  2968.              MSBytes(MODRM, 3)             ;3=QWord
  2969.            Case 4
  2970.              MN$ = "FSUB  "                ;Double Precision
  2971.              MSBytes(MODRM, 3)             ;3=QWord
  2972.            Case 5
  2973.              MN$ = "FSUBR  "               ;Double Precision
  2974.              MSBytes(MODRM, 3)             ;3=QWord
  2975.            Case 6
  2976.              MN$ = "FDIV  "                ;Double Precision
  2977.              MSBytes(MODRM, 3)             ;3=QWord
  2978.            Case 7
  2979.              MN$ = "FDIVR  "               ;Double Precision
  2980.              MSBytes(MODRM, 3)             ;3=QWord
  2981.          EndSelect
  2982.      EndSelect
  2983.  
  2984.    Case $DD
  2985.      Select MOD
  2986.        Case %11                            ;MODRM > $BF
  2987.          Select SPEC
  2988.            Case 0
  2989.              MN$ = "FFREE  "
  2990.              RegisterST(RM)
  2991.            Case 1
  2992.              MN$ = "FXCH  "                ;Alias
  2993.              RegisterST(RM)
  2994.            Case 2
  2995.              MN$ = "FST  "
  2996.              RegisterST(RM)
  2997.            Case 3
  2998.              MN$ = "FSTP  "
  2999.              RegisterST(RM)
  3000.            Case 4
  3001.              MN$ = "FUCOM  "
  3002.              RegisterST(RM)
  3003.              MN$ + " , ST0"
  3004.            Case 5
  3005.              MN$ = "FUCOMP  "
  3006.              RegisterST(RM)
  3007.            Case 6 To 7
  3008.              NoCode = 1
  3009.          EndSelect
  3010.        Default                             ;MODRM $0 bis $BF
  3011.          Select SPEC
  3012.            Case 0
  3013.              MN$ = "FLD  "                 ;Double Precision
  3014.              MSBytes(MODRM, 3)             ;3=QWord
  3015.            Case 1
  3016.              MN$ = "FISTTP  "              ;Double Integer
  3017.              MSBytes(MODRM, 3)             ;3=QWord
  3018.            Case 2
  3019.              MN$ = "FST  "                 ;Double Precision
  3020.              MSBytes(MODRM, 3)             ;3=QWord
  3021.            Case 3
  3022.              MN$ = "FSTP  "                ;Double Precision
  3023.              MSBytes(MODRM, 3)             ;3=QWord
  3024.            Case 4
  3025.              MN$ = "FRSTOR  "
  3026.              If Mid(OP$, 1, 2) = "66" Or Mid(OP$, 4, 2) = "66"
  3027.                MSBytes(MODRM, 10)          ;10=94-byte-ptr
  3028.                S = 1
  3029.               Else
  3030.                MSBytes(MODRM, 9)           ;9=108-byte-ptr
  3031.                S = 0
  3032.              EndIf
  3033.              If S
  3034.                MN$ + "   ( = FRSTORW )"
  3035.               Else
  3036.                MN$ + "   ( = FRSTORD )"
  3037.              EndIf
  3038.            Case 5
  3039.              NoCode = 1
  3040.            Case 6
  3041.              If Daten(Zeile - 1)\Mnemonic = "WAIT "
  3042.                MN$ = "FSAVE  "
  3043.                Zeile - 1
  3044.                If Mid(OP$, 1, 2) = "66" Or Mid(OP$, 4, 2) = "66"
  3045.                  MSBytes(MODRM, 10)        ;10=94-byte-ptr
  3046.                  S = 1
  3047.                 Else
  3048.                  MSBytes(MODRM, 9)         ;9=108-byte-ptr
  3049.                  S = 0
  3050.                EndIf
  3051.                OP$ = "9B " + OP$           ;erst hier!
  3052.                MN$ + "   ( 9B = (F)WAIT )"
  3053.                If S
  3054.                  MN$ + "   ( = FSAVEW )"
  3055.                 Else
  3056.                  MN$ + "   ( = FSAVED )"
  3057.                EndIf
  3058.               Else
  3059.                MN$ = "FNSAVE  "
  3060.                If Mid(OP$, 1, 2) = "66" Or Mid(OP$, 4, 2) = "66"
  3061.                  MSBytes(MODRM, 10)        ;10=94-byte-ptr
  3062.                  S = 1
  3063.                 Else
  3064.                  MSBytes(MODRM, 9)         ;9=108-byte-ptr
  3065.                  S = 0
  3066.                EndIf
  3067.                If S
  3068.                  MN$ + "   ( = FNSAVEW )"
  3069.                 Else
  3070.                  MN$ + "   ( = FNSAVED )"
  3071.                EndIf
  3072.              EndIf
  3073.            Case 7
  3074.              If Daten(Zeile - 1)\Mnemonic = "WAIT "
  3075.                MN$ = "FSTSW  "
  3076.                MSBytes(MODRM, 1)           ;1=Word
  3077.                OP$ = "9B " + OP$
  3078.                Zeile - 1
  3079.                MN$ + "   ( 9B = (F)WAIT )"
  3080.               Else
  3081.                MN$ = "FNSTSW  "
  3082.                MSBytes(MODRM, 1)           ;1=Word
  3083.              EndIf
  3084.          EndSelect
  3085.      EndSelect
  3086.  
  3087.    Case $DE
  3088.      Select MOD
  3089.        Case %11                            ;MODRM > $BF
  3090.          Select SPEC
  3091.            Case 0
  3092.              MN$ = "FADDP  "
  3093.              RegisterST(RM)
  3094.              MN$ + " , ST0"
  3095.            Case 1
  3096.              MN$ = "FMULP  "
  3097.              RegisterST(RM)
  3098.              MN$ + " , ST0"
  3099.            Case 2
  3100.              MN$ = "FCOMP  "               ;Alias
  3101.              RegisterST(RM)
  3102.            Case 3
  3103.              If MODRM = $D9
  3104.                MN$ = "FCOMPP "
  3105.               Else
  3106.                NoCode = 1
  3107.              EndIf
  3108.            Case 4
  3109.              MN$ = "FSUBRP  "
  3110.              RegisterST(RM)
  3111.              MN$ + " , ST0"
  3112.            Case 5
  3113.              MN$ = "FSUBP  "
  3114.              RegisterST(RM)
  3115.              MN$ + " , ST0"
  3116.            Case 6
  3117.              MN$ = "FDIVRP  "
  3118.              RegisterST(RM)
  3119.              MN$ + " , ST0"
  3120.            Case 7
  3121.              MN$ = "FDIVP  "
  3122.              RegisterST(RM)
  3123.              MN$ + " , ST0"
  3124.          EndSelect
  3125.        Default                             ;MODRM $0 bis $BF
  3126.          Select SPEC
  3127.            Case 0
  3128.              MN$ = "FIADD  "               ;Word Integer
  3129.              MSBytes(MODRM, 1)             ;1=Word
  3130.            Case 1
  3131.              MN$ = "FIMUL  "               ;Word Integer
  3132.              MSBytes(MODRM, 1)             ;1=Word
  3133.            Case 2
  3134.              MN$ = "FICOM  "               ;Word Integer
  3135.              MSBytes(MODRM, 1)             ;1=Word
  3136.            Case 3
  3137.              MN$ = "FICOMP  "              ;Word Integer
  3138.              MSBytes(MODRM, 1)             ;1=Word
  3139.            Case 4
  3140.              MN$ = "FISUB  "               ;Word Integer
  3141.              MSBytes(MODRM, 1)             ;1=Word
  3142.            Case 5
  3143.              MN$ = "FISUBR  "              ;Word Integer
  3144.              MSBytes(MODRM, 1)             ;1=Word
  3145.            Case 6
  3146.              MN$ = "FIDIV  "               ;Word Integer
  3147.              MSBytes(MODRM, 1)             ;1=Word
  3148.            Case 7
  3149.              MN$ = "FIDIVR  "              ;Word Integer
  3150.              MSBytes(MODRM, 1)             ;1=Word
  3151.          EndSelect
  3152.      EndSelect
  3153.  
  3154.    Case $DF
  3155.      Select MOD
  3156.        Case %11                            ;MODRM > $BF
  3157.          Select SPEC
  3158.            Case 0
  3159.              MN$ = "FFREEP  "              ;not documented: FFREE ST(i) and pop stack
  3160.              RegisterST(RM)
  3161.            Case 1
  3162.              MN$ = "FXCH  "                ;Alias
  3163.              RegisterST(RM)
  3164.            Case 2
  3165.              MN$ = "FSTP  "                ;Alias
  3166.              RegisterST(RM)
  3167.            Case 3
  3168.              MN$ = "FSTP  "                ;Alias
  3169.              RegisterST(RM)
  3170.            Case 4
  3171.              If MODRM = $E0
  3172.                If Daten(Zeile - 1)\Mnemonic = "WAIT "
  3173.                  MN$ = "FSTSW  AX "
  3174.                  OP$ = "9B " + OP$
  3175.                  Zeile - 1
  3176.                  MN$ + "   ( 9B = (F)WAIT )"
  3177.                 Else
  3178.                  MN$ = "FNSTSW  AX "
  3179.                EndIf
  3180.               Else
  3181.                NoCode = 1
  3182.              EndIf
  3183.            Case 5
  3184.              MN$ = "FUCOMIP  "
  3185.              RegisterST(RM)
  3186.            Case 6
  3187.              MN$ = "FCOMIP  "
  3188.              RegisterST(RM)
  3189.            Case 7
  3190.              NoCode = 1
  3191.          EndSelect
  3192.        Default                             ;MODRM $0 bis $BF
  3193.          Select SPEC
  3194.            Case 0
  3195.              MN$ = "FILD  "                ;Word Integer
  3196.              MSBytes(MODRM, 1)             ;1=Word
  3197.            Case 1
  3198.              MN$ = "FISTTP  "              ;Word Integer
  3199.              MSBytes(MODRM, 1)             ;1=Word
  3200.            Case 2
  3201.              MN$ = "FIST  "                ;Word Integer
  3202.              MSBytes(MODRM, 1)             ;1=Word
  3203.            Case 3
  3204.              MN$ = "FISTP  "               ;Word Integer
  3205.              MSBytes(MODRM, 1)             ;1=Word
  3206.            Case 4
  3207.              MN$ = "FBLD  "                ;Packed BCD 10-Bit
  3208.              MSBytes(MODRM, 4)             ;4=TWord
  3209.            Case 5
  3210.              MN$ = "FILD  "                ;QWord Integer
  3211.              MSBytes(MODRM, 3)             ;3=QWord
  3212.            Case 6
  3213.              MN$ = "FBSTP  "               ;Packed BCD 10-Bit
  3214.              MSBytes(MODRM, 4)             ;4=TWord
  3215.            Case 7
  3216.              MN$ = "FISTP  "               ;QWord Integer
  3217.              MSBytes(MODRM, 3)             ;3=QWord
  3218.          EndSelect
  3219.      EndSelect
  3220.  
  3221.  EndSelect
  3222. EndProcedure
  3223.  
  3224. Procedure OP3B38()                          ;die ersten 2 Bytes sind $0F $38 (ohne Präfix(e)!)
  3225.  PR = PeekW(@OP$)                          ;anstelle von PR$ = Mid(OP$, 1, 2)
  3226.  If PR = $3736                             ;$67    wenn 2 Präfixe $67 $66
  3227.    PR = PeekW(@OP$ + 3)
  3228.  EndIf  
  3229.  
  3230.  OP = PeekB(Buffer + BZ) & $FF
  3231.  OP$ + RSet(Hex(OP), 2, "0") + " "
  3232.  BZ + 1
  3233.  Select OP
  3234.    ;----------------------
  3235.    Case $00 To $0B
  3236.      Select OP
  3237.        Case $00
  3238.          MN$ = "PSHUFB  "
  3239.        Case $01
  3240.          MN$ = "PHADDW  "
  3241.        Case $02
  3242.          MN$ = "PHADDD  "
  3243.        Case $03
  3244.          MN$ = "PHADDSW  "
  3245.        Case $04
  3246.          MN$ = "PMADDUBSW  "
  3247.        Case $05
  3248.          MN$ = "PHSUBW  "
  3249.        Case $06
  3250.          MN$ = "PHSUBD  "
  3251.        Case $07
  3252.          MN$ = "PHSUBSW  "
  3253.        Case $08
  3254.          MN$ = "PSIGNB  "
  3255.        Case $09
  3256.          MN$ = "PSIGNW  "
  3257.        Case $0A
  3258.          MN$ = "PSIGND  "
  3259.        Case $0B
  3260.          MN$ = "PMULHRSW  "
  3261.      EndSelect
  3262.      Select PR
  3263.        Case $3636                          ;=$66
  3264.          XMM = 2 : S = 5                   ;Vdq, Wdq
  3265.        Default
  3266.          XMM = 1 : S = 3                   ;Pq, Qq
  3267.      EndSelect
  3268.      Gv(S, 1)
  3269.    ;----------------------
  3270.  
  3271.    Case $10
  3272.      Select PR
  3273.        Case $3636                          ;=$66
  3274.          MN$ = "PBLENDVB  "                ;Vdq, Wdq
  3275.          XMM = 2
  3276.      EndSelect
  3277.      Gv(5, 1)
  3278.      MN$ + " , XMM0"                       ;3.Parameter
  3279.    ;----------------------
  3280.    Case $14
  3281.      Select PR
  3282.        Case $3636                          ;=$66
  3283.          MN$ = "BLENDVPS  "                ;Vdq, Wdq
  3284.          XMM = 2
  3285.      EndSelect
  3286.      Gv(5, 1)
  3287.      MN$ + " , XMM0"                       ;3.Parameter
  3288.    ;----------------------
  3289.    Case $15
  3290.      Select PR
  3291.        Case $3636                          ;=$66
  3292.          MN$ = "BLENDVPD  "                ;Vdq, Wdq
  3293.          XMM = 2
  3294.      EndSelect
  3295.      Gv(5, 1)
  3296.      MN$ + " , XMM0"                       ;3.Parameter
  3297.    ;----------------------
  3298.    Case $17
  3299.      Select PR
  3300.        Case $3636                          ;=$66
  3301.          MN$ = "PTEST  "                   ;Vdq, Wdq
  3302.          XMM = 2
  3303.      EndSelect
  3304.      Gv(5, 1)
  3305.    ;----------------------
  3306.    Case $1C
  3307.      MN$ = "PABSB  "
  3308.      Select PR
  3309.        Case $3636                          ;=$66
  3310.          XMM = 2 : S = 5                   ;Vdq, Wdq
  3311.        Default
  3312.          XMM = 1 : S = 3                   ;Pq, Qq
  3313.      EndSelect
  3314.      Gv(S, 1)
  3315.    ;----------------------
  3316.    Case $1D
  3317.      MN$ = "PABSW  "
  3318.      Select PR
  3319.        Case $3636                          ;=$66
  3320.          XMM = 2 : S = 5                   ;Vdq, Wdq
  3321.        Default
  3322.          XMM = 1 : S = 3                   ;Pq, Qq
  3323.      EndSelect
  3324.      Gv(S, 1)
  3325.    ;----------------------
  3326.    Case $1E
  3327.      MN$ = "PABSD  "
  3328.      Select PR
  3329.        Case $3636                          ;=$66
  3330.          XMM = 2 : S = 5                   ;Vdq, Wdq
  3331.        Default
  3332.          XMM = 1 : S = 3                   ;Pq, Qq
  3333.      EndSelect
  3334.      Gv(S, 1)
  3335.    ;----------------------
  3336.    Case $20
  3337.      Select PR
  3338.        Case $3636                          ;=$66
  3339.          MN$ = "PMOVSXBW  "                ;Vdq, Udq/Mq
  3340.          XMM = 2
  3341.      EndSelect
  3342.      Gv(3, 1)
  3343.    ;----------------------
  3344.    Case $21
  3345.      Select PR
  3346.        Case $3636                          ;=$66
  3347.          MN$ = "PMOVSXBD  "                ;Vdq, Udq/Md
  3348.          XMM = 2
  3349.      EndSelect
  3350.      Gv(2, 1)
  3351.    ;----------------------
  3352.    Case $22
  3353.      Select PR
  3354.        Case $3636                          ;=$66
  3355.          MN$ = "PMOVSXBQ  "                ;Vdq, Udq/Mw
  3356.          XMM = 2
  3357.      EndSelect
  3358.      Gv(1, 1)
  3359.    ;----------------------
  3360.    Case $23
  3361.      Select PR
  3362.        Case $3636                          ;=$66
  3363.          MN$ = "PMOVSXWD  "                ;Vdq, Udq/Mq
  3364.          XMM = 2
  3365.      EndSelect
  3366.      Gv(3, 1)
  3367.    ;----------------------
  3368.    Case $24
  3369.      Select PR
  3370.        Case $3636                          ;=$66
  3371.          MN$ = "PMOVSXWQ  "                ;Vdq, Udq/Md
  3372.          XMM = 2
  3373.      EndSelect
  3374.      Gv(2, 1)
  3375.    ;----------------------
  3376.    Case $25
  3377.      Select PR
  3378.        Case $3636                          ;=$66
  3379.          MN$ = "PMOVSXDQ  "                ;Vdq, Udq/Mq
  3380.          XMM = 2
  3381.      EndSelect
  3382.      Gv(3, 1)
  3383.    ;----------------------
  3384.    Case $28 To $2B                         ;Vdq, Wdq
  3385.      Select PR
  3386.        Case $3636                          ;=$66
  3387.          Select OP
  3388.            Case $28
  3389.              MN$ = "PMULDQ  "
  3390.            Case $29
  3391.              MN$ = "PCMPEQQ  "
  3392.            Case $2A
  3393.              MN$ = "MOVNTDQA  "
  3394.            Case $2B
  3395.              MN$ = "PACKUSDW  "
  3396.          EndSelect
  3397.          XMM = 2 : Gv(5, 1)
  3398.      EndSelect
  3399.    ;----------------------
  3400.    Case $30
  3401.      Select PR
  3402.        Case $3636                          ;=$66
  3403.          MN$ = "PMOVZXBW  "                ;Vdq, Udq/Mq
  3404.          XMM = 2
  3405.      EndSelect
  3406.      Gv(3, 1)
  3407.    ;----------------------
  3408.    Case $31
  3409.      Select PR
  3410.        Case $3636                          ;=$66
  3411.          MN$ = "PMOVZXBD  "                ;Vdq, Udq/Md
  3412.          XMM = 2
  3413.      EndSelect
  3414.      Gv(2, 1)
  3415.    ;----------------------
  3416.    Case $32
  3417.      Select PR
  3418.        Case $3636                          ;=$66
  3419.          MN$ = "PMOVZXBQ  "                ;Vdq, Udq/Mw
  3420.          XMM = 2
  3421.      EndSelect
  3422.      Gv(1, 1)
  3423.    ;----------------------
  3424.    Case $33
  3425.      Select PR
  3426.        Case $3636                          ;=$66
  3427.          MN$ = "PMOVZXWD  "                ;Vdq, Udq/Mq
  3428.          XMM = 2
  3429.      EndSelect
  3430.      Gv(3, 1)
  3431.    ;----------------------
  3432.    Case $34
  3433.      Select PR
  3434.        Case $3636                          ;=$66
  3435.          MN$ = "PMOVZXWQ  "                ;Vdq, Udq/Md
  3436.          XMM = 2
  3437.      EndSelect
  3438.      Gv(2, 1)
  3439.    ;----------------------
  3440.    Case $35
  3441.      Select PR
  3442.        Case $3636                          ;=$66
  3443.          MN$ = "PMOVZXDQ  "                ;Vdq, Udq/Mq
  3444.          XMM = 2
  3445.      EndSelect
  3446.      Gv(3, 1)
  3447.    ;----------------------
  3448.    Case $37 To $41                         ;Vdq, Wdq
  3449.      Select PR
  3450.        Case $3636                          ;=$66
  3451.          Select OP
  3452.            Case $37
  3453.              MN$ = "PCMPGTQ  "
  3454.            Case $38
  3455.              MN$ = "PMINSB  "
  3456.            Case $39
  3457.              MN$ = "PMINSD  "
  3458.            Case $3A
  3459.              MN$ = "PMINUW  "
  3460.            Case $3B
  3461.              MN$ = "PMINUD  "
  3462.            Case $3C
  3463.              MN$ = "PMAXSB  "
  3464.            Case $3D
  3465.              MN$ = "PMAXSD  "
  3466.            Case $3E
  3467.              MN$ = "PMAXUW  "
  3468.            Case $3F
  3469.              MN$ = "PMAXUD  "
  3470.            Case $40
  3471.              MN$ = "PMULLD  "
  3472.            Case $41
  3473.              MN$ = "PHMINPOSUW  "
  3474.          EndSelect
  3475.          XMM = 2 : Gv(5, 1)
  3476.      EndSelect
  3477.    ;----------------------
  3478.    Case $80
  3479.      Select PR
  3480.        Case $3636                          ;=$66
  3481.          MN$ = "INVEPT  "                  ;Gd/q, Mdq
  3482.          XMM = 255                         ;prefix!
  3483.          If IsProg64
  3484.            REX | 8
  3485.          EndIf
  3486.          Gv(5, 1)
  3487.      EndSelect
  3488.    ;----------------------
  3489.    Case $81
  3490.      Select PR
  3491.        Case $3636                          ;=$66
  3492.          MN$ = "INVVPID  "                 ;Gd/q, Mdq
  3493.          XMM = 255                         ;prefix!
  3494.          If IsProg64
  3495.            REX | 8
  3496.          EndIf
  3497.          Gv(5, 1)
  3498.      EndSelect
  3499.  
  3500.  
  3501.  
  3502.    ;----------------------
  3503.    Case $DB
  3504.      Select PR
  3505.        Case $3636                          ;=$66
  3506.          MN$ = "AESIMC  "
  3507.          XMM = 2
  3508.      EndSelect
  3509.      Gv(5, 1)
  3510.    ;----------------------
  3511.    Case $DC
  3512.      Select PR
  3513.        Case $3636                          ;=$66
  3514.          MN$ = "AESENC  "
  3515.          XMM = 2
  3516.      EndSelect
  3517.      Gv(5, 1)
  3518.    ;----------------------
  3519.    Case $DD
  3520.      Select PR
  3521.        Case $3636                          ;=$66
  3522.          MN$ = "AESENCLAST  "
  3523.          XMM = 2
  3524.      EndSelect
  3525.      Gv(5, 1)
  3526.    ;----------------------
  3527.    Case $DE
  3528.      Select PR
  3529.        Case $3636                          ;=$66
  3530.          MN$ = "AESDEC  "
  3531.          XMM = 2
  3532.      EndSelect
  3533.      Gv(5, 1)
  3534.    ;----------------------
  3535.    Case $DF
  3536.      Select PR
  3537.        Case $3636                          ;=$66
  3538.          MN$ = "AESDECLAST  "
  3539.          XMM = 2
  3540.      EndSelect
  3541.      Gv(5, 1)
  3542.  
  3543.  
  3544.  
  3545.  
  3546.  
  3547.  
  3548.  
  3549.  
  3550.  
  3551.    ;----------------------
  3552.    Case $F0
  3553.      Select PR
  3554.        Case $3246                          ;=$F2
  3555.          MN$ = "CRC32  "                   ;Gd, Eb
  3556.          Gv(0, 1)
  3557.        Default
  3558.          MN$ = "MOVBE  "                   ;Gv, Mv
  3559.          Gv(10, 1)
  3560.      EndSelect
  3561.    ;----------------------
  3562.    Case $F1
  3563.      Select PR
  3564.        Case $3636                          ;=$66
  3565.          If Mid(OP$, 4, 2) = "F2"
  3566.            MN$ = "CRC32  "                 ;Gd, Ev
  3567.            Komma = 1
  3568.            OP = PeekB(Buffer + BZ) & $FF
  3569.            OP$ + RSet(Hex(OP), 2, "0") + " "
  3570.            OP$ = Mid(OP$, 3, Len(OP$) - 3) ;"66" weg
  3571.            REXEX = 1
  3572.            Register32(OP >> 3, 0)
  3573.            OP$ = "66 " + OP$ + " "
  3574.            BZ + 1
  3575.            MSBytes(OP, 1)                  ;1=Word
  3576.           Else
  3577.            MN$ = "MOVBE  "                 ;with 16-Bit-Register
  3578.            Ev(10, 1)
  3579.          EndIf
  3580.        Case $3246                          ;=$F2
  3581.          MN$ = "CRC32  "                   ;Gd, Ev
  3582.          If REX >= $48
  3583.            Gv(3, 1)
  3584.           Else
  3585.            Gv(2, 1)
  3586.          EndIf
  3587.        Default
  3588.          MN$ = "MOVBE  "                   ;Mv, Gv
  3589.          Ev(10, 1)
  3590.      EndSelect
  3591.  
  3592.  EndSelect
  3593. EndProcedure
  3594.  
  3595. Procedure OP3B3A()                          ;die ersten 2 Bytes sind $0F $3A (ohne Präfix(e)!)
  3596.  PR = PeekW(@OP$)                          ;anstelle von PR$ = Mid(OP$, 1, 2)
  3597.  If PR = $3736                             ;$67    wenn 2 Präfixe $67 $66
  3598.    PR = PeekW(@OP$ + 3)
  3599.  EndIf
  3600.  
  3601.  OP = PeekB(Buffer + BZ) & $FF
  3602.  OP$ + RSet(Hex(OP), 2, "0") + " "
  3603.  BZ + 1
  3604.  Select OP
  3605.    ;----------------------
  3606.    Case $08
  3607.      Select PR
  3608.        Case $3636                          ;=$66
  3609.          MN$ = "ROUNDPS  "                 ;Vdq, Wdq, Ib
  3610.          XMM = 2 : Adr64 = 1
  3611.      EndSelect
  3612.      Gv(5, 2)
  3613.      Strings(1, 0)
  3614.    ;----------------------
  3615.    Case $09
  3616.      Select PR
  3617.        Case $3636                          ;=$66
  3618.          MN$ = "ROUNDPD  "                 ;Vdq, Wdq, Ib
  3619.          XMM = 2 : Adr64 = 1
  3620.      EndSelect
  3621.      Gv(5, 2)
  3622.      Strings(1, 0)
  3623.    ;----------------------
  3624.    Case $0A
  3625.      Select PR
  3626.        Case $3636                          ;=$66
  3627.          MN$ = "ROUNDSS  "                 ;Vss, Wss, Ib
  3628.          XMM = 2 : Adr64 = 1
  3629.      EndSelect
  3630.      Gv(2, 2)
  3631.      Strings(1, 0)
  3632.    ;----------------------
  3633.    Case $0B
  3634.      Select PR
  3635.        Case $3636                          ;=$66
  3636.          MN$ = "ROUNDSD  "                 ;Vsd, Wsd, Ib
  3637.          XMM = 2 : Adr64 = 1
  3638.      EndSelect
  3639.      Gv(3, 2)
  3640.      Strings(1, 0)
  3641.    ;----------------------
  3642.    Case $0C
  3643.      Select PR
  3644.        Case $3636                          ;=$66
  3645.          MN$ = "BLENDPS  "                 ;Vdq, Wdq, Ib
  3646.          XMM = 2 : Adr64 = 1
  3647.      EndSelect
  3648.      MemAdd64 = 1      
  3649.      Gv(5, 2)
  3650.      Strings(1, 0)
  3651.    ;----------------------
  3652.    Case $0D
  3653.      Select PR
  3654.        Case $3636                          ;=$66
  3655.          MN$ = "BLENDPD  "                 ;Vdq, Wdq, Ib
  3656.          XMM = 2 : Adr64 = 1
  3657.      EndSelect
  3658.      MemAdd64 = 1
  3659.      Gv(5, 2)
  3660.      Strings(1, 0)
  3661.    ;----------------------
  3662.    Case $0E
  3663.      Select PR
  3664.        Case $3636                          ;=$66
  3665.          MN$ = "PBLENDW  "                 ;Vdq, Wdq, Ib
  3666.          XMM = 2 : Adr64 = 1
  3667.      EndSelect
  3668.      Gv(5, 2)
  3669.      Strings(1, 0)
  3670.    ;----------------------
  3671.    Case $0F
  3672.      MN$ = "PALIGNR  "
  3673.      Select PR
  3674.        Case $3636                          ;=$66
  3675.          XMM = 2 : S = 5 : Adr64 = 1       ;Vdq, Wdq, Ib
  3676.        Default
  3677.          XMM = 1 : S = 3 : Adr64 = 1       ;Pq, Qq, Ib
  3678.      EndSelect
  3679.      Gv(S, 2)
  3680.      Strings(1, 0)
  3681.    ;----------------------
  3682.    Case $14
  3683.      XMM = 5 : Adr64 = 1
  3684.      Select PR
  3685.        Case $3636                          ;=$66
  3686.          MN$ = "PEXTRB  "                  ;Rd/Mb, Vdq, Ib
  3687.          If (PeekB(Buffer + BZ) & $FF) < $C0    ;also nicht %11xxxxxx = Register-Register
  3688.            S = 0                           ;Byte-Variable
  3689.           Else
  3690.            S = 2                           ;32-Bit-Register
  3691.          EndIf
  3692.      EndSelect
  3693.      Ev(S, 2)
  3694.      Strings(1, 0)
  3695.    ;----------------------
  3696.    Case $15
  3697.      XMM = 5 : Adr64 = 1
  3698.      Select PR
  3699.        Case $3636                          ;=$66
  3700.          MN$ = "PEXTRW  "                  ;Rd/Mw, Vdq, Ib
  3701.      EndSelect
  3702.      Ev(1, 2)
  3703.      Strings(1, 0)
  3704.    ;----------------------
  3705.    Case $16
  3706.      XMM = 5 : Adr64 = 1
  3707.      Select PR
  3708.        Case $3636                          ;=$66
  3709.          If REX & %00001000                ;REX.W
  3710.            MN$ = "PEXTRQ  "        
  3711.            S = 3                           ;QWord
  3712.           Else
  3713.            MN$ = "PEXTRD  "                ;Ed, Vdq, Ib
  3714.            S = 2                           ;DWord
  3715.          EndIf
  3716.      EndSelect
  3717.      Ev(S, 2)
  3718.      Strings(1, 0)
  3719.    ;----------------------
  3720.    Case $17
  3721.      XMM = 5 : Adr64 = 1
  3722.      Select PR
  3723.        Case $3636                          ;=$66
  3724.          MN$ = "EXTRACTPS  "               ;Ed, Vdq, Ib
  3725.      EndSelect
  3726.      Ev(2, 2)
  3727.      Strings(1, 0)
  3728.    ;----------------------
  3729.    Case $20
  3730.      XMM = 4 : Adr64 = 1
  3731.      Select PR
  3732.        Case $3636                          ;=$66
  3733.          MN$ = "PINSRB  "                  ;Vdq, Rd/Mb, Ib
  3734.          If (PeekB(Buffer + BZ) & $FF) < $C0    ;also nicht %11xxxxxx = Register-Register
  3735.            S = 0                           ;Byte-Variable
  3736.           Else
  3737.            S = 2                           ;32-Bit-Register
  3738.          EndIf
  3739.      EndSelect
  3740.      Gv(S, 2)
  3741.      Strings(1, 0)
  3742.    ;----------------------
  3743.    Case $21
  3744.      XMM = 2 : Adr64 = 1
  3745.      Select PR
  3746.        Case $3636                          ;=$66
  3747.          MN$ = "INSERTPS  "                ;Vdq, Ud/Md, Ib
  3748.      EndSelect
  3749.      Gv(2, 2)
  3750.      Strings(1, 0)
  3751.    ;----------------------
  3752.    Case $22
  3753.      XMM = 4 : Adr64 = 1
  3754.      Select PR
  3755.        Case $3636                          ;=$66
  3756.          If REX & %00001000
  3757.            MN$ = "PINSRQ  "        
  3758.            S = 3
  3759.           Else
  3760.            MN$ = "PINSRD  "                ;Vdq, Ed, Ib
  3761.            S = 2
  3762.          EndIf      
  3763.      EndSelect
  3764.      Gv(S, 2)
  3765.      Strings(1, 0)
  3766.    ;------------------------
  3767.    Case $40
  3768.      XMM = 2 : Adr64 = 1
  3769.      Select PR
  3770.        Case $3636                          ;=$66
  3771.          MN$ = "DPPS  "                    ;Vdq, Wdq, Ib
  3772.      EndSelect
  3773.      MemAdd64 = 1
  3774.      Gv(5, 2)
  3775.      Strings(1, 0)
  3776.    ;------------------------
  3777.    Case $41
  3778.      XMM = 2 : Adr64 = 1
  3779.      Select PR
  3780.        Case $3636                          ;=$66
  3781.          MN$ = "DPPD  "                    ;Vdq, Wdq, Ib
  3782.      EndSelect
  3783.      MemAdd64 = 1
  3784.      Gv(5, 2)
  3785.      Strings(1, 0)
  3786.    ;------------------------
  3787.    Case $42
  3788.      XMM = 2 : Adr64 = 1
  3789.      Select PR
  3790.        Case $3636                          ;=$66
  3791.          MN$ = "MPSADBW  "                 ;Vdq, Wdq, Ib
  3792.      EndSelect
  3793.      Gv(5, 2)
  3794.      Strings(1, 0)
  3795.    ;------------------------
  3796.    Case $44
  3797.      XMM = 2 : Adr64 = 1
  3798.      Select PR
  3799.        Case $3636                          ;=$66
  3800.          MN$ = "PCLMULQDQ  "
  3801.      EndSelect
  3802.      Gv(5, 2)
  3803.      Strings(1, 0)
  3804.      IMM$ = "$" + Mid(MN$, Len(MN$) - 1, 2)
  3805.      Value = Val(IMM$) & %00010001
  3806.      Select Value
  3807.        Case %00000000
  3808.          MN$ + "  ( = PCLMULLQLQDQ )"
  3809.        Case %00000001
  3810.          MN$ + "  ( = PCLMULHQLQDQ )"
  3811.        Case %00010000
  3812.          MN$ + "  ( = PCLMULLQHDQ )"       ;hier denkt man, ein Buchstabe fehlt...
  3813.        Case %00010001
  3814.          MN$ + "  ( = PCLMULHQHDQ )"
  3815.      EndSelect
  3816.    ;------------------------
  3817.    Case $60 To $63
  3818.      Select PR
  3819.        Case $3636                          ;=$66
  3820.          Select OP
  3821.            Case $60
  3822.              MN$ = "PCMPESTRM  "
  3823.            Case $61
  3824.              MN$ = "PCMPESTRI  "
  3825.            Case $62
  3826.              MN$ = "PCMPISTRM  "
  3827.            Case $63
  3828.              MN$ = "PCMPISTRI  "
  3829.          EndSelect
  3830.          XMM = 2 : Adr64 = 1
  3831.          Gv(5, 2)                          ;Vdq, Wdq, Ib
  3832.          Strings(1, 0)
  3833.      EndSelect
  3834.  
  3835.  
  3836.    ;------------------------
  3837.    Case $DF
  3838.      Select PR
  3839.        Case $3636                          ;=$66
  3840.          MN$ = "AESKEYGENASSIST  "
  3841.          XMM = 2
  3842.      EndSelect
  3843.      MemAdd64 = 1
  3844.      Gv(5, 2)
  3845.      Strings(1, 0)
  3846.  
  3847.  
  3848.  EndSelect
  3849. EndProcedure
  3850.  
  3851. Procedure Codes_Shift()                     ;1.Byte ist $0F (ohne Präfix(e)!)
  3852.  PR = PeekW(@OP$)                          ;anstelle von PR$ = Mid(OP$, 1, 2)
  3853.  If PR = $3736                             ;$67    wenn 2 Präfixe $67 $66
  3854.    PR = PeekW(@OP$ + 3)
  3855.  EndIf  
  3856.  
  3857.  OP = PeekB(Buffer + BZ) & $FF
  3858.  OP$ + RSet(Hex(OP), 2, "0") + " "
  3859.  BZ + 1
  3860.  Select OP
  3861.    ;------------------------
  3862.    Case $00                                ;Gruppe 6
  3863.      OP = PeekB(Buffer + BZ) & $FF
  3864.      OP$ + RSet(Hex(OP), 2, "0") + " "
  3865.      BZ + 1
  3866.      RM = (OP & %00111000) >> 3            ;reg/opcode für Befehl
  3867.      Select RM
  3868.        Case 0
  3869.          MN$ = "SLDT  "                    ;Rv, Mw
  3870.          If OP < $C0                       ;also nicht %11xxxxxx = Register-Register
  3871.            MN$ + "word ptr [ " : Adr = 1
  3872.            Strings(4, 2)
  3873.           Else
  3874.            Register32(OP, 0)
  3875.          EndIf
  3876.        Case 1
  3877.          MN$ = "STR  "                     ;Rv, Mw
  3878.          If OP < $C0                       ;also nicht %11xxxxxx = Register-Register
  3879.            MN$ + "word ptr [ " : Adr = 1
  3880.            Strings(4, 2)
  3881.           Else
  3882.            Register32(OP, 0)
  3883.          EndIf
  3884.        Case 2
  3885.          MN$ = "LLDT  "                    ;Ew
  3886.          If OP < $C0                       ;also nicht %11xxxxxx = Register-Register
  3887.            MN$ + "word ptr [ " : Adr = 1
  3888.            Strings(4, 2)
  3889.           Else
  3890.            Register32(OP, 1)               ;1=16Bit
  3891.          EndIf
  3892.        Case 3
  3893.          MN$ = "LTR  "                     ;Ew
  3894.          If OP < $C0                       ;also nicht %11xxxxxx = Register-Register
  3895.            MN$ + "word ptr [ " : Adr = 1
  3896.            Strings(4, 2)
  3897.           Else
  3898.            Register32(OP, 1)               ;1=16Bit
  3899.          EndIf
  3900.        Case 4
  3901.          MN$ = "VERR  "                    ;Ew
  3902.          If OP < $C0                       ;also nicht %11xxxxxx = Register-Register
  3903.            MN$ + "word ptr [ " : Adr = 1
  3904.            Strings(4, 2)
  3905.           Else
  3906.            Register32(OP, 1)               ;1=16Bit
  3907.          EndIf
  3908.        Case 5
  3909.          MN$ = "VERW  "                    ;Ew
  3910.          If OP < $C0                       ;also nicht %11xxxxxx = Register-Register
  3911.            MN$ + "word ptr [ " : Adr = 1
  3912.            Strings(4, 2)
  3913.           Else
  3914.            Register32(OP, 1)               ;1=16Bit
  3915.          EndIf
  3916.        Case 6 To 7
  3917.          NoCode = 1
  3918.      EndSelect
  3919.    ;------------------------
  3920.    Case $01                                ;Gruppe 7
  3921.      OP = PeekB(Buffer + BZ) & $FF
  3922.      OP$ + RSet(Hex(OP), 2, "0") + " "
  3923.      BZ + 1
  3924.      RM = (OP & %00111000) >> 3            ;reg/opcode für Befehl
  3925.      Select RM
  3926.        Case 0
  3927.          If OP < $C0                       ;also nicht %11xxxxxx
  3928.            MN$ = "SGDT pword ptr [ " : Adr = 1  ;Ms, pword=6Bytes
  3929.            Strings(4, 2)
  3930.           Else
  3931.            Select OP
  3932.              Case $C1                      ;hier mal so
  3933.                MN$ = "VMCALL  "            ;Intel
  3934.              Case $C2
  3935.                MN$ = "VMLAUNCH  "          ;Intel
  3936.              Case $C3
  3937.                MN$ = "VMRESUME  "          ;Intel
  3938.              Case $C4
  3939.                MN$ = "VMXOFF  "            ;Intel
  3940.            EndSelect
  3941.          EndIf
  3942.        Case 1
  3943.          If OP < $C0                       ;also nicht %11xxxxxx
  3944.            MN$ = "SIDT pword ptr [ " : Adr = 1  ;Ms, pword=6Bytes
  3945.            Strings(4, 2)
  3946.           Else
  3947.            Select OP
  3948.              Case $C8                      ;hier mal so
  3949.                MN$ = "MONITOR    ( = MONITOR EAX , ECX , EDX )"
  3950.              Case $C9
  3951.                MN$ = "MWAIT    ( = MWAIT EAX , ECX )"
  3952.            EndSelect
  3953.          EndIf
  3954.        Case 2
  3955.          If OP < $C0                       ;also nicht %11xxxxxx
  3956.            MN$ = "LGDT pword ptr [ " : Adr = 1  ;Ms, pword=6Bytes
  3957.            Strings(4, 2)
  3958.           Else
  3959.            Select OP
  3960.              Case $D0                      ;hier mal so
  3961.                MN$ = "XGETBV "
  3962.              Case $D1
  3963.                MN$ = "XSETBV "
  3964.            EndSelect
  3965.          EndIf
  3966.        Case 3
  3967.          If OP < $C0                       ;also nicht %11xxxxxx
  3968.            MN$ = "LIDT pword ptr [ " : Adr = 1  ;Ms
  3969.            Strings(4, 2)
  3970.           Else
  3971.            Select OP
  3972.              Case $D8
  3973.                MN$ = "VMRUN  "             ;AMD SVM-Instruction
  3974.                If IsProg64
  3975.                  MN$ + "RAX"
  3976.                 Else
  3977.                  MN$ + "EAX"
  3978.                EndIf
  3979.              Case $D9
  3980.                MN$ = "VMMCALL "            ;AMD SVM-Instruction
  3981.              Case $DA
  3982.                MN$ = "VMLOAD  "            ;AMD SVM-Instruction
  3983.                If IsProg64
  3984.                  MN$ + "RAX"
  3985.                 Else
  3986.                  MN$ + "EAX"
  3987.                EndIf
  3988.              Case $DB
  3989.                MN$ = "VMSAVE  "            ;AMD SVM-Instruction
  3990.                If IsProg64
  3991.                  MN$ + "RAX"
  3992.                 Else
  3993.                  MN$ + "EAX"
  3994.                EndIf
  3995.              Case $DC
  3996.                MN$ = "STGI "               ;AMD SVM-Instruction
  3997.              Case $DD
  3998.                MN$ = "CLGI "               ;AMD SVM-Instruction
  3999.              Case $DE
  4000.                MN$ = "SKINIT  EAX"         ;AMD SVM-Instruction
  4001.              Case $DF
  4002.                MN$ = "INVLPGA  "           ;AMD SVM-Instruction
  4003.                If IsProg64
  4004.                  MN$ + "RAX , ECX"
  4005.                 Else
  4006.                  MN$ + "EAX , ECX"
  4007.                EndIf
  4008.            EndSelect
  4009.          EndIf
  4010.        Case 4
  4011.          MN$ = "SMSW  "                    ;Mw, Rv
  4012.          If OP < $C0                       ;also nicht %11xxxxxx = Register-Register
  4013.            MN$ + "word ptr [ " : Adr = 1
  4014.            Strings(4, 2)
  4015.           Else
  4016.            Register32(OP, 0)
  4017.          EndIf
  4018.        Case 5
  4019.          NoCode = 1
  4020.        Case 6
  4021.          MN$ = "LMSW  "                    ;Ew
  4022.          If OP < $C0                       ;also nicht %11xxxxxx = Register-Register
  4023.            MN$ + "word ptr [ " : Adr = 1
  4024.            Strings(4, 2)
  4025.           Else
  4026.            Register32(OP, 1)               ;1=16Bit
  4027.          EndIf
  4028.        Case 7
  4029.          If OP < $C0                       ;also nicht %11xxxxxx
  4030.            MN$ = "INVLPG byte ptr [ " : Adr = 1 ;Mb
  4031.            Strings(4, 2)
  4032.           Else
  4033.            Select OP
  4034.              Case $F8
  4035.                If IsProg64
  4036.                  MN$ = "SWAPGS "
  4037.                 Else
  4038.                  NoCode = 1
  4039.                EndIf
  4040.              Case $F9
  4041.                MN$ = "RDTSCP "
  4042.            EndSelect
  4043.          EndIf
  4044.      EndSelect
  4045.    ;------------------------
  4046.    Case $02
  4047.      MN$ = "LAR  "                         ;Gv, Ew
  4048.      Gv(1, 1)
  4049.    ;------------------------
  4050.    Case $03
  4051.      MN$ = "LSL  "                         ;Gv, Ew
  4052.      Gv(1, 1)
  4053.    ;------------------------
  4054.    Case $04
  4055.      NoCode = 1
  4056.    ;------------------------
  4057.    Case $05
  4058.      MN$ = "SYSCALL "
  4059.    ;------------------------
  4060.    Case $06
  4061.      MN$ = "CLTS "
  4062.    ;------------------------
  4063.    Case $07
  4064.      MN$ = "SYSRET "
  4065.      If REX
  4066.        MN$ + "    ( = SYSRETQ )"
  4067.      EndIf
  4068.    ;------------------------
  4069.    Case $08
  4070.      MN$ = "INVD "
  4071.    ;------------------------
  4072.    Case $09
  4073.      MN$ = "WBINVD "
  4074.    ;------------------------
  4075.    Case $0A
  4076.      NoCode = 1
  4077.    ;------------------------
  4078.    Case $0B
  4079.      MN$ = "UD2 "
  4080.    ;------------------------
  4081.    Case $0C
  4082.      NoCode = 1
  4083.    ;------------------------
  4084.    Case $0D                                ;AMD 3DNow!
  4085.      MN$ = "PREFETCH / PREFETCHW byte ptr [ " : Adr = 1   ;M8
  4086.      Strings(4, 2)
  4087.      MN$ + "   (3DNow!)"
  4088.    ;------------------------
  4089.    Case $0E                                ;AMD 3DNow!
  4090.      MN$ = "FEMMS   (3DNow!)"
  4091.    ;------------------------
  4092.    Case $0F                                ;AMD 3DNow!
  4093.      MN$  = ""
  4094.      XMM = 1
  4095.      Gv(3, 1)
  4096.      MNH$ = MN$
  4097.      SUF = PeekB(Buffer + BZ) & $FF        ;Suffix
  4098.      OP$ + RSet(Hex(SUF), 2, "0")
  4099.      BZ + 1
  4100.      AMD$ = "   (3DNow!)"
  4101.      DSP$ = "   (3DNow! / DSP)"
  4102.      Select SUF
  4103.        Case $0C
  4104.          MN$ = "PI2FW  " + MNH$ + DSP$
  4105.        Case $0D
  4106.          MN$ = "PI2FD  " + MNH$ + AMD$
  4107.        Case $1C
  4108.          MN$ = "PF2IW  " + MNH$ + DSP$
  4109.        Case $1D
  4110.          MN$ = "PF2ID  " + MNH$ + AMD$
  4111.        Case $8A
  4112.          MN$ = "PFNACC  " + MNH$ + DSP$
  4113.        Case $8E
  4114.          MN$ = "PFPNACC  " + MNH$ + DSP$
  4115.        Case $90
  4116.          MN$ = "PFCMPGE  " + MNH$ + AMD$
  4117.        Case $94
  4118.          MN$ = "PFMIN  " + MNH$ + AMD$
  4119.        Case $96
  4120.          MN$ = "PFRCP  " + MNH$ + AMD$
  4121.        Case $97
  4122.          MN$ = "PFRSQRT  " + MNH$ + AMD$
  4123.        Case $9A
  4124.          MN$ = "PFSUB  " + MNH$ + AMD$
  4125.        Case $9E
  4126.          MN$ = "PFADD  " + MNH$ + AMD$
  4127.        Case $A0
  4128.          MN$ = "PFCMPGT  " + MNH$ + AMD$
  4129.        Case $A4
  4130.          MN$ = "PFMAX  " + MNH$ + AMD$
  4131.        Case $A6
  4132.          MN$ = "PFRCPIT1  " + MNH$ + AMD$
  4133.        Case $A7
  4134.          MN$ = "PFRSQIT1  " + MNH$ + AMD$
  4135.        Case $AA
  4136.          MN$ = "PFSUBR  " + MNH$ + AMD$
  4137.        Case $AE
  4138.          MN$ = "PFACC  " + MNH$ + AMD$
  4139.        Case $B0
  4140.          MN$ = "PFCMPEQ  " + MNH$ + AMD$
  4141.        Case $B4
  4142.          MN$ = "PFMUL  " + MNH$ + AMD$
  4143.        Case $B6
  4144.          MN$ = "PFRCPIT2  " + MNH$ + AMD$
  4145.        Case $B7
  4146.          MN$ = "PMULHRW  " + MNH$ + AMD$
  4147.        Case $BB
  4148.          MN$ = "PSWAPD  " + MNH$ + DSP$
  4149.        Case $BF
  4150.          MN$ = "PAVGUSB  " + MNH$ + AMD$
  4151.      EndSelect
  4152.    ;------------------------
  4153.    Case $10
  4154.      XMM = 2
  4155.      Select PR
  4156.        Case $3636                          ;=$66
  4157.          MN$ = "MOVUPD  " : S = 5          ;Vpd, Wpd
  4158.        Case $3246                          ;=$F2
  4159.          MN$ = "MOVSD  " : S = 3           ;Vsd, Wsd
  4160.        Case $3346                          ;=$F3
  4161.          MN$ = "MOVSS  " : S = 2           ;Vss, Wss
  4162.        Default
  4163.          MN$ = "MOVUPS  " : S = 5          ;Vps, Wps
  4164.      EndSelect
  4165.      Gv(S, 1)
  4166.    ;------------------------
  4167.    Case $11
  4168.      XMM = 2
  4169.      Select PR
  4170.        Case $3636                          ;=$66
  4171.          MN$ = "MOVUPD  " : S = 5          ;Wpd, Vpd
  4172.        Case $3246                          ;=$F2
  4173.          MN$ = "MOVSD  " : S = 3           ;Wsd, Vsd
  4174.        Case $3346                          ;=$F3
  4175.          MN$ = "MOVSS  " : S = 2           ;Wss, Vss
  4176.        Default
  4177.          MN$ = "MOVUPS  " : S = 5          ;Wps, Vps
  4178.      EndSelect
  4179.      Ev(S, 1)
  4180.    ;------------------------
  4181.    Case $12
  4182.      XMM = 2
  4183.      Select PR
  4184.        Case $3636                          ;=$66
  4185.          MN$ = "MOVLPD  " : S = 3          ;Vq, Mq
  4186.        Case $3246                          ;=$F2
  4187.          MN$ = "MOVDDUP  " : S = 3         ;Vq, Wq
  4188.        Case $3346                          ;=$F3
  4189.          MN$ = "MOVSLDUP  " : S = 3        ;Vq, Wq
  4190.        Default
  4191.          MN$ = "MOVLPS  " : S = 3          ;Vq, Mq
  4192.          If (PeekB(Buffer + BZ) & $FF) < $C0    ;also nicht %11xxxxxx
  4193.            MN$ = "MOVLPS  " : S = 3        ;Vq, Mq
  4194.           Else                             ;Register-Register
  4195.            MN$ = "MOVHLPS  " : S = 3       ;Vq, Uq   S=3 wegen Kompatibilität lassen!
  4196.          EndIf
  4197.      EndSelect
  4198.      Gv(S, 1)
  4199.    ;------------------------
  4200.    Case $13
  4201.      XMM = 2
  4202.      Select PR
  4203.        Case $3636                          ;=$66
  4204.          MN$ = "MOVLPD  "                  ;Mq, Vq
  4205.        Default
  4206.          MN$ = "MOVLPS  "                  ;Mq, Vq
  4207.      EndSelect
  4208.      Ev(3, 1)
  4209.    ;----------------------
  4210.    Case $14
  4211.      XMM = 2
  4212.      Select PR
  4213.        Case $3636                          ;=$66
  4214.          MN$ = "UNPCKLPD  "                ;Vpd, Wq
  4215.        Default
  4216.          MN$ = "UNPCKLPS  "                ;Vps, Wq
  4217.      EndSelect
  4218.      Gv(5, 1)                              ;5=DQWord
  4219.    ;----------------------
  4220.    Case $15
  4221.      XMM = 2
  4222.      Select PR
  4223.        Case $3636                          ;=$66
  4224.          MN$ = "UNPCKHPD  "                ;Vpd, Wq
  4225.        Default
  4226.          MN$ = "UNPCKHPS  "                ;Vps, Wq
  4227.      EndSelect
  4228.      Gv(5, 1)                              ;5=DQWord
  4229.    ;------------------------
  4230.    Case $16
  4231.      XMM = 2
  4232.      Select PR
  4233.        Case $3636                          ;=$66
  4234.          MN$ = "MOVHPD  "                  ;Vq, Mq
  4235.        Case $3346                          ;=$F3
  4236.          MN$ = "MOVSHDUP  "                ;Vq, Wq
  4237.        Default
  4238.          MN$ = "MOVLPS  "                  ;Vq, Mq
  4239.          If (PeekB(Buffer + BZ) & $FF) < $C0    ;also nicht %11xxxxxx
  4240.            MN$ = "MOVHPS  "                ;Vq, Mq
  4241.           Else                             ;Register-Register
  4242.            MN$ = "MOVLHPS  "               ;Vq, Uq
  4243.          EndIf
  4244.      EndSelect
  4245.      Gv(3, 1)                              ;3=QWord
  4246.    ;----------------------
  4247.    Case $17
  4248.      XMM = 2
  4249.      Select PR
  4250.        Case $3636                          ;=$66
  4251.          MN$ = "MOVHPD  "                  ;Mq, Vq
  4252.        Default
  4253.          MN$ = "MOVHPS  "                  ;Mq, Vq
  4254.      EndSelect
  4255.      Ev(3, 1)                              ;3=QWord
  4256.    ;------------------------
  4257.    Case $18                                ;PREFETCH, Gruppe 16
  4258.      OP = PeekB(Buffer + BZ) & $FF
  4259.      OP$ + RSet(Hex(OP), 2, "0") + " "
  4260.      BZ + 1
  4261.      RM = (OP & %00111000) >> 3            ;reg/opcode für Befehl
  4262.      Select RM
  4263.        Case 0
  4264.          MN$ = "PREFETCHNTA byte ptr [ " : Adr = 1   ;M8
  4265.          Strings(4, 2)
  4266.        Case 1
  4267.          MN$ = "PREFETCHT0 byte ptr [ " : Adr = 1    ;M8
  4268.          Strings(4, 2)
  4269.        Case 2
  4270.          MN$ = "PREFETCHT1 byte ptr [ " : Adr = 1    ;M8
  4271.          Strings(4, 2)
  4272.        Case 3
  4273.          MN$ = "PREFETCHT2 byte ptr [ " : Adr = 1    ;M8
  4274.          Strings(4, 2)
  4275.        Case 4 To 7
  4276.          NoCode = 1
  4277.      EndSelect
  4278.    ;------------------------
  4279.    Case $19 To $1E
  4280.      NoCode = 1
  4281.    ;------------------------
  4282.    Case $1F
  4283.      MN$ = "NOP  "                         ;nicht ganz sicher
  4284.      OP = PeekB(Buffer + BZ) & $FF
  4285.      OP$ + RSet(Hex(OP), 2, "0") + " "
  4286.      BZ + 1
  4287.      If REX
  4288.        VAR2=3
  4289.       Else
  4290.        VAR2=2
  4291.      EndIf
  4292.      MSBytes(OP, VAR2)
  4293.    ;------------------------
  4294.    Case $20                                ;Rd, Cd   Control-Register in General-Register
  4295.      MN$ = "MOV  "
  4296.      Komma = 1
  4297.      OP = PeekB(Buffer + BZ) & $FF
  4298.      OP$ + RSet(Hex(OP), 2, "0") + " "
  4299.      BZ + 1
  4300.      If IsProg64                           ;REX.W is ignored!
  4301.        If REX                              ;REX.W in FAsm not in opcode!
  4302.          REX &  %01000001
  4303.          REX + 8
  4304.         Else
  4305.          REX = $48                         ;set REX.W
  4306.        EndIf
  4307.      EndIf
  4308.      Register32(OP, 0)
  4309.      RegisterCR(OP >> 3)
  4310.    ;------------------------
  4311.    Case $21                                ;Rd, Dd   Debug-Register in General-Register
  4312.      MN$ = "MOV  "
  4313.      Komma = 1
  4314.      OP = PeekB(Buffer + BZ) & $FF
  4315.      OP$ + RSet(Hex(OP), 2, "0") + " "
  4316.      BZ + 1
  4317.      If IsProg64                           ;REX.W is ignored!
  4318.        If REX                              ;REX.W in FAsm not in opcode!
  4319.          REX &  %01000001
  4320.          REX + 8
  4321.         Else
  4322.          REX = $48                         ;set REX.W
  4323.        EndIf
  4324.      EndIf
  4325.      Register32(OP, 0)
  4326.      RegisterDR(OP >> 3)
  4327.    ;------------------------
  4328.    Case $22                                ;Cd, Rd   General-Register in Control-Register
  4329.      MN$ = "MOV  "
  4330.      Komma = 1
  4331.      OP = PeekB(Buffer + BZ) & $FF
  4332.      OP$ + RSet(Hex(OP), 2, "0") + " "
  4333.      BZ + 1
  4334.      If IsProg64                           ;REX.W is ignored!
  4335.        If REX                              ;REX.W in FAsm not in opcode!
  4336.          REX &  %01000001
  4337.          REX + 8
  4338.         Else
  4339.          REX = $48                         ;set REX.W
  4340.        EndIf
  4341.      EndIf
  4342.      RegisterCR(OP >> 3)
  4343.      Register32(OP, 0)
  4344.    ;------------------------
  4345.    Case $23                                ;Dd, Rd   General-Register in Debug-Register
  4346.      MN$ = "MOV  "
  4347.      Komma = 1
  4348.      OP = PeekB(Buffer + BZ) & $FF
  4349.      OP$ + RSet(Hex(OP), 2, "0") + " "
  4350.      BZ + 1
  4351.      If IsProg64                           ;REX.W is ignored!
  4352.        If REX                              ;REX.W in FAsm not in opcode!
  4353.          REX &  %01000001
  4354.          REX + 8
  4355.         Else
  4356.          REX = $48                         ;set REX.W
  4357.        EndIf
  4358.      EndIf
  4359.      RegisterDR(OP >> 3)
  4360.      Register32(OP, 0)
  4361.    ;------------------------
  4362.    Case $24 To $27
  4363.      NoCode = 1
  4364.    ;------------------------
  4365.    Case $28
  4366.      XMM = 2
  4367.      Select PR
  4368.        Case $3636                          ;=$66
  4369.          MN$ = "MOVAPD  "                  ;Vpd, Wpd
  4370.        Default
  4371.          MN$ = "MOVAPS  "                  ;Vps, Wps
  4372.      EndSelect
  4373.      Gv(5, 1)                              ;5=DQWord
  4374.    ;------------------------
  4375.    Case $29
  4376.      XMM = 2
  4377.      Select PR
  4378.        Case $3636                          ;=$66
  4379.          MN$ = "MOVAPD  "                  ;Wpd, Vpd
  4380.        Default
  4381.          MN$ = "MOVAPS  "                  ;Wps, Vps
  4382.      EndSelect
  4383.      Ev(5, 1)                              ;5=DQWord
  4384.    ;------------------------
  4385.    Case $2A
  4386.      Select PR
  4387.        Case $3636                          ;=$66
  4388.          MN$ = "CVTPI2PD  " : S = 3        ;Vpd, Qpi   3=QWord
  4389.          XMM = 7
  4390.        Case $3246                          ;=$F2
  4391.          MN$ = "CVTSI2SD  "                ;Vsd, Ed/q
  4392.          XMM = 4
  4393.          If REX & %00001000
  4394.            S = 3                           ;QWord
  4395.           Else
  4396.            S = 2                           ;DWord
  4397.          EndIf
  4398.        Case $3346                          ;=$F3
  4399.          MN$ = "CVTSI2SS  "                ;Vss, Ed/q
  4400.          XMM = 4
  4401.          If REX & %00001000
  4402.            S = 3                           ;QWord
  4403.           Else
  4404.            S = 2                           ;DWord
  4405.          EndIf
  4406.        Default
  4407.          MN$ = "CVTPI2PS  " : S = 3        ;Vps, Qpi   3=QWord
  4408.          XMM = 7
  4409.      EndSelect
  4410.      Gv(S, 1)
  4411.    ;------------------------
  4412.    Case $2B
  4413.      XMM = 2
  4414.      Select PR
  4415.        Case $3636                          ;=$66
  4416.          MN$ = "MOVNTPD  "
  4417.          S = 5                             ;5=DQWord
  4418.        Case $3246                          ;=$F2
  4419.          MN$ = "MOVNTSD  "                 ;AMD SSE4a
  4420.          S = 3                             ;3=QWord
  4421.        Case $3346                          ;=$F3
  4422.          MN$ = "MOVNTSS  "                 ;AMD SSE4a
  4423.          S = 2                             ;2=DWord
  4424.        Default
  4425.          MN$ = "MOVNTPS  "
  4426.          S = 5                             ;5=DQWord
  4427.      EndSelect
  4428.      Ev(S, 1)
  4429.    ;------------------------
  4430.    Case $2C
  4431.      Select PR
  4432.        Case $3636                          ;=$66
  4433.          MN$ = "CVTTPD2PI  " : S = 5       ;Ppi, Wpd   5=DQWord
  4434.          XMM = 8
  4435.        Case $3246                          ;=$F2
  4436.          MN$ = "CVTTSD2SI  " : S = 3       ;Gd/q, Wsd   3=QWord
  4437.          XMM = 5
  4438.        Case $3346                          ;=$F3
  4439.          MN$ = "CVTTSS2SI  " : S = 2       ;Gd/q, Wss   2=DWord
  4440.          XMM = 5
  4441.        Default
  4442.          MN$ = "CVTTPS2PI  " : S = 3       ;Ppi, Wps   3=QWord
  4443.          XMM = 8
  4444.      EndSelect
  4445.      Gv(S, 1)
  4446.    ;------------------------
  4447.    Case $2D
  4448.      Select PR
  4449.        Case $3636                          ;=$66
  4450.          MN$ = "CVTPD2PI  " : S = 5        ;Qpi, Wpd   5=DQWord
  4451.          XMM = 8
  4452.        Case $3246                          ;=$F2
  4453.          MN$ = "CVTSD2SI  " : S = 3        ;Gd/q, Wsd   3=QWord
  4454.          XMM = 5
  4455.        Case $3346                          ;=$F3
  4456.          MN$ = "CVTSS2SI  " : S = 2        ;Gd/q, Wss   2=DWord
  4457.          XMM = 5
  4458.        Default
  4459.          MN$ = "CVTPS2PI  " : S = 3        ;Ppi, Wps   3=QWord
  4460.          XMM = 8
  4461.      EndSelect
  4462.      Gv(S, 1)
  4463.    ;------------------------
  4464.    Case $2E
  4465.      XMM = 2
  4466.      Select PR
  4467.        Case $3636                          ;=$66
  4468.          MN$ = "UCOMISD  " : S = 3         ;Vsd, Wsd    3=QWord
  4469.        Default
  4470.          MN$ = "UCOMISS  " : S = 2         ;Vss, Wss    2=DWord
  4471.      EndSelect
  4472.      Gv(S, 1)
  4473.    ;------------------------
  4474.    Case $2F
  4475.      XMM = 2
  4476.      Select PR
  4477.        Case $3636                          ;=$66
  4478.          MN$ = "COMISD  " : S = 3          ;Vsd, Wsd    3=QWord
  4479.        Default
  4480.          MN$ = "COMISS  " : S = 2          ;Vss, Wss    2=DWord
  4481.      EndSelect
  4482.      Gv(S, 1)
  4483.    ;------------------------
  4484.    Case $30
  4485.      MN$ = "WRMSR "
  4486.      If REX
  4487.        MN$ + "    ( = WRMSRQ )"
  4488.      EndIf
  4489.    ;------------------------
  4490.    Case $31
  4491.      MN$ = "RDTSC "
  4492.    ;------------------------
  4493.    Case $32
  4494.      MN$ = "RDMSR "
  4495.      If REX
  4496.        MN$ + "    ( = RDMSRQ )"
  4497.      EndIf
  4498.    ;------------------------
  4499.    Case $33
  4500.      MN$ = "RDPMC "
  4501.    ;------------------------
  4502.    Case $34
  4503.      MN$ = "SYSENTER "
  4504.    ;------------------------
  4505.    Case $35
  4506.      MN$ = "SYSEXIT "
  4507.      If REX
  4508.        MN$ + "    ( = SYSEXITQ )"
  4509.      EndIf
  4510.    ;------------------------
  4511.    Case $36
  4512.      NoCode = 1
  4513.    ;------------------------
  4514.    Case $37
  4515.      MN$ = "GETSEC "
  4516.    ;------------------------
  4517.    Case $38                                ;3-Byte-Opcodes
  4518.      OP3B38()
  4519.    ;------------------------
  4520.    Case $39
  4521.      NoCode = 1
  4522.    ;------------------------
  4523.    Case $3A                                ;3-Byte-Opcodes
  4524.      OP3B3A()
  4525.    ;------------------------
  4526.    Case $3B To $3F
  4527.      NoCode = 1
  4528.    ;------------------------
  4529.    Case $40                                ;Gv, Ev
  4530.      MN$ = "CMOVO  "
  4531.      Gv(10, 1)
  4532.    ;------------------------
  4533.    Case $41                                ;Gv, Ev
  4534.      MN$ = "CMOVNO  "
  4535.      Gv(10, 1)
  4536.    ;------------------------
  4537.    Case $42                                ;Gv, Ev
  4538.      MN$ = "CMOVB  "                       ;identisch mit CMOVC und CMOVNAE
  4539.      Gv(10, 1)
  4540.      MN$ + "  ( = CMOVC  = CMOVNAE )"
  4541.    ;------------------------
  4542.    Case $43                                ;Gv, Ev
  4543.      MN$ = "CMOVNB  "                      ;identisch mit CMOVNC und CMOVAE
  4544.      Gv(10, 1)
  4545.      MN$ + "  ( = CMOVNC  = CMOVAE )"
  4546.    ;------------------------
  4547.    Case $44                                ;Gv, Ev
  4548.      MN$ = "CMOVE  "                       ;identisch mit CMOVZ
  4549.      Gv(10, 1)
  4550.      MN$ + "  ( = CMOVZ )"
  4551.    ;------------------------
  4552.    Case $45                                ;Gv, Ev
  4553.      MN$ = "CMOVNE  "                      ;identisch mit CMOVNZ
  4554.      Gv(10, 1)
  4555.      MN$ + "  ( = CMOVNZ )"
  4556.    ;------------------------
  4557.    Case $46                                ;Gv, Ev
  4558.      MN$ = "CMOVBE  "                      ;identisch mit CMOVNA
  4559.      Gv(10, 1)
  4560.      MN$ + "  ( = CMOVNA )"
  4561.    ;------------------------
  4562.    Case $47                                ;Gv, Ev
  4563.      MN$ = "CMOVA  "                       ;identisch mit CMOVNBE
  4564.      Gv(10, 1)
  4565.      MN$ + "  ( = CMOVNBE )"
  4566.    ;------------------------
  4567.    Case $48                                ;Gv, Ev
  4568.      MN$ = "CMOVS  "
  4569.      Gv(10, 1)
  4570.    ;------------------------
  4571.    Case $49                                ;Gv, Ev
  4572.      MN$ = "CMOVNS  "
  4573.      Gv(10, 1)
  4574.    ;------------------------
  4575.    Case $4A                                ;Gv, Ev
  4576.      MN$ = "CMOVP  "                       ;identisch mit CMOVPE
  4577.      Gv(10, 1)
  4578.      MN$ + "  ( = CMOVPE )"
  4579.    ;------------------------
  4580.    Case $4B                                ;Gv, Ev
  4581.      MN$ = "CMOVNP  "                      ;identisch mit CMOVPO
  4582.      Gv(10, 1)
  4583.      MN$ + "  ( = CMOVPO )"
  4584.    ;------------------------
  4585.    Case $4C                                ;Gv, Ev
  4586.      MN$ = "CMOVL  "                       ;identisch mit CMOVNGE
  4587.      Gv(10, 1)
  4588.      MN$ + "  ( = CMOVNGE )"
  4589.    ;------------------------
  4590.    Case $4D                                ;Gv, Ev
  4591.      MN$ = "CMOVGE  "                      ;identisch mit CMOVNL
  4592.      Gv(10, 1)
  4593.      MN$ + "  ( = CMOVNL )"
  4594.    ;------------------------
  4595.    Case $4E                                ;Gv, Ev
  4596.      MN$ = "CMOVLE  "                      ;identisch mit CMOVNG
  4597.      Gv(10, 1)
  4598.      MN$ + "  ( = CMOVNG) "
  4599.    ;------------------------
  4600.    Case $4F                                ;Gv, Ev
  4601.      MN$ = "CMOVG  "                       ;identisch mit CMOVNLE
  4602.      Gv(10, 1)
  4603.      MN$ + "  ( = CMOVNLE )"
  4604.    ;------------------------
  4605.    Case $50
  4606.      XMM = 5
  4607.      Select PR
  4608.        Case $3636                          ;=$66
  4609.          MN$ = "MOVMSKPD  "                ;Gd/q, Upd
  4610.        Default
  4611.          MN$ = "MOVMSKPS  "                ;Gd/q, Ups
  4612.      EndSelect
  4613.      Gv(2, 1)                              ;5=DQWord
  4614.    ;------------------------
  4615.    Case $51
  4616.      XMM = 2
  4617.      Select PR
  4618.        Case $3636                          ;=$66
  4619.          MN$ = "SQRTPD  " : S = 5          ;Vpd, Wpd   5=DQWord
  4620.        Case $3246                          ;=$F2
  4621.          MN$ = "SQRTSD  " : S = 3          ;Vsd, Wsd   3=QWord
  4622.        Case $3346                          ;=$F3
  4623.          MN$ = "SQRTSS  " : S = 2          ;Vss, Wss   2=DWord
  4624.        Default
  4625.          MN$ = "SQRTPS  " : S = 5          ;Vps, Wps   5=DQWord
  4626.      EndSelect
  4627.      Gv(S, 1)
  4628.    ;------------------------
  4629.    Case $52
  4630.      XMM = 2
  4631.      Select PR
  4632.        Case $3346                          ;=$F3
  4633.          MN$ = "RSQRTSS  " : S = 2         ;Vss, Wss    ;2=DWord
  4634.        Default
  4635.          MN$ = "RSQRTPS  " : S = 5         ;Vps, Wps    ;5=DQWord
  4636.      EndSelect
  4637.      Gv(S, 1)
  4638.    ;------------------------
  4639.    Case $53
  4640.      XMM = 2
  4641.      Select PR
  4642.        Case $3346                          ;=$F3
  4643.          MN$ = "RCPSS  " : S = 2           ;Vss, Wss    ;2=DWord
  4644.        Default
  4645.          MN$ = "RCPPS  " : S = 5           ;Vps, Wps    ;5=DQWord
  4646.      EndSelect
  4647.      Gv(S, 1)
  4648.    ;------------------------
  4649.    Case $54
  4650.      XMM = 2
  4651.      Select PR
  4652.        Case $3636                          ;=$66
  4653.          MN$ = "ANDPD  "                   ;Vpd, Wpd
  4654.        Default
  4655.          MN$ = "ANDPS  "                   ;Vps, Wps
  4656.      EndSelect
  4657.      Gv(5, 1)                              ;5=DQWord
  4658.    ;------------------------
  4659.    Case $55
  4660.      XMM = 2
  4661.      Select PR
  4662.        Case $3636                          ;=$66
  4663.          MN$ = "ANDNPD  "                  ;Vpd, Wpd
  4664.        Default
  4665.          MN$ = "ANDNPS  "                  ;Vps, Wps
  4666.      EndSelect
  4667.      Gv(5, 1)                              ;5=DQWord
  4668.    ;------------------------
  4669.    Case $56
  4670.      XMM = 2
  4671.      Select PR
  4672.        Case $3636                          ;=$66
  4673.          MN$ = "ORPD  "                    ;Vpd, Wpd
  4674.        Default
  4675.          MN$ = "ORPS  "                    ;Vps, Wps
  4676.      EndSelect
  4677.      Gv(5, 1)                              ;5=DQWord
  4678.    ;------------------------
  4679.    Case $57
  4680.      XMM = 2
  4681.      Select PR
  4682.        Case $3636                          ;=$66
  4683.          MN$ = "XORPD  "                   ;Vpd, Wpd
  4684.        Default
  4685.          MN$ = "XORPS  "                   ;Vps, Wps
  4686.      EndSelect
  4687.      Gv(5, 1)                              ;5=DQWord
  4688.    ;------------------------
  4689.    Case $58
  4690.      XMM = 2
  4691.      Select PR
  4692.        Case $3636                          ;=$66
  4693.          MN$ = "ADDPD  " : S = 5           ;Vpd, Wpd   5=DQWord
  4694.        Case $3246                          ;=$F2
  4695.          MN$ = "ADDSD  " : S = 3           ;Vsd, Wsd   3=QWord
  4696.        Case $3346                          ;=$F3
  4697.          MN$ = "ADDSS  " : S = 2           ;Vss, Wss   2=DWord
  4698.        Default
  4699.          MN$ = "ADDPS  " : S = 5           ;Vps, Wps   5=DQWord
  4700.      EndSelect
  4701.      Gv(S, 1)
  4702.    ;------------------------
  4703.    Case $59
  4704.      XMM = 2
  4705.      Select PR
  4706.        Case $3636                          ;=$66
  4707.          MN$ = "MULPD  " : S = 5           ;Vpd, Wpd   5=DQWord
  4708.        Case $3246                          ;=$F2
  4709.          MN$ = "MULSD  " : S = 3           ;Vsd, Wsd   3=QWord
  4710.        Case $3346                          ;=$F3
  4711.          MN$ = "MULSS  " : S = 2           ;Vss, Wss   2=DWord
  4712.        Default
  4713.          MN$ = "MULPS  " : S = 5           ;Vps, Wps   5=DQWord
  4714.      EndSelect
  4715.      Gv(S, 1)
  4716.    ;------------------------
  4717.    Case $5A
  4718.      XMM = 2
  4719.      Select PR
  4720.        Case $3636                          ;=$66
  4721.          MN$ = "CVTPD2PS  " : S = 5        ;Vps, Wpd   5=DQWord
  4722.        Case $3246                          ;=$F2
  4723.          MN$ = "CVTSD2SS  " : S = 3        ;Vsd, Wsd   3=QWord
  4724.        Case $3346                          ;=$F3
  4725.          MN$ = "CVTSS2SD  " : S = 2        ;Vsd, Wss   2=DWord
  4726.        Default
  4727.          MN$ = "CVTPS2PD  " : S = 3        ;Vpd, Wps   3=QWord
  4728.      EndSelect
  4729.      Gv(S, 1)
  4730.    ;------------------------
  4731.    Case $5B
  4732.      XMM = 2
  4733.      Select PR
  4734.        Case $3636                          ;=$66
  4735.          MN$ = "CVTPS2DQ  "                ;Vdq, Wps
  4736.        Case $3346                          ;=$F3
  4737.          MN$ = "CVTTPS2DQ  "               ;Vdq, Wps
  4738.        Default
  4739.          MN$ = "CVTDQ2PS  "                ;Vps, Wdq
  4740.      EndSelect
  4741.      Gv(5, 1)                              ;5=DQWord
  4742.    ;------------------------
  4743.    Case $5C
  4744.      XMM = 2
  4745.      Select PR
  4746.        Case $3636                          ;=$66
  4747.          MN$ = "SUBPD  " : S = 5           ;Vpd, Wpd   5=DQWord
  4748.        Case $3246                          ;=$F2
  4749.          MN$ = "SUBSD  " : S = 3           ;Vsd, Wsd   3=QWord
  4750.        Case $3346                          ;=$F3
  4751.          MN$ = "SUBSS  " : S = 2           ;Vss, Wss   2=DWord
  4752.        Default
  4753.          MN$ = "SUBPS  " : S = 5           ;Vps, Wps   5=DQWord
  4754.      EndSelect
  4755.      Gv(S, 1)
  4756.    ;------------------------
  4757.    Case $5D
  4758.      XMM = 2
  4759.      Select PR
  4760.        Case $3636                          ;=$66
  4761.          MN$ = "MINPD  " : S = 5           ;Vpd, Wpd   5=DQWord
  4762.        Case $3246                          ;=$F2
  4763.          MN$ = "MINSD  " : S = 3           ;Vsd, Wsd   3=QWord
  4764.        Case $3346                          ;=$F3
  4765.          MN$ = "MINSS  " : S = 2           ;Vss, Wss   2=DWord
  4766.        Default
  4767.          MN$ = "MINPS  " : S = 5           ;Vps, Wps   5=DQWord
  4768.      EndSelect
  4769.      Gv(S, 1)
  4770.    ;------------------------
  4771.    Case $5E
  4772.      XMM = 2
  4773.      Select PR
  4774.        Case $3636                          ;=$66
  4775.          MN$ = "DIVPD  " : S = 5           ;Vpd, Wpd   5=DQWord
  4776.        Case $3246                          ;=$F2
  4777.          MN$ = "DIVSD  " : S = 3           ;Vsd, Wsd   3=QWord
  4778.        Case $3346                          ;=$F3
  4779.          MN$ = "DIVSS  " : S = 2           ;Vss, Wss   2=DWord
  4780.        Default
  4781.          MN$ = "DIVPS  " : S = 5           ;Vps, Wps   5=DQWord
  4782.      EndSelect
  4783.      Gv(S, 1)
  4784.    ;------------------------
  4785.    Case $5F
  4786.      XMM = 2
  4787.      Select PR
  4788.        Case $3636                          ;=$66
  4789.          MN$ = "MAXPD  " : S = 5           ;Vpd, Wpd   5=DQWord
  4790.        Case $3246                          ;=$F2
  4791.          MN$ = "MAXSD  " : S = 3           ;Vsd, Wsd   3=QWord
  4792.        Case $3346                          ;=$F3
  4793.          MN$ = "MAXSS  " : S = 2           ;Vss, Wss   2=DWord
  4794.        Default
  4795.          MN$ = "MAXPS  " : S = 5           ;Vps, Wps   5=DQWord
  4796.      EndSelect
  4797.      Gv(S, 1)
  4798.    ;------------------------
  4799.    Case $60 To $6B
  4800.      Select OP
  4801.        Case $60
  4802.          MN$ = "PUNPCKLBW  "
  4803.        Case $61
  4804.          MN$ = "PUNPCKLWD  "
  4805.        Case $62
  4806.          MN$ = "PUNPCKLDQ  "
  4807.        Case $63
  4808.          MN$ = "PACKSSWB  "
  4809.        Case $64
  4810.          MN$ = "PCMPGTB  "
  4811.        Case $65
  4812.          MN$ = "PCMPGTW  "
  4813.        Case $66
  4814.          MN$ = "PCMPGTD  "
  4815.        Case $67
  4816.          MN$ = "PACKUSWB  "
  4817.        Case $68
  4818.          MN$ = "PUNPCKHBW  "
  4819.        Case $69
  4820.          MN$ = "PUNPCKHWD  "
  4821.        Case $6A
  4822.          MN$ = "PUNPCKHDQ  "
  4823.        Case $6B
  4824.          MN$ = "PACKSSDW  "
  4825.      EndSelect
  4826.      Select PR
  4827.        Case $3636                          ;=$66
  4828.          XMM = 2 : S = 5                   ;Vdq, Wdq
  4829.        Default
  4830.          XMM = 1 : S = 3                   ;Pq, Qq  <- Fehler in Intel-Doku, nicht Qd
  4831.      EndSelect
  4832.      Gv(S, 1)
  4833.    ;------------------------
  4834.    Case $6C
  4835.      MN$ = "PUNPCKLQDQ  "
  4836.      Select PR
  4837.        Case $3636                          ;=$66
  4838.          XMM = 2                           ;Vdq, Wdq
  4839.      EndSelect
  4840.      Gv(5, 1)
  4841.    ;------------------------
  4842.    Case $6D
  4843.      MN$ = "PUNPCKHQDQ  "
  4844.      Select PR
  4845.        Case $3636                          ;=$66
  4846.          XMM = 2                           ;Vdq, Wdq
  4847.      EndSelect
  4848.      Gv(5, 1)
  4849.    ;------------------------
  4850.    Case $6E
  4851.      MN$ = "MOVD  "
  4852.      Select PR
  4853.        Case $3636                          ;=$66
  4854.          XMM = 4                           ;4=XMM-Register und nachfolgendes 32-Bit-Register
  4855.        Default
  4856.          XMM = 3                           ;3=MMX-Register und nachfolgendes 32-Bit-Register
  4857.      EndSelect
  4858.      Gv(2, 1)
  4859.    ;------------------------
  4860.    Case $6F
  4861.      XMM = 2
  4862.      Select PR
  4863.        Case $3636                          ;=$66
  4864.          MN$ = "MOVDQA  " : S = 5          ;Vdq, Wdq
  4865.        Case $3346                          ;=$F3
  4866.          MN$ = "MOVDQU  " : S = 5          ;Vdq, Wdq
  4867.        Default
  4868.          MN$ = "MOVQ  " : S = 3            ;Pq, Qq
  4869.          XMM = 1                           ;MMX!
  4870.      EndSelect
  4871.      Gv(S, 1)
  4872.    ;------------------------
  4873.    Case $70
  4874.      XMM = 2
  4875.      Select PR
  4876.        Case $3636                          ;=$66
  4877.          MN$ = "PSHUFD  "  : S = 5         ;Vdq, Wdq, Ib
  4878.        Case $3246                          ;=$F2
  4879.          MN$ = "PSHUFLW  " : S = 5         ;Vdq, Wdq, Ib
  4880.        Case $3346                          ;=$F3
  4881.          MN$ = "PSHUFHW  " : S = 5         ;Vdq, Wdq, Ib
  4882.        Default
  4883.          MN$ = "PSHUFW  " : S = 3          ;Pq, Qq, Ib
  4884.          XMM = 1
  4885.      EndSelect
  4886.      Adr64 = 1
  4887.      Gv(S, 2)
  4888.      Strings(1, 0)
  4889.    ;------------------------
  4890.    Case $71                                ;Gruppe 12
  4891.      Komma = 1
  4892.      OP = PeekB(Buffer + BZ) & $FF
  4893.      OP$ + RSet(Hex(OP), 2, "0") + " "
  4894.      BZ + 1
  4895.      RM = (OP & %00111000) >> 3            ;reg/opcode für Befehl
  4896.      Select RM
  4897.        Case 0 To 1
  4898.          NoCode = 1
  4899.        Case 2
  4900.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  4901.            MN$ = "PSRLW  "
  4902.            Select PR
  4903.              Case $3636                    ;=$66
  4904.                XMM = 2 : S = 5             ;Udq, Ib
  4905.              Default
  4906.                XMM = 1 : S = 3             ;Nq, Ib
  4907.            EndSelect
  4908.            Adr64 = 1
  4909.            Register32(OP, 0)
  4910.            Strings(1, 0)
  4911.          EndIf
  4912.        Case 3
  4913.          NoCode = 1
  4914.        Case 4
  4915.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  4916.            MN$ = "PSRAW  "
  4917.            Select PR
  4918.              Case $3636                    ;=$66
  4919.                XMM = 2 : S = 5             ;Udq, Ib
  4920.              Default
  4921.                XMM = 1 : S = 3             ;Nq, Ib
  4922.            EndSelect
  4923.            Adr64 = 1
  4924.            Register32(OP, 0)
  4925.            Strings(1, 0)
  4926.          EndIf
  4927.        Case 5
  4928.          NoCode = 1
  4929.        Case 6
  4930.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  4931.            MN$ = "PSLLW  "
  4932.            Select PR
  4933.              Case $3636                    ;=$66
  4934.                XMM = 2 : S = 5             ;Udq, Ib
  4935.              Default
  4936.                XMM = 1 : S = 3             ;Nq, Ib
  4937.            EndSelect
  4938.            Adr64 = 1
  4939.            Register32(OP, 0)
  4940.            Strings(1, 0)
  4941.          EndIf
  4942.        Case 7
  4943.          NoCode = 1
  4944.      EndSelect
  4945.    ;------------------------
  4946.    Case $72                                ;Gruppe 13
  4947.      Komma = 1
  4948.      OP = PeekB(Buffer + BZ) & $FF
  4949.      OP$ + RSet(Hex(OP), 2, "0") + " "
  4950.      BZ + 1
  4951.      RM = (OP & %00111000) >> 3            ;reg/opcode für Befehl
  4952.      Select RM
  4953.        Case 0 To 1
  4954.          NoCode = 1
  4955.        Case 2
  4956.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  4957.            MN$ = "PSRLD  "
  4958.            Select PR
  4959.              Case $3636                    ;=$66
  4960.                XMM = 2 : S = 5             ;Udq, Ib
  4961.              Default
  4962.                XMM = 1 : S = 3             ;Nq, Ib
  4963.            EndSelect
  4964.            Adr64 = 1
  4965.            Register32(OP, 0)
  4966.            Strings(1, 0)
  4967.          EndIf
  4968.        Case 3
  4969.          NoCode = 1
  4970.        Case 4
  4971.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  4972.            MN$ = "PSRAD  "
  4973.            Select PR
  4974.              Case $3636                    ;=$66
  4975.                XMM = 2 : S = 5             ;Udq, Ib
  4976.              Default
  4977.                XMM = 1 : S = 3             ;Nq, Ib
  4978.            EndSelect
  4979.            Adr64 = 1
  4980.            Register32(OP, 0)
  4981.            Strings(1, 0)
  4982.          EndIf
  4983.        Case 5
  4984.          NoCode = 1
  4985.        Case 6
  4986.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  4987.            MN$ = "PSLLD  "
  4988.            Select PR
  4989.              Case $3636                    ;=$66
  4990.                XMM = 2 : S = 5             ;Udq, Ib
  4991.              Default
  4992.                XMM = 1 : S = 3             ;Nq, Ib
  4993.            EndSelect
  4994.            Adr64 = 1
  4995.            Register32(OP, 0)
  4996.            Strings(1, 0)
  4997.          EndIf
  4998.        Case 7
  4999.          NoCode = 1
  5000.      EndSelect
  5001.    ;------------------------
  5002.    Case $73                                ;Gruppe 14
  5003.      Komma = 1
  5004.      OP = PeekB(Buffer + BZ) & $FF
  5005.      OP$ + RSet(Hex(OP), 2, "0") + " "
  5006.      BZ + 1
  5007.      RM = (OP & %00111000) >> 3            ;reg/opcode für Befehl
  5008.      Select RM
  5009.        Case 0 To 1
  5010.          NoCode = 1
  5011.        Case 2
  5012.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  5013.            MN$ = "PSRLQ  "
  5014.            Select PR
  5015.              Case $3636                    ;=$66
  5016.                XMM = 2 : S = 5             ;Udq, Ib
  5017.              Default
  5018.                XMM = 1 : S = 3             ;Nq, Ib
  5019.            EndSelect
  5020.            Adr64 = 1
  5021.            Register32(OP, 0)
  5022.            Strings(1, 0)
  5023.          EndIf
  5024.        Case 3
  5025.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  5026.            Select PR
  5027.              Case $3636                    ;=$66
  5028.                MN$ = "PSRLDQ  "
  5029.                XMM = 2 : S = 5             ;Udq, Ib
  5030.            EndSelect
  5031.            Adr64 = 1
  5032.            Register32(OP, 0)
  5033.            Strings(1, 0)
  5034.          EndIf
  5035.        Case 4 To 5
  5036.          NoCode = 1
  5037.        Case 6
  5038.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  5039.            MN$ = "PSLLQ  "
  5040.            Select PR
  5041.              Case $3636                    ;=$66
  5042.                XMM = 2 : S = 5             ;Udq, Ib
  5043.              Default
  5044.                XMM = 1 : S = 3             ;Nq, Ib
  5045.            EndSelect
  5046.            Adr64 = 1
  5047.            Register32(OP, 0)
  5048.            Strings(1, 0)
  5049.          EndIf
  5050.        Case 7
  5051.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  5052.            Select PR
  5053.              Case $3636                    ;=$66
  5054.                MN$ = "PSLLDQ  "
  5055.                XMM = 2 : S = 5             ;Udq, Ib
  5056.            EndSelect
  5057.            Adr64 = 1
  5058.            Register32(OP, 0)
  5059.            Strings(1, 0)
  5060.          EndIf
  5061.      EndSelect
  5062.    ;------------------------
  5063.    Case $74
  5064.      MN$ = "PCMPEQB  "
  5065.      Select PR
  5066.        Case $3636                          ;=$66
  5067.          XMM = 2 : S = 5                   ;Vdq, Wdq
  5068.        Default
  5069.          XMM = 1 : S = 3                   ;Pq, Qq
  5070.      EndSelect
  5071.      Gv(S, 1)
  5072.    ;------------------------
  5073.    Case $75
  5074.      MN$ = "PCMPEQW  "
  5075.      Select PR
  5076.        Case $3636                          ;=$66
  5077.          XMM = 2 : S = 5                   ;Vdq, Wdq
  5078.        Default
  5079.          XMM = 1 : S = 3                   ;Pq, Qq
  5080.      EndSelect
  5081.      Gv(S, 1)
  5082.    ;------------------------
  5083.    Case $76
  5084.      MN$ = "PCMPEQD  "
  5085.      Select PR
  5086.        Case $3636                          ;=$66
  5087.          XMM = 2 : S = 5                   ;Vdq, Wdq
  5088.        Default
  5089.          XMM = 1 : S = 3                   ;Pq, Qq
  5090.      EndSelect
  5091.      Gv(S, 1)
  5092.    ;------------------------
  5093.    Case $77
  5094.      MN$ = "EMMS "
  5095.    ;------------------------
  5096.    Case $78
  5097.      Select PR
  5098.        Case $3636                          ;=$66
  5099.          MN$ = "EXTRQ  "                   ;AMD SSE4a
  5100.          XMM = 2                           ;hier mal so für Register32()
  5101.          OP = PeekB(Buffer + BZ) & $FF
  5102.          OP$ + RSet(Hex(OP), 2, "0") + " "
  5103.          BZ + 1
  5104.          VAR1 = (OP >> 3) & %00000111
  5105.          If REX
  5106.            VAR1 | (REX & %00000100) << 1   ;REX.R
  5107.          EndIf
  5108.          IsvonMSBytes = 1
  5109.          Register32(VAR1, 0)
  5110.          MN$ + " , "
  5111.          Strings(1, 0)                     ;1-Byte-Konstante
  5112.          MN$ + " , "
  5113.          Strings(1, 0)                     ;1-Byte-Konstante
  5114.        Case $3246                          ;=$F2
  5115.          MN$ = "INSERTQ  "                 ;AMD SSE4a
  5116.          XMM = 2
  5117.          Gv(5, 1)
  5118.          MN$ + " , "
  5119.          Strings(1, 0)                     ;1-Byte-Konstante
  5120.          MN$ + " , "
  5121.          Strings(1, 0)                     ;1-Byte-Konstante
  5122.        Default
  5123.          MN$ = "VMREAD  "                  ;Ed, Gd
  5124.          If IsProg64
  5125.            REX | 8
  5126.            Ev(10, 1)
  5127.           Else
  5128.            Ev(2, 1)
  5129.          EndIf  
  5130.      EndSelect
  5131.    ;------------------------
  5132.    Case $79
  5133.      Select PR
  5134.        Case $3636                          ;=$66
  5135.          MN$ = "EXTRQ  "                   ;AMD SSE4a
  5136.          XMM = 2
  5137.          Gv(5, 1)
  5138.        Case $3246                          ;=$F2
  5139.          MN$ = "INSERTQ  "                 ;AMD SSE4a
  5140.          XMM = 2
  5141.          Gv(5, 1)
  5142.        Default
  5143.          MN$ = "VMWRITE  "                 ;Gd, Ed
  5144.          If IsProg64
  5145.            REX | 8
  5146.            Gv(3, 1)
  5147.           Else
  5148.            Gv(2, 1)
  5149.          EndIf  
  5150.      EndSelect
  5151.    ;------------------------
  5152.    Case $7A To $7B
  5153.      NoCode = 1
  5154.    ;------------------------
  5155.    Case $7C
  5156.      XMM = 2
  5157.      Select PR
  5158.        Case $3636                          ;=$66
  5159.          MN$ = "HADDPD  "                  ;Vpd, Wpd
  5160.        Case $3246                          ;=$F2
  5161.          MN$ = "HADDPS  "                  ;Vps, Wps
  5162.      EndSelect
  5163.      Gv(5, 1)                              ;5=DQWord
  5164.    ;------------------------
  5165.    Case $7D
  5166.      XMM = 2
  5167.      Select PR
  5168.        Case $3636                          ;=$66
  5169.          MN$ = "HSUBPD  "                  ;Vpd, Wpd
  5170.        Case $3246                          ;=$F2
  5171.          MN$ = "HSUBPS  "                  ;Vps, Wps
  5172.      EndSelect
  5173.      Gv(5, 1)                              ;5=DQWord
  5174.    ;------------------------
  5175.    Case $7E
  5176.      MN$ = "MOVD  "
  5177.      Select PR
  5178.        Case $3636                          ;=$66
  5179.          XMM = 5                           ;5=32-Bit-Register/Mem - XMM-Register
  5180.          Ev(2, 1)
  5181.        Case $3346                          ;=$F3
  5182.          MN$ = "MOVQ  "                    ;Vq, Wq
  5183.          XMM = 2
  5184.          Gv(3, 1)
  5185.        Default
  5186.          XMM = 6                           ;6=32-Bit-Register/Mem - MMX-Register
  5187.          Ev(2, 1)
  5188.      EndSelect
  5189.    ;------------------------
  5190.    Case $7F
  5191.      XMM = 2
  5192.      Select PR
  5193.        Case $3636                          ;=$66
  5194.          MN$ = "MOVDQA  " : S = 5          ;Wdq, Vdq
  5195.        Case $3346                          ;=$F3
  5196.          MN$ = "MOVDQU  " : S = 5          ;Wdq, Vdq
  5197.        Default
  5198.          MN$ = "MOVQ  " : S = 3            ;Qq, Pq
  5199.          XMM = 1                           ;MMX!
  5200.      EndSelect
  5201.      Ev(S, 1)
  5202.    ;------------------------
  5203.    Case $80
  5204.      MN$ = "JO  "                          ;long
  5205.      Sprung_near_long()
  5206.      MN$ + "  ( long )"
  5207.    ;------------------------
  5208.    Case $81
  5209.      MN$ = "JNO  "                         ;long
  5210.      Sprung_near_long()
  5211.      MN$ + "  ( long )"
  5212.    ;------------------------
  5213.    Case $82
  5214.      MN$ = "JC  "                          ;long, identisch mit JB und JNAE
  5215.      Sprung_near_long()
  5216.      MN$ + "  ( long )  ( = JB  = JNAE )"
  5217.    ;------------------------
  5218.    Case $83
  5219.      MN$ = "JNC  "                         ;long, identisch mit JNB und JAE
  5220.      Sprung_near_long()
  5221.      MN$ + "  ( long )  ( = JNB  = JAE )"
  5222.    ;------------------------
  5223.    Case $84
  5224.      MN$ = "JE  "                          ;long, identisch mit JZ
  5225.      Sprung_near_long()
  5226.      MN$ + "  ( long )  ( = JZ ) "
  5227.    ;------------------------
  5228.    Case $85
  5229.      MN$ = "JNE  "                         ;long, identisch mit JNZ
  5230.      Sprung_near_long()
  5231.      MN$ + "  ( long )  ( = JNZ )"
  5232.    ;------------------------
  5233.    Case $86
  5234.      MN$ = "JBE  "                         ;long, identisch mit JNA
  5235.      Sprung_near_long()
  5236.      MN$ + "  ( long )  ( = JNA )"
  5237.    ;------------------------
  5238.    Case $87
  5239.      MN$ = "JA  "                          ;long, identisch mit JNBE
  5240.      Sprung_near_long()
  5241.      MN$ + "  ( long )  ( = JNBE )"
  5242.    ;------------------------
  5243.    Case $88
  5244.      MN$ = "JS  "                          ;long
  5245.      Sprung_near_long()
  5246.      MN$ + "  ( long )"
  5247.    ;------------------------
  5248.    Case $89
  5249.      MN$ = "JNS  "                         ;long
  5250.      Sprung_near_long()
  5251.      MN$ + "  ( long )"
  5252.    ;------------------------
  5253.    Case $8A
  5254.      MN$ = "JP  "                          ;long, identisch mit JPE
  5255.      Sprung_near_long()
  5256.      MN$ + "  ( long )  ( = JPE )"
  5257.    ;------------------------
  5258.    Case $8B
  5259.      MN$ = "JNP  "                         ;long, identisch mit JPO
  5260.      Sprung_near_long()
  5261.      MN$ + "  ( long )  ( = JPO )"
  5262.    ;------------------------
  5263.    Case $8C
  5264.      MN$ = "JL  "                          ;long, identisch mit JNGE
  5265.      Sprung_near_long()
  5266.      MN$ + "  ( long )  ( = JNGE )"
  5267.    ;------------------------
  5268.    Case $8D
  5269.      MN$ = "JGE  "                         ;long, identisch mit JNL
  5270.      Sprung_near_long()
  5271.      MN$ + "  ( long )  ( = JNL ) "
  5272.    ;------------------------
  5273.    Case $8E
  5274.      MN$ = "JLE  "                         ;long, identisch mit JNG
  5275.      Sprung_near_long()
  5276.      MN$ + "  ( long )  ( = JNG )"
  5277.    ;------------------------
  5278.    Case $8F
  5279.      MN$ = "JG  "                          ;long, identisch mit JNLE
  5280.      Sprung_near_long()
  5281.      MN$ + "  ( long )  ( = JNLE )"
  5282.    ;------------------------
  5283.    Case $90                                ;Eb
  5284.      MN$ = "SETO  "
  5285.      Eb(0)
  5286.    ;------------------------
  5287.    Case $91                                ;Eb
  5288.      MN$ = "SETNO  "
  5289.      Eb(0)
  5290.    ;------------------------
  5291.    Case $92                                ;Eb
  5292.      MN$ = "SETC  "
  5293.      Eb(0)
  5294.      MN$ + "  ( = SETB  = SETNAE )"
  5295.    ;------------------------
  5296.    Case $93                                ;Eb
  5297.      MN$ = "SETNC  "
  5298.      Eb(0)
  5299.      MN$ + "  ( = SETNB  = SETAE )"
  5300.    ;------------------------
  5301.    Case $94                                ;Eb
  5302.      MN$ = "SETE  "
  5303.      Eb(0)
  5304.      MN$ + "  ( = SETZ )"
  5305.    ;------------------------
  5306.    Case $95                                ;Eb
  5307.      MN$ = "SETNE  "
  5308.      Eb(0)
  5309.      MN$ + "  ( = SETNZ )"
  5310.    ;------------------------
  5311.    Case $96                                ;Eb
  5312.      MN$ = "SETBE  "
  5313.      Eb(0)
  5314.      MN$ + "  ( = SETNA )"
  5315.    ;------------------------
  5316.    Case $97                                ;Eb
  5317.      MN$ = "SETA  "
  5318.      Eb(0)
  5319.      MN$ + "  ( = SETNBE )"
  5320.    ;------------------------
  5321.    Case $98                                ;Eb
  5322.      MN$ = "SETS  "
  5323.      Eb(0)
  5324.    ;------------------------
  5325.    Case $99                                ;Eb
  5326.      MN$ = "SETNS  "
  5327.      Eb(0)
  5328.    ;------------------------
  5329.    Case $9A                                ;Eb
  5330.      MN$ = "SETP  "
  5331.      Eb(0)
  5332.      MN$ + "  ( = SETPE )"
  5333.    ;------------------------
  5334.    Case $9B                                ;Eb
  5335.      MN$ = "SETNP  "
  5336.      Eb(0)
  5337.      MN$ + "  ( = SETPO )"
  5338.    ;------------------------
  5339.    Case $9C                                ;Eb
  5340.      MN$ = "SETL  "
  5341.      Eb(0)
  5342.      MN$ + "  ( = SETNGE )"
  5343.    ;------------------------
  5344.    Case $9D                                ;Eb
  5345.      MN$ = "SETNL  "
  5346.      Eb(0)
  5347.      MN$ + "  ( = SETGE )"
  5348.    ;------------------------
  5349.    Case $9E                                ;Eb
  5350.      MN$ = "SETNG  "
  5351.      Eb(0)
  5352.      MN$ + "  ( = SETLE )"
  5353.    ;------------------------
  5354.    Case $9F                                ;Eb
  5355.      MN$ = "SETG  "
  5356.      Eb(0)
  5357.      MN$ + "  ( = SETNLE )"
  5358.    ;------------------------
  5359.    Case $A0
  5360.      MN$ = "PUSH FS "
  5361.    ;------------------------
  5362.    Case $A1
  5363.      MN$ = "POP FS "
  5364.    ;------------------------
  5365.    Case $A2
  5366.      MN$ = "CPUID "
  5367.    ;------------------------
  5368.    Case $A3                                ;Ev, Gv
  5369.      MN$ = "BT  "
  5370.      Ev(10, 1)
  5371.    ;------------------------
  5372.    Case $A4 To $A5                         ;Ev, Gv, Ib/CL
  5373.      OPH=OP
  5374.      MN$ = "SHLD  "
  5375.      Komma = 2
  5376.      OP = PeekB(Buffer + BZ) & $FF
  5377.      OP$ + RSet(Hex(OP), 2, "0") + " "
  5378.      BZ + 1
  5379.      If (OP >> 6) <> 3                     ;also nicht Register-Register
  5380.        If REX & %00001000                  ;REX.W
  5381.          S = 3                             ;QWord
  5382.         Else
  5383.          S = 2                             ;DWord
  5384.        EndIf
  5385.        If OPH = $A4          
  5386.          MemAdd64 = 1
  5387.        EndIf
  5388.        MSBytes(OP, S)
  5389.       Else
  5390.        VAR1 = OP
  5391.        VAR1 & %00000111
  5392.        If REX
  5393.          VAR1 | (REX & %00000001) << 3
  5394.        EndIf
  5395.        IsvonMSBytes = 1
  5396.        Register32(VAR1, 0)
  5397.      EndIf
  5398.      VAR1 = OP >> 3
  5399.      VAR1 & %00000111
  5400.      If REX
  5401.        VAR1 | (REX & %00000100) << 1
  5402.        IsvonMSBytes = 1
  5403.      EndIf
  5404.      Register32(VAR1, 0)                   ;"Spender"-Register
  5405.      If OPH = $A4
  5406.        Strings(1, 0)                       ;1-Byte-Konstante
  5407.       Else
  5408.        MN$ + " CL"
  5409.      EndIf
  5410.    ;------------------------
  5411.    Case $A6
  5412.      NoCode = 1                            ;XBTS, obsolet
  5413.    ;------------------------
  5414.    Case $A7
  5415.      NoCode = 1                            ;IBTS, obsolet
  5416.    ;------------------------
  5417.    Case $A8
  5418.      MN$ = "PUSH GS "
  5419.    ;------------------------
  5420.    Case $A9
  5421.      MN$ = "POP GS "
  5422.    ;------------------------
  5423.    Case $AA
  5424.      MN$ = "RSM "
  5425.    ;------------------------
  5426.    Case $AB                                ;Ev, Gv
  5427.      MN$ = "BTS  "
  5428.      Ev(10, 1)
  5429.    ;------------------------
  5430.    Case $AC To $AD                         ;Ev, Gv, Ib/CL
  5431.      OPH=OP
  5432.      MN$ = "SHRD  "
  5433.      Komma = 2
  5434.      OP = PeekB(Buffer + BZ) & $FF
  5435.      OP$ + RSet(Hex(OP), 2, "0") + " "
  5436.      BZ + 1
  5437.      If (OP >> 6) <> 3                     ;also nicht Register-Register
  5438.        If REX & %00001000                  ;REX.W
  5439.          S = 3                             ;QWord
  5440.         Else
  5441.          S = 2                             ;DWord
  5442.        EndIf
  5443.        If OPH = $AC          
  5444.          MemAdd64 = 1
  5445.        EndIf
  5446.        MSBytes(OP, S)
  5447.       Else
  5448.        VAR1 = OP
  5449.        VAR1 & %00000111
  5450.        If REX
  5451.          VAR1 | (REX & %00000001) << 3
  5452.        EndIf
  5453.        IsvonMSBytes = 1
  5454.        Register32(VAR1, 0)
  5455.      EndIf
  5456.      VAR1 = OP >> 3
  5457.      VAR1 & %00000111
  5458.      If REX
  5459.        VAR1 | (REX & %00000100) << 1
  5460.        IsvonMSBytes = 1
  5461.      EndIf
  5462.      Register32(VAR1, 0)                   ;"Spender"-Register
  5463.      If OPH = $AC
  5464.        Strings(1, 0)                       ;1-Byte-Konstante
  5465.       Else
  5466.        MN$ + " CL"
  5467.      EndIf
  5468.    ;------------------------
  5469.    Case $AE                                ;Gruppe 15
  5470.      OP = PeekB(Buffer + BZ) & $FF
  5471.      OP$ + RSet(Hex(OP), 2, "0") + " "
  5472.      BZ + 1
  5473.      RM = (OP & %00111000) >> 3            ;reg/opcode für Befehl
  5474.      Select RM
  5475.        Case 0
  5476.          If OP < $C0                       ;also nicht %11xxxxxx
  5477.            If REX
  5478.              MN$ = "FXSAVE64  "
  5479.             Else
  5480.              MN$ = "FXSAVE  "
  5481.            EndIf
  5482.            MSBytes(OP, 7)                  ;7=512-byte-ptr
  5483.          EndIf
  5484.        Case 1
  5485.          If OP < $C0                       ;also nicht %11xxxxxx
  5486.            If REX
  5487.              MN$ = "FXRSTOR64  "
  5488.             Else
  5489.              MN$ = "FXRSTOR  "
  5490.            EndIf
  5491.            MSBytes(OP, 7)                  ;7=512-byte-ptr
  5492.          EndIf
  5493.        Case 2
  5494.          If OP < $C0                       ;also nicht %11xxxxxx
  5495.            MN$ = "LDMXCSR dword ptr [ " : Adr = 1    ;M32
  5496.            Strings(4, 2)
  5497.          EndIf
  5498.        Case 3
  5499.          If OP < $C0                       ;also nicht %11xxxxxx
  5500.            MN$ = "STMXCSR dword ptr [ " : Adr = 1    ;M32
  5501.            Strings(4, 2)
  5502.          EndIf
  5503.        Case 4
  5504.          If OP < $C0                       ;also nicht %11xxxxxx = Register-Register
  5505.            If REX
  5506.              MN$ = "XSAVE64  "
  5507.             Else
  5508.              MN$ = "XSAVE  "
  5509.            EndIf
  5510.            MSBytes(OP, 7)                  ;7=512-byte-ptr
  5511.          EndIf
  5512.        Case 5
  5513.          If OP < $C0                       ;also nicht %11xxxxxx
  5514.            If REX
  5515.              MN$ = "XRSTOR64  "
  5516.             Else
  5517.              MN$ = "XRSTOR  "
  5518.            EndIf
  5519.            MSBytes(OP, 7)                  ;7=512-byte-ptr
  5520.           Else
  5521.            MN$ = "LFENCE  "
  5522.          EndIf
  5523.        Case 6
  5524.          If OP >= $C0                      ;also %11xxxxxx = Register-Register
  5525.            MN$ = "MFENCE  "
  5526.           Else
  5527.            If REX
  5528.              MN$ = "XSAVEOPT64  "
  5529.             Else
  5530.              MN$ = "XSAVEOPT  "
  5531.            EndIf
  5532.            MSBytes(OP, 7)                  ;7=512-byte-ptr
  5533.          EndIf
  5534.        Case 7
  5535.          If OP < $C0                       ;also nicht %11xxxxxx
  5536.            MN$ = "CLFLUSH byte ptr [ " : Adr = 1     ;M8
  5537.            Strings(4, 2)
  5538.           Else
  5539.            MN$ = "SFENCE "
  5540.          EndIf
  5541.      EndSelect
  5542.    ;------------------------
  5543.    Case $AF
  5544.      MN$ = "IMUL  "                        ;Gv, Ev
  5545.      Gv(10, 1)
  5546.    ;------------------------
  5547.    Case $B0                                ;Eb, Gb
  5548.      MN$ = "CMPXCHG  "
  5549.      Komma = 1
  5550.      Eb(1)
  5551.    ;------------------------
  5552.    Case $B1                                ;Ev, Gv
  5553.      MN$ = "CMPXCHG  "
  5554.      Ev(10, 1)
  5555.    ;------------------------
  5556.    Case $B2
  5557.      MN$ = "LSS  "                         ;Gv, Mp
  5558.      If IsProg64 And REX                   ;mal REX.W auswerten
  5559.        REX & %01000111
  5560.      EndIf
  5561.      Gv(2, 1)
  5562.    ;------------------------
  5563.    Case $B3                                ;Ev, Gv
  5564.      MN$ = "BTR  "
  5565.      Ev(10, 1)
  5566.    ;------------------------
  5567.    Case $B4
  5568.      MN$ = "LFS  "                         ;Gv, Mp
  5569.      If IsProg64 And REX                   ;mal REX.W auswerten
  5570.        REX & %01000111
  5571.      EndIf
  5572.      Gv(2, 1)
  5573.    ;------------------------
  5574.    Case $B5
  5575.      MN$ = "LGS  "                         ;Gv, Mp
  5576.      If IsProg64 And REX                   ;mal REX.W auswerten
  5577.        REX & %01000111
  5578.      EndIf
  5579.      Gv(2, 1)
  5580.    ;------------------------
  5581.    Case $B6
  5582.      MN$ = "MOVZX  "                       ;Gv, Eb
  5583.      Gv(0, 1)
  5584.    ;------------------------
  5585.    Case $B7
  5586.      MN$ = "MOVZX  "                       ;Gv, Ew
  5587.      Gv(1, 1)
  5588.    ;------------------------
  5589.    Case $B8
  5590.      Select PR
  5591.        Case $3636                          ;=$66
  5592.          If Mid(OP$, 4, 2) = "F3"
  5593.            MN$ = "POPCNT  "                ;Gv, Ev
  5594.            Gv(1, 1)
  5595.          EndIf
  5596.        Case $3346                          ;=$F3
  5597.          MN$ = "POPCNT  "                  ;Gv, Ev
  5598.          Gv(10, 1)
  5599.        ;Default
  5600.        ;  MN$ = "JMPE  "                   ;Intel-Doku: "reserved for emulator on IPF"
  5601.      EndSelect
  5602.    ;------------------------
  5603.    Case $B9                                ;Gruppe 10, reserviert
  5604.      NoCode = 1
  5605.    ;------------------------
  5606.    Case $BA                                ;Gruppe 8  Ev, Ib
  5607.      OP = PeekB(Buffer + BZ) & $FF
  5608.      OP$ + RSet(Hex(OP), 2, "0") + " "
  5609.      BZ + 1
  5610.      RM = (OP & %00111000) >> 3            ;reg/opcode für Befehl
  5611.      Select RM
  5612.        Case 0 To 3
  5613.          NoCode = 1
  5614.        Case 4
  5615.          MN$ = "BT  "
  5616.        Case 5
  5617.          MN$ = "BTS  "
  5618.        Case 6
  5619.          MN$ = "BTR  "
  5620.        Case 7
  5621.          MN$ = "BTC  "
  5622.      EndSelect
  5623.      If NoCode = 0      
  5624.        Komma = 1
  5625.        MemAdd64 = 1
  5626.        If REX & %00001000
  5627.          S = 3                             ;QWord
  5628.         Else
  5629.          S = 2                             ;DWord
  5630.        EndIf
  5631.        MSBytes(OP, S)
  5632.        MN$ + RSet(Hex(PeekB(Buffer + BZ) & $FF), 2, "0")  ;der 1-Byte-Wert
  5633.        OP = PeekB(Buffer + BZ) & $FF
  5634.        OP$ + RSet(Hex(OP), 2, "0")
  5635.        BZ + 1
  5636.      EndIf
  5637.    ;------------------------
  5638.    Case $BB                                ;Ev, Gv
  5639.      MN$ = "BTC  "
  5640.      Ev(10, 1)
  5641.    ;------------------------
  5642.    Case $BC
  5643.      MN$ = "BSF  "                         ;Gv, Ev
  5644.      Gv(10, 1)
  5645.    ;------------------------
  5646.    Case $BD
  5647.      Select PR
  5648.        Case $3636                          ;=$66
  5649.          If Mid(OP$, 4, 2) = "F3"
  5650.            MN$ = "LZCNT  "                 ;Gv, Ev    AMD only
  5651.            Gv(1, 1)      
  5652.          EndIf        
  5653.        Case $3346                          ;=$F3
  5654.          MN$ = "LZCNT  "                   ;Gv, Ev    AMD only
  5655.          Gv(10, 1)      
  5656.        Default
  5657.          MN$ = "BSR  "                     ;Gv, Ev
  5658.          Gv(10, 1)
  5659.      EndSelect
  5660.   ;------------------------
  5661.    Case $BE
  5662.      MN$ = "MOVSX  "                       ;Gv, Eb
  5663.      Gv(0, 1)
  5664.    ;------------------------
  5665.    Case $BF
  5666.      MN$ = "MOVSX  "                       ;Gv, Ew
  5667.      Gv(1, 1)
  5668.    ;------------------------
  5669.    Case $C0                                ;Eb, Gb
  5670.      MN$ = "XADD  "
  5671.      Komma = 1
  5672.      Eb(1)
  5673.    ;------------------------
  5674.    Case $C1                                ;Ev, Gv
  5675.      MN$ = "XADD  "
  5676.      Ev(10, 1)
  5677.    ;------------------------
  5678.    Case $C2
  5679.      XMM = 2 : Adr64 = 1
  5680.      Select PR
  5681.        Case $3636                          ;=$66
  5682.          MN$ = "CMPPD  " : S = 5           ;Vpd, Wpd, Ib   5=DQWord
  5683.        Case $3246                          ;=$F2
  5684.          MN$ = "CMPSD  " : S = 3           ;Vsd, Wsd, Ib   3=QWord
  5685.        Case $3346                          ;=$F3
  5686.          MN$ = "CMPSS  " : S = 2           ;Vss, Wss, Ib   2=DWord
  5687.        Default
  5688.          MN$ = "CMPPS  " : S = 5           ;Vps, Wps, Ib   5=DQWord
  5689.      EndSelect
  5690.      MemAdd64 = 1
  5691.      Gv(S, 2)
  5692.      Strings(1, 0)
  5693.      Value = Val(Mid(MN$, Len(MN$), 1))
  5694.      Reg$ = Mid(MN$, 7, Len(MN$) - 10) + ")"
  5695.      Select PR
  5696.        Case $3636                          ;=$66
  5697.          Select Value
  5698.            Case 0
  5699.              MN$ + "   ( = CMPEQPD " + Reg$        
  5700.            Case 1
  5701.              MN$ + "   ( = CMPLTPD " + Reg$
  5702.            Case 2
  5703.              MN$ + "   ( = CMPLEPD " + Reg$
  5704.            Case 3
  5705.              MN$ + "   ( = CMPUNORDPD " + Reg$        
  5706.            Case 4
  5707.              MN$ + "   ( = CMPNEQPD " + Reg$
  5708.            Case 5
  5709.              MN$ + "   ( = CMPNLTPD " + Reg$          
  5710.            Case 6
  5711.              MN$ + "   ( = CMPNLEPD " + Reg$
  5712.            Case 7
  5713.              MN$ + "   ( = CMPORDPD " + Reg$        
  5714.          EndSelect
  5715.        Case $3246                          ;=$F2
  5716.          Select Value
  5717.            Case 0
  5718.              MN$ + "   ( = CMPEQSD " + Reg$        
  5719.            Case 1
  5720.              MN$ + "   ( = CMPLTSD " + Reg$
  5721.            Case 2
  5722.              MN$ + "   ( = CMPLESD " + Reg$
  5723.            Case 3
  5724.              MN$ + "   ( = CMPUNORDSD " + Reg$        
  5725.            Case 4
  5726.              MN$ + "   ( = CMPNEQSD " + Reg$
  5727.            Case 5
  5728.              MN$ + "   ( = CMPNLTSD " + Reg$          
  5729.            Case 6
  5730.              MN$ + "   ( = CMPNLESD " + Reg$
  5731.            Case 7
  5732.              MN$ + "   ( = CMPORDSD " + Reg$        
  5733.          EndSelect
  5734.        Case $3346                          ;=$F3
  5735.          Select Value
  5736.            Case 0
  5737.              MN$ + "   ( = CMPEQSS " + Reg$        
  5738.            Case 1
  5739.              MN$ + "   ( = CMPLTSS " + Reg$
  5740.            Case 2
  5741.              MN$ + "   ( = CMPLESS " + Reg$
  5742.            Case 3
  5743.              MN$ + "   ( = CMPUNORDSS " + Reg$        
  5744.            Case 4
  5745.              MN$ + "   ( = CMPNEQSS " + Reg$
  5746.            Case 5
  5747.              MN$ + "   ( = CMPNLTSS " + Reg$          
  5748.            Case 6
  5749.              MN$ + "   ( = CMPNLESS " + Reg$
  5750.            Case 7
  5751.              MN$ + "   ( = CMPORDSS " + Reg$        
  5752.          EndSelect
  5753.        Default
  5754.          Select Value
  5755.            Case 0
  5756.              MN$ + "   ( = CMPEQPS " + Reg$        
  5757.            Case 1
  5758.              MN$ + "   ( = CMPLTPS " + Reg$
  5759.            Case 2
  5760.              MN$ + "   ( = CMPLEPS " + Reg$
  5761.            Case 3
  5762.              MN$ + "   ( = CMPUNORDPS " + Reg$        
  5763.            Case 4
  5764.              MN$ + "   ( = CMPNEQPS " + Reg$
  5765.            Case 5
  5766.              MN$ + "   ( = CMPNLTPS " + Reg$          
  5767.            Case 6
  5768.              MN$ + "   ( = CMPNLEPS " + Reg$
  5769.            Case 7
  5770.              MN$ + "   ( = CMPORDPS " + Reg$        
  5771.          EndSelect
  5772.      EndSelect
  5773.     ;------------------------
  5774.    Case $C3                                ;Md, Gd
  5775.      MN$ = "MOVNTI  "
  5776.      If REX & %00001000
  5777.        S = 3                               ;QWord
  5778.       Else
  5779.        S = 2                               ;DWord
  5780.      EndIf
  5781.      Ev(S, 1)
  5782.    ;------------------------
  5783.    Case $C4
  5784.      MN$ = "PINSRW  "
  5785.      Adr64 = 1
  5786.      Select PR
  5787.        Case $3636                          ;=$66
  5788.          XMM = 4                           ;Vdq, Mw, Ib
  5789.        Default
  5790.          XMM = 3                           ;Pq, Mw, Ib
  5791.      EndSelect
  5792.      Gv(1, 2)
  5793.      Strings(1, 0)
  5794.    ;------------------------
  5795.    Case $C5
  5796.      MN$ = "PEXTRW  "
  5797.      Adr64 = 1
  5798.      Select PR
  5799.        Case $3636                          ;=$66
  5800.          XMM = 5                           ;Gd, Udq, Ib
  5801.        Default
  5802.          XMM = 6                           ;Gd, Nq, Ib
  5803.      EndSelect
  5804.      Gv(2, 2)
  5805.      Strings(1, 0)
  5806.    ;------------------------
  5807.    Case $C6
  5808.      XMM = 2 : Adr64 = 1
  5809.      Select PR
  5810.        Case $3636                          ;=$66
  5811.          MN$ = "SHUFPD  "                  ;Vpd, Wpd, Ib
  5812.        Default
  5813.          MN$ = "SHUFPS  "                  ;Vps, Wps, Ib
  5814.      EndSelect
  5815.      Gv(5, 2)                              ;5=DQWord
  5816.      Strings(1, 0)
  5817.    ;------------------------
  5818.    Case $C7                                ;Gruppe 9
  5819.      OP = PeekB(Buffer + BZ) & $FF
  5820.      OP$ + RSet(Hex(OP), 2, "0") + " "
  5821.      BZ + 1
  5822.      RM = (OP & %00111000) >> 3            ;reg/opcode für Befehl
  5823.      Select RM
  5824.        Case 0
  5825.          NoCode = 1
  5826.        Case 1
  5827.          If REX & %00001000                ;REX.W
  5828.            MN$ = "CMPXCHG16B dqword ptr [ "     ;Mdq          
  5829.           Else
  5830.            MN$ = "CMPXCHG8B qword ptr [ "  ;Mq
  5831.          EndIf
  5832.        Case 2 To 5
  5833.          NoCode = 1
  5834.        Case 6
  5835.          Select PR
  5836.            Case $3636                      ;=$66
  5837.              MN$ = "VMCLEAR qword ptr [ "  ;Mq
  5838.            Case $3346                      ;=$F3
  5839.              MN$ = "VMXON qword ptr [ "    ;Mq
  5840.            Default
  5841.              MN$ = "VMPTRLD qword ptr [ "  ;Mq
  5842.          EndSelect
  5843.        Case 7
  5844.          MN$ = "VMPTRST qword ptr [ "      ;Mq
  5845.      EndSelect
  5846.      If NoCode = 0    
  5847.        Adr = 1
  5848.        Strings(4, 2)
  5849.      EndIf
  5850.    ;------------------------
  5851.    Case $C8 To $CF
  5852.      MN$ = "BSWAP  "
  5853.      Register32(OP, 0)
  5854.    ;------------------------
  5855.    Case $D0
  5856.      XMM = 2
  5857.      Select PR
  5858.        Case $3636                          ;=$66
  5859.          MN$ = "ADDSUBPD  "                ;Vpd, Wpd   5=DQWord
  5860.        Case $3246                          ;=$F2
  5861.          MN$ = "ADDSUBPS  "                ;Vps, Wps   5=DQWord
  5862.      EndSelect
  5863.      Gv(5, 1)
  5864.    ;------------------------
  5865.    Case $D1 To $D5
  5866.      Select OP
  5867.        Case $D1
  5868.          MN$ = "PSRLW  "
  5869.        Case $D2
  5870.          MN$ = "PSRLD  "
  5871.        Case $D3
  5872.          MN$ = "PSRLQ  "
  5873.        Case $D4
  5874.          MN$ = "PADDQ  "
  5875.        Case $D5
  5876.          MN$ = "PMULLW  "
  5877.      EndSelect
  5878.      Select PR
  5879.        Case $3636                          ;=$66
  5880.          XMM = 2 : S = 5                   ;Vdq, Wdq
  5881.        Default
  5882.          XMM = 1 : S = 3                   ;Pq, Qq
  5883.      EndSelect
  5884.      Gv(S, 1)
  5885.    ;------------------------
  5886.    Case $D6
  5887.      Select PR
  5888.        Case $3636                          ;=$66
  5889.          XMM = 2
  5890.          MN$ = "MOVQ  "                    ;Wq, Vq
  5891.          Ev(3, 1)
  5892.        Case $3246                          ;=$F2
  5893.          MN$ = "MOVDQ2Q  "                 ;Pq, Uq    ;XMM in MMX nur Register
  5894.          XMM = 8
  5895.          Gv(3, 1)
  5896.        Case $3346                          ;=$F3
  5897.          MN$ = "MOVQ2DQ  "                 ;Vdq, Nq   ;MMX in XMM nur Register
  5898.          XMM = 7
  5899.          Gv(3, 1)
  5900.      EndSelect
  5901.    ;------------------------
  5902.    Case $D7
  5903.      MN$ = "PMOVMSKB  "
  5904.      Select PR
  5905.        Case $3636                          ;=$66
  5906.          XMM = 5                           ;Gd, Udq
  5907.        Default
  5908.          XMM = 6                           ;Gd, Nq
  5909.      EndSelect
  5910.      Gv(2, 1)
  5911.    ;------------------------
  5912.    Case $D8 To $E5
  5913.      Select OP
  5914.        Case $D8
  5915.          MN$ = "PSUBUSB  "
  5916.        Case $D9
  5917.          MN$ = "PSUBUSW  "
  5918.        Case $DA
  5919.          MN$ = "PMINUB  "
  5920.        Case $DB
  5921.          MN$ = "PAND  "
  5922.        Case $DC
  5923.          MN$ = "PADDUSB  "
  5924.        Case $DD
  5925.          MN$ = "PADDUSW  "
  5926.        Case $DE
  5927.          MN$ = "PMAXUB  "
  5928.        Case $DF
  5929.          MN$ = "PANDN  "
  5930.        Case $E0
  5931.          MN$ = "PAVGB  "
  5932.        Case $E1
  5933.          MN$ = "PSRAW  "
  5934.        Case $E2
  5935.          MN$ = "PSRAD  "
  5936.        Case $E3
  5937.          MN$ = "PAVGW  "
  5938.        Case $E4
  5939.          MN$ = "PMULHUW  "
  5940.        Case $E5
  5941.          MN$ = "PMULHW  "
  5942.      EndSelect
  5943.      Select PR
  5944.        Case $3636                          ;=$66
  5945.          XMM = 2 : S = 5                   ;Vdq, Wdq
  5946.        Default
  5947.          XMM = 1 : S = 3                   ;Pq, Qq
  5948.      EndSelect
  5949.      Gv(S, 1)
  5950.    ;------------------------
  5951.    Case $E6
  5952.      XMM = 2
  5953.      Select PR
  5954.        Case $3636                          ;=$66
  5955.          MN$ = "CVTTPD2DQ  "               ;Vdq, Wpd
  5956.          S = 5
  5957.        Case $3246                          ;=$F2
  5958.          MN$ = "CVTPD2DQ  "                ;Vdq, Wpd
  5959.          S = 5
  5960.        Case $3346                          ;=$F3
  5961.          MN$ = "CVTDQ2PD  "                ;Vpd, Wdq
  5962.          S = 3
  5963.      EndSelect
  5964.      Gv(S, 1)                              ;5=DQWord
  5965.    ;------------------------
  5966.    Case $E7
  5967.      Select PR
  5968.        Case $3636                          ;=$66
  5969.          MN$ = "MOVNTDQ  "                 ;Mdq, Vdq
  5970.          XMM = 2 : S = 5
  5971.         Default
  5972.          MN$ = "MOVNTQ  "                  ;Mq, Pq
  5973.          XMM = 1 : S = 3
  5974.      EndSelect
  5975.      Ev(S, 1)
  5976.    ;------------------------
  5977.    Case $E8 To $EF
  5978.      Select OP
  5979.        Case $E8
  5980.          MN$ = "PSUBSB  "
  5981.        Case $E9
  5982.          MN$ = "PSUBSW  "
  5983.        Case $EA
  5984.          MN$ = "PMINSW  "
  5985.        Case $EB
  5986.          MN$ = "POR  "
  5987.        Case $EC
  5988.          MN$ = "PADDSB  "
  5989.        Case $ED
  5990.          MN$ = "PADDSW  "
  5991.        Case $EE
  5992.          MN$ = "PMAXSW  "
  5993.        Case $EF
  5994.          MN$ = "PXOR  "
  5995.      EndSelect
  5996.      Select PR
  5997.        Case $3636                          ;=$66
  5998.          XMM = 2 : S = 5                   ;Vdq, Wdq
  5999.        Default
  6000.          XMM = 1 : S = 3                   ;Pq, Qq
  6001.      EndSelect
  6002.      Gv(S, 1)
  6003.    ;------------------------
  6004.    Case $F0
  6005.      XMM = 2
  6006.      Select PR
  6007.        Case $3246                          ;=$F2
  6008.          MN$ = "LDDQU  "                   ;Vdq, Mdq
  6009.      EndSelect
  6010.      Gv(5, 1)
  6011.    ;------------------------
  6012.    Case $F1 To $F6
  6013.      Select OP
  6014.        Case $F1
  6015.          MN$ = "PSLLW  "
  6016.        Case $F2
  6017.          MN$ = "PSLLD  "
  6018.        Case $F3
  6019.          MN$ = "PSLLQ  "
  6020.        Case $F4
  6021.          MN$ = "PMULUDQ  "
  6022.        Case $F5
  6023.          MN$ = "PMADDWD  "
  6024.        Case $F6
  6025.          MN$ = "PSADBW  "
  6026.      EndSelect
  6027.      Select PR
  6028.        Case $3636                          ;=$66
  6029.          XMM = 2 : S = 5                   ;Vdq, Wdq
  6030.        Default
  6031.          XMM = 1 : S = 3                   ;Pq, Qq
  6032.      EndSelect
  6033.      Gv(S, 1)
  6034.    ;------------------------
  6035.    Case $F7
  6036.      Select PR
  6037.        Case $3636                          ;=$66
  6038.          MN$ = "MASKMOVDQU  "
  6039.          XMM = 2 : S = 5                   ;Vdq, Udq
  6040.        Default
  6041.          MN$ = "MASKMOVQ  "
  6042.          XMM = 1 : S = 3                   ;Pq, Nq
  6043.      EndSelect
  6044.      Gv(S, 1)
  6045.    ;------------------------
  6046.    Case $F8 To $FE
  6047.      Select OP
  6048.        Case $F8
  6049.          MN$ = "PSUBB  "
  6050.        Case $F9
  6051.          MN$ = "PSUBW  "
  6052.        Case $FA
  6053.          MN$ = "PSUBD  "
  6054.        Case $FB
  6055.          MN$ = "PSUBQ  "
  6056.        Case $FC
  6057.          MN$ = "PADDB  "
  6058.        Case $FD
  6059.          MN$ = "PADDW  "
  6060.        Case $FE
  6061.          MN$ = "PADDD  "
  6062.      EndSelect
  6063.      Select PR
  6064.        Case $3636                          ;=$66
  6065.          XMM = 2 : S = 5                   ;Vdq, Wdq
  6066.        Default
  6067.          XMM = 1 : S = 3                   ;Pq, Qq
  6068.      EndSelect
  6069.      Gv(S, 1)
  6070.    ;------------------------
  6071.    Case $FF
  6072.      NoCode = 1
  6073.  
  6074.  EndSelect
  6075. EndProcedure
  6076.  
  6077. Procedure Codes()                           ;Section mit ausführbarem Code
  6078.  If Bin = 0                                ;PE-Program on HD
  6079.    SRVA  = I_S_H\VirtualAddress            ;rel.virt.Adresse Section
  6080.    SL    = I_S_H\SizeOfRawData             ;Section-Länge
  6081.    SO    = I_S_H\PointerToRawData          ;Section-Offset innerhalb der Datei
  6082.    SF    = I_S_H\Characteristics           ;Section-Flags
  6083.    SE    = SO + SL                         ;Section-End-Adresse
  6084.    OS    = IB + SRVA                       ;Offset Section
  6085.    SECN$ = Mid(I_S_H\Name, 1, 8)           ;zur Sicherheit, da nicht zwangsläufig null-terminiert
  6086.    Daten(Zeile)\Opcode = "Begin Section" + Str(SZ) + ", Name: " + UCase(SECN$) + ", executable Code"
  6087.    Zeile + 1      
  6088.   ElseIf Bin = 1                           ;Non-PE-Program on HD
  6089.    ReadFile(0, File$)
  6090.    SL = Lof(0)
  6091.    CloseFile(0)
  6092.    SE = SL
  6093.    OS = BaseAdr  
  6094.    SRVA = BaseAdr    
  6095.    Dim Daten.Item(SL)                      ;nicht kleiner!
  6096.   ElseIf Bin = 2                           ;Program in Memory
  6097.    SL = EndAdr - BaseAdr    
  6098.    LF = SL                                 ;für Fortschritts-Balken
  6099.    SE = SL
  6100.    OS = BaseAdr  
  6101.    SRVA = BaseAdr  
  6102.    Dim Daten.Item(SL)                      ;nicht kleiner!
  6103.  EndIf
  6104.  
  6105.  BZ = SO                                   ;Zeiger in Buffer
  6106.  
  6107.  Repeat
  6108.    If BZ >= SE
  6109.      If FileExt = 0
  6110.        Daten(Zeile)\Opcode = "                  E n d   S e c t i o n " + Str(SZ) + "    " + UCase(SECN$)
  6111.      EndIf
  6112.      Zeile + 1
  6113.      Break
  6114.    EndIf
  6115.  
  6116.    If PEP                                  ;PEP hier auch als Merker "missbraucht"
  6117.      If BZ + OS - SO = PEP + IB
  6118.        PEP = 0
  6119.        ZeilePEP = Zeile                    ;PEP-Zeile wird grün markiert
  6120.      EndIf
  6121.    EndIf
  6122.  
  6123.    While DLL                               ;es können auch mehrere Funktionen auf ein und die selbe Adresse zeigen
  6124.      DLLAdr$ = "$" + Mid(ArrayAdr(ZDLL), 1, Adr3264)
  6125.      DLLAdr = Val(DLLAdr$)
  6126.      If BZ + OS - SO = DLLAdr
  6127.        DLLEntry + 1
  6128.        ZDLL + 1
  6129.        If ZDLL = NOF + 1
  6130.          DLL = 0
  6131.        EndIf  
  6132.       Else
  6133.        Break
  6134.      EndIf
  6135.    Wend
  6136.  
  6137.    If OV                                   ;wirkt auch für Segment-Override!
  6138.      OP = PeekB(Buffer + BZ) & $FF         ;Opcode Byte für Byte einlesen
  6139.      OP$ + RSet(Hex(OP), 2, "0") + " "
  6140.      BZ + 1
  6141.      OV = 0
  6142.     Else
  6143.      OP$ = ""
  6144.      OP = PeekB(Buffer + BZ) & $FF         ;Opcode Byte für Byte einlesen
  6145.      OP$ + RSet(Hex(OP), 2, "0") + " "
  6146.      Daten(Zeile)\Address = "$" + RSet(Hex(BZ + OS - SO), Adr3264, "0")
  6147.      BZ + 1                                ;Adresse nächstes Byte in Speicher-Datei
  6148.    EndIf
  6149.    ;------------------------------------------------------------------------------------
  6150.    Select OP                               ;Sortierung nach zu erwartender Aufruf-Häufigkeit brachte nicht die Bohne
  6151.      ;----------------------
  6152.      Case $00                              ;Eb, Gb
  6153.        SOS = BZ - 1
  6154.       &n