View difference between Paste ID: 00FBPaU4 and z915FF7i
SHOW: | | - or go back to the newest paste.
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