Advertisement
Guest User

Untitled

a guest
Mar 13th, 2014
420
0
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.        MN$ = "ADD  "
  6155.        Komma = 1
  6156.        Eb(1)
  6157.        If (PeekB(Buffer + BZ) & $FF = $00) And (PeekW(Buffer + BZ - 2) & $FFFF = $0000)
  6158.          OP$ + "00 "
  6159.          BZ + 1
  6160.          ;für Füll-Nullen
  6161.          MN$ = ""
  6162.          While (BZ < SE) And (PeekB(Buffer + BZ) & $FF = $00)
  6163.            BZ + 1
  6164.            OP$ + "00 "
  6165.            If Len(OP$) > 45                ;max. 16 Null-Bytes + Leerzeichen dazwischen
  6166.              Daten(Zeile)\Address = "$" + RSet(Hex(BZ + OS - SO - 16), Adr3264, "0")
  6167.              Daten(Zeile)\Opcode = OP$
  6168.              Zeile + 1
  6169.              OP$ = ""
  6170.              SOS = BZ
  6171.            EndIf
  6172.          Wend
  6173.          If OP$ <> ""
  6174.            Daten(Zeile)\Address = "$" + RSet(Hex(SOS + OS - SO), Adr3264, "0")            
  6175.          EndIf
  6176.        EndIf
  6177.      ;----------------------
  6178.      Case $01                              ;Ev, Gv
  6179.        MN$ = "ADD  "
  6180.        Ev(10, 1)
  6181.      ;----------------------
  6182.      Case $02                              ;Gb, Eb
  6183.        MN$ = "ADD  "
  6184.        Komma = 1
  6185.        Gb()
  6186.      ;----------------------
  6187.      Case $03                              ;Gv, Ev
  6188.        MN$ = "ADD  "
  6189.        Gv(10, 1)
  6190.      ;----------------------
  6191.      Case $04                              ;AL, Ib
  6192.        MN$ = "ADD  AL , "
  6193.        Strings(1, 0)
  6194.      ;----------------------
  6195.      Case $05                              ;rAX, Iz
  6196.        If Mid(OP$, 1, 2) = "66"
  6197.          MN$ = "ADD  AX , "
  6198.          Strings(2, 0)
  6199.         Else
  6200.          If REX & %00001000
  6201.            MN$ = "ADD  RAX , "
  6202.            H = PeekB(Buffer + BZ + 3) & $FF
  6203.            If H < $80                      ;Feinheit! sign-extended
  6204.              MN$ + "00 00 00 00 "
  6205.             Else
  6206.              MN$ + "FF FF FF FF "
  6207.            EndIf
  6208.            Strings(4, 0)
  6209.           Else
  6210.            MN$ = "ADD  EAX , "
  6211.            Strings(4, 0)                   ;4 auch für RAX richtig!
  6212.          EndIf
  6213.        EndIf
  6214.      ;----------------------
  6215.      Case $06
  6216.        If IsProg64
  6217.          MN$ = No64$
  6218.         Else
  6219.          MN$ = "PUSH  ES"
  6220.        EndIf
  6221.      ;----------------------
  6222.      Case $07
  6223.        If IsProg64
  6224.          MN$ = No64$
  6225.         Else
  6226.          MN$ = "POP  ES"
  6227.        EndIf
  6228.      ;----------------------
  6229.      Case $08                              ;Eb, Gb
  6230.        MN$ = "OR  "
  6231.        Komma = 1
  6232.        Eb(1)
  6233.      ;----------------------
  6234.      Case $09                              ;Ev, Gv
  6235.        MN$ = "OR  "
  6236.        Ev(10, 1)
  6237.      ;----------------------
  6238.      Case $0A                              ;Gb, Eb
  6239.        MN$ = "OR  "
  6240.        Komma = 1
  6241.        Gb()
  6242.      ;----------------------
  6243.      Case $0B                              ;Gv, Ev
  6244.        MN$ = "OR  "
  6245.        Gv(10, 1)
  6246.      ;----------------------
  6247.      Case $0C                              ;AL, Ib
  6248.        MN$ = "OR  AL , "
  6249.        Strings(1, 0)
  6250.      ;----------------------
  6251.      Case $0D                              ;rAX, Iz
  6252.        If Mid(OP$, 1, 2) = "66"
  6253.          MN$ = "OR  AX , "
  6254.          Strings(2, 0)
  6255.         Else
  6256.          If REX & %00001000
  6257.            MN$ = "OR  RAX , "
  6258.            H = PeekB(Buffer + BZ + 3) & $FF
  6259.            If H < $80                      ;Feinheit! sign-extended
  6260.              MN$ + "00 00 00 00 "
  6261.             Else
  6262.              MN$ + "FF FF FF FF "
  6263.            EndIf
  6264.            Strings(4, 0)
  6265.           Else
  6266.            MN$ = "OR  EAX , "
  6267.            Strings(4, 0)                   ;4 auch für RAX richtig!
  6268.          EndIf
  6269.        EndIf
  6270.      ;----------------------
  6271.      Case $0E
  6272.        If IsProg64
  6273.          MN$ = No64$
  6274.         Else
  6275.          MN$ = "PUSH  CS"
  6276.        EndIf      
  6277.      ;----------------------
  6278.      Case $0F                              ;Shift-Byte (1.Byte=0Fh)
  6279.        Codes_Shift()
  6280.      ;----------------------
  6281.      Case $10                              ;Eb, Gb
  6282.        MN$ = "ADC  "
  6283.        Komma = 1
  6284.        Eb(1)
  6285.      ;----------------------
  6286.      Case $11                              ;Ev, Gv
  6287.        MN$ = "ADC  "
  6288.        Ev(10, 1)
  6289.      ;----------------------
  6290.      Case $12                              ;Gb, Eb
  6291.        MN$ = "ADC  "
  6292.        Komma = 1
  6293.        Gb()
  6294.      ;----------------------
  6295.      Case $13                              ;Gv, Ev
  6296.        MN$ = "ADC  "
  6297.        Gv(10, 1)
  6298.      ;----------------------
  6299.      Case $14                              ;AL, Ib
  6300.        MN$ = "ADC  AL , "
  6301.        Strings(1, 0)
  6302.      ;----------------------
  6303.      Case $15                              ;rAX, Iz
  6304.        If Mid(OP$, 1, 2) = "66"
  6305.          MN$ = "ADC  AX , "
  6306.          Strings(2, 0)
  6307.         Else
  6308.          If REX & %00001000
  6309.            MN$ = "ADC  RAX , "
  6310.            H = PeekB(Buffer + BZ + 3) & $FF
  6311.            If H < $80                      ;Feinheit! sign-extended
  6312.              MN$ + "00 00 00 00 "
  6313.             Else
  6314.              MN$ + "FF FF FF FF "
  6315.            EndIf
  6316.            Strings(4, 0)
  6317.           Else
  6318.            MN$ = "ADC  EAX , "
  6319.            Strings(4, 0)                   ;4 auch für RAX richtig!
  6320.          EndIf
  6321.        EndIf
  6322.      ;----------------------
  6323.      Case $16
  6324.        If IsProg64
  6325.          MN$ = No64$
  6326.         Else
  6327.          MN$ = "PUSH  SS"
  6328.        EndIf      
  6329.      ;----------------------
  6330.      Case $17
  6331.        If IsProg64
  6332.          MN$ = No64$
  6333.         Else
  6334.          MN$ = "POP  SS"
  6335.        EndIf      
  6336.      ;----------------------
  6337.      Case $18                              ;Eb, Gb
  6338.        MN$ = "SBB  "
  6339.        Komma = 1
  6340.        Eb(1)
  6341.      ;----------------------
  6342.      Case $19                              ;Ev, Gv
  6343.        MN$ = "SBB  "
  6344.        Ev(10, 1)
  6345.      ;----------------------
  6346.      Case $1A                              ;Gb, Eb
  6347.        MN$ = "SBB  "
  6348.        Komma = 1
  6349.        Gb()
  6350.      ;----------------------
  6351.      Case $1B                              ;Gv, Ev
  6352.        MN$ = "SBB  "
  6353.        Gv(10, 1)
  6354.      ;----------------------
  6355.      Case $1C                              ;AL, Ib
  6356.        MN$ = "SBB  AL , "
  6357.        Strings(1, 0)
  6358.      ;----------------------
  6359.      Case $1D                              ;rAX, Iz
  6360.        If Mid(OP$, 1, 2) = "66"
  6361.          MN$ = "SBB  AX , "
  6362.          Strings(2, 0)
  6363.         Else
  6364.          If REX & %00001000
  6365.            MN$ = "SBB  RAX , "
  6366.            H = PeekB(Buffer + BZ + 3) & $FF
  6367.            If H < $80                      ;Feinheit! sign-extended
  6368.              MN$ + "00 00 00 00 "
  6369.             Else
  6370.              MN$ + "FF FF FF FF "
  6371.            EndIf
  6372.            Strings(4, 0)
  6373.           Else
  6374.            MN$ = "SBB  EAX , "
  6375.            Strings(4, 0)                   ;4 auch für RAX richtig!
  6376.          EndIf
  6377.        EndIf
  6378.      ;----------------------
  6379.      Case $1E
  6380.        If IsProg64
  6381.          MN$ = No64$
  6382.         Else
  6383.          MN$ = "PUSH  DS"
  6384.        EndIf    
  6385.      ;----------------------
  6386.      Case $1F
  6387.        If IsProg64
  6388.          MN$ = No64$
  6389.         Else
  6390.          MN$ = "POP  DS"
  6391.        EndIf
  6392.      ;----------------------
  6393.      Case $20                              ;Eb, Gb
  6394.        MN$ = "AND  "
  6395.        Komma = 1
  6396.        Eb(1)
  6397.      ;----------------------
  6398.      Case $21                              ;Ev, Gv
  6399.        MN$ = "AND  "
  6400.        Ev(10, 1)
  6401.      ;----------------------
  6402.      Case $22                              ;Gb, Eb
  6403.        MN$ = "AND  "
  6404.        Komma = 1
  6405.        Gb()
  6406.      ;----------------------
  6407.      Case $23                              ;Gv, Ev
  6408.        MN$ = "AND  "
  6409.        Gv(10, 1)
  6410.      ;----------------------
  6411.      Case $24                              ;AL, Ib
  6412.        MN$ = "AND  AL , "
  6413.        Strings(1, 0)
  6414.      ;----------------------
  6415.      Case $25                              ;rAX, Iz
  6416.        If Mid(OP$, 1, 2) = "66"
  6417.          MN$ = "AND  AX , "
  6418.          Strings(2, 0)
  6419.         Else
  6420.          If REX & %00001000
  6421.            MN$ = "AND  RAX , "
  6422.            H = PeekB(Buffer + BZ + 3) & $FF
  6423.            If H < $80                      ;Feinheit! sign-extended
  6424.              MN$ + "00 00 00 00 "
  6425.             Else
  6426.              MN$ + "FF FF FF FF "
  6427.            EndIf
  6428.            Strings(4, 0)
  6429.           Else
  6430.            MN$ = "AND  EAX , "
  6431.            Strings(4, 0)                   ;4 auch für RAX richtig!
  6432.          EndIf
  6433.        EndIf
  6434.      ;----------------------
  6435.      Case $26                              ;zeigt in ES:
  6436.        OV = 1 : ESS = 1
  6437.      ;----------------------
  6438.      Case $27
  6439.        If IsProg64
  6440.          MN$ = No64$
  6441.         Else
  6442.          MN$ = "DAA "
  6443.        EndIf
  6444.      ;----------------------
  6445.      Case $28                              ;Eb, Gb
  6446.        MN$ = "SUB  "
  6447.        Komma = 1
  6448.        Eb(1)
  6449.      ;----------------------
  6450.      Case $29                              ;Ev, Gv
  6451.        MN$ = "SUB  "
  6452.        Ev(10, 1)
  6453.      ;----------------------
  6454.      Case $2A                              ;Gb, Eb
  6455.        MN$ = "SUB  "
  6456.        Komma = 1
  6457.        Gb()
  6458.      ;----------------------
  6459.      Case $2B                              ;Gv, Ev
  6460.        MN$ = "SUB  "
  6461.        Gv(10, 1)
  6462.      ;----------------------
  6463.      Case $2C                              ;AL, Ib
  6464.        MN$ = "SUB  AL , "
  6465.        Strings(1, 0)
  6466.      ;----------------------
  6467.      Case $2D                              ;rAX, Iz
  6468.        If Mid(OP$, 1, 2) = "66"
  6469.          MN$ = "SUB  AX , "
  6470.          Strings(2, 0)
  6471.         Else
  6472.          If REX & %00001000
  6473.            MN$ = "SUB  RAX , "
  6474.            H = PeekB(Buffer + BZ + 3) & $FF
  6475.            If H < $80                      ;Feinheit! sign-extended
  6476.              MN$ + "00 00 00 00 "
  6477.             Else
  6478.              MN$ + "FF FF FF FF "
  6479.            EndIf
  6480.            Strings(4, 0)
  6481.           Else
  6482.            MN$ = "SUB  EAX , "
  6483.            Strings(4, 0)                   ;4 auch für RAX richtig!
  6484.          EndIf
  6485.        EndIf
  6486.      ;----------------------
  6487.      Case $2E                              ;zeigt in CS: oder Branch Hint bei bedingtem Sprung
  6488.        OV = 1 : CSS = 1
  6489.      ;----------------------
  6490.      Case $2F
  6491.        If IsProg64
  6492.          MN$ = No64$
  6493.         Else
  6494.          MN$ = "DAS "
  6495.        EndIf
  6496.      ;----------------------
  6497.      Case $30                              ;Eb, Gb
  6498.        MN$ = "XOR  "
  6499.        Komma = 1
  6500.        Eb(1)
  6501.      ;----------------------
  6502.      Case $31                              ;Ev, Gv
  6503.        MN$ = "XOR  "
  6504.        Ev(10, 1)
  6505.      ;----------------------
  6506.      Case $32                              ;Gb, Eb
  6507.        MN$ = "XOR  "
  6508.        Komma = 1
  6509.        Gb()
  6510.      ;----------------------
  6511.      Case $33                              ;Gv, Ev
  6512.        MN$ = "XOR  "
  6513.        Gv(10, 1)
  6514.      ;----------------------
  6515.      Case $34                              ;AL, Ib
  6516.        MN$ = "XOR  AL , "
  6517.        Strings(1, 0)
  6518.      ;----------------------
  6519.      Case $35                              ;rAX, Iz
  6520.        If Mid(OP$, 1, 2) = "66"
  6521.          MN$ = "XOR  AX , "
  6522.          Strings(2, 0)
  6523.         Else
  6524.          If REX & %00001000
  6525.            MN$ = "XOR  RAX , "
  6526.            H = PeekB(Buffer + BZ + 3) & $FF
  6527.            If H < $80                      ;Feinheit! sign-extended
  6528.              MN$ + "00 00 00 00 "
  6529.             Else
  6530.              MN$ + "FF FF FF FF "
  6531.            EndIf
  6532.            Strings(4, 0)
  6533.           Else
  6534.            MN$ = "XOR  EAX , "
  6535.            Strings(4, 0)                   ;4 auch für RAX richtig!
  6536.          EndIf
  6537.        EndIf
  6538.      ;----------------------
  6539.      Case $36                              ;zeigt in SS:
  6540.        OV = 1 : SSS = 1
  6541.      ;----------------------
  6542.      Case $37
  6543.        If IsProg64
  6544.          MN$ = No64$
  6545.         Else
  6546.          MN$ = "AAA "
  6547.        EndIf
  6548.      ;----------------------
  6549.      Case $38                              ;Eb, Gb
  6550.        MN$ = "CMP  "
  6551.        Komma = 1
  6552.        Eb(1)
  6553.      ;----------------------
  6554.      Case $39                              ;Ev, Gv
  6555.        MN$ = "CMP  "
  6556.        Ev(10, 1)
  6557.      ;----------------------
  6558.      Case $3A                              ;Gb, Eb
  6559.        MN$ = "CMP  "
  6560.        Komma = 1
  6561.        Gb()
  6562.      ;----------------------
  6563.      Case $3B                              ;Gv, Ev
  6564.        MN$ = "CMP  "
  6565.        Gv(10, 1)
  6566.      ;----------------------
  6567.      Case $3C                              ;AL, Ib
  6568.        MN$ = "CMP  AL , "
  6569.        Strings(1, 0)
  6570.      ;----------------------
  6571.      Case $3D                              ;rAX, Iz
  6572.        If Mid(OP$, 1, 2) = "66"
  6573.          MN$ = "CMP  AX , "
  6574.          Strings(2, 0)
  6575.         Else
  6576.          If REX & %00001000
  6577.            MN$ = "CMP  RAX , "
  6578.            H = PeekB(Buffer + BZ + 3) & $FF
  6579.            If H < $80                      ;Feinheit! sign-extended
  6580.              MN$ + "00 00 00 00 "
  6581.             Else
  6582.              MN$ + "FF FF FF FF "
  6583.            EndIf
  6584.            Strings(4, 0)
  6585.           Else
  6586.            MN$ = "CMP  EAX , "
  6587.            Strings(4, 0)                   ;4 auch für RAX richtig!
  6588.          EndIf
  6589.        EndIf
  6590.      ;----------------------
  6591.      Case $3E                              ;zeigt in DS: oder Branch Hint bei bedingtem Sprung
  6592.        OV = 1 : DSS = 1
  6593.      ;----------------------
  6594.      Case $3F
  6595.        If IsProg64
  6596.          MN$ = No64$
  6597.         Else
  6598.          MN$ = "AAS "
  6599.        EndIf
  6600.      ;----------------------
  6601.      Case $40 To $47
  6602.        If IsProg64
  6603.          OV = 1 : REX = OP
  6604.         Else
  6605.          MN$ = "INC  "
  6606.          Register32(OP, 0)
  6607.        EndIf
  6608.      ;----------------------
  6609.      Case $48 To $4F
  6610.        If IsProg64
  6611.          OV = 1 : REX = OP                 ;Präfix 64-Bit
  6612.         Else
  6613.        MN$ = "DEC  "
  6614.        Register32(OP, 0)
  6615.      EndIf
  6616.      ;----------------------
  6617.      Case $50 To $57
  6618.        MN$ = "PUSH  "
  6619.        If IsProg64 And REX                 ;einige Klimmzüge für 64-Bit
  6620.          REXEX = 1
  6621.          REX << 2
  6622.          REX | %00001000    
  6623.         ElseIf IsProg64
  6624.          REX = $48
  6625.        EndIf        
  6626.        Register32(OP, 0)
  6627.      ;----------------------
  6628.      Case $58 To $5F
  6629.        MN$ = "POP  "
  6630.        If IsProg64 And REX
  6631.          REXEX = 1
  6632.          REX << 2
  6633.          REX | %00001000    
  6634.         ElseIf IsProg64
  6635.          REX = $48
  6636.        EndIf
  6637.        Register32(OP, 0)
  6638.      ;----------------------
  6639.      Case $60
  6640.        If IsProg64
  6641.          MN$ = No64$
  6642.         Else
  6643.          MN$ = "PUSHAD "
  6644.        EndIf
  6645.      ;----------------------
  6646.      Case $61
  6647.        If IsProg64
  6648.          MN$ = No64$
  6649.         Else
  6650.          MN$ = "POPAD "
  6651.        EndIf
  6652.      ;----------------------
  6653.      Case $62                              ;Gv, Ma
  6654.        If IsProg64
  6655.          MN$ = No64$
  6656.         Else
  6657.          MN$ = "BOUND  "
  6658.          Gv(2, 1)
  6659.        EndIf        
  6660.      ;----------------------
  6661.      Case $63                              ;Ew, Gw
  6662.        If REX & %00001000
  6663.          MN$ = "MOVSXD  "                  ;hier von Hand
  6664.          OP = PeekB(Buffer + BZ) & $FF
  6665.          If (OP & %11000000) <> %11000000
  6666.            Gv(2, 1)
  6667.           Else
  6668.            Komma = 1
  6669.            OP$ + RSet(Hex(OP), 2, "0") + " "
  6670.            BZ + 1
  6671.            VAR1 = OP >> 3
  6672.            VAR1 & %00000111
  6673.            VAR1 | ((REX & %00000100) << 1)        
  6674.            IsvonMSBytes = 1                ;"antäuschen"
  6675.            Register32(VAR1, 0)
  6676.            VAR1 = OP & %00000111
  6677.            VAR1 | (REX & %00000001) << 3
  6678.            REX = 0
  6679.            IsvonMSBytes = 1
  6680.            Register32(VAR1, 0)
  6681.          EndIf
  6682.         Else
  6683.          Komma = 1
  6684.          MN$ = "ARPL  "
  6685.          OP = PeekB(Buffer + BZ) & $FF
  6686.          OP$ + RSet(Hex(OP), 2, "0") + " "
  6687.          BZ + 1
  6688.          MSBytes(OP, 1)                    ;1=Word
  6689.          Register32(OP >> 3, 1)
  6690.        EndIf
  6691.      ;----------------------
  6692.      Case $64                              ;zeigt in FS:
  6693.        OV = 1 : FSS = 1
  6694.      ;----------------------
  6695.      Case $65                              ;zeigt in GS:
  6696.        OV = 1 : GSS = 1
  6697.      ;----------------------
  6698.      Case $66                              ;Operand Override, z.B. aus mov eax,[ebx] wird mov ax,[ebx]
  6699.        OV = 1
  6700.      ;----------------------
  6701.      Case $67                              ;Address Override, z.B. aus mov eax,[ebx] wird mov eax,[bx]
  6702.        OV = 1
  6703.      ;----------------------
  6704.      Case $68                              ;PUSH mit DWord-Konstante
  6705.        MN$ = "PUSH  "
  6706.        If IsProg64
  6707.          H = PeekB(Buffer + BZ + 3) & $FF
  6708.          If H < $80                        ;Feinheit! sign-extended
  6709.            MN$ + "00 00 00 00 "
  6710.           Else
  6711.            MN$ + "FF FF FF FF "
  6712.          EndIf
  6713.        EndIf      
  6714.        Strings(4, 0)
  6715.        ;Versuch, Strings aufzulösen
  6716.        SPZ = PeekL(Buffer + BZ - 4)
  6717.        If SPZ >= ProgA And SPZ < ProgE
  6718.          SPZ - IB
  6719.          k = 0
  6720.          For n = 1 To ANS
  6721.            CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  6722.            XRVA = I_S_H\VirtualAddress
  6723.            X = XRVA + I_S_H\SizeOfRawData  ;+ Länge der Section
  6724.            If SPZ < X                      ;SPZ in dieser Section ?
  6725.              SPZ - XRVA + I_S_H\PointerToRawData     ;+ Offset dieser Section
  6726.              If SPZ > LF Or SPZ < 0        ;Null wegen signed
  6727.                Break
  6728.              EndIf
  6729.              XF = I_S_H\Characteristics    ;Flags ermitteln
  6730.              If (XF & #IMAGE_SCN_MEM_EXECUTE = 0) And (SPZ >= SO)   ;Test, ob Section ausführbar oder nicht
  6731.                Info$ = PeekS(Buffer + SPZ, $FF)
  6732.                If Info$ <> ""
  6733.                  MN$ + "  (" + Chr(34) + Info$ + Chr(34) + ")"
  6734.                EndIf
  6735.              EndIf
  6736.              Break
  6737.            EndIf
  6738.            k + #IMAGE_SIZEOF_SECTION_HEADER
  6739.          Next
  6740.        EndIf
  6741.      ;----------------------
  6742.      Case $69                              ;Gv, Ev, Iz
  6743.        MN$ = "IMUL  "
  6744.        Komma = 2
  6745.        OP = PeekB(Buffer + BZ) & $FF
  6746.        OP$ + RSet(Hex(OP), 2, "0") + " "
  6747.        BZ + 1
  6748.        VAR1 = OP >> 3
  6749.        VAR1 & %00000111
  6750.        If REX
  6751.          VAR1 | (REX & %00000100) << 1
  6752.          IsvonMSBytes = 1
  6753.        EndIf
  6754.        Register32(VAR1, 0)
  6755.        If (OP >> 6) <> 3                   ;also nicht Register-Register
  6756.          If REX & %00001000
  6757.            S = 3                           ;QWord
  6758.           Else
  6759.            S = 2                           ;DWord
  6760.          EndIf
  6761.          MemAdd64 = 4
  6762.          MSBytes(OP, S)
  6763.         Else
  6764.          VAR1 = OP
  6765.          VAR1 & %00000111
  6766.          If REX
  6767.            VAR1 | (REX & %00000001) << 3
  6768.          EndIf
  6769.          IsvonMSBytes = 1
  6770.          Register32(VAR1, 0)
  6771.        EndIf
  6772.        Strings(4, 0)                       ;4-Byte-Konstante
  6773.      ;----------------------
  6774.      Case $6A                              ;PUSH mit Byte-Konstante, wird auf D/Q-Word aufgefüllt
  6775.        MN$ = "PUSH  "
  6776.        OP = PeekB(Buffer + BZ) & $FF
  6777.        OP$ + RSet(Hex(OP), 2, "0") + " "
  6778.        H = PeekB(Buffer + BZ) & $FF
  6779.        If H < $80                          ;Feinheit! sign-extended
  6780.          If Mid(OP$, 1, 2) = "66"
  6781.            H$ = "00 "
  6782.           Else
  6783.            H$ = "00 00 00 "
  6784.            If IsProg64
  6785.              H$ + "00 00 00 00 "
  6786.            EndIf
  6787.          EndIf
  6788.         Else
  6789.          If Mid(OP$, 1, 2) = "66"
  6790.            H$ = "FF "
  6791.           Else
  6792.            H$ = "FF FF FF "
  6793.            If IsProg64
  6794.              H$ + "FF FF FF FF "
  6795.            EndIf          
  6796.          EndIf
  6797.        EndIf
  6798.        MN$ + H$ + RSet(Hex(H), 2, "0")     ;plus der 1-Byte-Wert
  6799.        BZ + 1
  6800.      ;----------------------
  6801.      Case $6B                              ;Gv, Ev, Ib
  6802.        MN$ = "IMUL  "
  6803.        Komma = 2
  6804.        OP = PeekB(Buffer + BZ) & $FF
  6805.        OP$ + RSet(Hex(OP), 2, "0") + " "
  6806.        BZ + 1
  6807.        VAR1 = OP >> 3
  6808.        VAR1 & %00000111
  6809.        If REX
  6810.          VAR1 | (REX & %00000100) << 1
  6811.          IsvonMSBytes = 1
  6812.        EndIf
  6813.        Register32(VAR1, 0)
  6814.        If (OP >> 6) <> 3                   ;also nicht Register-Register
  6815.          If REX & %00001000
  6816.            S = 3                           ;QWord
  6817.           Else
  6818.            S = 2                           ;DWord
  6819.          EndIf
  6820.          MemAdd64 = 1
  6821.          MSBytes(OP, S)
  6822.         Else
  6823.          VAR1 = OP
  6824.          VAR1 & %00000111
  6825.          If REX
  6826.            VAR1 | (REX & %00000001) << 3
  6827.          EndIf
  6828.          IsvonMSBytes = 1
  6829.          Register32(VAR1, 0)
  6830.        EndIf
  6831.        Strings(1, 0)                       ;1-Byte-Konstante
  6832.      ;----------------------
  6833.      Case $6C                              ;Yb, DX
  6834.        MN$ = "INSB "
  6835.      ;----------------------
  6836.      Case $6D                              ;Yz, DX
  6837.        If Mid(OP$, 1, 2) = "66"
  6838.          MN$ = "INSW "
  6839.         Else
  6840.          MN$ = "INSD "
  6841.        EndIf
  6842.      ;----------------------
  6843.      Case $6E                              ;DX, Xb
  6844.        MN$ = "OUTSB "
  6845.      ;----------------------
  6846.      Case $6F                              ;DX, Xz
  6847.        If Mid(OP$, 1, 2) = "66"
  6848.          MN$ = "OUTSW "
  6849.         Else
  6850.          MN$ = "OUTSD "
  6851.        EndIf
  6852.      ;----------------------
  6853.      Case $70
  6854.        MN$ = "JO  "                        ;short
  6855.        Sprung_short()
  6856.      ;----------------------
  6857.      Case $71
  6858.        MN$ = "JNO  "                       ;short
  6859.        Sprung_short()
  6860.      ;----------------------
  6861.      Case $72
  6862.        MN$ = "JB  "                        ;short, identisch mit JC und JNAE
  6863.        Sprung_short()
  6864.        MN$ + "  ( = JC  = JNAE )"
  6865.      ;----------------------
  6866.      Case $73
  6867.        MN$ = "JNB  "                       ;short, identisch mit JNC und JAE
  6868.        Sprung_short()
  6869.        MN$ + "  ( = JNC  = JAE )"
  6870.      ;----------------------
  6871.      Case $74
  6872.        MN$ = "JE  "                        ;short, identisch mit JZ
  6873.        Sprung_short()
  6874.        MN$ + "  ( = JZ )"
  6875.      ;----------------------
  6876.      Case $75
  6877.        MN$ = "JNE  "                       ;short, identisch mit JNZ
  6878.        Sprung_short()
  6879.        MN$ + "  ( = JNZ )"
  6880.      ;----------------------
  6881.      Case $76
  6882.        MN$ = "JBE  "                       ;short, identisch mit JNA
  6883.        Sprung_short()
  6884.        MN$ + "  ( = JNA )"
  6885.      ;----------------------
  6886.      Case $77
  6887.        MN$ = "JA  "                        ;short, identisch mit JNBE
  6888.        Sprung_short()
  6889.        MN$ + "  ( = JNBE )"
  6890.      ;----------------------
  6891.      Case $78
  6892.        MN$ = "JS  "                        ;short
  6893.        Sprung_short()
  6894.      ;----------------------
  6895.      Case $79
  6896.        MN$ = "JNS  "                       ;short
  6897.        Sprung_short()
  6898.      ;----------------------
  6899.      Case $7A
  6900.        MN$ = "JP  "                        ;short, identisch mit JPE
  6901.        Sprung_short()
  6902.        MN$ + "  ( = JPE )"
  6903.      ;----------------------
  6904.      Case $7B
  6905.        MN$ = "JNP  "                       ;short, identisch mit JPO
  6906.        Sprung_short()
  6907.        MN$ + "  ( = JPO )"
  6908.      ;----------------------
  6909.      Case $7C
  6910.        MN$ = "JL  "                        ;short, identisch mit JNGE
  6911.        Sprung_short()
  6912.        MN$ + "  ( = JNGE )"
  6913.      ;----------------------
  6914.      Case $7D
  6915.        MN$ = "JGE  "                       ;short, identisch mit JNL
  6916.        Sprung_short()
  6917.        MN$ + "  ( = JNL )"
  6918.      ;----------------------
  6919.      Case $7E
  6920.        MN$ = "JLE  "                       ;short, identisch mit JNG
  6921.        Sprung_short()
  6922.        MN$ + "  ( = JNG ) "
  6923.      ;----------------------
  6924.      Case $7F
  6925.        MN$ = "JG  "                        ;short, identisch mit JNLE
  6926.        Sprung_short()
  6927.        MN$ + "  ( = JNLE )"
  6928.      ;----------------------
  6929.      Case $80                              ;Gruppe 1   Eb, Ib
  6930.        OP = PeekB(Buffer + BZ) & $FF
  6931.        OP$ + RSet(Hex(OP), 2, "0") + " "
  6932.        BZ + 1
  6933.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  6934.        Select RM
  6935.          Case 0
  6936.            MN$ = "ADD  "
  6937.          Case 1
  6938.            MN$ = "OR  "
  6939.          Case 2
  6940.            MN$ = "ADC  "
  6941.          Case 3
  6942.            MN$ = "SBB  "
  6943.          Case 4
  6944.            MN$ = "AND  "
  6945.          Case 5
  6946.            MN$ = "SUB  "
  6947.          Case 6
  6948.            MN$ = "XOR  "
  6949.          Case 7
  6950.            MN$ = "CMP  "
  6951.        EndSelect
  6952.        Komma = 1
  6953.        MemAdd64 = 1
  6954.        MSBytes(OP, 0)                      ;VAR2=0=Byte
  6955.        Strings(1, 0)
  6956.      ;----------------------
  6957.      Case $81                              ;Gruppe 1   Ev,Iz
  6958.        OP = PeekB(Buffer + BZ) & $FF
  6959.        OP$ + RSet(Hex(OP), 2, "0") + " "
  6960.        BZ + 1
  6961.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  6962.        Select RM
  6963.          Case 0
  6964.            MN$ = "ADD  "
  6965.          Case 1
  6966.            MN$ = "OR  "
  6967.          Case 2
  6968.            MN$ = "ADC  "
  6969.          Case 3
  6970.            MN$ = "SBB  "
  6971.          Case 4
  6972.            MN$ = "AND  "
  6973.          Case 5
  6974.            MN$ = "SUB  "
  6975.          Case 6
  6976.            MN$ = "XOR  "
  6977.          Case 7
  6978.            MN$ = "CMP  "
  6979.        EndSelect
  6980.        Komma = 1
  6981.        MemAdd64 = 4
  6982.        If REX & %00001000
  6983.          S = 3                             ;QWord
  6984.         Else
  6985.          S = 2                             ;DWord
  6986.        EndIf
  6987.        MSBytes(OP, S)
  6988.        If REX
  6989.          H = PeekB(Buffer + BZ + 3) & $FF
  6990.          If H < $80                       ;Feinheit! sign-extended
  6991.            MN$ + "00 00 00 00 "
  6992.           Else
  6993.            MN$ + "FF FF FF FF "
  6994.          EndIf
  6995.        EndIf
  6996.        Strings(4, 0)
  6997.      ;----------------------
  6998.      Case $82                              ;Gruppe 1   Eb, Ib   nicht für 64-Bit! Taucht bei Intel garnicht mehr auf!
  6999.        OP = PeekB(Buffer + BZ) & $FF
  7000.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7001.        BZ + 1
  7002.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7003.        Select RM
  7004.          Case 0
  7005.            MN$ = "ADD  "
  7006.          Case 1
  7007.            MN$ = "OR  "
  7008.          Case 2
  7009.            MN$ = "ADC  "
  7010.          Case 3
  7011.            MN$ = "SBB  "
  7012.          Case 4
  7013.            MN$ = "AND  "
  7014.          Case 5
  7015.            MN$ = "SUB  "
  7016.          Case 6
  7017.            MN$ = "XOR  "
  7018.          Case 7
  7019.            MN$ = "CMP  "
  7020.        EndSelect
  7021.        Komma = 1
  7022.        MemAdd64 = 1
  7023.        MSBytes(OP, 0)                      ;VAR2=0=Byte
  7024.        Strings(1, 0)
  7025.      ;----------------------
  7026.      Case $83                              ;Gruppe 1   Ev, Ib
  7027.        OP = PeekB(Buffer + BZ) & $FF
  7028.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7029.        BZ + 1
  7030.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7031.        Select RM
  7032.          Case 0
  7033.            MN$ = "ADD  "
  7034.          Case 1
  7035.            MN$ = "OR  "
  7036.          Case 2
  7037.            MN$ = "ADC  "
  7038.          Case 3
  7039.            MN$ = "SBB  "
  7040.          Case 4
  7041.            MN$ = "AND  "
  7042.          Case 5
  7043.            MN$ = "SUB  "
  7044.          Case 6
  7045.            MN$ = "XOR  "
  7046.          Case 7
  7047.            MN$ = "CMP  "
  7048.        EndSelect
  7049.        Komma = 1
  7050.        MemAdd64 = 1
  7051.        If REX & %00001000
  7052.          S = 3                             ;QWord
  7053.         Else
  7054.          S = 2                             ;DWord
  7055.        EndIf
  7056.        MSBytes(OP, S)
  7057.        OP = PeekB(Buffer + BZ) & $FF
  7058.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7059.        H = PeekB(Buffer + BZ) & $FF
  7060.        If H < $80                          ;Feinheit! sign-extended
  7061.          If Mid(OP$, 1, 2) = "66"
  7062.            H$ = "00 "
  7063.           Else
  7064.            H$ = "00 00 00 "
  7065.            If REX
  7066.              H$ + "00 00 00 00 "
  7067.            EndIf
  7068.          EndIf
  7069.         Else
  7070.          If Mid(OP$, 1, 2) = "66"
  7071.            H$ = "FF "
  7072.           Else
  7073.            H$ = "FF FF FF "
  7074.            If REX
  7075.              H$ + "FF FF FF FF "
  7076.            EndIf          
  7077.          EndIf
  7078.        EndIf
  7079.        MN$ + H$ + RSet(Hex(H), 2, "0")     ;plus der 1-Byte-Wert
  7080.        BZ + 1
  7081.      ;----------------------
  7082.      Case $84                              ;Eb, Gb
  7083.        MN$ = "TEST  "
  7084.        Komma = 1
  7085.        Eb(1)
  7086.      ;----------------------
  7087.      Case $85                              ;Ev, Gv
  7088.        MN$ = "TEST  "
  7089.        Ev(10, 1)
  7090.      ;----------------------
  7091.      Case $86                              ;Eb, Gb
  7092.        MN$ = "XCHG  "
  7093.        Komma = 1
  7094.        Eb(1)
  7095.      ;----------------------
  7096.      Case $87                              ;Ev, Gv
  7097.        MN$ = "XCHG  "
  7098.        Ev(10, 1)
  7099.      ;----------------------
  7100.      Case $88                              ;Eb, Gb
  7101.        MN$ = "MOV  "
  7102.        Komma = 1
  7103.        Eb(1)
  7104.      ;----------------------
  7105.      Case $89                              ;Ev, Gv
  7106.        MN$ = "MOV  "
  7107.        Ev(10, 1)
  7108.      ;----------------------
  7109.      Case $8A                              ;Gb, Eb
  7110.        MN$ = "MOV  "
  7111.        Komma = 1
  7112.        Gb()
  7113.      ;----------------------
  7114.      Case $8B                              ;Gv, Ev
  7115.        MN$ = "MOV  "
  7116.        Gv(10, 1)
  7117.      ;----------------------
  7118.      Case $8C                              ;Ev, Sw   Segment-Register!
  7119.        MN$ = "MOV  "
  7120.        Komma = 1
  7121.        OP = PeekB(Buffer + BZ) & $FF
  7122.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7123.        BZ + 1
  7124.        MSBytes(OP, 1)                      ;1=Word
  7125.        RegisterSR(OP >> 3)
  7126.      ;----------------------
  7127.      Case $8D                              ;Gv, M
  7128.        MN$ = "LEA  "
  7129.        Gv(10, 1)
  7130.      ;----------------------
  7131.      Case $8E                              ;Sw, Ew   Segment-Register!
  7132.        MN$ = "MOV  "
  7133.        Komma = 1
  7134.        OP = PeekB(Buffer + BZ) & $FF
  7135.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7136.        BZ + 1
  7137.        RegisterSR(OP >> 3)
  7138.        MSBytes(OP, 1)                      ;1=Word
  7139.      ;----------------------
  7140.      Case $8F                              ;Ev
  7141.        MN$ = "POP  "
  7142.        OP = PeekB(Buffer + BZ) & $FF
  7143.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7144.        BZ + 1
  7145.        If IsProg64
  7146.          S = 3                             ;3=QWord
  7147.         Else
  7148.          S = 2                             ;2=DWord
  7149.        EndIf
  7150.        MSBytes(OP, S)
  7151.      ;----------------------
  7152.      Case $90                              ;NOP
  7153.        MN$ = "NOP "                        ;ist auch XCHG rAX,rAX !
  7154.      ;----------------------
  7155.      Case $91                              ;rAX,rCX/r9
  7156.        If Mid(OP$, 1, 2) = "66"
  7157.          MN$ = "XCHG  AX , CX"
  7158.         Else
  7159.          If REX = $48
  7160.            MN$ = "XCHG  RAX , RCX"
  7161.           ElseIf REX = $49
  7162.            MN$ = "XCHG  RAX , R9"
  7163.           Else
  7164.            MN$ = "XCHG  EAX , ECX"
  7165.          EndIf
  7166.        EndIf
  7167.      ;----------------------
  7168.      Case $92                              ;rAX,rDX/r10
  7169.        If Mid(OP$, 1, 2) = "66"
  7170.          MN$ = "XCHG  AX , DX"
  7171.         Else
  7172.          If REX = $48
  7173.            MN$ = "XCHG  RAX , RDX"
  7174.           ElseIf REX = $49
  7175.            MN$ = "XCHG  RAX , R10"
  7176.           Else
  7177.            MN$ = "XCHG  EAX , EDX"
  7178.          EndIf        
  7179.        EndIf
  7180.      ;----------------------
  7181.      Case $93                              ;rAX,rBX/r11
  7182.        If Mid(OP$, 1, 2) = "66"
  7183.          MN$ = "XCHG  AX , BX"
  7184.         Else
  7185.          If REX = $48
  7186.            MN$ = "XCHG  RAX , RBX"
  7187.           ElseIf REX = $49
  7188.            MN$ = "XCHG  RAX , R11"
  7189.           Else
  7190.            MN$ = "XCHG  EAX , EBX"
  7191.          EndIf        
  7192.        EndIf
  7193.      ;----------------------
  7194.      Case $94                              ;rAX,rSP/r12
  7195.        If Mid(OP$, 1, 2) = "66"
  7196.          MN$ = "XCHG  AX , SP"
  7197.         Else
  7198.          If REX = $48
  7199.            MN$ = "XCHG  RAX , RSP"
  7200.           ElseIf REX = $49
  7201.            MN$ = "XCHG  RAX , R12"
  7202.           Else
  7203.            MN$ = "XCHG  EAX , ESP"
  7204.          EndIf          
  7205.        EndIf
  7206.      ;----------------------
  7207.      Case $95                              ;rAX,rBP/r13
  7208.        If Mid(OP$, 1, 2) = "66"
  7209.          MN$ = "XCHG  AX , BP"
  7210.         Else
  7211.          If REX = $48
  7212.            MN$ = "XCHG  RAX , RBP"
  7213.           ElseIf REX = $49
  7214.            MN$ = "XCHG  RAX , R13"
  7215.           Else
  7216.            MN$ = "XCHG  EAX , EBP"
  7217.          EndIf                
  7218.        EndIf
  7219.      ;----------------------
  7220.      Case $96                              ;rAX,rSI/r14
  7221.        If Mid(OP$, 1, 2) = "66"
  7222.          MN$ = "XCHG  AX , SI"
  7223.         Else
  7224.          If REX = $48
  7225.            MN$ = "XCHG  RAX , RSI"
  7226.           ElseIf REX = $49
  7227.            MN$ = "XCHG  RAX , R14"
  7228.           Else
  7229.            MN$ = "XCHG  EAX , ESI"
  7230.          EndIf                
  7231.        EndIf
  7232.      ;----------------------
  7233.      Case $97                              ;rAX,rDI/r15
  7234.        If Mid(OP$, 1, 2) = "66"
  7235.          MN$ = "XCHG  AX , DI"
  7236.         Else
  7237.          If REX = $48
  7238.            MN$ = "XCHG  RAX , RDI"
  7239.           ElseIf REX = $49
  7240.            MN$ = "XCHG  RAX , R15"
  7241.           Else
  7242.            MN$ = "XCHG  EAX , EDI"
  7243.          EndIf                
  7244.        EndIf
  7245.      ;----------------------
  7246.      Case $98
  7247.        If Mid(OP$, 1, 2) = "66"
  7248.          MN$ = "CBW "
  7249.         ElseIf REX & %00001000
  7250.          MN$ = "CDQE "
  7251.         Else
  7252.          MN$ = "CWDE "      
  7253.        EndIf
  7254.      ;----------------------
  7255.      Case $99
  7256.        If Mid(OP$, 1, 2) = "66"
  7257.          MN$ = "CWD "
  7258.         ElseIf REX & %00001000
  7259.          MN$ = "CQO "
  7260.         Else
  7261.          MN$ = "CDQ "      
  7262.        EndIf
  7263.      ;----------------------
  7264.      Case $9A                              ;Ap
  7265.        MN$ = "CALL  "                      ;far
  7266.        MSBytes(OP, 2)
  7267.        MN$ + "  ( far )"
  7268.      ;----------------------
  7269.      Case $9B                              ;WAIT/FWAIT
  7270.        MN$ = "WAIT "                       ;hier nur WAIT; sind beide identisch
  7271.      ;----------------------
  7272.      Case $9C                              ;Fv
  7273.        If IsProg64
  7274.          MN$ = "PUSHFQ "
  7275.         Else
  7276.          If Mid(OP$, 1, 2) = "66"
  7277.            MN$ = "PUSHF "
  7278.           Else
  7279.            MN$ = "PUSHFD "
  7280.          EndIf
  7281.        EndIf
  7282.      ;----------------------
  7283.      Case $9D                              ;Fv
  7284.        If IsProg64
  7285.          MN$ = "POPFQ "
  7286.         Else
  7287.          If Mid(OP$, 1, 2) = "66"
  7288.            MN$ = "POPF "
  7289.           Else
  7290.            MN$ = "POPFD "
  7291.          EndIf
  7292.        EndIf
  7293.      ;----------------------
  7294.      Case $9E                              ;SAHF
  7295.        MN$ = "SAHF "
  7296.      ;----------------------
  7297.      Case $9F                              ;LAHF
  7298.        MN$ = "LAHF "
  7299.      ;----------------------
  7300.      Case $A0                              ;AL, Ob  Offset
  7301.        MN$ = "MOV  AL , byte ptr [ "
  7302.        If IsProg64
  7303.          Strings(8, 2)
  7304.         Else
  7305.          Strings(4, 2)
  7306.        EndIf
  7307.      ;----------------------
  7308.      Case $A1                              ;rAX, Ov  Offset
  7309.        If Mid(OP$, 1, 2) = "66"
  7310.          MN$ = "MOV  AX , word ptr [ "
  7311.         ElseIf REX & %00001000
  7312.          MN$ = "MOV  RAX , qword ptr [ "
  7313.         Else
  7314.          MN$ = "MOV  EAX , dword ptr [ "
  7315.        EndIf
  7316.        If IsProg64  
  7317.          Strings(8, 2)
  7318.         Else
  7319.          Strings(4, 2)
  7320.        EndIf
  7321.      ;----------------------
  7322.      Case $A2                              ;Ob, AL
  7323.        MN$ = "MOV byte ptr [ "
  7324.        If IsProg64
  7325.          Strings(8, 2)
  7326.         Else
  7327.          Strings(4, 2)
  7328.        EndIf
  7329.        MN$ + " , AL"
  7330.      ;----------------------
  7331.      Case $A3                              ;Ov, rAX
  7332.        If Mid(OP$, 1, 2) = "66"
  7333.          MN$ = "MOV word ptr [ "
  7334.          If IsProg64
  7335.            Strings(8, 2)
  7336.           Else
  7337.            Strings(4, 2)
  7338.          EndIf
  7339.          MN$ + " , AX"
  7340.         ElseIf REX & %00001000        
  7341.          MN$ = "MOV qword ptr [ "
  7342.          Strings(8, 2)
  7343.          MN$ + " , RAX"
  7344.         Else
  7345.          MN$ = "MOV dword ptr [ "
  7346.          If IsProg64
  7347.            Strings(8, 2)
  7348.           Else
  7349.            Strings(4, 2)
  7350.          EndIf
  7351.          MN$ + " , EAX"
  7352.        EndIf
  7353.      ;----------------------
  7354.      Case $A4                              ;Xb, Yb
  7355.        MN$ = "MOVSB "
  7356.      ;----------------------
  7357.      Case $A5                              ;Xv, Yv
  7358.        If Mid(OP$, 1, 2) = "66"
  7359.          MN$ = "MOVSW "
  7360.         ElseIf REX & %00001000
  7361.          MN$ = "MOVSQ "        
  7362.         Else
  7363.          MN$ = "MOVSD "
  7364.        EndIf
  7365.      ;----------------------
  7366.      Case $A6                              ;Xb, Yb
  7367.        MN$ = "CMPSB "
  7368.      ;----------------------
  7369.      Case $A7                              ;Xv, Yv
  7370.        If Mid(OP$, 1, 2) = "66"
  7371.          MN$ = "CMPSW "
  7372.         ElseIf REX & %00001000
  7373.          MN$ = "CMPSQ "        
  7374.         Else
  7375.          MN$ = "CMPSD "
  7376.        EndIf
  7377.      ;----------------------
  7378.      Case $A8                              ;AL, Ib
  7379.        MN$ = "TEST  AL , "
  7380.        Strings(1, 0)
  7381.      ;----------------------
  7382.      Case $A9                              ;rAX, Iz
  7383.        If Mid(OP$, 1, 2) = "66"
  7384.          MN$ = "TEST  AX , "
  7385.          Strings(2, 0)
  7386.         Else
  7387.          If REX & %00001000
  7388.            MN$ = "TEST  RAX , "
  7389.            H = PeekB(Buffer + BZ + 3) & $FF
  7390.            If H < $80                      ;Feinheit! sign-extended
  7391.              MN$ + "00 00 00 00 "
  7392.             Else
  7393.              MN$ + "FF FF FF FF "
  7394.            EndIf
  7395.            Strings(4, 0)
  7396.           Else
  7397.            MN$ = "TEST  EAX , "
  7398.            Strings(4, 0)                   ;4 auch für RAX richtig!
  7399.          EndIf
  7400.        EndIf
  7401.      ;----------------------
  7402.      Case $AA                              ;Yb, AL
  7403.        MN$ = "STOSB "
  7404.      ;----------------------
  7405.      Case $AB                              ;Yv, rAX
  7406.        If Mid(OP$, 1, 2) = "66"
  7407.          MN$ = "STOSW "
  7408.         ElseIf REX & %00001000
  7409.          MN$ = "STOSQ "
  7410.         Else
  7411.          MN$ = "STOSD "      
  7412.        EndIf
  7413.      ;----------------------
  7414.      Case $AC                              ;AL, Xb
  7415.        MN$ = "LODSB "
  7416.      ;----------------------
  7417.      Case $AD                              ;rAX, Xv
  7418.        If Mid(OP$, 1, 2) = "66"
  7419.          MN$ = "LODSW "
  7420.         ElseIf REX & %00001000
  7421.          MN$ = "LODSQ "
  7422.         Else
  7423.          MN$ = "LODSD "
  7424.        EndIf
  7425.      ;----------------------
  7426.      Case $AE                              ;AL, Yb
  7427.        MN$ = "SCASB "
  7428.      ;----------------------
  7429.      Case $AF                              ;rAX, Yv
  7430.        If Mid(OP$, 1, 2) = "66"
  7431.          MN$ = "SCASW "
  7432.         ElseIf REX & %00001000
  7433.          MN$ = "SCASQ "
  7434.         Else
  7435.          MN$ = "SCASD "
  7436.        EndIf
  7437.      ;----------------------
  7438.      Case $B0 To $B7                       ;MOV 8-Bit-Reg, Byte-Konstante
  7439.        MN$ = "MOV  "
  7440.        Komma = 1
  7441.        Register8(OP, 0)
  7442.        Strings(1, 0)
  7443.      ;----------------------
  7444.      Case $B8 To $BF                       ;MOV 32-Bit-Reg, D/Q-Word-Konstante; eigener Status für 64-Bit!
  7445.        MN$ = "MOV  "
  7446.        Komma = 1
  7447.        If REX & %00001000                  ;also W gesetzt=64-Bit-Operand
  7448.          Register32(OP, 0)                 ;64-Bit-Reg, QWord-Konstante
  7449.          Strings(8, 0)      
  7450.         Else
  7451.          Register32(OP, 0)                 ;32-Bit-Reg, DWord-Konstante
  7452.          Strings(4, 0)
  7453.        EndIf
  7454.       ;----------------------
  7455.      Case $C0                              ;Eb, Ib
  7456.        OP = PeekB(Buffer + BZ) & $FF
  7457.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7458.        BZ + 1
  7459.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7460.        Select RM
  7461.          Case 0
  7462.            MN$ = "ROL  "
  7463.          Case 1
  7464.            MN$ = "ROR  "
  7465.          Case 2
  7466.            MN$ = "RCL  "
  7467.          Case 3
  7468.            MN$ = "RCR  "
  7469.          Case 4
  7470.            MN$ = "SHL  "                   ;= SAL
  7471.          Case 5
  7472.            MN$ = "SHR  "
  7473.          Case 6
  7474.            MN$ = "SAL  "                   ;= SHL
  7475.          Case 7
  7476.            MN$ = "SAR  "
  7477.        EndSelect
  7478.        Komma = 1
  7479.        MemAdd64 = 1      
  7480.        MSBytes(OP, 0)
  7481.        MN$ + RSet(Hex(PeekB(Buffer + BZ) & $FF), 2, "0")  ;der 1-Byte-Wert
  7482.        OP = PeekB(Buffer + BZ) & $FF
  7483.        OP$ + RSet(Hex(OP), 2, "0")
  7484.        BZ + 1
  7485.        If RM = 4
  7486.          MN$ + "   ( = SAL )"
  7487.         ElseIf RM = 6  
  7488.          MN$ + "   ( = SHL )"
  7489.        EndIf
  7490.       ;----------------------
  7491.      Case $C1                              ;Ev, Ib
  7492.        OP = PeekB(Buffer + BZ) & $FF
  7493.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7494.        BZ + 1
  7495.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7496.        Select RM
  7497.          Case 0
  7498.            MN$ = "ROL  "
  7499.          Case 1
  7500.            MN$ = "ROR  "
  7501.          Case 2
  7502.            MN$ = "RCL  "
  7503.          Case 3
  7504.            MN$ = "RCR  "
  7505.          Case 4
  7506.            MN$ = "SHL  "                   ;= SAL
  7507.          Case 5
  7508.            MN$ = "SHR  "
  7509.          Case 6
  7510.            MN$ = "SAL  "                   ;= SHL
  7511.          Case 7
  7512.            MN$ = "SAR  "
  7513.        EndSelect
  7514.        Komma = 1
  7515.        MemAdd64 = 1
  7516.        If REX & %00001000                  ;Test auf REX.W
  7517.          S = 3                             ;QWord
  7518.         Else  
  7519.          S = 2                             ;DWord
  7520.        EndIf
  7521.        MSBytes(OP, S)
  7522.        MN$ + RSet(Hex(PeekB(Buffer + BZ) & $FF), 2, "0")  ;der 1-Byte-Wert
  7523.        OP = PeekB(Buffer + BZ) & $FF
  7524.        OP$ + RSet(Hex(OP), 2, "0")
  7525.        BZ + 1
  7526.        If RM = 4
  7527.          MN$ + "   ( = SAL )"
  7528.         ElseIf RM = 6  
  7529.          MN$ + "   ( = SHL )"
  7530.        EndIf
  7531.       ;----------------------
  7532.      Case $C2                              ;near Return mit Wert
  7533.        MN$ = "RET  "
  7534.        Strings(2, 0)
  7535.        MN$ + " (near)"
  7536.      ;----------------------
  7537.      Case $C3                              ;near Return
  7538.        MN$ = "RET (near) "
  7539.      ;----------------------
  7540.      Case $C4
  7541.        OP = PeekB(Buffer + BZ) & %11000000    
  7542.        If IsProg64 Or OP = %11000000                 ;AVX, 3-Byte-VEX-Präfix
  7543.          XMM = 2
  7544.          VEX1 = PeekB(Buffer + BZ) & $FF
  7545.          OP$ + RSet(Hex(VEX1), 2, "0") + " "  
  7546.          mmmmm = VEX1 & %00011111                    ;Opcode-Erweiterungen ($0F, $0F38, $0F3A)
  7547.          RVEX = (~(VEX1 & %10000000) >> 4) & %1000   ;Erweiterung für 1.Operand (8-15)
  7548.          XVEX = (~(VEX1 & %01000000) >> 3) & %1000
  7549.          BVEX = (~(VEX1 & %00100000) >> 2) & %1000
  7550.          BZ + 1
  7551.          VEX2 = PeekB(Buffer + BZ) & $FF
  7552.          OP$ + RSet(Hex(VEX2), 2, "0") + " "
  7553.          pp = VEX2 & %00000011                       ;Präfixe (Keiner, $66, $F2, $F3)
  7554.          LVEX = VEX2 & %00000100                     ;1=256-Bit-Operanden (YMM), 0=128-Bit-Operanden (XMM)
  7555.          vvvv = (~(VEX2 & %01111000) >> 3) & %1111   ;Register 2.Operand (0-15)
  7556.          WVEX = ((VEX2 & %10000000) >> 4) & %1000    ;Nicht invertiert!
  7557.  
  7558.          AVX()
  7559.  
  7560.          If (OPAVX & %11000000 = %11000000) And XMM < 250 And XMM <> -2  ;Register, not Memory   -2=VEXTRACTPS
  7561.            MN$ + XY$ + Str((OPAVX) & %111 | BVEX)    ;Operand = Register
  7562.           Else                                       ;Memory
  7563.            If XVEX Or BVEX
  7564.              REX = 1
  7565.              REX | XVEX >> 2
  7566.              REX | BVEX >> 1
  7567.            EndIf
  7568.            
  7569.            REX | WVEX
  7570.            
  7571.            MSBytes(OPAVX, Var1)
  7572.  
  7573.          EndIf
  7574.          
  7575.          Select IMM8                                 ;Konstante oder z.B. 4.Parameter
  7576.            Case 1
  7577.              MN$ + " , "
  7578.              Strings(1, 0)                           ;Konstante                  
  7579.              IMM8 = 0
  7580.            Case 2
  7581.              MN$ + " , "
  7582.              If LVEX
  7583.                MN$ + "YMM"
  7584.               Else
  7585.                MN$ + "XMM"
  7586.              EndIf
  7587.              OP = PeekB(Buffer + BZ) & $FF
  7588.              OP$ + RSet(Hex(OP), 2, "0") + " "
  7589.              OP >> 4
  7590.              MN$ + Str(OP)
  7591.              BZ + 1
  7592.              IMM8 = 0
  7593.            Case 3
  7594.              Strings(1, 0)                           ;Konstante                  
  7595.              IMM8 = 0
  7596.            Case 4                                    ;z.B. VEXTRACTPS
  7597.              MN$ + " , "
  7598.              If LVEX
  7599.                MN$ + "YMM"
  7600.               Else
  7601.                MN$ + "XMM"
  7602.              EndIf
  7603.              OPAVX >> 3
  7604.              OPAVX & %111      
  7605.              OPAVX | RVEX
  7606.              MN$ + Str(OPAVX) + " , "
  7607.              Strings(1, 0)
  7608.              IMM8 = 0
  7609.          EndSelect
  7610.  
  7611.          WVEX = 0
  7612.          BVEX = 0        
  7613.        
  7614.         Else
  7615.          MN$ = "LES  "                     ;Gz, Mp
  7616.          Gv(2, 1)
  7617.        EndIf
  7618.      ;----------------------
  7619.      Case $C5
  7620.        OP = PeekB(Buffer + BZ) & %10000000
  7621.        If IsProg64 Or OP = %10000000                 ;AVX, 2-Byte-VEX-Präfix
  7622.          XMM = 2
  7623.          VEX1 = PeekB(Buffer + BZ) & $FF
  7624.          OP$ + RSet(Hex(VEX1), 2, "0") + " "
  7625.          pp = VEX1 & %00000011                       ;Präfixe (Keiner, $66, $F2, $F3)
  7626.          LVEX = VEX1 & %00000100                     ;1=256-Bit-Operanden (YMM), 0=128-Bit-Operanden (XMM)
  7627.          vvvv = (~(VEX1 & %01111000) >> 3) & %1111   ;Register 2.Operand (0-15)
  7628.          RVEX = (~(VEX1 & %10000000) >> 4) & %1000   ;Erweiterung für 1.Operand (8-15)
  7629.          mmmmm = %00001                              ;$0F "vortäuschen"
  7630.  
  7631.          ;Sonderfälle abfangen
  7632.          OPN = PeekB(Buffer + 1 + BZ) & $FF
  7633.          Select OPN
  7634.            Case $77
  7635.              OP$ + RSet(Hex(OPN), 2, "0") + " "
  7636.              If LVEX
  7637.                MN$ = "VZEROALL"
  7638.               Else
  7639.                MN$ = "VZEROUPPER"
  7640.              EndIf
  7641.              OPAVX = 0
  7642.              BZ + 2
  7643.            Case $AE                                  ;hier erstmal so; evtl. neu, wenn $AE noch mal
  7644.              OP$ + RSet(Hex(OPN), 2, "0") + " "
  7645.              BZ + 2
  7646.              OPN1 = (PeekB(Buffer + BZ) & $FF)
  7647.              OP$ + RSet(Hex(OPN1), 2, "0") + " "
  7648.              OPN2 = (PeekB(Buffer + 1 + BZ) & $FF)
  7649.              OP$ + RSet(Hex(OPN2), 2, "0") + " "              
  7650.              If OPN1 = $14
  7651.                MN$ = "VLDMXCSR  dword ptr ["
  7652.               ElseIf OPN1 = $1C
  7653.                MN$ = "VSTMXCSR  dword ptr ["
  7654.              EndIf
  7655.              BZ + 2
  7656.              Strings(4, 2)  
  7657.              OPAVX = 0            
  7658.            Default
  7659.              WVEX=0
  7660.              AVX()
  7661.         EndSelect
  7662.  
  7663.          If OPAVX & %11000000 = %11000000 And XMM < 250   ;Register, not Memory
  7664.            MN$ + XY$ + Str((OPAVX) & %111)           ;Operand = Register
  7665.           ElseIf OPAVX > 0                           ;z.B. wegen VZEROALL
  7666.            If XMM = 255
  7667.              Var1 = 2
  7668.            EndIf
  7669.            REX = 0
  7670.            MSBytes(OPAVX, Var1)                      ;Memory
  7671.          EndIf
  7672.  
  7673.          Select IMM8                                 ;Konstante oder z.B. 4.Parameter
  7674.            Case 1
  7675.              MN$ + " , "
  7676.              Strings(1, 0)                           ;Konstante                  
  7677.              IMM8 = 0
  7678.            Case 2
  7679.              MN$ + " , "
  7680.              If LVEX
  7681.                MN$ + "YMM"
  7682.               Else
  7683.                MN$ + "XMM"
  7684.              EndIf
  7685.              OP = PeekB(Buffer + BZ) & $FF
  7686.              OP$ + RSet(Hex(OP), 2, "0") + " "
  7687.              OP >> 4
  7688.              MN$ + Str(OP)
  7689.              BZ + 1
  7690.              IMM8 = 0
  7691.          EndSelect
  7692.  
  7693.         Else
  7694.          MN$ = "LDS  "                     ;Gz, Mp
  7695.          Gv(2, 1)
  7696.        EndIf
  7697.      ;----------------------
  7698.      Case $C6                              ;Gruppe11  Eb, Ib
  7699.        OP = PeekB(Buffer + BZ) & $FF
  7700.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7701.        BZ + 1
  7702.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7703.        Select RM
  7704.          Case 0
  7705.            MN$ = "MOV  "
  7706.            Komma = 1
  7707.          Case 1 To 7
  7708.            NoCode = 1
  7709.        EndSelect
  7710.        If NoCode = 0      
  7711.          Adr64 = 1          
  7712.          MemAdd64 = 1
  7713.          MSBytes(OP, 0)                    ;VAR2=0=Byte
  7714.          Strings(1, 0)
  7715.        EndIf
  7716.      ;----------------------
  7717.      Case $C7                              ;Gruppe 11  Ev, Iz
  7718.        OP = PeekB(Buffer + BZ) & $FF
  7719.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7720.        BZ + 1
  7721.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7722.        Select RM
  7723.          Case 0
  7724.            MN$ = "MOV  "
  7725.            Komma = 1
  7726.          Case 1 To 7
  7727.            NoCode = 1
  7728.        EndSelect
  7729.        If NoCode = 0
  7730.          MemAdd64 = 4
  7731.          If REX & %00001000
  7732.            Adr64 = 4
  7733.            MSBytes(OP, 3)                  ;VAR2=3=QWord
  7734.            H = PeekB(Buffer + BZ + 3) & $FF
  7735.            If H < $80                      ;Feinheit! sign-extended
  7736.              MN$ + "00 00 00 00 "
  7737.             Else
  7738.              MN$ + "FF FF FF FF "
  7739.            EndIf
  7740.           Else
  7741.            MSBytes(OP, 2)                  ;VAR2=2=DWord
  7742.          EndIf
  7743.          Strings(4, 0)                     ;64-Bit: Sign extended! 4 Bytes richtig!
  7744.        EndIf
  7745.      ;----------------------
  7746.      Case $C8                              ;Iw, Ib
  7747.        MN$ = "ENTER  "
  7748.        Strings(2, 0)
  7749.        MN$ + " , "                         ;hier "von Hand"
  7750.        Strings(1, 0)
  7751.      ;----------------------
  7752.      Case $C9                              ;LEAVE
  7753.        If Mid(OP$, 1, 2) = "66"
  7754.          MN$ = "LEAVE    ( = MOV SP , BP  :  POP BP )"
  7755.         Else
  7756.          If IsProg64
  7757.            MN$ = "LEAVE    ( = MOV RSP , RBP  :  POP RBP )"
  7758.           Else
  7759.            MN$ = "LEAVE    ( = MOV ESP , EBP  :  POP EBP )"
  7760.          EndIf
  7761.        EndIf  
  7762.       ;----------------------
  7763.      Case $CA                              ;far Return mit Wert
  7764.        MN$ = "RET  "
  7765.        Strings(2, 0)
  7766.        MN$ + " ( far )"
  7767.      ;----------------------
  7768.      Case $CB                              ;far Return
  7769.        MN$ = "RET ( far )"
  7770.      ;----------------------
  7771.      Case $CC                              ;INT3
  7772.        MN$ = "INT3 "                       ;Feinheit, zusammen geschrieben!
  7773.      ;----------------------
  7774.      Case $CD                              ;INT Ib
  7775.        MN$ = "INT  "
  7776.        Strings(1, 0)
  7777.      ;----------------------
  7778.      Case $CE                              ;INTO
  7779.        If IsProg64
  7780.          MN$ = No64$
  7781.         Else
  7782.          MN$ = "INTO "
  7783.        EndIf
  7784.      ;----------------------
  7785.      Case $CF                              ;IRET(IRETW)/IRETD/IRETQ
  7786.        If REX & %00001000                  ;die 16-Bit schenke ich mir hier
  7787.          MN$ = "IRETQ "
  7788.         Else  
  7789.          MN$ = "IRETD "
  7790.        EndIf  
  7791.      ;----------------------
  7792.      Case $D0                              ;Eb, 1
  7793.        OP = PeekB(Buffer + BZ) & $FF
  7794.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7795.        BZ + 1
  7796.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7797.        Select RM
  7798.          Case 0
  7799.            MN$ = "ROL  "
  7800.          Case 1
  7801.            MN$ = "ROR  "
  7802.          Case 2
  7803.            MN$ = "RCL  "
  7804.          Case 3
  7805.            MN$ = "RCR  "
  7806.          Case 4
  7807.            MN$ = "SHL  "                   ;= SAL
  7808.          Case 5
  7809.            MN$ = "SHR  "
  7810.          Case 6
  7811.            MN$ = "SAL  "                   ;= SHL
  7812.          Case 7
  7813.            MN$ = "SAR  "
  7814.        EndSelect
  7815.        MSBytes(OP, 0)
  7816.        MN$ + " , 1"
  7817.        If RM = 4
  7818.          MN$ + "   ( = SAL )"
  7819.         ElseIf RM = 6  
  7820.          MN$ + "   ( = SHL )"
  7821.        EndIf
  7822.       ;----------------------
  7823.      Case $D1                              ;Ev, 1
  7824.        OP = PeekB(Buffer + BZ) & $FF
  7825.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7826.        BZ + 1
  7827.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7828.        Select RM
  7829.          Case 0
  7830.            MN$ = "ROL  "
  7831.          Case 1
  7832.            MN$ = "ROR  "
  7833.          Case 2
  7834.            MN$ = "RCL  "
  7835.          Case 3
  7836.            MN$ = "RCR  "
  7837.          Case 4
  7838.            MN$ = "SHL  "                   ;= SAL
  7839.          Case 5
  7840.            MN$ = "SHR  "
  7841.          Case 6
  7842.            MN$ = "SAL  "                   ;= SHL
  7843.          Case 7
  7844.            MN$ = "SAR  "
  7845.        EndSelect
  7846.        MSBytes(OP, 2)
  7847.        MN$ + " , 1"
  7848.        If RM = 4
  7849.          MN$ + "   ( = SAL )"
  7850.         ElseIf RM = 6  
  7851.          MN$ + "   ( = SHL )"
  7852.        EndIf
  7853.       ;----------------------
  7854.      Case $D2                              ;Eb, CL
  7855.        OP = PeekB(Buffer + BZ) & $FF
  7856.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7857.        BZ + 1
  7858.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7859.        Select RM
  7860.          Case 0
  7861.            MN$ = "ROL  "
  7862.          Case 1
  7863.            MN$ = "ROR  "
  7864.          Case 2
  7865.            MN$ = "RCL  "
  7866.          Case 3
  7867.            MN$ = "RCR  "
  7868.          Case 4
  7869.            MN$ = "SHL  "                   ;= SAL
  7870.          Case 5
  7871.            MN$ = "SHR  "
  7872.          Case 6
  7873.            MN$ = "SAL  "                   ;= SHL
  7874.          Case 7
  7875.            MN$ = "SAR  "
  7876.        EndSelect
  7877.        MSBytes(OP, 0)
  7878.        MN$ + " , CL"
  7879.        If RM = 4
  7880.          MN$ + "   ( = SAL )"
  7881.         ElseIf RM = 6  
  7882.          MN$ + "   ( = SHL )"
  7883.        EndIf
  7884.       ;----------------------
  7885.      Case $D3                              ;Ev, CL
  7886.        OP = PeekB(Buffer + BZ) & $FF
  7887.        OP$ + RSet(Hex(OP), 2, "0") + " "
  7888.        BZ + 1
  7889.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  7890.        Select RM
  7891.          Case 0
  7892.            MN$ = "ROL  "
  7893.          Case 1
  7894.            MN$ = "ROR  "
  7895.          Case 2
  7896.            MN$ = "RCL  "
  7897.          Case 3
  7898.            MN$ = "RCR  "
  7899.          Case 4
  7900.            MN$ = "SHL  "                   ;= SAL
  7901.          Case 5
  7902.            MN$ = "SHR  "
  7903.          Case 6
  7904.            MN$ = "SAL  "                   ;= SHL
  7905.          Case 7
  7906.            MN$ = "SAR  "
  7907.        EndSelect
  7908.        MSBytes(OP, 2)
  7909.        MN$ + " , CL"
  7910.        If RM = 4
  7911.          MN$ + "   ( = SAL )"
  7912.         ElseIf RM = 6  
  7913.          MN$ + "   ( = SHL )"
  7914.        EndIf        
  7915.      ;----------------------
  7916.      Case $D4                              ;Ib
  7917.        If IsProg64
  7918.          MN$ = No64$
  7919.         Else
  7920.        MN$ = "AAM  "
  7921.        Strings(1, 0)                       ;Basiswert wird hier mit Absicht angegeben!
  7922.        EndIf
  7923.      ;----------------------
  7924.      Case $D5                              ;Ib
  7925.        If IsProg64
  7926.          MN$ = No64$
  7927.         Else
  7928.          MN$ = "AAD  "
  7929.          Strings(1, 0)                     ;Basiswert wird hier mit Absicht angegeben!
  7930.        EndIf
  7931.      ;----------------------
  7932.      Case $D6
  7933.        If IsProg64
  7934.          MN$ = No64$
  7935.         Else        
  7936.          MN$ = "SALC   (Set AL on Carry - not documented (Intel), set all 8 Bits!)"
  7937.        EndIf
  7938.      ;----------------------
  7939.      Case $D7
  7940.        MN$ = "XLATB "
  7941.      ;----------------------
  7942.      Case $D8 To $DF                       ;FPU-Instruktionen
  7943.        OPF = OP                            ;OP nicht global!
  7944.        FPU()
  7945.      ;----------------------
  7946.      Case $E0                              ;Jb
  7947.        MN$ = "LOOPNE  "
  7948.        Sprung_short()
  7949.        MN$ + "   ( = LOOPNZ )"
  7950.      ;----------------------
  7951.      Case $E1                              ;Jb
  7952.        MN$ = "LOOPE  "
  7953.        Sprung_short()
  7954.        MN$ + "   ( = LOOPZ )"
  7955.      ;----------------------
  7956.      Case $E2                              ;Jb
  7957.        MN$ = "LOOP  "
  7958.        Sprung_short()
  7959.      ;----------------------
  7960.      Case $E3                              ;Jb
  7961.        If IsProg64 = 0 And (Mid(OP$, 1, 2) = "67" Or Mid(OP$, 4, 2) = "67")   ;Operand Override
  7962.          MN$ = "JCXZ  "
  7963.         ElseIf IsProg64 = 1 And (Mid(OP$, 1, 2) = "67" Or Mid(OP$, 4, 2) = "67")
  7964.          MN$ = "JECXZ  "
  7965.         Else
  7966.          MN$ = "JRCXZ  "
  7967.        EndIf
  7968.        Sprung_short()
  7969.      ;----------------------
  7970.      Case $E4                              ;Ib
  7971.        MN$ = "IN  AL , "
  7972.        Strings(1, 0)
  7973.      ;----------------------
  7974.      Case $E5                              ;Ib
  7975.        If Mid(OP$, 1, 2) = "66"            ;Operand Override
  7976.          MN$ = "IN  AX , "
  7977.         Else
  7978.          MN$ = "IN  EAX , "
  7979.        EndIf
  7980.        Strings(1, 0)
  7981.      ;----------------------
  7982.      Case $E6                              ;Ib
  7983.        MN$ = "OUT  "
  7984.        Strings(1, 0)
  7985.        MN$ + " , AL"
  7986.      ;----------------------
  7987.      Case $E7                              ;Ib
  7988.        MN$ = "OUT  "
  7989.        Strings(1, 0)
  7990.        If Mid(OP$, 1, 2) = "66"            ;Operand Override
  7991.          MN$ + " , AX"
  7992.         Else
  7993.          MN$ + " , EAX"
  7994.        EndIf
  7995.     ;----------------------
  7996.      Case $E8                              ;CALL mit rel. Adresse
  7997.        MN$ = "CALL  "
  7998.        For k = 1 To 4
  7999.          OP = PeekB(Buffer + BZ) & $FF
  8000.          OP$ + RSet(Hex(OP), 2, "0") + " "
  8001.          BZ + 1
  8002.        Next
  8003.        SPZ = PeekL(Buffer + BZ - 4) + BZ - SO   ;Sprungziel
  8004.        SPZH$ = RSet(Hex(SPZ + IB + SRVA), Adr3264, "0")   ;setzt auch 64-Bit-Adresse richtig!
  8005.        SPZ$ = ""
  8006.        For k = 1 To Adr3264 - 1 Step 2
  8007.          SPZ$ + Mid(SPZH$, k, 2) + " "
  8008.        Next
  8009.        MN$ + SPZ$
  8010.        ;- Versuch, Sprungziel nach möglicher API-Funktion aufzulösen
  8011.        RSPZ = SPZ + IB + SRVA              ;rel.Sprungziel
  8012.        k = 0
  8013.        For n = 1 To ANS                    ;um "Sprungziel" in der Datei zu ermitteln
  8014.          CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  8015.          XRVA = I_S_H\VirtualAddress
  8016.          X = XRVA + I_S_H\SizeOfRawData    ;+ Länge der Section
  8017.          RSE = IB + XRVA + I_S_H\SizeOfRawData - 1   ;rel.Ende der Sections
  8018.          If RSPZ < RSE                     ;Sprungziel in dieser Section ?
  8019.            SPZ = RSPZ - IB - XRVA + I_S_H\PointerToRawData     ;"Sprungziel" in der Datei
  8020.            Break
  8021.          EndIf
  8022.          k + #IMAGE_SIZEOF_SECTION_HEADER
  8023.        Next
  8024.  
  8025.        If SPZ > LF Or SPZ < 0              ;Schutzmassnahme z.B. wenn Code nicht vollständig auflösbar oder Käse ist
  8026.          Goto Schutz
  8027.        EndIf
  8028.  
  8029.        If PeekW(Buffer + SPZ) = $25FF      ;Test auf JMP (Opcode $FF25, erweiterbar)
  8030.          SPZ = PeekL(Buffer + SPZ + 2)     ;neues Sprungziel
  8031.          If IsProg64
  8032.            RSPZ + SPZ + 6                  ;6=Länge Opcode (mit Long-Adresse)
  8033.           Else
  8034.            SPZ - IB
  8035.          EndIf
  8036.          k = 0
  8037.          For n = SZ To ANS
  8038.            CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  8039.            XRVA = I_S_H\VirtualAddress     ;RVA der Sections
  8040.            X = XRVA + I_S_H\SizeOfRawData  ;+ Länge der Section
  8041.            If IsProg64
  8042.              SPZ = RSPZ - IB
  8043.            EndIf
  8044.            If SPZ < X                      ;SPZ in dieser Section ?
  8045.              SPZ - XRVA + I_S_H\PointerToRawData     ;+ Offset dieser Section
  8046.              Break
  8047.            EndIf
  8048.            k + #IMAGE_SIZEOF_SECTION_HEADER
  8049.          Next
  8050.          If SPZ > LF Or SPZ < 0            ;Schutzmassnahme z.B. wenn Code nicht vollständig auflösbar oder Käse ist
  8051.            Goto Schutz
  8052.          EndIf
  8053.          SPZ = PeekL(Buffer + SPZ)
  8054.          For m = n To ANS
  8055.            CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  8056.            XRVA = I_S_H\VirtualAddress     ;RVA der Sections
  8057.            X = XRVA + I_S_H\SizeOfRawData  ;+ Länge der Section
  8058.            If SPZ < X                      ;SPZ in dieser Section ?
  8059.              SPZ - XRVA + I_S_H\PointerToRawData     ;+ Offset dieser Section
  8060.              If SPZ > LF Or SPZ < 0        ;Schutzmassnahme z.B. wenn Code nicht vollständig auflösbar oder Käse ist
  8061.                Goto Schutz
  8062.              EndIf          
  8063.              XF = I_S_H\Characteristics    ;Flags ermitteln
  8064.              If XF & #IMAGE_SCN_MEM_EXECUTE = 0 ;Test, ob Section ausführbar oder nicht
  8065.                Info$ = PeekS(Buffer + SPZ + 2, $FF)  ;+2 wegen Word Ordnungs-Nr.
  8066.                If Info$ <> ""
  8067.                  MN$ + "  (" + Chr(34) + Info$ + Chr(34); + " / "
  8068.                  For i = Buffer + SPZ + 3 To Buffer + I_S_H\PointerToRawData + I_S_H\SizeOfRawData - 4
  8069.                    If PeekL(i) & $5F5F5FFF = $4C4C442E    ;".DLL" oder ".dll"              
  8070.                      For j = i  To Buffer + SPZ + 3 Step -1
  8071.                        If PeekB(j) = 0      ;Zero-Byte
  8072.                          Break
  8073.                        EndIf
  8074.                      Next
  8075.                      DLL$ = PeekS(j + 1, $FF)
  8076.                      If DLL$ <> ""
  8077.                        MN$ + " / " + DLL$
  8078.                      EndIf
  8079.                      Break
  8080.                    EndIf
  8081.                  Next
  8082.                  DLL$ = ""
  8083.                  MN$ + ")"
  8084.                EndIf
  8085.                Break
  8086.              EndIf
  8087.            EndIf
  8088.            k + #IMAGE_SIZEOF_SECTION_HEADER
  8089.          Next
  8090.        EndIf                               ;ob anschliessender JMP
  8091. Schutz:
  8092.      ;----------------------
  8093.      Case $E9                              ;Jz
  8094.        MN$ = "JMP  "                       ;near
  8095.        Sprung_near_long()
  8096.        MN$ + " ( near )"
  8097.      ;----------------------
  8098.      Case $EA                              ;AP
  8099.        MN$ = "JMP  "                       ;far
  8100.        Sprung_near_long()                  ;?
  8101.        MN$ + " ( far )"
  8102.      ;----------------------
  8103.      Case $EB                              ;Jb
  8104.        MN$ = "JMP  "                       ;short
  8105.        Sprung_short()
  8106.      ;----------------------
  8107.      Case $EC
  8108.        MN$ = "IN  AL , DX"
  8109.      ;----------------------
  8110.      Case $ED
  8111.        If Mid(OP$, 1, 2) = "66"            ;Operand Override
  8112.          MN$ = "IN  AX , DX"
  8113.         Else
  8114.          MN$ = "IN  EAX , DX"
  8115.        EndIf
  8116.      ;----------------------
  8117.      Case $EE
  8118.        MN$ = "OUT  DX , AL"
  8119.      ;----------------------
  8120.      Case $EF
  8121.        If Mid(OP$, 1, 2) = "66"            ;Operand Override
  8122.          MN$ = "OUT  DX , AX"
  8123.         Else
  8124.          MN$ = "OUT  DX , EAX"
  8125.        EndIf
  8126.      ;----------------------
  8127.      Case $F0
  8128.        MN$ = "LOCK "
  8129.      ;----------------------
  8130.      Case $F1
  8131.        MN$ = "ICEBP   (INT01 (ICE BreakPoint) - not documented)"
  8132.      ;----------------------
  8133.      Case $F2
  8134.        X = (PeekB(Buffer + BZ) & $FF)      ;auch um 64-Bit auszusieben
  8135.        If X <> $0F And (X < $40 And X > $4F)    ;sonst Präfix für SSE!        
  8136.          MN$ = "REPNE    ( = REPNZ )"      ;identisch mit REPNZ
  8137.         Else
  8138.          OV = 1
  8139.        EndIf
  8140.      ;----------------------
  8141.      Case $F3
  8142.        X = (PeekB(Buffer + BZ) & $FF)      ;auch um 64-Bit auszusieben
  8143.        If X <> $0F And (X < $40 And X > $4F)    ;sonst Präfix für SSE!
  8144.          MN$ = "REPE    ( = REP  = REPZ )" ;identisch mit REP und REPZ
  8145.         Else
  8146.          OV = 1
  8147.        EndIf      
  8148.      ;----------------------
  8149.      Case $F4
  8150.        MN$ = "HLT "
  8151.      ;----------------------
  8152.      Case $F5
  8153.        MN$ = "CMC "
  8154.      ;----------------------
  8155.      Case $F6                              ;Eb   Gruppe 3
  8156.        OP = PeekB(Buffer + BZ) & $FF
  8157.        OP$ + RSet(Hex(OP), 2, "0") + " "
  8158.        BZ + 1
  8159.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  8160.        Select RM
  8161.          Case 0 To 1
  8162.            MN$ = "TEST  "
  8163.            Komma = 1
  8164.            MemAdd64 = 1
  8165.          Case 2
  8166.            MN$ = "NOT  "
  8167.          Case 3
  8168.            MN$ = "NEG  "
  8169.          Case 4
  8170.            MN$ = "MUL  "                   ;AL
  8171.          Case 5
  8172.            MN$ = "IMUL  "                  ;AL
  8173.          Case 6
  8174.            MN$ = "DIV  "                   ;AL
  8175.          Case 7
  8176.            MN$ = "IDIV  "                  ;AL
  8177.        EndSelect
  8178.        MSBytes(OP, 0)
  8179.        If RM = 0 Or RM = 1                 ;für TEST
  8180.          Strings(1, 0)
  8181.        EndIf
  8182.      ;----------------------
  8183.      Case $F7                              ;Ev   Gruppe 3
  8184.        OP = PeekB(Buffer + BZ) & $FF
  8185.        OP$ + RSet(Hex(OP), 2, "0") + " "
  8186.        BZ + 1
  8187.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  8188.        Select RM
  8189.          Case 0 To 1
  8190.            MN$ = "TEST  "
  8191.            Komma = 1
  8192.            MemAdd64 = 4
  8193.          Case 2
  8194.            MN$ = "NOT  "
  8195.          Case 3
  8196.            MN$ = "NEG  "
  8197.          Case 4
  8198.            MN$ = "MUL  "
  8199.          Case 5
  8200.            MN$ = "IMUL  "
  8201.          Case 6
  8202.            MN$ = "DIV  "
  8203.          Case 7
  8204.            MN$ = "IDIV  "
  8205.        EndSelect
  8206.        If Mid(OP$, 1, 2) = "66"            ;Operand Override
  8207.          MSBytes(OP, 1)
  8208.          If RM = 0 Or RM = 1               ;für TEST
  8209.            Strings(2, 0)
  8210.          EndIf
  8211.         Else
  8212.          If REX & %00001000                ;REX.W
  8213.            S = 3                           ;QWord
  8214.           Else
  8215.            S = 2                           ;DWord
  8216.          EndIf
  8217.          MSBytes(OP, S)
  8218.          If RM = 0 Or RM = 1               ;für TEST
  8219.            If REX & %00001000
  8220.              H = PeekB(Buffer + BZ + 3) & $FF
  8221.              If H < $80                    ;Feinheit! sign-extended
  8222.                MN$ + "00 00 00 00 "
  8223.               Else
  8224.                MN$ + "FF FF FF FF "
  8225.              EndIf              
  8226.            EndIf
  8227.            Strings(4, 0)
  8228.          EndIf
  8229.        EndIf
  8230.      ;----------------------
  8231.      Case $F8                              ;CLC
  8232.        MN$ = "CLC "
  8233.      ;----------------------
  8234.      Case $F9                              ;STC
  8235.        MN$ = "STC "
  8236.      ;----------------------
  8237.      Case $FA                              ;CLI
  8238.        MN$ = "CLI "
  8239.      ;----------------------  
  8240.      Case $FB                              ;STI
  8241.        MN$ = "STI "
  8242.      ;----------------------  
  8243.      Case $FC                              ;CLD
  8244.        MN$ = "CLD "
  8245.      ;----------------------  
  8246.      Case $FD                              ;STD
  8247.        MN$ = "STD "
  8248.      ;----------------------
  8249.      Case $FE                              ;Eb
  8250.        OP = PeekB(Buffer + BZ) & $FF
  8251.        OP$ + RSet(Hex(OP), 2, "0") + " "
  8252.        BZ + 1
  8253.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  8254.        Select RM
  8255.          Case 0
  8256.            MN$ = "INC  "
  8257.          Case 1
  8258.            MN$ = "DEC  "
  8259.          Case 2 To 7
  8260.            NoCode = 1
  8261.        EndSelect
  8262.        If NoCode = 0        
  8263.          MSBytes(OP, 0)
  8264.        EndIf
  8265.      ;----------------------
  8266.      Case $FF                              ;Gruppe 5
  8267.        OP = PeekB(Buffer + BZ) & $FF
  8268.        OP$ + RSet(Hex(OP), 2, "0") + " "
  8269.        BZ + 1
  8270.        RM = (OP & %00111000) >> 3          ;reg/opcode für Befehl
  8271.        Select RM
  8272.          Case 0                            ;Ev
  8273.            MN$ = "INC  "
  8274.            If REX & %00001000              ;REX.W
  8275.              S = 3                         ;QWord
  8276.             Else
  8277.              S = 2                         ;DWord
  8278.            EndIf
  8279.            MSBytes(OP, S)
  8280.          Case 1                            ;Ev
  8281.            MN$ = "DEC  "
  8282.            If REX & %00001000
  8283.              S = 3                         ;QWord
  8284.             Else
  8285.              S = 2                         ;DWord
  8286.            EndIf
  8287.            MSBytes(OP, S)
  8288.          Case 2                            ;Ev
  8289.            MN$ = "CALL  "                  ;near
  8290.            If IsProg64  
  8291.              S = 3                         ;QWord
  8292.             Else
  8293.              S = 2                         ;DWord
  8294.            EndIf
  8295.            MSBytes(OP, S)
  8296.            If NoString = 0                 ;nicht, wenn nicht direkt in Memory
  8297.              FuncInfo()                    ;Versuch, Sprungziel nach möglicher API-Funktion aufzulösen
  8298.            EndIf
  8299.            MN$ + "  ( near )"
  8300.          Case 3                            ;Ep
  8301.            MN$ = "CALL  "                  ;far
  8302.            If IsProg64  
  8303.              S = 3                         ;QWord
  8304.             Else
  8305.              S = 2                         ;DWord
  8306.            EndIf
  8307.            MSBytes(OP, S)
  8308.            If NoString = 0                 ;nicht, wenn nicht direkt in Memory
  8309.              FuncInfo()                    ;Versuch, Sprungziel nach möglicher API-Funktion aufzulösen
  8310.            EndIf
  8311.            MN$ + "  ( far )"
  8312.          Case 4                            ;Ev
  8313.            MN$ = "JMP  "                   ;near
  8314.            If IsProg64  
  8315.              S = 3                         ;QWord
  8316.             Else
  8317.              S = 2                         ;DWord
  8318.            EndIf
  8319.            MSBytes(OP, S)
  8320.            MN$ + " ( near )"
  8321.          Case 5                            ;Ep
  8322.            MN$ = "JMP  "                   ;far
  8323.            If IsProg64  
  8324.              S = 3                         ;QWord
  8325.             Else
  8326.              S = 2                         ;DWord
  8327.            EndIf
  8328.            MSBytes(OP, S)
  8329.            MN$ + "  ( far )"
  8330.          Case 6                            ;Ev
  8331.            MN$ = "PUSH  "
  8332.            If IsProg64  
  8333.              S = 3                         ;QWord
  8334.             Else
  8335.              S = 2                         ;DWord
  8336.            EndIf
  8337.            MSBytes(OP, S)
  8338.          Case 7
  8339.            NoCode = 1
  8340.        EndSelect
  8341.      ;----------------------
  8342.      Default
  8343.        MN$ = "???"                         ;irgendwelcher Käse
  8344.    EndSelect
  8345.  
  8346.    If PEP                                  ;PEP soll separate Zeile sein
  8347.      If BZ + OS - SO > PEP + IB
  8348.        D = (BZ + OS - SO) - (PEP + IB)
  8349.        BZ - D                              ;"Einraster" für PEP
  8350.        OP$ = Mid(OP$, 1, Len(OP$) - D * 3) ;3 = 2 Ziffer-Zeichen + 1 Space
  8351.        NoCode = 1                          ;kein ausführbarer Code
  8352.      EndIf
  8353.    EndIf
  8354.  
  8355.    If DLL And DLLEntry = 0                 ;falls DLL-Entrypoint nicht auf Adresse fällt
  8356.      If BZ + OS - SO > DLLAdr              ;von oben
  8357.        D = (BZ + OS - SO) - DLLAdr
  8358.        BZ - D                              ;"Einraster" für DLL-Entrypoint
  8359.        OP$ = Mid(OP$, 1, Len(OP$) - D * 3) ;3 = 2 Ziffer-Zeichen + 1 Space
  8360.        NoCode = 1                          ;kein ausführbarer Code
  8361.      EndIf
  8362.    EndIf
  8363.  
  8364.    If NoCode
  8365.      MN$ = "No Code"
  8366.      NoCode = 0
  8367.    EndIf
  8368.  
  8369. ;If ZeilePEP = Zeile
  8370. ;  MN$ + "    (Program - Entrypoint)"
  8371. ;EndIf
  8372.  
  8373.    If OV = 0                               ;nur, wenn kein Override
  8374.       Daten(Zeile)\Opcode = OP$
  8375.       Daten(Zeile)\Mnemonic = MN$
  8376.      ;Opcode as Text-Chars
  8377.      ASC$ = ""
  8378.      For j = 1 To Len(OP$) Step 2
  8379.        A$ = "$"
  8380.        A$ + Mid(OP$, j, 2)  
  8381.        ASC$ + Chr(Val(A$))
  8382.        j + 1                               ;Space in OP$ überspringen
  8383.      Next
  8384.      Daten(Zeile)\ASCII = ASC$
  8385.  
  8386.      While DLLEntry                        ;es können auch mehrere Funktionen auf ein und die selbe Adresse zeigen
  8387.        MN$ + "    (Entrypoint : " + Mid(ArrayAdr(ZDLL - DLLEntry), Adr3264 + 1, 255) + " )"
  8388.        Daten(Zeile)\Mnemonic = MN$
  8389.        AddElement(DLLEP())
  8390.        DLLEP() = Zeile
  8391.        DLLEntry - 1
  8392.      Wend
  8393.  
  8394.      Zeile + 1
  8395.      XMM = 0
  8396.      REX = 0
  8397.      Adr64 = 0
  8398.      NoString = 0
  8399.    EndIf
  8400.  
  8401.    If BZ > (BZOLD + (LF / 100))            ;was fürs Auge
  8402.      BZOLD = BZ
  8403.      SetGadgetText(70, Fort$ + SECN$)
  8404.      SetGadgetState(71, (BZ * 100) / LF)
  8405.    EndIf
  8406.  
  8407.  ForEver                                   ;bis Section fertig
  8408.  
  8409. EndProcedure
  8410.  
  8411. Procedure Datas()                           ;Section mit nicht ausführbarem Code
  8412.  SRVA  = I_S_H\VirtualAddress              ;rel.virt.Adresse Section
  8413.  SL    = I_S_H\SizeOfRawData               ;Section-Länge
  8414.  SO    = I_S_H\PointerToRawData            ;Section-Offset innerhalb der Datei
  8415.  SF    = I_S_H\Characteristics             ;Section-Flags
  8416.  SE    = SO + SL                           ;Section-End-Adresse
  8417.  OS    = IB + SRVA                         ;Offset Section
  8418.  SECN$ = Mid(I_S_H\Name, 1, 8)             ;zur Sicherheit, da nicht zwangsläufig null-terminiert
  8419.  
  8420.  Daten(Zeile)\Opcode = "Begin Section" + Str(SZ) + ", Name: " + UCase(SECN$) + ", non executable Code"
  8421.  
  8422.  Zeile + 1
  8423.  BZ = SO                                   ;Zeiger in Buffer
  8424.  
  8425.  Repeat
  8426.    If BZ >= SE
  8427.      Daten(Zeile)\Opcode = "                  E n d   S e c t i o n " + Str(SZ) + "    " + UCase(SECN$)
  8428.      Zeile + 1
  8429.      Break
  8430.    EndIf
  8431.  
  8432.    OP$ = ""
  8433.    MN$ = ""
  8434.    SOS = BZ
  8435.    While (BZ < SE)
  8436.      OP$ + RSet(Hex(PeekB(Buffer + BZ) & $FF), 2, "0") + " "
  8437.      MN = PeekB(Buffer + BZ)
  8438.      If MN < $20 Or MN > $7A
  8439.        MN = $2E
  8440.      EndIf
  8441.      MN$ + Chr(MN) + " "
  8442.      If Len(OP$) > 45                      ;max. 16 Zeichen + Leerzeichen dazwischen
  8443.        Daten(Zeile)\Address = "$" + RSet(Hex(BZ + OS - SO - 15), Adr3264, "0")
  8444.        Daten(Zeile)\Opcode = OP$
  8445.        Daten(Zeile)\Mnemonic = MN$
  8446.        Zeile + 1
  8447.        OP$ = ""
  8448.        MN$ = ""
  8449.        SOS = BZ
  8450.      EndIf
  8451.      BZ + 1
  8452.      If BZ > (BZOLD + (LF / 100))          ;was fürs Auge
  8453.        BZOLD = BZ
  8454.        SetGadgetText(70, Fort$ + SECN$)
  8455.        SetGadgetState(71, (BZ * 100) / LF)
  8456.      EndIf
  8457.    Wend
  8458.    
  8459.    If OP$ <> ""
  8460.      Daten(Zeile)\Address = "$" + RSet(Hex(SOS + OS - SO), Adr3264, "0")
  8461.      Daten(Zeile)\Opcode = OP$
  8462.      Daten(Zeile)\Mnemonic = MN$
  8463.      Zeile + 1
  8464.    EndIf
  8465.  
  8466.  ForEver                                   ;bis Section fertig
  8467.  
  8468. EndProcedure
  8469.  
  8470. Procedure CPUID_Info()
  8471.  ;Instruction/Group   CPUID (EAX)     Register    Bit    Intel    AMD   Remarks
  8472.  ;--------------------------------------------------------------------------------------------------------
  8473.  ;3DNOW!               80000001h         EDX      31       -       x
  8474.  ;AES                  00000001h         ECX      25       x       x
  8475.  ;AMDLM                80000001h         EDX      29       -       x    AMD Long Mode
  8476.  ;AMDMISAL16           80000001h         ECX       7       -       x    Misaligned 16-Byte Memory Access
  8477.  ;AVX                  00000001h         ECX      28       x       x
  8478.  ;AVX2                 00000007h         EBX       5       x       -    Input ECX=0
  8479.  ;BMI                  00000007h         EBX       3       -       x    Input ECX=0, Bit Manipulation Instruction
  8480.  ;CLFSH                00000001h         EDX      19       x       x    CLFLUSH
  8481.  ;(F)CMOV              00000001h         EDX      15       x       x    CMOVcc, FCMOVcc
  8482.  ;CMPXCHG8B            00000001h         EDX       8       x       x
  8483.  ;CMPXCHG16B           00000001h         ECX      13       x       x
  8484.  ;CVT16                80000001h         ECX      18       -       x    Floating-Point Fraction Extract and Half-Precision Conversion
  8485.  ;EMMX                 80000001h         EDX      22       -       x    AMD Extensions to MMX
  8486.  ;EXT3DNOW!            80000001h         EDX      30       -       x    Extensions to 3DNOW!
  8487.  ;FMA                  00000001h         ECX      12       x       -    Fused Multiply Add
  8488.  ;FMA4                 80000001h         ECX      16       -       x    Floating-Point Multiply Accumulate (4 Operands)
  8489.  ;FXSR                 00000001h         EDX      24       x       x    FXSAVE, FXRSTOR
  8490.  ;LWP                  80000001h         ECX      15       -       x    LightWeight Profiling
  8491.  ;LZCNT                80000001h         ECX       5       -       x
  8492.  ;MMX                  00000001h         EDX      23       x       x
  8493.  ;MONITOR              00000001h         ECX       3       x       x    MONITOR, MWAIT
  8494.  ;MOVBE                00000001h         ECX      22       x       -
  8495.  ;MSR                  00000001h         EDX       5       x       x    RDMSR, WRMSR  
  8496.  ;OSXSAVE              00000001h         ECX      27       x       -
  8497.  ;PCLMULQDQ            00000001h         ECX       1       x       -    Carryless Multiplication
  8498.  ;POPCNT               00000001h         ECX      23       x       x
  8499.  ;RDTSC                00000001h         EDX       4       x       x  
  8500.  ;RDTSCP               80000001h         EDX      27       x       x
  8501.  ;SEP                  00000001h         EDX      11       x       x    SYSENTER, SYSEXIT
  8502.  ;SMX                  00000001h         ECX       6       x       -    Safer Mode Extensions
  8503.  ;SSE                  00000001h         EDX      25       x       x
  8504.  ;SSE2                 00000001h         EDX      26       x       x
  8505.  ;SSE3                 00000001h         ECX       0       x       x  
  8506.  ;SSSE3                00000001h         ECX       9       x       x  
  8507.  ;SSE4.1               00000001h         ECX      19       x       x  
  8508.  ;SSE4.2               00000001h         ECX      20       x       x  
  8509.  ;SSE4A                80000001h         ECX       6       -       x
  8510.  ;SVM                  80000001h         ECX       2       -       x    Secure Virtual Machine
  8511.  ;TBM                  80000001h         ECX      21       -       x    Trailing Bit Manipulation
  8512.  ;VMX                  00000001h         ECX       5       x       -    Virtual Machine Extensions
  8513.  ;XOP                  80000001h         ECX      11       -       x    Extended Operations
  8514.  ;XSAVE                00000001h         ECX      26       x       x
  8515.  ;XSAVEOPT             0000000Dh         EAX       0       x       x    Input ECX=1
  8516.  
  8517.  ;No check for CPUID!  
  8518.    !mov eax,1h
  8519.    !cpuid
  8520.    !test edx,[v_Bit23]      ;MMX
  8521.    !jz l_nommx
  8522.    !mov [v_MMX],8800h       ;Grün für vorhanden
  8523. NOMMX:
  8524.    !test edx,[v_Bit25]      ;SSE  
  8525.    !jz l_nosse
  8526.    !mov [v_SSE],8800h
  8527. NOSSE:
  8528.    !test edx,[v_Bit26]      ;SSE2  
  8529.    !jz l_nosse2
  8530.    !mov [v_SSE2],8800h
  8531. NOSSE2:
  8532.    !test ecx,[v_Bit0]       ;SSE3
  8533.    !jz l_nosse3
  8534.    !mov [v_SSE3],8800h    
  8535. NOSSE3:
  8536.    !test ecx,[v_Bit9]       ;SSSE3
  8537.    !jz l_nossse3
  8538.    !mov [v_SSSE3],8800h
  8539. NOSSSE3:
  8540.    !test ecx,[v_Bit19]      ;SSE4.1
  8541.    !jz l_nosse41
  8542.    !mov [v_SSE41],8800h
  8543. NOSSE41:
  8544.    !test ecx,[v_Bit20]      ;SSE4.2
  8545.    !jz l_nosse42
  8546.    !mov [v_SSE42],8800h
  8547. NOSSE42:
  8548.    !test ecx,[v_Bit23]      ;POPCNT
  8549.    !jz l_nopopcnt
  8550.    !mov [v_POPCNT],8800h
  8551. NOPOPCNT:
  8552.    !test ecx,[v_Bit1]       ;PCLMULQDQ
  8553.    !jz l_nopclmulqdq
  8554.    !mov [v_PCLMULQDQ],8800h
  8555. NOPCLMULQDQ:
  8556.    !test ecx,[v_Bit2]       ;MONITOR
  8557.    !jz l_nomonitor
  8558.    !mov [v_MONITOR],8800h
  8559. NOMONITOR:
  8560.    !test ecx,[v_Bit5]       ;VMX
  8561.    !jz l_novmx
  8562.    !mov [v_VMX],8800h
  8563. NOVMX:
  8564.    !test ecx,[v_Bit6]       ;SMX
  8565.    !jz l_nosmx
  8566.    !mov [v_SMX],8800h
  8567. NOSMX:
  8568.    !test ecx,[v_Bit12]      ;FMA
  8569.    !jz l_nofma
  8570.    !mov [v_FMA],8800h
  8571. NOFMA:
  8572.    !test edx,[v_Bit11]      ;SEP
  8573.    !jz l_nosep
  8574.    !mov [v_SEP],8800h
  8575. NOSEP:
  8576.    !test edx,[v_Bit24]      ;FXSR
  8577.    !jz l_nofxsr
  8578.    !mov [v_FXSR],8800h
  8579. NOFXSR:
  8580.    !test edx,[v_Bit8]       ;CMPXCHG8B
  8581.    !jz l_nocx8
  8582.    !mov [v_CX8],8800h
  8583. NOCX8:
  8584.    !test ecx,[v_Bit13]      ;CMPXCHG16B
  8585.    !jz l_nocx16
  8586.    !mov [v_CX16],8800h
  8587. NOCX16:
  8588.    !test ecx,[v_Bit25]      ;AES
  8589.    !jz l_noaes
  8590.    !mov [v_AES],8800h
  8591. NOAES:
  8592.    !test ecx,[v_Bit26]      ;XSAVE
  8593.    !jz l_noxsave
  8594.    !mov [v_XSAVE],8800h
  8595. NOXSAVE:
  8596.    !test ecx,[v_Bit27]      ;OSXSAVE
  8597.    !jz l_noosxsave
  8598.    !mov [v_OSXSAVE],8800h
  8599. NOOSXSAVE:
  8600.    !test ecx,[v_Bit28]      ;AVX
  8601.    !jz l_noavx
  8602.    !mov [v_AVX],8800h
  8603. NOAVX:
  8604.    !test ecx,[v_Bit22]      ;MOVBE
  8605.    !jz l_nomovbe
  8606.    !mov [v_MOVBE],8800h
  8607. NOMOVBE:
  8608.    !test edx,[v_Bit15]      ;(F)CMOVcc
  8609.    !jz l_nocmov
  8610.    !mov [v_CMOV],8800h
  8611. NOCMOV:      
  8612.    !test edx,[v_Bit19]      ;CLFSH
  8613.    !jz l_noclfsh
  8614.    !mov [v_CLFSH],8800h
  8615. NOCLFSH:      
  8616.    !test edx,[v_Bit5]       ;MSR
  8617.    !jz l_nomsr
  8618.    !mov [v_MSR],8800h
  8619. NOMSR:
  8620.    !test edx,[v_Bit4]       ;RDTSC
  8621.    !jz l_nordtsc
  8622.    !mov [v_RDTSC],8800h
  8623. NORDTSC:
  8624.    !xor eax,eax
  8625.    !cpuid
  8626.    !cmp eax,0Dh             ;largest ID
  8627.    !jb l_noxsaveopt
  8628.    !mov eax,0Dh
  8629.    !mov ecx,1
  8630.    !cpuid
  8631.    !test eax,[v_Bit0]       ;XSAVEOPT
  8632.    !jz l_noxsaveopt
  8633.    !mov [v_XSAVEOPT],8800h
  8634. NOXSAVEOPT:
  8635.    !mov eax,7
  8636.    !xor ecx,ecx
  8637.    !cpuid
  8638.    !test ebx,[v_Bit5]       ;AVX2
  8639.    !jz l_noavx2
  8640.    !mov [v_AVX2],8800h    
  8641. NOAVX2:    
  8642.    !mov eax,7
  8643.    !xor ecx,ecx
  8644.    !cpuid
  8645.    !test ebx,[v_Bit3]       ;BMI
  8646.    !jz l_nobmi
  8647.    !mov [v_BMI],8800h
  8648. NOBMI:
  8649. ;-------- Anzahl der vorhandenen Extended Levels ermitteln als Vorstufe für 3DNow!-Test
  8650. ;-------- Rückgabewert in EAX (-80000000h) gibt Anzahl der Extended Level an
  8651.    !mov eax,80000000h
  8652.    !cpuid
  8653.    !cmp eax,80000000h       ;hat nichts mit einem Bit zu tun!
  8654.    !jbe l_noexte            ;keine Extended Levels, Ende
  8655.    !mov eax,80000001h
  8656.    !cpuid                   ;Intel-Prozessoren liefern hier EAX=0 zurück
  8657.    !or eax,eax
  8658.    !je l_noamd              ;ist Intel-Prozessor
  8659.    !test edx,[v_Bit31]      ;AMD 3DNow!
  8660.    !jz l_noext
  8661.    !mov [v_DNOW],8800h
  8662.    !test edx,[v_Bit30]      ;AMD Extended 3DNow!  DSP: PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD
  8663.    !jz l_noext
  8664.    !mov [v_EDNOW],8800h
  8665. NOEXT:
  8666.    !test ecx,[v_Bit6]       ;AMD SSE4A   EXTRQ, INSERTQ, MOVNTSD, MOVNTSS
  8667.    !jz l_nosse4a
  8668.    !mov [v_SSE4A],8800h
  8669. NOSSE4A:    
  8670.    !test edx,[v_Bit29]      ;AMDLM   AMD Long Mode
  8671.    !jz l_noamdlm
  8672.    !mov [v_AMDLM],8800h
  8673. NOAMDLM:    
  8674.    !test ecx,[v_Bit7]       ;AMDMISAL16
  8675.    !jz l_noamdmisal16
  8676.    !mov [v_AMDMISAL16],8800h
  8677. NOAMDMISAL16:
  8678.    !test ecx,[v_Bit18]      ;CVT16
  8679.    !jz l_nocvt16
  8680.    !mov [v_CVT16],8800h
  8681. NOCVT16:
  8682.    !test edx,[v_Bit22]      ;EMMX
  8683.    !jz l_noemmx
  8684.    !mov [v_EMMX],8800h
  8685. NOEMMX:
  8686.    !test ecx,[v_Bit16]      ;FMA4
  8687.    !jz l_nofma4
  8688.    !mov [v_FMA4],8800h
  8689. NOFMA4:
  8690.    !test ecx,[v_Bit15]      ;LWP
  8691.    !jz l_nolwp
  8692.    !mov [v_LWP],8800h
  8693. NOLWP:
  8694.    !test ecx,[v_Bit5]       ;LZCNT
  8695.    !jz l_nolzcnt
  8696.    !mov [v_LZCNT],8800h
  8697. NOLZCNT:
  8698.    !test ecx,[v_Bit2]       ;SVM
  8699.    !jz l_nosvm
  8700.    !mov [v_SVM],8800h
  8701. NOSVM:
  8702.    !test ecx,[v_Bit21]      ;TBM
  8703.    !jz l_notbm
  8704.    !mov [v_TBM],8800h
  8705. NOTBM:
  8706.    !test ecx,[v_Bit11]      ;XOP
  8707.    !jz l_noamd
  8708.    !mov [v_XOP],8800h
  8709. NOAMD:
  8710.    !test edx,[v_Bit27]      ;RDTSCP
  8711.    !jz l_noexte
  8712.    !mov [v_RDTSCP],8800h
  8713. NOEXTE:
  8714.  
  8715.  TextGadget(80, 10, 16, 43, 13, DNOW$)  
  8716.  SetGadgetColor(80, #PB_Gadget_FrontColor, DNOW)
  8717.  
  8718.  TextGadget(81, 60, 16, 59, 13, EDNOW$)  
  8719.  SetGadgetColor(81, #PB_Gadget_FrontColor, EDNOW)  
  8720.  
  8721.  TextGadget(82, 126, 16, 23, 13, AES$)  
  8722.  SetGadgetColor(82, #PB_Gadget_FrontColor, AES)  
  8723.  
  8724.  TextGadget(83, 157, 16, 40, 13, AMDLM$)  
  8725.  SetGadgetColor(83, #PB_Gadget_FrontColor, AMDLM)
  8726.  
  8727.  TextGadget(84, 205, 16, 73, 13, AMDMISAL16$)  
  8728.  SetGadgetColor(84, #PB_Gadget_FrontColor, AMDMISAL16)
  8729.  
  8730.  TextGadget(85, 285, 16, 22, 13, AVX$)  
  8731.  SetGadgetColor(85, #PB_Gadget_FrontColor, AVX)  
  8732.  
  8733.  TextGadget(86, 314, 16, 28, 13, AVX2$)  
  8734.  SetGadgetColor(86, #PB_Gadget_FrontColor, AVX2)  
  8735.  
  8736.  TextGadget(87, 349, 16, 20, 13, BMI$)  
  8737.  SetGadgetColor(87, #PB_Gadget_FrontColor, BMI)  
  8738.  
  8739.  TextGadget(88, 376, 16, 40, 13, CLFSH$)  
  8740.  SetGadgetColor(88, #PB_Gadget_FrontColor, CLFSH)  
  8741.  
  8742.  TextGadget(89, 423, 16, 50, 13, CMOV$)  
  8743.  SetGadgetColor(89, #PB_Gadget_FrontColor, CMOV)
  8744.  
  8745.  TextGadget(90, 480, 16, 37, 13, CVT16$)  
  8746.  SetGadgetColor(90, #PB_Gadget_FrontColor, CVT16)
  8747.  
  8748.  TextGadget(91, 524, 16, 24, 13, CX8$)  
  8749.  SetGadgetColor(91, #PB_Gadget_FrontColor, CX8)
  8750.  
  8751.  TextGadget(92, 555, 16, 30, 13, CX16$)  
  8752.  SetGadgetColor(92, #PB_Gadget_FrontColor, CX16)
  8753.  
  8754.  TextGadget(93, 592, 16, 24, 13, FMA$)  
  8755.  SetGadgetColor(93, #PB_Gadget_FrontColor, FMA)
  8756.  
  8757.  TextGadget(94, 623, 16, 29, 13, FMA4$)  
  8758.  SetGadgetColor(94, #PB_Gadget_FrontColor, FMA4)
  8759.  
  8760.  TextGadget(95, 659, 16, 31, 13, FXSR$)  
  8761.  SetGadgetColor(95, #PB_Gadget_FrontColor, FXSR)
  8762.  
  8763.  TextGadget(96, 697, 16, 25, 13, LWP$)  
  8764.  SetGadgetColor(96, #PB_Gadget_FrontColor, LWP)  
  8765.  
  8766.  TextGadget(97, 729, 16, 38, 13, LZCNT$)  
  8767.  SetGadgetColor(97, #PB_Gadget_FrontColor, LZCNT)
  8768.  
  8769.  TextGadget(98, 774, 16, 25, 13, MMX$)  
  8770.  SetGadgetColor(98, #PB_Gadget_FrontColor, MMX)  
  8771.  
  8772.  TextGadget(99, 806, 16, 42, 13, EMMX$)  
  8773.  SetGadgetColor(99, #PB_Gadget_FrontColor, EMMX)
  8774.  
  8775.  TextGadget(100, 855, 16, 54, 13, MONITOR$)  
  8776.  SetGadgetColor(100, #PB_Gadget_FrontColor, MONITOR)
  8777.  
  8778.  TextGadget(101, 916, 16, 40, 13, MOVBE$)  
  8779.  SetGadgetColor(101, #PB_Gadget_FrontColor, MOVBE)
  8780.  
  8781.  TextGadget(102, 963, 16, 26, 13, MSR$)  
  8782.  SetGadgetColor(102, #PB_Gadget_FrontColor, MSR)
  8783.  
  8784.  TextGadget(103, 10, 29, 52, 13, OSXSAVE$)  
  8785.  SetGadgetColor(103, #PB_Gadget_FrontColor, OSXSAVE)
  8786.  
  8787.  TextGadget(104, 69, 29, 76, 13, PCLMULQDQ$)  
  8788.  SetGadgetColor(104, #PB_Gadget_FrontColor, PCLMULQDQ)
  8789.  
  8790.  TextGadget(105, 152, 29, 50, 13, POPCNT$)  
  8791.  SetGadgetColor(105, #PB_Gadget_FrontColor, POPCNT)
  8792.  
  8793.  TextGadget(106, 209, 29, 42, 13, RDTSC$)  
  8794.  SetGadgetColor(106, #PB_Gadget_FrontColor, RDTSC)
  8795.  
  8796.  TextGadget(107, 258, 29, 50, 13, RDTSCP$)  
  8797.  SetGadgetColor(107, #PB_Gadget_FrontColor, RDTSCP)
  8798.  
  8799.  TextGadget(108, 315, 29, 24, 13, SEP$)  
  8800.  SetGadgetColor(108, #PB_Gadget_FrontColor, SEP)
  8801.  
  8802.  TextGadget(109, 346, 29, 24, 13, SMX$)  
  8803.  SetGadgetColor(109, #PB_Gadget_FrontColor, SMX)
  8804.  
  8805.  TextGadget(110, 377, 29, 23, 13, SSE$)  
  8806.  SetGadgetColor(110, #PB_Gadget_FrontColor, SSE)
  8807.  
  8808.  TextGadget(111, 407, 29, 31, 13, SSE2$)  
  8809.  SetGadgetColor(111, #PB_Gadget_FrontColor, SSE2)
  8810.  
  8811.  TextGadget(112, 445, 29, 31, 13, SSE3$)  
  8812.  SetGadgetColor(112, #PB_Gadget_FrontColor, SSE3)
  8813.  
  8814.  TextGadget(113, 483, 29, 39, 13, SSSE3$)  
  8815.  SetGadgetColor(113, #PB_Gadget_FrontColor, SSSE3)
  8816.  
  8817.  TextGadget(114, 529, 29, 40, 13, SSE41$)  
  8818.  SetGadgetColor(114, #PB_Gadget_FrontColor, SSE41)
  8819.  
  8820.  TextGadget(115, 576, 29, 41, 13, SSE42$)  
  8821.  SetGadgetColor(115, #PB_Gadget_FrontColor, SSE42)
  8822.  
  8823.  TextGadget(116, 624, 29, 41, 13, SSE4A$)  
  8824.  SetGadgetColor(116, #PB_Gadget_FrontColor, SSE4A)  
  8825.  
  8826.  TextGadget(117, 672, 29, 25, 13, SVM$)  
  8827.  SetGadgetColor(117, #PB_Gadget_FrontColor, SVM)
  8828.  
  8829.  TextGadget(118, 704, 29, 25, 13, TBM$)  
  8830.  SetGadgetColor(118, #PB_Gadget_FrontColor, TBM)  
  8831.  
  8832.  TextGadget(119, 736, 29, 25, 13, VMX$)  
  8833.  SetGadgetColor(119, #PB_Gadget_FrontColor, VMX)
  8834.  
  8835.  TextGadget(120, 768, 29, 25, 13, XOP$)  
  8836.  SetGadgetColor(120, #PB_Gadget_FrontColor, XOP)
  8837.  
  8838.  TextGadget(121, 800, 29, 35, 13, XSAVE$)  
  8839.  SetGadgetColor(121, #PB_Gadget_FrontColor, XSAVE)
  8840.  
  8841.  TextGadget(122, 842, 29, 60, 13, XSAVEOPT$)  
  8842.  SetGadgetColor(122, #PB_Gadget_FrontColor, XSAVEOPT)
  8843.  
  8844.  ;Prozessor-String  
  8845.  ProzStrAdr = @ProzessorString$  
  8846.  !mov eax,80000000h         ;Test, ob CPU aktuell genug ist um den String zu liefern
  8847.  !cpuid
  8848.  !cmp eax,80000004h
  8849.  !jb l_nocpustr
  8850.  !mov esi,[v_ProzStrAdr]
  8851.  !xor edi,edi
  8852. !@@:    
  8853.  !mov eax,80000002h
  8854.  !add eax,edi
  8855.  !cpuid        
  8856.  !mov [esi],eax
  8857.  !mov [esi+4],ebx    
  8858.  !mov [esi+8],ecx
  8859.  !mov [esi+12],edx
  8860.  !inc edi
  8861.  !cmp edi,3
  8862.  !je l_nocpustr
  8863.  !add esi,16
  8864.  !jmp @b
  8865. NOCPUSTR:
  8866.  !mov byte[esi+48],0        ;Zerobyte setzen
  8867.    
  8868.  TextGadget(123, 10, 2, 400, 15, "Current CPU : " + LTrim(ProzessorString$))
  8869.  For i = 80 To 123
  8870.    SetGadgetFont(i, FontID(0))  
  8871.  Next    
  8872. EndProcedure  
  8873.  
  8874. Procedure File_Info()  
  8875.  k = 0
  8876.  For n = ANS To 1 Step -1
  8877.    CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))    ;fill Structure IMAGE_SECTION_HEADER
  8878.    SF = I_S_H\Characteristics              ;Flags ermitteln
  8879.    SF$ = " ("
  8880.    If SF & #IMAGE_SCN_MEM_READ
  8881.      SF$ + "Read"
  8882.    EndIf
  8883.    If SF & #IMAGE_SCN_MEM_WRITE
  8884.      SF$ + " and Write"
  8885.    EndIf
  8886.    If SF & #IMAGE_SCN_MEM_EXECUTE
  8887.      SF$ + " , executable Code"
  8888.    EndIf
  8889.    If SF & #IMAGE_SCN_CNT_INITIALIZED_DATA
  8890.      SF$ + " , initializated Datas"
  8891.    EndIf
  8892.    If SF & #IMAGE_SCN_CNT_UNINITIALIZED_DATA
  8893.      SF$ + " , non initializated Datas"
  8894.    EndIf
  8895.    SF$ + ")"
  8896.  
  8897.    SO    = I_S_H\PointerToRawData          ;Section-Offset innerhalb der Datei
  8898.    SL    = I_S_H\SizeOfRawData             ;Sections-Länge
  8899.    SRVA  = I_S_H\VirtualAddress
  8900.    SECN$ = Mid(I_S_H\Name, 1, 8)           ;zur Sicherheit, da nicht zwangsläufig null-terminiert
  8901.    SE    = SO + SL
  8902.    If ProgA = 0                            ;niedrigst mögliche Adresse
  8903.      ProgA = IB + SRVA
  8904.    EndIf
  8905.    SEC$ = SECN$ + " : Offset = $" + Hex(SO, #PB_Long) + "  End = $" + Hex(SE, #PB_Long) + "  Size = $" + Hex(SL, #PB_Long) + "  RVA = $" + Hex(SRVA, #PB_Long) + "  Flags = $" + Hex(SF, #PB_Long) + SF$ ;lass ich erstmal auf Long
  8906.    TextGadget(131 + n, 10, 535 - 15 * n, 750, 15, SEC$)
  8907.    SetGadgetFont(131 + n, FontID(0))
  8908.    SECNG$ + SECN$ + ", "
  8909.    k + #IMAGE_SIZEOF_SECTION_HEADER
  8910.    SF$ = ""                                ;zur Sicherheit
  8911.  Next
  8912.  
  8913.  ProgE = IB + SRVA + SL - 1                ;höchst mögliche Adresse
  8914.  ;Kosmetik
  8915.  SECNG$ = Mid(SECNG$, 1, Len(SECNG$) - 2)  ;letze ", " wieder entfernen für Anzeige
  8916.  
  8917.  MISC$ = "ImageBase = $" + Hex(IB, Adr3264 >> 2) + "  Program-Entrypoint = $" + Hex(IB + PEP, Adr3264 >> 2) + "  Number of Sections = $" + Hex(ANS, Adr3264) + " (" + SECNG$ + ")"
  8918.  TextGadget(130, 10, 520 - 15 * ANS, 750, 15, MISC$)
  8919.  SetGadgetFont(130, FontID(0))
  8920. EndProcedure
  8921.  
  8922. Procedure GetProcessList(Gadget)
  8923.  If OpenLibrary(0, "psapi.dll")
  8924.    If OS3264
  8925.      OpenLibrary(1, "Kernel32.dll")
  8926.      IsWow64Process.IsWoW64 = GetFunction(1, "IsWow64Process")
  8927.      CloseLibrary(1)
  8928.    EndIf
  8929.    Bit$ = "32 - Bit"
  8930.    EnumProcesses = GetFunction(0, "EnumProcesses")
  8931.    EnumProcessModules = GetFunction(0, "EnumProcessModules")
  8932.    GetModuleBaseName = GetFunction(0, "GetModuleBaseNameA")
  8933.    CallFunctionFast(EnumProcesses, ProcessesArray(), #NbProcessesMax, @nProcesses)
  8934.    For k = 0 To nProcesses >> 2
  8935.      hProcess = OpenProcess_(#PROCESS_ALL_ACCESS, #False, ProcessesArray(k))  ;PROCESS_ALL_ACCESS siebt gesperrte Programme aus
  8936.      If hProcess
  8937.        CallFunctionFast(EnumProcessModules, hProcess, @BaseModule, 4, @cbNeeded)
  8938.        Prozess$ = Space(cbNeeded)
  8939.        CallFunctionFast(GetModuleBaseName, hProcess, BaseModule, @Prozess$, cbNeeded)
  8940.        If Len(Prozess$) <> 0               ;z.B. System
  8941.          If OS3264
  8942.            IsWow64Process(hProcess, @BOOL)
  8943.            If BOOL
  8944.              Bit$ = "32 - Bit"
  8945.             Else
  8946.              Bit$ = "64 - Bit"
  8947.            EndIf
  8948.          EndIf
  8949.          AddGadgetItem(Gadget, -1, Prozess$ + Chr(10) + Bit$ + Chr(10) + Str(ProcessesArray(k)))
  8950.        EndIf
  8951.        CloseHandle_(hProcess)
  8952.      EndIf
  8953.    Next
  8954.    CloseLibrary(0)
  8955.  EndIf
  8956. EndProcedure
  8957.  
  8958. Procedure MemoryAreas()
  8959. Repeat
  8960.  GetSystemInfo_(S_I)                       ;Ermittlung des für Programme zur Verfügung stehenden Speichers
  8961.  MinAdr = S_I\lpMinimumApplicationAddress
  8962.  MaxAdr = S_I\lpMaximumApplicationAddress
  8963.  ;jetzt das Ganze für Vollzugriff öffnen
  8964.  ProcessHandle = OpenProcess_(#PROCESS_ALL_ACCESS, #False, ProgID)
  8965.  AnfAdresse = MinAdr
  8966.  Zeile = 0
  8967.  
  8968.  While AnfAdresse < MaxAdr                 ;Speicher abklappern
  8969.    If OS3264
  8970.      If VirtualQueryEx_(ProcessHandle, AnfAdresse, MBI64A, 48)
  8971.        Size = PeekQ(MBI64A + 24)           ;MBI\RegionSize  24    
  8972.        Eigner = PeekL(MBI64A + 32)         ;MBI\State  32  
  8973.        Status = PeekL(MBI64A + 36)         ;MBI\Protect  36
  8974.       Else  
  8975.        Break
  8976.      EndIf
  8977.     Else
  8978.      If VirtualQueryEx_(ProcessHandle, AnfAdresse, @M_B_I, SizeOf(M_B_I))
  8979.        Size = M_B_I\RegionSize    
  8980.        Eigner = M_B_I\State  
  8981.        Status = M_B_I\Protect      
  8982.       Else
  8983.        Break
  8984.      EndIf
  8985.    EndIf
  8986.    If Eigner = #MEM_COMMIT                 ;Test, ob Speicherbereich mit ausgewähltem Programm assoziiert ist
  8987.      If OS3264
  8988.        BaseAdr = PeekQ(MBI64A)             ;MBI\BaseAddress  0
  8989.       Else
  8990.        BaseAdr = M_B_I\BaseAddress
  8991.      EndIf  
  8992.      AddGadgetItem(20, -1, "")
  8993.      SetGadgetItemText(20, Zeile, "$" + Hex(BaseAdr), 0)
  8994.      EndAdr = BaseAdr + Size
  8995.      SetGadgetItemText(20, Zeile, "$" + Hex(EndAdr), 1)
  8996.      SetGadgetItemText(20, Zeile, "$" + Hex(Size), 2)
  8997.      If Status = $1
  8998.        Status$ = "PAGE_NOACCESS"
  8999.       ElseIf Status = $2
  9000.        Status$ = "PAGE_READONLY"
  9001.       ElseIf Status = $4
  9002.        Status$ = "PAGE_READWRITE"    
  9003.       ElseIf Status = $8
  9004.        Status$ = "PAGE_WRITECOPY"    
  9005.       ElseIf Status = $10
  9006.        Status$ = "PAGE_EXECUTE"    
  9007.       ElseIf Status = $20
  9008.        Status$ = "PAGE_EXECUTE_READ"    
  9009.       ElseIf Status = $40
  9010.        Status$ = "PAGE_EXECUTE_READWRITE"    
  9011.       ElseIf Status = $80
  9012.        Status$ = "PAGE_EXECUTE_WRITECOPY"    
  9013.       ElseIf Status = $100
  9014.        Status$ = "PAGE_GUARD"  
  9015.       ElseIf Status = $200
  9016.        Status$ = "PAGE_NOCACHE"
  9017.       ElseIf Status = $400
  9018.        Status$ = "PAGE_WRITECOMBINE"    
  9019.       Else
  9020.        Status$ = "Combination"
  9021.      EndIf
  9022.  
  9023.      SetGadgetItemText(20, Zeile, "$" + Hex(Status) + " = " + Status$ , 3)
  9024.      Status$ = ""
  9025.      Zeile + 1
  9026.    EndIf
  9027.    AnfAdresse + Size
  9028.  Wend  
  9029.  
  9030.  SetActiveGadget(20)                       ;for scrolling  
  9031.  Repeat
  9032.    Event = WaitWindowEvent()
  9033.    If Event = #PB_Event_CloseWindow
  9034.      Quit = 1
  9035.      Break 2
  9036.    EndIf    
  9037.  Until EventType() = #PB_EventType_LeftDoubleClick
  9038.  
  9039.  BaseAdr$ = GetGadgetItemText(20, GetGadgetState(20))
  9040.  BaseAdr = Val(BaseAdr$)
  9041.  EndAdr$ = GetGadgetItemText(20, GetGadgetState(20), 1)
  9042.  EndAdr = Val(EndAdr$)
  9043.    
  9044.  ;Buffer-Speicher anfordern ---
  9045.  Laenge = (EndAdr - BaseAdr)
  9046.  Buffer = AllocateMemory(Laenge)
  9047.  If Buffer = 0
  9048.    MessageRequester("Error !", "Not enough memory !")
  9049.    Break
  9050.  EndIf  
  9051.  ;"virtual" to "real" memory  
  9052.  ReadProcessMemory_(ProcessHandle, BaseAdr, Buffer, Laenge, 0)
  9053.  
  9054.  TextGadget(0, 10, 42, 1000, 15, "Selected File :" + Bit$ + " (In Memory) " + File$ + "  (" + Str(EndAdr - BaseAdr) + " Bytes)", #PB_Text_Center)
  9055.  SetGadgetFont(0, FontID(0))
  9056.  GID = ListIconGadget(20, 10, 60, 1000, 460 - 15 * ANS, "Address", 135, #LVS_OWNERDATA | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  9057.  SetGadgetFont(20, FontID(0))
  9058.  AddGadgetColumn(20, 1, "Opcode (Values in Hex)", 290)
  9059.  AddGadgetColumn(20, 2, "Mnemonic (Values in Hex)" + Option$, 445)
  9060.  AddGadgetColumn(20, 3, "Opcode - ASCII", 100)
  9061.  
  9062.  TextGadget(70, 325, 70, 250, 20, Fort$, #PB_Text_Center)
  9063.  ProgressBarGadget(71, 325, 90, 250,  25, 0, 100, #PB_ProgressBar_Smooth)
  9064.  
  9065.  Zeile = 0
  9066.  
  9067.  Codes()
  9068.  Break
  9069. ForEver
  9070.  
  9071. EndProcedure  
  9072.  
  9073. Procedure Main()  
  9074.  CPUID_Info()
  9075. Repeat
  9076.  TextGadget(0, 10, 50, 230, 15, "Select :")
  9077.  ButtonGadget(1, 70, 48, 160, 20, "* . EXE")
  9078.  ButtonGadget(2, 250, 48, 160, 20, "* . DLL")
  9079.  ButtonGadget(3, 430, 48, 160, 20, "* . *  32 - Bit - Disassembly")
  9080.  ButtonGadget(4, 610, 48, 160, 20, "* . *  64 - Bit - Disassembly")
  9081.  ButtonGadget(5, 790, 48, 160, 20, "Program in Memory")
  9082.  
  9083.  For i = 0 To 5
  9084.    SetGadgetFont(i, FontID(0))  
  9085.  Next  
  9086.  
  9087.  Repeat
  9088.    Event = WaitWindowEvent()
  9089.    Select Event
  9090.      Case #PB_Event_Gadget
  9091.        Select EventGadget()
  9092.          Case 1
  9093.            FileExt$ = "*.EXE"
  9094.            Break
  9095.          Case 2
  9096.            FileExt$ = "*.DLL"
  9097.            Break    
  9098.          Case 3
  9099.            FileExt$ = "*.*"
  9100.            FileExt = 2
  9101.            PEP = 0
  9102.            Bit$ = " (32-Bit-Disassembly)"
  9103.            Break        
  9104.          Case 4
  9105.            FileExt$ = "*.*"
  9106.            IsProg64 = 1
  9107.            Adr3264 = 16                    ;für Adress-Anzeige 64-Bit
  9108.            FileExt = 2
  9109.            PEP = 0
  9110.            Bit$ = " (64-Bit-Disassembly)"
  9111.            Break
  9112.          Case 5
  9113.            FileExt$ = "(Program in Memory)"     ;only for the text
  9114.            FileExt = 3
  9115.            PEP = 0
  9116.            Break            
  9117.        EndSelect
  9118.      Case #PB_Event_CloseWindow
  9119.        Quit = 1
  9120.        Break 2        
  9121.    EndSelect
  9122.  ForEver
  9123.  
  9124.  FreeGadget(1) : FreeGadget(2) : FreeGadget(3) : FreeGadget(4) : FreeGadget(5)
  9125.  
  9126.  SetGadgetText(0, "Select : " + FileExt$)
  9127.  SetGadgetFont(0, FontID(0))
  9128.  
  9129.  If FileExt <> 3  
  9130.    ExplorerTreeGadget(1, 10, 70, 1000, 460, FileExt$, #PB_Explorer_NoDriveRequester)  
  9131.  
  9132.    ;ExplorerTreeGadget(1, 10, 70, 980, 460, "D:\Program Files\PureBasic\Compilers\"+FileExt$, #PB_Explorer_NoDriveRequester)    ;for my tests
  9133.    ;ExplorerTreeGadget(1, 10, 70, 980, 460, "C:\Programme\PureBasic\Compilers\"+FileExt$, #PB_Explorer_NoDriveRequester)    ;for my tests
  9134.    ;ExplorerTreeGadget(1, 10, 70, 980, 460, "Y:\"+FileExt$, #PB_Explorer_NoDriveRequester)    ;for my tests
  9135.  
  9136.    Repeat
  9137.      Event = WaitWindowEvent()
  9138.      If Event = #PB_Event_CloseWindow
  9139.        Quit = 1
  9140.        Break 2
  9141.      EndIf
  9142.    Until EventType() = #PB_EventType_LeftDoubleClick And GetGadgetState(1) = #PB_Explorer_File
  9143.    File$ = GetGadgetText(1)
  9144.    FreeGadget(0) : FreeGadget(1)
  9145.  
  9146.    ReadFile(0, File$)
  9147.    LF = Lof(0)
  9148.    Buffer = AllocateMemory(LF)
  9149.    FileL = ReadData(0, Buffer, LF)         ;Datei in Speicher einlesen
  9150.    CloseFile(0)
  9151.  EndIf
  9152.  
  9153.  Select FileExt  
  9154.    Case 0                                  ;EXE, DLL
  9155.      CopyMemory(Buffer, @I_D_H, SizeOf(I_D_H))  ;fill Structure IMAGE_DOS_HEADER
  9156.      New_File_Header = I_D_H\e_lfanew
  9157.      If New_File_Header - 8 > LF
  9158.        MessageRequester("Error !", File$ + " is not a File in PE-File-Format !. Use All Files (*.*) !")
  9159.        Quit = 2
  9160.        Break
  9161.      EndIf  
  9162.      CopyMemory(Buffer + I_D_H\e_lfanew + 4, @I_F_H, SizeOf(I_F_H))   ;fill Structure IMAGE_FILE_HEADER
  9163.      If PeekL(Buffer + I_D_H\e_lfanew) & $FFFFFFFF <> #IMAGE_NT_SIGNATURE     ;Test auf "PE  "
  9164.        MessageRequester("Error !", File$ + " is not a File in PE-File-Format !. Use All Files (*.*) !")
  9165.        Quit = 2
  9166.        Break
  9167.      EndIf
  9168.  
  9169.      Select I_F_H\Machine & $FFFF
  9170.        Case #IMAGE_FILE_MACHINE_I386
  9171.          IB = PeekL(Buffer + I_D_H\e_lfanew + 52) & $FFFFFFFF  ;Image-Base
  9172.          VADLL = PeekL(Buffer + I_D_H\e_lfanew + 120) & $FFFFFFFF   ;virtual address export table address
  9173.          File$ + " , 32-Bit-"
  9174.        Case #IMAGE_FILE_MACHINE_AMD64
  9175.          IB = PeekQ(Buffer + I_D_H\e_lfanew + 48)    ;Image-Base
  9176.          VADLL = PeekL(Buffer + I_D_H\e_lfanew + 136) & $FFFFFFFF   ;virtual address export table address
  9177.          File$ + " , 64-Bit-"  
  9178.          IsProg64 = 1
  9179.          Adr3264 = 16                      ;für Adress-Anzeige 64-Bit
  9180.        Default
  9181.          MessageRequester("Error !", File$ + " is not a File in 32- or 64-Bit-Windows-Format !")
  9182.          Quit = 2
  9183.          Break
  9184.      EndSelect
  9185.  
  9186.      Select I_F_H\Characteristics & #IMAGE_FILE_DLL
  9187.        Case #IMAGE_FILE_DLL
  9188.          File$ + "DLL"  
  9189.        Default
  9190.          File$ + "Exe"  
  9191.      EndSelect  
  9192.  
  9193.      TextGadget(0, 10, 42, 1000, 15, "Selected File : " + File$ + "  (" + Str(FileL) + " Bytes)", #PB_Text_Center)
  9194.      SetGadgetFont(0, FontID(0))
  9195.      ANS = I_F_H\NumberOfSections          ;Anzahl der Sections
  9196.      AST = I_D_H\e_lfanew + I_F_H\SizeOfOptionalHeader + SizeOf(I_F_H) + 4  ;Anfang Section Tables  4 = size of signature (´PE  ´)
  9197.      PEP = PeekL(Buffer + I_D_H\e_lfanew + 40) & $FFFFFFFF     ;Programm-Einstiegspunkt
  9198.  
  9199.      File_Info()
  9200.  
  9201.      GID = ListIconGadget(20, 10, 60, 1000, 460 - 15 * ANS, "Address (Hex)", 135, #LVS_OWNERDATA | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  9202.      SetGadgetFont(20, FontID(0))
  9203.      AddGadgetColumn(20, 1, "Opcode (Values in Hex)", 290)
  9204.      AddGadgetColumn(20, 2, "Mnemonic (Values in Hex)" + Option$, 435)
  9205.      AddGadgetColumn(20, 3, "Opcode - ASCII", 100)
  9206.      TextGadget(70, 325, 70, 250, 20, Fort$, #PB_Text_Center)
  9207.      ProgressBarGadget(71, 325, 90, 250,  25, 0, 100, #PB_ProgressBar_Smooth)
  9208.  
  9209.      ;Test auf DLL (zur Sicherheit)
  9210.      ;die Ordinal-Zuweisung ist mit Vorsicht zu geniessen! Mal sehen... Immer diese Ausnahmen ;-)
  9211.      ;die Nr. ist nicht unbedingt die Hint-Nr., deshalb auch nicht so genannt
  9212.      If I_F_H\Characteristics & #IMAGE_FILE_DLL ;Vertrauen ist gut, Kontrolle ist besser!
  9213.        If OpenWindow(1, 0, 0, 700, 400, "DLL-Functions of " + File$, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_Minimize)
  9214.          DLL = 1
  9215.          GID_DLL = ListIconGadget(25, 10, 10, 680, 380, "Nr.", 35, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  9216.          SetGadgetFont(25, FontID(0))
  9217.          AddGadgetColumn(25, 1, "Function-Name", 400)
  9218.          AddGadgetColumn(25, 2, "Address (Hex)", 160)
  9219.          AddGadgetColumn(25, 3, "Ordinal", 55)
  9220.  
  9221.          k = 0
  9222.          For n = 1 To ANS
  9223.            CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H)) ;fill Structure IMAGE_SECTION_HEADER
  9224.            SRVA = I_S_H\VirtualAddress
  9225.            If VADLL < SRVA + I_S_H\SizeOfRawData     ;VADLL in dieser Section ?
  9226.              SO = I_S_H\PointerToRawData
  9227.              Break
  9228.            EndIf
  9229.            k + #IMAGE_SIZEOF_SECTION_HEADER
  9230.          Next
  9231.  
  9232.          CopyMemory(Buffer + VADLL - SRVA + SO, @I_E_D, SizeOf(I_E_D))   ;fill Structure IMAGE_EXPORT_DIRECTORY
  9233.          AdrName = I_E_D\nName - SRVA + SO ;mit I_E_D\AddressOfNames fehlt mitunter etwas. Sauber???
  9234.          Name$ = PeekS(Buffer + AdrName)
  9235.          AddGadgetItem(25, -1, "")      
  9236.          SetGadgetItemText(25, 0, "  Original-Name : " + Name$, 1)      
  9237.          SetGadgetItemText(25, 0, "(left double-click for jump)", 2)          
  9238.          AdrName + Len(Name$) + 1          ;plus Zero-Byte
  9239.  
  9240.          NextOB = 0
  9241.          NOF = I_E_D\NumberOfFunctions - 1
  9242.          Dim ArrayName.s(NOF)
  9243.          ReDim ArrayAdr(NOF)
  9244.          j = 0                             ;für NOF <> Anzahl FuncAdr
  9245.          For i = 0 To NOF
  9246.            OrdinalBasic = PeekW(Buffer + I_E_D\AddressOfNameOrdinals - SRVA + SO + NextOB)
  9247.            If OrdinalBasic < 0 Or OrdinalBasic > NOF
  9248.              Break
  9249.            EndIf  
  9250.            FuncAdr = PeekL(Buffer + I_E_D\AddressOfFunctions - SRVA + SO + (OrdinalBasic << 2))
  9251.            If FuncAdr
  9252.              Name$ = PeekS(Buffer + AdrName + LNameStr)
  9253.              LNameStr + Len(Name$) + 1     ;plus Zero-Byte
  9254.              ArrayName(j) = Name$
  9255.              ArrayAdr(j) = RSet(Hex(IB + FuncAdr), Adr3264, "0") + Name$ ;Address
  9256.              NextOB + 2
  9257.              j + 1    
  9258.            EndIf
  9259.          Next  
  9260.          NOF = j - 1
  9261.          ReDim ArrayName(NOF)
  9262.          ReDim ArrayAdr(NOF)      
  9263.          SortArray(ArrayName(), #PB_Sort_Ascending)
  9264.  
  9265.          NextOB = 0 : Zeile = 1
  9266.          For i = 0 To NOF
  9267.            OrdinalBasic = PeekW(Buffer + I_E_D\AddressOfNameOrdinals - SRVA + SO + NextOB)
  9268.            FuncAdr = PeekL(Buffer + I_E_D\AddressOfFunctions - SRVA + SO + (OrdinalBasic << 2))
  9269.            Name$ = ArrayName(i)
  9270.            If FuncAdr And Name$ <> ""
  9271.              AddGadgetItem(25, -1, "")
  9272.              SetGadgetItemText(25, Zeile, Str(Zeile - 1), 0)
  9273.              SetGadgetItemText(25, Zeile, Name$, 1)
  9274.              Adr$ = "$" + RSet(Hex(IB + FuncAdr), Adr3264, "0")
  9275.              SetGadgetItemText(25, Zeile, Adr$, 2)
  9276.              SetGadgetItemText(25, Zeile, Str(OrdinalBasic + I_E_D\nBase), 3)
  9277.              SetGadgetItemColor(25, Zeile, #PB_Gadget_BackColor, $EECCBB, -1)
  9278.              NextOB + 2
  9279.              Zeile + 1
  9280.            EndIf
  9281.          Next
  9282.          Zeile = 0                         ;für Nachfolgendes
  9283.          SortArray(ArrayAdr(), #PB_Sort_Ascending)   ;nach Adresse sortiert, mit Funktions-Namen!
  9284.          SpaltID = SendMessage_(GID_DLL, #LVM_GETHEADER, #Null, #Null) ;Spaltenbreite nicht veränderbar
  9285.          EnableWindow_(SpaltID, 0)
  9286.        EndIf
  9287.      EndIf
  9288.  
  9289.      Dim Daten.Item(FileL)                 ;nicht kleiner!
  9290.  
  9291.      For SZ = 1 To ANS
  9292.        CopyMemory(Buffer + AST + FL, @I_S_H, SizeOf(I_S_H))
  9293.        SF = I_S_H\Characteristics          ;Status-Flags ermitteln
  9294.        If SF & #IMAGE_SCN_MEM_EXECUTE      ;ausführbarer Code?
  9295.          Codes()
  9296.         Else
  9297.          Datas()
  9298.        EndIf
  9299.        FL + #IMAGE_SIZEOF_SECTION_HEADER
  9300.      Next
  9301.  
  9302.    Case 2                                  ;*.*  (32/64-Bit)
  9303.      Bin = 1
  9304.      TextGadget(0, 10, 42, 1000, 15, "Selected File : " + File$ + "  (" + Str(FileL) + " Bytes)" + Bit$, #PB_Text_Center)
  9305.      SetGadgetFont(0, FontID(0))      
  9306.      GID = ListIconGadget(20, 10, 60, 1000, 460 - 15 * ANS, "Address", 135, #LVS_OWNERDATA | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  9307.      SetGadgetFont(20, FontID(0))
  9308.      AddGadgetColumn(20, 1, "Opcode (Values in Hex)", 290)
  9309.      AddGadgetColumn(20, 2, "Mnemonic (Values in Hex)" + Option$, 450)
  9310.      AddGadgetColumn(20, 3, "Opcode - ASCII", 100)
  9311.      TextGadget(70, 325, 70, 250, 20, Fort$, #PB_Text_Center)
  9312.      ProgressBarGadget(71, 325, 90, 250,  25, 0, 100, #PB_ProgressBar_Smooth)
  9313.  
  9314.      Codes()
  9315.  
  9316.    Case 3                                  ;Program in Memory
  9317.      Bin = 2
  9318.      ListIconGadget(20, 10, 70, 1000, 460, "Name", 480, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  9319.      SetGadgetFont(20, FontID(0))
  9320.      AddGadgetColumn(20, 1, "Process", 245)
  9321.      AddGadgetColumn(20, 2, "Process-ID", 245)
  9322.      GetProcessList(20)
  9323.      SetActiveGadget(20)                   ;for scrolling  
  9324.      Repeat
  9325.        File$ = GetGadgetItemText(20, GetGadgetState(20))
  9326.        ProgID = Val(GetGadgetItemText(20, GetGadgetState(20), 2))
  9327.        Event = WaitWindowEvent()
  9328.        If Event = #PB_Event_CloseWindow
  9329.          Quit = 1      
  9330.          Break 2
  9331.        EndIf  
  9332.      Until EventType() = #PB_EventType_LeftDoubleClick
  9333.  
  9334.      Bit$ = "  (32-Bit)"      
  9335.      If GetGadgetItemText(20, GetGadgetState(20), 1) = "64 - Bit"
  9336.        IsProg64 = 1
  9337.        Adr3264 = 16
  9338.        Bit$ = "  (64-Bit)"
  9339.      EndIf
  9340.  
  9341.      TextGadget(0, 10, 50, 400, 15, "Select : " + FileExt$ + " : " + File$ + Bit$)
  9342.      SetGadgetFont(0, FontID(0))
  9343.      ListIconGadget(20, 10, 70, 1000, 460, "Start-Address", 135, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  9344.      SetGadgetFont(20, FontID(0))
  9345.      AddGadgetColumn(20, 1, "End-Address", 160)
  9346.      AddGadgetColumn(20, 2, "Length", 160)
  9347.      AddGadgetColumn(20, 3, "Status", 410)
  9348.  
  9349.      MemoryAreas()
  9350.      If Quit
  9351.        Break
  9352.      EndIf  
  9353.  EndSelect
  9354.  
  9355.  SendMessage_(GID, #LVM_SETITEMCOUNT, Zeile, 0) ;show now the ListIconGadget
  9356.  SendMessage_(GID, #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_GRIDLINES, #LVS_EX_GRIDLINES) ;Gridlines mal anschauen
  9357.  
  9358.  SetWindowTitle(0, Main$)
  9359.  SpaltID = SendMessage_(GID, #LVM_GETHEADER, #Null, #Null) ;Spaltenbreite nicht veränderbar
  9360.  EnableWindow_(SpaltID, 0)                 ;wieder veränderbar: EnableWindow_(SpaltID, 1)  
  9361.  
  9362.  FreeGadget(70) : FreeGadget(71)           ;ProgressBarGadget
  9363.  
  9364.  If I_F_H\Characteristics & #IMAGE_FILE_DLL
  9365.    SetWindowState(1, #PB_Window_Normal)
  9366.    SetActiveGadget(25)                     ;for scrolling  
  9367.   Else
  9368.    SetActiveGadget(20)                     ;for scrolling
  9369.  EndIf
  9370.  
  9371.  CreatePopupMenu(0)                        ;Bearbeitungs-Menü rechte Maus-Taste
  9372.  If Bin = 0  
  9373.    MenuItem(1, "Show Address as Address in the File (20 Lines) / Switch back to Standard")
  9374.  EndIf
  9375.  MenuItem(2, "Jump to Address (if Call or Jump)")
  9376.  MenuItem(3, "Jump back last Step")
  9377.  If FileExt = 0
  9378.    MenuItem(4, "Jump to Program-Entrypoint")
  9379.    MenuItem(5, "Show Header-Infos")
  9380.  EndIf  
  9381.  MenuItem(6, "Search")
  9382.  MenuItem(7, "Clear Search Results")  
  9383.  MenuItem(8, "Copy the range between the last two marked lines to clipboard")
  9384.  MenuItem(9, "New File")
  9385.  If Bin = 2
  9386.    MenuItem(10, "New Range for File in Memory")  
  9387.  EndIf
  9388.  MenuItem(11, "About")
  9389.  MenuItem(12, "Quit")
  9390.  
  9391.  If IsWindow(1)
  9392.    If GetWindowState(1) = #PB_Window_Minimize Or GetActiveWindow() = 0
  9393.      SetActiveGadget(20)
  9394.     Else
  9395.      SetActiveGadget(25)
  9396.    EndIf
  9397.   Else
  9398.    SetActiveGadget(20)
  9399.  EndIf
  9400.  
  9401.  Repeat                                    ;hierhin gelegt, hatte Aufhänger mit Win 7 Prof. 64-Bit (nur damit!)  
  9402.    Select WaitWindowEvent()
  9403.      Case #PB_Event_Gadget
  9404.        Select EventGadget()
  9405.          Case 20                                ;Gadget #20
  9406.            Select EventType()
  9407.              Case #PB_EventType_LeftClick, #PB_EventType_LeftDoubleClick
  9408.                ZeileCopy2 = GetGadgetState(20)  ;für Copy
  9409.                If ZeileCopy2 <> ZeileOld
  9410.                  ZeileCopy1 = ZeileOld
  9411.                  ZeileOld = ZeileCopy2
  9412.                 Else
  9413.                  ZeileCopy1 = ZeileCopy2
  9414.                EndIf                
  9415.              Case #PB_EventType_RightClick
  9416.                DisplayPopupMenu(0, WindowID(0)) ;Popup-Menu
  9417.            EndSelect
  9418.        EndSelect
  9419.      Case #PB_Event_CloseWindow
  9420.        If IsWindow(1) And GetActiveWindow() = 1 ;DLL-Funktionen  
  9421.          CloseWindow(1)  
  9422.          SetActiveGadget(20)               ;for scrolling
  9423.         ElseIf GetActiveWindow() = 0  
  9424.          If IsWindow(1)
  9425.            CloseWindow(1)  
  9426.          EndIf
  9427.          Quit = 1
  9428.          Break 2
  9429.        EndIf  
  9430.        If IsWindow(2) And GetActiveWindow() = 2 ;Header-Infos  
  9431.          CloseWindow(2)  
  9432.          SetActiveGadget(20)               ;for scrolling
  9433.        EndIf  
  9434.      Case #PB_Event_Menu
  9435.        Select EventMenu()
  9436.          Case 1                            ;Show Address as Address in the File (20 Lines) / Switch back to Standard
  9437.            SwitcherA = ~SwitcherA
  9438.            If SwitcherA                    ;sichern
  9439.              Zeile = GetGadgetState(20)                
  9440.              ZeileOldA = Zeile
  9441.              SichA$ = ""
  9442.              LA$ = ""
  9443.              For i = 0 To 19
  9444.                E$ = Daten(Zeile + i)\Address     ;read Address
  9445.                SichA$ + E$
  9446.                LA$ + RSet(Str(Len(E$)), 3, "0") ;Länge des jeweiligen "Zeilen-Strings"
  9447.              Next
  9448.             Else                           ;wiederherstellen
  9449.              Zeile = ZeileOldA
  9450.              j = 1 : k = 1
  9451.              For i = 0 To 19
  9452.                L = Val(Mid(LA$, j, 3))
  9453.                E$ = Mid(SichA$, k, L)
  9454.                Daten(Zeile + i)\Address = E$
  9455.                SetGadgetState(20, Zeile + i)
  9456.                k + L : j + 3
  9457.              Next
  9458.            EndIf
  9459.            If SwitcherA      
  9460.              Zeile = GetGadgetState(20)              
  9461.              For i = 0 To 19               ;20 Zeilen  
  9462.                Adr$ = Daten(Zeile + i)\Address  ;read Address                
  9463.                RSPZ = Val(Adr$)
  9464.                If RSPZ <> 0
  9465.                  k = 0
  9466.                  For n = 1 To ANS          ;um Adresse in der Datei zu ermitteln
  9467.                    CopyMemory(Buffer + AST + k, @I_S_H, SizeOf(I_S_H))
  9468.                    XRVA = I_S_H\VirtualAddress
  9469.                    X = XRVA + I_S_H\SizeOfRawData    ;+ Länge der Section
  9470.                    RSE = IB + XRVA + I_S_H\SizeOfRawData - 1   ;rel.Ende der Sections
  9471.                    If RSPZ < RSE           ;Adresse in dieser Section ?
  9472.                      SPZ = RSPZ - IB - XRVA + I_S_H\PointerToRawData     ;Adresse in der Datei
  9473.                      Break
  9474.                    EndIf
  9475.                    k + #IMAGE_SIZEOF_SECTION_HEADER
  9476.                  Next
  9477.                  Daten(Zeile + i)\Address = "$" + Hex(SPZ) + "  (in the file)"
  9478.                  SetGadgetState(20, Zeile + i)
  9479.                EndIf
  9480.              Next
  9481.            EndIf  
  9482.  
  9483.          Case 2                            ;Jump to Address (if Call or Jump)
  9484.            Zeile = GetGadgetState(20)
  9485.            E$ = Daten(Zeile)\Mnemonic      ;read Mnemonic
  9486.            ItemCount = CountGadgetItems(20) - 1 ;max.Zeile
  9487.            FindAdr$ = "$"
  9488.            If IsProg64
  9489.              AdrL = 23                     ;64-Bit-Adresse
  9490.             Else
  9491.              AdrL = 11                     ;32-Bit-Adresse
  9492.            EndIf
  9493.  
  9494.            If Mid(E$, 1, 1) = "J" Or Mid(E$, 1, 4) = "CALL"
  9495.              For j = 3 To 6                ;max.JECXZ, min.JE e.g.
  9496.                If Asc(Mid(E$, j, 1)) = 32  ;Space?
  9497.                  Break
  9498.                EndIf
  9499.              Next                
  9500.  
  9501.              j + 2                         ;2 Leerzeichen nach Instruction
  9502.              If Asc(Mid(E$, j, 1)) > 70    ;F
  9503.                Goto NoAdr                  ;keine direkte Adresse
  9504.              EndIf
  9505.  
  9506.              For i = j To j + AdrL Step 3
  9507.                If Mid(E$, i - 1, 1) <> " "
  9508.                  Goto NoAdr                ;keine direkte Adresse, Register                
  9509.                EndIf
  9510.                FindAdr$ + Mid(E$, i, 2)
  9511.              Next
  9512.              FindAdr = Val(FindAdr$)
  9513.              ZAnf = 1
  9514.              ZEnd = ItemCount
  9515.              For i = 1 To ItemCount        ;binary Search
  9516.                Zeilensprung = (ZAnf + ZEnd) >> 1
  9517.                ZWert = Val(Daten(Zeilensprung)\Address)
  9518.                If ZWert = FindAdr
  9519.                  Break
  9520.                 ElseIf ZWert < FindAdr
  9521.                  ZAnf = Zeilensprung + 1
  9522.                 ElseIf ZWert > FindAdr
  9523.                  ZEnd = Zeilensprung - 1
  9524.                EndIf
  9525.              Next
  9526.  
  9527.              If ZZeile < 100
  9528.                ZZeile + 1
  9529.                ZArray(ZZeile) = Zeile
  9530.                SetGadgetState(20, Zeilensprung)
  9531.                SendMessage_(GID, #LVM_ENSUREVISIBLE, Zeilensprung, #True)            
  9532.              EndIf
  9533.            EndIf
  9534. NoAdr:
  9535.          Case 3                            ;Jump back last Step
  9536.            If ZZeile
  9537.              ZeileOld = ZArray(ZZeile)
  9538.              SetGadgetState(20, ZeileOld)  ;hier markieren
  9539.              SendMessage_(GID, #LVM_ENSUREVISIBLE, ZeileOld, #True)
  9540.              ZZeile - 1
  9541.            EndIf
  9542.  
  9543.          Case 4                            ;Jump to Program-Entrypoint
  9544.            SendMessage_(GID, #LVM_ENSUREVISIBLE, ZeilePEP, #True)
  9545.  
  9546.          Case 5                            ;Header-Infos
  9547.            Header_Infos()
  9548.  
  9549.          Case 6                            ;Search, only instruction (todo)  
  9550.            UseGadgetList(WindowID(0))      ;nötig, falls Window für DLL
  9551.            AddKeyboardShortcut(0, #PB_Shortcut_Return, 0) ;um das Stringgadget mit Return zu verlassen
  9552.            hStr = StringGadget(140, 440, 60, 430, 18, "Search for :  ")  
  9553.            SetActiveGadget(140)
  9554.            SendMessage_(hStr, #EM_SETSEL, $0fffffff, $0fffffff)     ;Caret an Ende des Strings setzen  
  9555.            Repeat
  9556.              Event = WaitWindowEvent()
  9557.              Select Event
  9558.                Case #PB_Event_CloseWindow
  9559.                  Quit = 1      
  9560.                  Break 3
  9561.                Case #PB_Event_Menu
  9562.                  Select EventMenu()
  9563.                    Case 0                  ;0 von AddKeyboardShortcut = Return
  9564.                      Search$ = UCase(Mid(GetGadgetText(140), 15, Len(GetGadgetText(140))))
  9565.                      Search$ = RTrim(Search$) + " "  ;oder neu für komplexe Ausdrücke
  9566.                      RemoveKeyboardShortcut(0, 0)
  9567.                      FreeGadget(140)
  9568.                      Break    
  9569.                  EndSelect  
  9570.              EndSelect
  9571.              If GetActiveGadget() <> 140
  9572.                SetActiveGadget(140)
  9573.              EndIf
  9574.            ForEver
  9575.            Find = 0
  9576.  
  9577.            For f.l = 1 To Zeile
  9578.              Pos = FindString(Daten(f)\Mnemonic, Search$, 1)
  9579.              If Pos = 1                    ;1=also nicht mittendrin  
  9580.                Find + 1
  9581.                SendMessage_(GID, #LVM_ENSUREVISIBLE, f, #True) ;Scrollen zur Position
  9582.                AddElement(Search())
  9583.                Search() = f
  9584.                SetGadgetState(20, f)       ;farbige Anzeige auch ohne Scrollen (wenn aktuelle Seite)
  9585.  
  9586.                If f < Zeile  
  9587.                  Query = MessageRequester("Search for " + Search$, "Continue ?", #MB_YESNO)
  9588.                  If Query = #PB_MessageRequester_No
  9589.                    Break
  9590.                  EndIf
  9591.                 Else
  9592.                  Break
  9593.                EndIf
  9594.              EndIf
  9595.            Next
  9596.  
  9597.            If Find = 0
  9598.              MessageRequester("Search for " + Search$, Search$ + " not found !")
  9599.             Else
  9600.              MessageRequester("Search for " + Search$, "Search over !")
  9601.            EndIf
  9602.  
  9603.          Case 7                            ;Clear Search Results
  9604.            ClearList(Search())
  9605.            SendMessage_(GID, #LVM_SETITEMCOUNT, Zeile, 0)
  9606.  
  9607.          Case 8                            ;Copy
  9608.            If ZeileCopy1 > ZeileCopy2
  9609.              Swap ZeileCopy1, ZeileCopy2
  9610.            EndIf
  9611.            i = ZeileCopy1
  9612.            Copy$ = ""
  9613.            While i <= ZeileCopy2
  9614.              Copy$ + Daten(i)\Address + Space(5)     ;Address
  9615.              Copy$ + LSet(Daten(i)\Opcode, 50)       ;Opcode
  9616.              Copy$ + Daten(i)\Mnemonic + #CRLF$      ;Mnemonic
  9617.              i + 1
  9618.            Wend
  9619.            SetClipboardText(Copy$)
  9620.  
  9621.          Case 9                            ;New File
  9622.            Break 2
  9623.  
  9624.          Case 10                           ;New Range for File in Memory
  9625.            TextGadget(0, 10, 50, 400, 15, "Select : " + FileExt$ + " : " + File$ + Bit$)
  9626.            ListIconGadget(20, 10, 70, 1000, 460, "Start-Address", 135, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  9627.            AddGadgetColumn(20, 1, "End-Address", 160)
  9628.            AddGadgetColumn(20, 2, "Length", 160)
  9629.            AddGadgetColumn(20, 3, "Status", 410)
  9630.            MemoryAreas()
  9631.            SendMessage_(GID, #LVM_SETITEMCOUNT, Zeile, 0) ;show now the ListIconGadget
  9632.            SendMessage_(GID, #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_GRIDLINES, #LVS_EX_GRIDLINES)
  9633.            SetWindowTitle(0, Main$)
  9634.            FreeGadget(70) : FreeGadget(71) ;ProgressBarGadget
  9635.  
  9636.          Case 11                           ; About
  9637.            MessageRequester("About", Main$ + Date$, 0)
  9638.  
  9639.          Case 12                           ;Quit
  9640.            Quit = 1
  9641.            Break 2
  9642.  
  9643.        EndSelect
  9644.  
  9645.      Case #WM_LBUTTONDBLCLK                ;for DLL
  9646.        If GetActiveGadget() = 25
  9647.          Zeile = GetGadgetState(25)
  9648.          FindAdr$ = GetGadgetItemText(25, Zeile, 2)  ;read Address
  9649.          ItemCount = CountGadgetItems(20) - 1
  9650.          FindAdr = Val(FindAdr$)
  9651.          ZAnf = 1
  9652.          ZEnd = ItemCount
  9653.          For i = 1 To ItemCount            ;binary search
  9654.            Zeilensprung = (ZAnf + ZEnd) >> 1
  9655.            ZWert = Val(Daten(Zeilensprung)\Address)
  9656.            If ZWert = FindAdr
  9657.              Break
  9658.             ElseIf ZWert < FindAdr
  9659.              ZAnf = Zeilensprung + 1
  9660.             ElseIf ZWert > FindAdr
  9661.              ZEnd = Zeilensprung - 1
  9662.            EndIf
  9663.          Next
  9664.          SetWindowState(1, #PB_Window_Minimize)  
  9665.          SetActiveWindow(0)
  9666.          SetWindowState(0, #PB_Window_Normal)        
  9667.          SetActiveGadget(20)
  9668.          SendMessage_(GID, #LVM_ENSUREVISIBLE, Zeilensprung, #True)
  9669.        EndIf
  9670.  
  9671.      Case #WM_LBUTTONDOWN                  ;CPU-Info
  9672.        If CPUInfo
  9673.          DestroyWindow_(CPUInfo)
  9674.          Title$ = ""
  9675.        EndIf
  9676.        If WindowMouseY(0) >= 17 And WindowMouseY(0) <= 26 And GetActiveWindow() = 0     ;obere Zeile
  9677.          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 53
  9678.            Title$ = "3DNow!"
  9679.            Text$ = "AMD only"
  9680.           ElseIf WindowMouseX(0) >= 60 And WindowMouseX(0) <= 119
  9681.            Title$ = "Ext3DNow!"
  9682.            Text$ = "PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD" + #LFCR$ + "AMD only"
  9683.           ElseIf WindowMouseX(0) >= 126 And WindowMouseX(0) <= 149
  9684.            Title$ = "AES"
  9685.            Text$ = "Intel and AMD"
  9686.           ElseIf WindowMouseX(0) >= 157 And WindowMouseX(0) <= 197
  9687.            Title$ = "AMDLM"
  9688.            Text$ = "AMD Long Mode" + #LFCR$ + "AMD only"
  9689.           ElseIf WindowMouseX(0) >= 205 And WindowMouseX(0) <= 278
  9690.            Title$ = "AMDMISAL16"
  9691.            Text$ = "Misaligned 16-Byte Memory Access" + #LFCR$ + "AMD only"
  9692.           ElseIf WindowMouseX(0) >= 285 And WindowMouseX(0) <= 307
  9693.            Title$ = "AVX"
  9694.            Text$ = "Intel and AMD"
  9695.           ElseIf WindowMouseX(0) >= 314 And WindowMouseX(0) <= 342
  9696.            Title$ = "AVX2"
  9697.            Text$ = "Intel only"            
  9698.           ElseIf WindowMouseX(0) >= 349 And WindowMouseX(0) <= 369
  9699.            Title$ = "BMI"
  9700.            Text$ = "Bit Manipulation Instruction" + #LFCR$ + "AMD only"            
  9701.           ElseIf WindowMouseX(0) >= 376 And WindowMouseX(0) <= 416
  9702.            Title$ = "CLFSH"
  9703.            Text$ = "CLFLUSH" + #LFCR$ + "Intel and AMD"
  9704.           ElseIf WindowMouseX(0) >= 423 And WindowMouseX(0) <= 473
  9705.            Title$ = "(F)CMOVE"
  9706.            Text$ = "CMOVcc, FCMOVcc" + #LFCR$ + "Intel and AMD"
  9707.           ElseIf WindowMouseX(0) >= 480 And WindowMouseX(0) <= 517
  9708.            Title$ = "CVT16"
  9709.            Text$ = "Floating-Point Fraction Extract and Half-Precision Conversion" + #LFCR$ + "AMD only"
  9710.           ElseIf WindowMouseX(0) >= 524 And WindowMouseX(0) <= 548
  9711.            Title$ = "CX8"
  9712.            Text$ = "CMPXCHG8B" + #LFCR$ + "Intel and AMD"
  9713.           ElseIf WindowMouseX(0) >= 555 And WindowMouseX(0) <= 585
  9714.            Title$ = "CX16"
  9715.            Text$ = "CMPXCHG16B" + #LFCR$ + "Intel and AMD"
  9716.           ElseIf WindowMouseX(0) >= 592 And WindowMouseX(0) <= 616
  9717.            Title$ = "FMA"
  9718.            Text$ = "Fused Multiply Add" + #LFCR$ + "Intel and AMD"
  9719.           ElseIf WindowMouseX(0) >= 623 And WindowMouseX(0) <= 652
  9720.            Title$ = "FMA4"
  9721.            Text$ = "Floating-Point Multiply Accumulate (4 Operands)" + #LFCR$ + "AMD only"
  9722.           ElseIf WindowMouseX(0) >= 659 And WindowMouseX(0) <= 690
  9723.            Title$ = "FXSR"
  9724.            Text$ = "FXSAVE, FXRSTOR" + #LFCR$ + "Intel and AMD"
  9725.           ElseIf WindowMouseX(0) >= 697 And WindowMouseX(0) <= 722
  9726.            Title$ = "LWP"
  9727.            Text$ = "LightWeight Profiling" + #LFCR$ + "AMD only"            
  9728.           ElseIf WindowMouseX(0) >= 729 And WindowMouseX(0) <= 767
  9729.            Title$ = "LZCNT"
  9730.            Text$ = "AMD only"
  9731.           ElseIf WindowMouseX(0) >= 774 And WindowMouseX(0) <= 799
  9732.            Title$ = "MMX"
  9733.            Text$ = "Multi Media Extension" + #LFCR$ + "Intel and AMD"
  9734.           ElseIf WindowMouseX(0) >= 806 And WindowMouseX(0) <= 848
  9735.            Title$ = "(E)MMX"
  9736.            Text$ = "AMD Extensions to MMX" + #LFCR$ + "AMD only"
  9737.           ElseIf WindowMouseX(0) >= 855 And WindowMouseX(0) <= 909
  9738.            Title$ = "MONITOR"
  9739.            Text$ = "MONITOR, MWAIT" + #LFCR$ + "Intel and AMD"
  9740.           ElseIf WindowMouseX(0) >= 916 And WindowMouseX(0) <= 956
  9741.            Title$ = "MOVBE"
  9742.            Text$ = "Intel only"
  9743.           ElseIf WindowMouseX(0) >= 963 And WindowMouseX(0) <= 989
  9744.            Title$ = "MSR"
  9745.            Text$ = "RDMSR, WRMSR" + #LFCR$ + "Intel and AMD"
  9746.          EndIf
  9747.         ElseIf WindowMouseY(0) >= 30 And WindowMouseY(0) <= 39 And GetActiveWindow() = 0     ;untere Zeile
  9748.          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 62
  9749.            Title$ = "OSXSAVE"
  9750.            Text$ = "OS Support for Processor extended State Management using XSAVE/XRSTOR" + #LFCR$ + "Intel only"
  9751.           ElseIf WindowMouseX(0) >= 69 And WindowMouseX(0) <= 145
  9752.            Title$ = "PCLMULQDQ"
  9753.            Text$ = "Carryless Multiplication" + #LFCR$ + "Intel only"
  9754.           ElseIf WindowMouseX(0) >= 152 And WindowMouseX(0) <= 202
  9755.            Title$ = "POPCNT"
  9756.            Text$ = "Intel and AMD"
  9757.           ElseIf WindowMouseX(0) >= 209 And WindowMouseX(0) <= 251
  9758.            Title$ = "RDTSC"
  9759.            Text$ = "Intel and AMD"
  9760.           ElseIf WindowMouseX(0) >= 258 And WindowMouseX(0) <= 308
  9761.            Title$ = "RDTSCP"
  9762.            Text$ = "Intel and AMD"
  9763.           ElseIf WindowMouseX(0) >= 315 And WindowMouseX(0) <= 339
  9764.            Title$ = "SEP"
  9765.            Text$ = "SYSENTER, SYSEXIT" + #LFCR$ + "Intel and AMD"
  9766.           ElseIf WindowMouseX(0) >= 346 And WindowMouseX(0) <= 370
  9767.            Title$ = "SMX"
  9768.            Text$ = "Safer Mode Extensions" + #LFCR$ + "Intel only"
  9769.           ElseIf WindowMouseX(0) >= 377 And WindowMouseX(0) <= 400
  9770.            Title$ = "SSE"
  9771.            Text$ = "Intel and AMD"
  9772.           ElseIf WindowMouseX(0) >= 407 And WindowMouseX(0) <= 438
  9773.            Title$ = "SSE2"
  9774.            Text$ = "Intel and AMD"
  9775.           ElseIf WindowMouseX(0) >= 445 And WindowMouseX(0) <= 476
  9776.            Title$ = "SSE3"
  9777.            Text$ = "Intel and AMD"
  9778.           ElseIf WindowMouseX(0) >= 483 And WindowMouseX(0) <= 522
  9779.            Title$ = "SSSE3"
  9780.            Text$ = "Intel and AMD"
  9781.           ElseIf WindowMouseX(0) >= 529 And WindowMouseX(0) <= 569
  9782.            Title$ = "SSE4.1"
  9783.            Text$ = "Intel and AMD"
  9784.           ElseIf WindowMouseX(0) >= 576 And WindowMouseX(0) <= 617
  9785.            Title$ = "SSE4.2"
  9786.            Text$ = "Intel and AMD"
  9787.           ElseIf WindowMouseX(0) >= 624 And WindowMouseX(0) <= 665
  9788.            Title$ = "SSE4A"
  9789.            Text$ = "EXTRQ, INSERTQ, MOVNTSD, MOVNTSS" + #LFCR$ + "AMD only"
  9790.           ElseIf WindowMouseX(0) >= 672 And WindowMouseX(0) <= 697
  9791.            Title$ = "SVM"
  9792.            Text$ = "Secure Virtual Machine" + #LFCR$ + "AMD only"
  9793.           ElseIf WindowMouseX(0) >= 704 And WindowMouseX(0) <= 729
  9794.            Title$ = "TBM"
  9795.            Text$ = "Trailing Bit Manipulation" + #LFCR$ + "AMD only"            
  9796.           ElseIf WindowMouseX(0) >= 736 And WindowMouseX(0) <= 761
  9797.            Title$ = "VMX"
  9798.            Text$ = "Virtual Machine Extensions" + #LFCR$ + "Intel only"
  9799.           ElseIf WindowMouseX(0) >= 768 And WindowMouseX(0) <= 793
  9800.            Title$ = "XOP"
  9801.            Text$ = "Extended Operations" + #LFCR$ + "AMD only"
  9802.           ElseIf WindowMouseX(0) >= 800 And WindowMouseX(0) <= 835
  9803.            Title$ = "XSAVE"
  9804.            Text$ = "XGETBV, XRSTOR, XSAVE, XSETBV" + #LFCR$ + "Intel and AMD"
  9805.           ElseIf WindowMouseX(0) >= 842 And WindowMouseX(0) <= 902
  9806.            Title$ = "XSAVEOPT"
  9807.            Text$ = "Intel and AMD"
  9808.          EndIf
  9809.        EndIf
  9810.  
  9811.        If Title$ <> ""
  9812.          CPUInfo(Title$, Text$)
  9813.        EndIf
  9814.  
  9815.    EndSelect
  9816.  ForEver
  9817. ForEver
  9818.  
  9819. EndProcedure
  9820.  
  9821. If OpenWindow(0, 0, 0, 1020, 540, Main$, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  9822.  FontHigh = Int(9.0 / (GetDeviceCaps_(GetDC_(WindowID(0)), #LOGPIXELSY) / 96.0))
  9823.  LoadFont(0, "Arial", FontHigh)
  9824.  SetWindowCallback(@ListIcon_Callback(), 0)
  9825.  ;ermitteln, ob 32- oder 64-Bit-Betriebssystem  
  9826.  If OSVersion() > #PB_OS_Windows_2000      ;Mit W2k geht nachfolgende Abfrage nicht (gibt ja auch kein 64-Bit-W2k)!
  9827.    openlib = OpenLibrary(#PB_Any, "kernel32.dll")
  9828.    *GetNativeSystemInfo = GetFunction(openlib, "GetNativeSystemInfo")
  9829.    CallFunctionFast(*GetNativeSystemInfo, @S_I)
  9830.    CloseLibrary(openlib)
  9831.    If S_I\wProcessorArchitecture = #PROCESSOR_ARCHITECTURE_AMD64
  9832.      OS3264 = 1
  9833.    EndIf
  9834.  EndIf  
  9835.  Repeat  
  9836.    Main()
  9837.    If Quit = 1
  9838.      Break
  9839.    EndIf
  9840.  
  9841.    ReDim ArrayAdr.s(1)
  9842.    For i = 0 To 150
  9843.      If IsGadget(i)
  9844.        FreeGadget(i)
  9845.      EndIf
  9846.    Next
  9847.    If IsWindow(1)                          ;DLL-Funktionen
  9848.      CloseWindow(1)
  9849.    EndIf
  9850.    If IsWindow(2)                          ;Header-Infos
  9851.      CloseWindow(2)
  9852.    EndIf
  9853.    UseGadgetList(WindowID(0))              ;nötig, falls Window für DLL
  9854.    FreeMemory(Buffer)
  9855.    If CPUInfo
  9856.      CPUInfo = 0
  9857.      DestroyWindow_(CPUInfo)
  9858.      Title$ = ""
  9859.    EndIf
  9860.  
  9861.    IB = 0
  9862.    SZ = 0
  9863.    Zeile = 0
  9864.    SO = 0
  9865.    Bin = 0
  9866.    PEP = 0
  9867.    IsProg64 = 0
  9868.    Adr3264 = 8
  9869.    FileExt = 0
  9870.    ZeilePEP = 0
  9871.    FL = 0
  9872.    SwitcherA = 0
  9873.    SetWindowTitle(0, Main$)
  9874.    Dim Daten.Item(0)                       ;free array
  9875.    ClearList(Search())
  9876.    ClearList(DLLEP())
  9877.  
  9878.  ForEver
  9879.  
  9880.  End
  9881. EndIf
  9882. ; IDE Options = PureBasic 4.60 (Windows - x64)
  9883. ; CursorPosition = 9633
  9884. ; FirstLine = 9617
  9885. ; Folding = ------
  9886. ; UseIcon = comp-hardware100.ico
  9887. ; Executable = DisAsm.exe
  9888. ; DisableDebugger
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement