Was unterstützt mein Prozessor?

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Was unterstützt mein Prozessor?

Beitrag von Helle »

Also gut, hier die von meinem Disassembler ausgekoppelte Version:

Code: Alles auswählen


;- CPU-Info, PB 4.40 Beta5 (x86/x64)
;- "Helle" Klaus Helbing, 27.10.2009
;- Achtung: Ist "optisch anfällig" für Änderungen von Schrift-Art/-Größe! Kann aber jeder notfalls anpassen.

Global AES.l        = $0000D0     ;für CPUID   erstmal Rot für nicht vorhanden
Global AMDLM.l      = $0000D0
Global AMDMISAL16.l = $0000D0
Global AVX.l        = $0000D0
Global CLFSH.l      = $0000D0
Global CMOV.l       = $0000D0
Global CX16.l       = $0000D0
Global CX8.l        = $0000D0
Global CVT16.l      = $0000D0
Global DNOW.l       = $0000D0
Global EDNOW.l      = $0000D0
Global EMMX.l       = $0000D0
Global FMA.l        = $0000D0
Global FMA4.l       = $0000D0
Global FXSR.l       = $0000D0
Global LZCNT.l      = $0000D0
Global MMX.l        = $0000D0
Global MONITOR.l    = $0000D0
Global MOVBE.l      = $0000D0
Global MSR.l        = $0000D0
Global OSXSAVE.l    = $0000D0
Global PCLMULQDQ.l  = $0000D0
Global POPCNT.l     = $0000D0
Global RDTSC.l      = $0000D0
Global RDTSCP.l     = $0000D0
Global SEP.l        = $0000D0
Global SMX.l        = $0000D0
Global SSE.l        = $0000D0
Global SSE2.l       = $0000D0
Global SSE3.l       = $0000D0
Global SSSE3.l      = $0000D0
Global SSE41.l      = $0000D0
Global SSE42.l      = $0000D0
Global SSE4A.l      = $0000D0
Global VMX.l        = $0000D0
Global SVM.l        = $0000D0
Global XOP.l        = $0000D0
Global XSAVE.l      = $0000D0

Global Bit0.l  = $1          ;für SSE3
Global Bit1.l  = $2          ;für PCLMULQDQ
Global Bit2.l  = $4          ;für MONITOR, SVM
Global Bit4.l  = $10         ;für RDTSC
Global Bit5.l  = $20         ;für VMX, MSR, LZCNT
Global Bit6.l  = $40         ;für SMX, SSE4A
Global Bit7.l  = $80         ;für AMDMISAL16
Global Bit8.l  = $100        ;für CMPXCHG8B
Global Bit9.l  = $200        ;für SSSE3
Global Bit11.l = $800        ;für SEP, XOP
Global Bit12.l = $1000       ;für FMA
Global Bit13.l = $2000       ;für CMPXCHG16B
Global Bit15.l = $8000       ;für (F)CMOVcc
Global Bit16.l = $10000      ;für FMA4
Global Bit18.l = $40000      ;für CVT16
Global Bit19.l = $80000      ;für SSE4.1, CLFSH
Global Bit20.l = $100000     ;für SSE4.2
Global Bit21.i = $200000     ;für EFlag
Global Bit22.l = $400000     ;für MOVBE, EMMX
Global Bit23.l = $800000     ;für MMX, POPCNT
Global Bit24.l = $1000000    ;für FXSR
Global Bit25.l = $2000000    ;für SSE, AES
Global Bit26.l = $4000000    ;für SSE2, XSAVE
Global Bit27.l = $8000000    ;für OSXSAVE, RDTSCP
Global Bit28.l = $10000000   ;für AVX
Global Bit29.l = $20000000   ;für AMDLM
Global Bit30.l = $40000000   ;für Extended 3DNow!
Global Bit31.l = $80000000   ;für 3DNow!

Global AES$        = "AES"
Global AMDLM$      = "AMDLM"
Global AMDMISAL16$ = "AMDMISAL16"
Global AVX$        = "AVX"
Global CLFSH$      = "CLFSH"
Global CMOV$       = "(F)CMOV"
Global CX16$       = "CX16"
Global CX8$        = "CX8"
Global CVT16$      = "CVT16"
Global DNOW$       = "3DNow!"
Global EDNOW$      = "Ext3DNow!"
Global EMMX$       = "(E)MMX"
Global FMA$        = "FMA"
Global FMA4$       = "FMA4"
Global FXSR$       = "FXSR"
Global LZCNT$      = "LZCNT"
Global MMX$        = "MMX"
Global MONITOR$    = "MONITOR"
Global MOVBE$      = "MOVBE"
Global MSR$        = "MSR"
Global OSXSAVE$    = "OSXSAVE"
Global PCLMULQDQ$  = "PCLMULQDQ"
Global POPCNT$     = "POPCNT"
Global RDTSC$      = "RDTSC"
Global RDTSCP$     = "RDTSCP"
Global SEP$        = "SEP"
Global SMX$        = "SMX"
Global SSE$        = "SSE"
Global SSE2$       = "SSE2"
Global SSE3$       = "SSE3"
Global SSSE3$      = "SSSE3"
Global SSE41$      = "SSE4.1"
Global SSE42$      = "SSE4.2"
Global SSE4A$      = "SSE4A"
Global SVM$        = "SVM"
Global VMX$        = "VMX"
Global XOP$        = "XOP"
Global XSAVE$      = "XSAVE"

Global ProzessorString$ = Space(48)    ;der String kann max.48 Zeichen lang sein
Global CPUInfo.i
Global ProzStrAdr.l

Procedure CPUID_Info()
  ;Instruction/Group   CPUID (EAX)     Register    Bit    Intel    AMD   Remarks
  ;--------------------------------------------------------------------------------------------------------
  ;3DNOW!               80000001h         EDX      31       -       x
  ;AES                  00000001h         ECX      25       x       -
  ;AMDLM                80000001h         EDX      29       -       x    AMD Long Mode
  ;AMDMISAL16           80000001h         ECX       7       -       x    Misaligned 16-Byte Memory Access
  ;AVX                  00000001h         ECX      28       x       -
  ;CLFSH                00000001h         EDX      19       x       x    CLFLUSH
  ;(F)CMOV              00000001h         EDX      15       x       x    CMOVcc, FCMOVcc
  ;CMPXCHG8B            00000001h         EDX       8       x       x
  ;CMPXCHG16B           00000001h         ECX      13       x       x
  ;CVT16                80000001h         ECX      18       -       x    Floating-Point Fraction Extract and Half-Precision Conversion
  ;EMMX                 80000001h         EDX      22       -       x    AMD Extensions to MMX
  ;EXT3DNOW!            80000001h         EDX      30       -       x    Extensions to 3DNOW!
  ;FMA                  00000001h         ECX      12       x       -    Fused Multiply Add
  ;FMA4                 80000001h         ECX      16       -       x    Floating-Point Multiply Accumulate (4 Operands)
  ;FXSR                 00000001h         EDX      24       x       x    FXSAVE, FXRSTOR
  ;LZCNT                80000001h         ECX       5       -       x
  ;MMX                  00000001h         EDX      23       x       x
  ;MONITOR              00000001h         ECX       3       x       x    MONITOR, MWAIT
  ;MOVBE                00000001h         ECX      22       x       -
  ;MSR                  00000001h         EDX       5       x       x    RDMSR, WRMSR  
  ;OSXSAVE              00000001h         ECX      27       x       -
  ;PCLMULQDQ            00000001h         ECX       1       x       -    Carryless Multiplication
  ;POPCNT               00000001h         ECX      23       x       -
  ;RDTSC                00000001h         EDX       4       x       x  
  ;RDTSCP               80000001h         EDX      27       x       x
  ;SEP                  00000001h         EDX      11       x       x    SYSENTER, SYSEXIT
  ;SMX                  00000001h         ECX       6       x       -    Safer Mode Extensions
  ;SSE                  00000001h         EDX      25       x       x
  ;SSE2                 00000001h         EDX      26       x       x
  ;SSE3                 00000001h         ECX       0       x       x  
  ;SSSE3                00000001h         ECX       9       x       -  
  ;SSE4.1               00000001h         ECX      19       x       -  
  ;SSE4.2               00000001h         ECX      20       x       -  
  ;SSE4A                80000001h         ECX       6       -       x
  ;SVM                  80000001h         ECX       2       -       x    Secure Virtual Machine
  ;VMX                  00000001h         ECX       5       x       -    Virtual Machine Extensions
  ;XOP                  80000001h         ECX      11       -       x    Extended Operations
  ;XSAVE                00000001h         ECX      26       x       -
 
  ;No check for CPUID!  
    !mov eax,1h
    !cpuid
    !test edx,[v_Bit23]      ;MMX
    !jz l_nommx
    !mov [v_MMX],0D000h      ;Grün für vorhanden 
NOMMX:
    !test edx,[v_Bit25]      ;SSE  
    !jz l_nosse
    !mov [v_SSE],0D000h
NOSSE:
    !test edx,[v_Bit26]      ;SSE2  
    !jz l_nosse2
    !mov [v_SSE2],0D000h
NOSSE2:
    !test ecx,[v_Bit0]       ;SSE3
    !jz l_nosse3
    !mov [v_SSE3],0D000h    
NOSSE3:
    !test ecx,[v_Bit9]       ;SSSE3
    !jz l_nossse3
    !mov [v_SSSE3],0D000h 
NOSSSE3:
    !test ecx,[v_Bit19]      ;SSE4.1
    !jz l_nosse41
    !mov [v_SSE41],0D000h
NOSSE41:
    !test ecx,[v_Bit20]      ;SSE4.2
    !jz l_nosse42
    !mov [v_SSE42],0D000h
NOSSE42:
    !test ecx,[v_Bit23]      ;POPCNT
    !jz l_nopopcnt
    !mov [v_POPCNT],0D000h
NOPOPCNT:
    !test ecx,[v_Bit1]       ;PCLMULQDQ
    !jz l_nopclmulqdq
    !mov [v_PCLMULQDQ],0D000h
NOPCLMULQDQ:
    !test ecx,[v_Bit2]       ;MONITOR
    !jz l_nomonitor
    !mov [v_MONITOR],0D000h
NOMONITOR:
    !test ecx,[v_Bit5]       ;VMX
    !jz l_novmx
    !mov [v_VMX],0D000h
NOVMX:
    !test ecx,[v_Bit6]       ;SMX
    !jz l_nosmx
    !mov [v_SMX],0D000h
NOSMX:
    !test ecx,[v_Bit12]      ;FMA
    !jz l_nofma
    !mov [v_FMA],0D000h
NOFMA:
    !test edx,[v_Bit11]      ;SEP
    !jz l_nosep
    !mov [v_SEP],0D000h
NOSEP:
    !test edx,[v_Bit24]      ;FXSR
    !jz l_nofxsr
    !mov [v_FXSR],0D000h
NOFXSR:
    !test edx,[v_Bit8]       ;CMPXCHG8B
    !jz l_nocx8
    !mov [v_CX8],0D000h
NOCX8:
    !test ecx,[v_Bit13]      ;CMPXCHG16B
    !jz l_nocx16
    !mov [v_CX16],0D000h
NOCX16:
    !test ecx,[v_Bit25]      ;AES
    !jz l_noaes
    !mov [v_AES],0D000h
NOAES:
    !test ecx,[v_Bit26]      ;XSAVE
    !jz l_noxsave
    !mov [v_XSAVE],0D000h
NOXSAVE:
    !test ecx,[v_Bit27]      ;OSXSAVE
    !jz l_noosxsave
    !mov [v_OSXSAVE],0D000h
NOOSXSAVE:
    !test ecx,[v_Bit28]      ;AVX
    !jz l_noavx
    !mov [v_AVX],0D000h
NOAVX:
    !test ecx,[v_Bit22]      ;MOVBE
    !jz l_nomovbe
    !mov [v_MOVBE],0D000h
NOMOVBE:
    !test edx,[v_Bit15]      ;(F)CMOVcc
    !jz l_nocmov
    !mov [v_CMOV],0D000h
NOCMOV:       
    !test edx,[v_Bit19]      ;CLFSH
    !jz l_noclfsh
    !mov [v_CLFSH],0D000h
NOCLFSH:       
    !test edx,[v_Bit5]       ;MSR
    !jz l_nomsr
    !mov [v_MSR],0D000h
NOMSR:
    !test edx,[v_Bit4]       ;RDTSC
    !jz l_nordtsc
    !mov [v_RDTSC],0D000h
NORDTSC:

;-------- Anzahl der vorhandenen Extended Levels ermitteln als Vorstufe für 3DNow!-Test
;-------- Rückgabewert in EAX (-80000000h) gibt Anzahl der Extended Level an
    !mov eax,80000000h
    !cpuid
    !cmp eax,80000000h       ;hat nichts mit einem Bit zu tun!
    !jbe l_noexte            ;keine Extended Levels, Ende
    !mov eax,80000001h
    !cpuid                   ;Intel-Prozessoren liefern hier EAX=0 zurück
    !or eax,eax
    !je l_noamd              ;ist Intel-Prozessor
    !test edx,[v_Bit31]      ;AMD 3DNow! 
    !jz l_noext
    !mov [v_DNOW],0D000h
    !test edx,[v_Bit30]      ;AMD Extended 3DNow!  DSP: PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD
    !jz l_noext
    !mov [v_EDNOW],0D000h
NOEXT:
    !test ecx,[v_Bit6]       ;AMD SSE4A   EXTRQ, INSERTQ, MOVNTSD, MOVNTSS
    !jz l_nosse4a
    !mov [v_SSE4A],0D000h
NOSSE4A:     
    !test edx,[v_Bit29]      ;AMDLM   AMD Long Mode 
    !jz l_noamdlm
    !mov [v_AMDLM],0D000h
NOAMDLM:     
    !test ecx,[v_Bit7]       ;AMDMISAL16 
    !jz l_noamdmisal16
    !mov [v_AMDMISAL16],0D000h
NOAMDMISAL16:
    !test ecx,[v_Bit18]      ;CVT16 
    !jz l_nocvt16
    !mov [v_CVT16],0D000h
NOCVT16:
    !test edx,[v_Bit22]      ;EMMX
    !jz l_noemmx
    !mov [v_EMMX],0D000h
NOEMMX:
    !test ecx,[v_Bit16]      ;FMA4
    !jz l_nofma4
    !mov [v_FMA4],0D000h
NOFMA4:
    !test ecx,[v_Bit5]       ;LZCNT
    !jz l_nolzcnt
    !mov [v_LZCNT],0D000h
NOLZCNT:
    !test ecx,[v_Bit2]       ;SVM
    !jz l_nosvm
    !mov [v_SVM],0D000h
NOSVM:
    !test ecx,[v_Bit11]      ;XOP
    !jz l_noamd
    !mov [v_XOP],0D000h
NOAMD:
    !test edx,[v_Bit27]      ;RDTSCP
    !jz l_noexte
    !mov [v_RDTSCP],0D000h
NOEXTE: 

  TextGadget(80, 10, 15, 38, 13, DNOW$)  
  SetGadgetColor(80, #PB_Gadget_FrontColor, DNOW) 
  
  TextGadget(81, 58, 15, 53, 13, EDNOW$)  
  SetGadgetColor(81, #PB_Gadget_FrontColor, EDNOW)  
  
  TextGadget(82, 121, 15, 20, 13, AES$)  
  SetGadgetColor(82, #PB_Gadget_FrontColor, AES)  
  
  TextGadget(83, 151, 15, 40, 13, AMDLM$)  
  SetGadgetColor(83, #PB_Gadget_FrontColor, AMDLM) 
  
  TextGadget(84, 200, 15, 70, 13, AMDMISAL16$)  
  SetGadgetColor(84, #PB_Gadget_FrontColor, AMDMISAL16) 
  
  TextGadget(85, 279, 15, 23, 13, AVX$)  
  SetGadgetColor(85, #PB_Gadget_FrontColor, AVX)  
  
  TextGadget(86, 312, 15, 33, 13, CLFSH$)  
  SetGadgetColor(86, #PB_Gadget_FrontColor, CLFSH)  
  
  TextGadget(87, 355, 15, 43, 13, CMOV$)  
  SetGadgetColor(87, #PB_Gadget_FrontColor, CMOV)

  TextGadget(88, 408, 15, 33, 13, CVT16$)  
  SetGadgetColor(88, #PB_Gadget_FrontColor, CVT16)

  TextGadget(89, 451, 15, 20, 13, CX8$)  
  SetGadgetColor(89, #PB_Gadget_FrontColor, CX8)

  TextGadget(90, 481, 15, 26, 13, CX16$)  
  SetGadgetColor(90, #PB_Gadget_FrontColor, CX16)

  TextGadget(91, 517, 15, 22, 13, FMA$)  
  SetGadgetColor(91, #PB_Gadget_FrontColor, FMA)

  TextGadget(92, 549, 15, 28, 13, FMA4$)  
  SetGadgetColor(92, #PB_Gadget_FrontColor, FMA4)

  TextGadget(93, 587, 15, 27, 13, FXSR$)  
  SetGadgetColor(93, #PB_Gadget_FrontColor, FXSR)

  TextGadget(94, 624, 15, 35, 13, LZCNT$)  
  SetGadgetColor(94, #PB_Gadget_FrontColor, LZCNT)

  TextGadget(95, 669, 15, 25, 13, MMX$)  
  SetGadgetColor(95, #PB_Gadget_FrontColor, MMX)  

  TextGadget(96, 703, 15, 38, 13, EMMX$)  
  SetGadgetColor(96, #PB_Gadget_FrontColor, EMMX) 

  TextGadget(97, 750, 15, 50, 13, MONITOR$)  
  SetGadgetColor(97, #PB_Gadget_FrontColor, MONITOR)

  TextGadget(98, 809, 15, 38, 13, MOVBE$)  
  SetGadgetColor(98, #PB_Gadget_FrontColor, MOVBE)

  TextGadget(99, 857, 15, 23, 13, MSR$)  
  SetGadgetColor(99, #PB_Gadget_FrontColor, MSR)

  TextGadget(100, 10, 28, 50, 13, OSXSAVE$)  
  SetGadgetColor(100, #PB_Gadget_FrontColor, OSXSAVE)

  TextGadget(101, 70, 28, 67, 13, PCLMULQDQ$)  
  SetGadgetColor(101, #PB_Gadget_FrontColor, PCLMULQDQ)

  TextGadget(102, 147, 28, 43, 13, POPCNT$)  
  SetGadgetColor(102, #PB_Gadget_FrontColor, POPCNT)

  TextGadget(103, 200, 28, 37, 13, RDTSC$)  
  SetGadgetColor(103, #PB_Gadget_FrontColor, RDTSC)
 
  TextGadget(104, 247, 28, 45, 13, RDTSCP$)  
  SetGadgetColor(104, #PB_Gadget_FrontColor, RDTSCP)

  TextGadget(105, 302, 28, 22, 13, SEP$)  
  SetGadgetColor(105, #PB_Gadget_FrontColor, SEP)

  TextGadget(106, 334, 28, 23, 13, SMX$)  
  SetGadgetColor(106, #PB_Gadget_FrontColor, SMX)

  TextGadget(107, 367, 28, 20, 13, SSE$)  
  SetGadgetColor(107, #PB_Gadget_FrontColor, SSE)

  TextGadget(108, 397, 28, 27, 13, SSE2$)  
  SetGadgetColor(108, #PB_Gadget_FrontColor, SSE2)

  TextGadget(109, 434, 28, 27, 13, SSE3$)  
  SetGadgetColor(109, #PB_Gadget_FrontColor, SSE3)

  TextGadget(110, 471, 28, 35, 13, SSSE3$)  
  SetGadgetColor(110, #PB_Gadget_FrontColor, SSSE3)

  TextGadget(111, 516, 28, 35, 13, SSE41$)  
  SetGadgetColor(111, #PB_Gadget_FrontColor, SSE41)

  TextGadget(112, 561, 28, 36, 13, SSE42$)  
  SetGadgetColor(112, #PB_Gadget_FrontColor, SSE42)
  
  TextGadget(113, 607, 28, 35, 13, SSE4A$)  
  SetGadgetColor(113, #PB_Gadget_FrontColor, SSE4A)  

  TextGadget(114, 652, 28, 25, 13, SVM$)  
  SetGadgetColor(114, #PB_Gadget_FrontColor, SVM)

  TextGadget(115, 686, 28, 23, 13, VMX$)  
  SetGadgetColor(115, #PB_Gadget_FrontColor, VMX)

  TextGadget(116, 719, 28, 25, 13, XOP$)  
  SetGadgetColor(116, #PB_Gadget_FrontColor, XOP)

  TextGadget(117, 753, 28, 35, 13, XSAVE$)  
  SetGadgetColor(117, #PB_Gadget_FrontColor, XSAVE)
  
  ;Prozessor-String  
  ProzStrAdr = @ProzessorString$   
    !mov eax,80000000h       ;Test, ob CPU aktuell genug ist um den String zu liefern
    !cpuid
    !cmp eax,80000004h
    !jb l_nocpustr
    !mov esi,[v_ProzStrAdr]
    !xor edi,edi
!@@:    
    !mov eax,80000002h
    !add eax,edi
    !cpuid        
    !mov [esi],eax
    !mov [esi+4],ebx    
    !mov [esi+8],ecx
    !mov [esi+12],edx
    !inc edi
    !cmp edi,3
    !je l_nocpustr
    !add esi,16
    !jmp @b
NOCPUSTR:
  TextGadget(119, 10, 2, 400, 13, "Current CPU : " + ProzessorString$)
EndProcedure  

Procedure CPUInfo(Title$, Text$)
  CPUInfo = CreateWindowEx_(#WS_EX_TOPMOST, #TOOLTIPS_CLASS, #Null, #WS_POPUP | #TTS_ALWAYSTIP | #TTS_BALLOON, 0, 0, 0, 0, 0, 0, 0, 0)
  SendMessage_(CPUInfo, #TTM_SETTITLE, #TOOLTIP_INFO_ICON, @Title$)
  Balloon.TOOLINFO\cbSize = SizeOf(TOOLINFO)
  Balloon\lpszText = @Text$
  SendMessage_(CPUInfo, #TTM_ADDTOOL, 0, @Balloon)
  SendMessage_(CPUInfo, #TTM_TRACKACTIVATE, 1, @Balloon)
ProcedureReturn CPUInfo
EndProcedure

If OpenWindow(0, 0, 0, 900, 50, "CPU-Info           Grün = wird unterstützt,  Rot = wird nicht unterstützt         Linker Maus-Klick auf Erweiterung ergibt mehr Infos! ", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  CompilerSelect #PB_Compiler_Processor
    CompilerCase #PB_Processor_x86
      !pushfd                ;das EFlag-Register (32-Bit) auf den Stack
      !pop eax               ;rein in EAX
      !mov edx,eax           ;EAX unverändert lassen
      !xor edx,[v_Bit21]     ;Bit21 kippen 
      !push edx                          
      !popfd                 ;in EFlag schreiben
      !pushfd                ;wieder auf Stack
      !pop edx
      !push eax              ;der Ordnung halber alten Wert wieder herstellen
      !popfd   
      !cmp eax,edx
      !jne @f                ;sind nicht gleich -> CPUID ist möglich
    MessageRequester("Status", "Der getestete Prozessor unterstützt den CPUID-Befehl nicht!")
End  
!@@:
    CompilerCase #PB_Processor_x64
      !pushfq                ;das RFlag-Register (64-Bit) auf den Stack
      !pop rax               ;rein in RAX
      !mov rdx,rax           ;RAX unverändert lassen
      !xor rdx,[v_Bit21]     ;Bit21 kippen 
      !push rdx                          
      !popfq                 ;in RFlag schreiben
      !pushfq                ;wieder auf Stack
      !pop rdx
      !push rax              ;der Ordnung halber alten Wert wieder herstellen
      !popfq   
      !cmp rax,rdx
      !jne @f                ;sind nicht gleich -> CPUID ist möglich
    MessageRequester("Status", "Der getestete Prozessor unterstützt den CPUID-Befehl nicht!")
End  
!@@:
  CompilerEndSelect

  CPUID_Info()
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        Break 
      Case #WM_LBUTTONDOWN                  ;CPU-Info
        If CPUInfo
          DestroyWindow_(CPUInfo)
          Title$ = ""
        EndIf
        If WindowMouseY(0) >= 17 And WindowMouseY(0) <= 25 ;obere Zeile
          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 48
            Title$ = "3DNow!"
            Text$ = "AMD only"
           ElseIf WindowMouseX(0) >= 58 And WindowMouseX(0) <= 111
            Title$ = "Ext3DNow!"
            Text$ = "PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 121 And WindowMouseX(0) <= 141
            Title$ = "AES"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 151 And WindowMouseX(0) <= 191
            Title$ = "AMDLM"
            Text$ = "AMD Long Mode" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 200 And WindowMouseX(0) <= 270
            Title$ = "AMDMISAL16"
            Text$ = "Misaligned 16-Byte Memory Access" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 279 And WindowMouseX(0) <= 302
            Title$ = "AVX"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 312 And WindowMouseX(0) <= 345
            Title$ = "CLFSH"
            Text$ = "CLFLUSH" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 355 And WindowMouseX(0) <= 398
            Title$ = "(F)CMOVE"
            Text$ = "CMOVcc, FCMOVcc" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 408 And WindowMouseX(0) <= 441
            Title$ = "CVT16"
            Text$ = "Floating-Point Fraction Extract and Half-Precision Conversion" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 451 And WindowMouseX(0) <= 471
            Title$ = "CX8"
            Text$ = "CMPXCHG8B" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 481 And WindowMouseX(0) <= 507
            Title$ = "CX16"
            Text$ = "CMPXCHG16B" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 517 And WindowMouseX(0) <= 539
            Title$ = "FMA"
            Text$ = "Fused Multiply Add" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 549 And WindowMouseX(0) <= 577
            Title$ = "FMA4"
            Text$ = "Floating-Point Multiply Accumulate (4 Operands)" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 587 And WindowMouseX(0) <= 614
            Title$ = "FXSR"
            Text$ = "FXSAVE, FXRSTOR" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 624 And WindowMouseX(0) <= 659
            Title$ = "LZCNT"
            Text$ = "AMD only"
           ElseIf WindowMouseX(0) >= 669 And WindowMouseX(0) <= 694
            Title$ = "MMX"
            Text$ = "Multi Media Extension" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 703 And WindowMouseX(0) <= 741
            Title$ = "(E)MMX"
            Text$ = "AMD Extensions to MMX" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 750 And WindowMouseX(0) <= 800
            Title$ = "MONITOR"
            Text$ = "MONITOR, MWAIT" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 809 And WindowMouseX(0) <= 847
            Title$ = "MOVBE"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 857 And WindowMouseX(0) <= 880
            Title$ = "MSR"
            Text$ = "RDMSR, WRMSR" + #LFCR$ + "Intel and AMD"
          EndIf
         ElseIf WindowMouseY(0) >= 30 And WindowMouseY(0) <= 38 ;untere Zeile
          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 60
            Title$ = "OSXSAVE"
            Text$ = "OS Support for Processor extended State Management using XSAVE/XRSTOR" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 70 And WindowMouseX(0) <= 137
            Title$ = "PCLMULQDQ"
            Text$ = "Carryless Multiplication" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 147 And WindowMouseX(0) <= 190
            Title$ = "POPCNT"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 200 And WindowMouseX(0) <= 237
            Title$ = "RDTSC"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 247 And WindowMouseX(0) <= 292
            Title$ = "RDTSCP"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 302 And WindowMouseX(0) <= 324
            Title$ = "SEP"
            Text$ = "SYSENTER, SYSEXIT" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 334 And WindowMouseX(0) <= 357
            Title$ = "SMX"
            Text$ = "Safer Mode Extensions" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 367 And WindowMouseX(0) <= 387
            Title$ = "SSE"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 397 And WindowMouseX(0) <= 424
            Title$ = "SSE2"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 434 And WindowMouseX(0) <= 461
            Title$ = "SSE3"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 471 And WindowMouseX(0) <= 506
            Title$ = "SSSE3"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 516 And WindowMouseX(0) <= 551
            Title$ = "SSE4.1"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 561 And WindowMouseX(0) <= 596
            Title$ = "SSE4.2"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 607 And WindowMouseX(0) <= 642
            Title$ = "SSE4A"
            Text$ = "EXTRQ, INSERTQ, MOVNTSD, MOVNTSS" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 652 And WindowMouseX(0) <= 676
            Title$ = "SVM"
            Text$ = "Secure Virtual Machine" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 686 And WindowMouseX(0) <= 709
            Title$ = "VMX"
            Text$ = "Virtual Machine Extensions" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 719 And WindowMouseX(0) <= 744
            Title$ = "XOP"
            Text$ = "Extended Operations" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 753 And WindowMouseX(0) <= 788
            Title$ = "XSAVE"
            Text$ = "XRSTOR, XSAVE" + #LFCR$ + "Intel only"
          EndIf
        EndIf

        If Title$ <> ""
          CPUInfo(Title$, Text$)
        EndIf

    EndSelect
  ForEver

EndIf
Gruß
Helle
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Was unterstützt mein Prozessor?

Beitrag von Andesdaf »

Vergib mir die kleine Änderung am Code, ich hab ein Leerzeichen in der
vorletzten Zeile eingefügt, damit es den Boardstyle nicht so zerhaut.
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Was unterstützt mein Prozessor?

Beitrag von STARGÅTE »

Da ich die Info der CPU sehr interessant finde (Danke Helle), hier mal n Codeupdate für PB 5.30 ("local lables"):
In hinblick auf 5.40 müsste dann noch Unicode unterstützung aktualisiert werden (Prozessorstring)

Code: Alles auswählen


;- CPU-Info, PB 5.30 (x86/x64)
;- "Helle" Klaus Helbing, 27.10.2009
;- Achtung: Ist "optisch anfällig" für Änderungen von Schrift-Art/-Größe! Kann aber jeder notfalls anpassen.

Global AES.l        = $0000D0     ;für CPUID   erstmal Rot für nicht vorhanden
Global AMDLM.l      = $0000D0
Global AMDMISAL16.l = $0000D0
Global AVX.l        = $0000D0
Global CLFSH.l      = $0000D0
Global CMOV.l       = $0000D0
Global CX16.l       = $0000D0
Global CX8.l        = $0000D0
Global CVT16.l      = $0000D0
Global DNOW.l       = $0000D0
Global EDNOW.l      = $0000D0
Global EMMX.l       = $0000D0
Global FMA.l        = $0000D0
Global FMA4.l       = $0000D0
Global FXSR.l       = $0000D0
Global LZCNT.l      = $0000D0
Global MMX.l        = $0000D0
Global MONITOR.l    = $0000D0
Global MOVBE.l      = $0000D0
Global MSR.l        = $0000D0
Global OSXSAVE.l    = $0000D0
Global PCLMULQDQ.l  = $0000D0
Global POPCNT.l     = $0000D0
Global RDTSC.l      = $0000D0
Global RDTSCP.l     = $0000D0
Global SEP.l        = $0000D0
Global SMX.l        = $0000D0
Global SSE.l        = $0000D0
Global SSE2.l       = $0000D0
Global SSE3.l       = $0000D0
Global SSSE3.l      = $0000D0
Global SSE41.l      = $0000D0
Global SSE42.l      = $0000D0
Global SSE4A.l      = $0000D0
Global VMX.l        = $0000D0
Global SVM.l        = $0000D0
Global XOP.l        = $0000D0
Global XSAVE.l      = $0000D0

Global Bit0.l  = $1          ;für SSE3
Global Bit1.l  = $2          ;für PCLMULQDQ
Global Bit2.l  = $4          ;für MONITOR, SVM
Global Bit4.l  = $10         ;für RDTSC
Global Bit5.l  = $20         ;für VMX, MSR, LZCNT
Global Bit6.l  = $40         ;für SMX, SSE4A
Global Bit7.l  = $80         ;für AMDMISAL16
Global Bit8.l  = $100        ;für CMPXCHG8B
Global Bit9.l  = $200        ;für SSSE3
Global Bit11.l = $800        ;für SEP, XOP
Global Bit12.l = $1000       ;für FMA
Global Bit13.l = $2000       ;für CMPXCHG16B
Global Bit15.l = $8000       ;für (F)CMOVcc
Global Bit16.l = $10000      ;für FMA4
Global Bit18.l = $40000      ;für CVT16
Global Bit19.l = $80000      ;für SSE4.1, CLFSH
Global Bit20.l = $100000     ;für SSE4.2
Global Bit21.i = $200000     ;für EFlag
Global Bit22.l = $400000     ;für MOVBE, EMMX
Global Bit23.l = $800000     ;für MMX, POPCNT
Global Bit24.l = $1000000    ;für FXSR
Global Bit25.l = $2000000    ;für SSE, AES
Global Bit26.l = $4000000    ;für SSE2, XSAVE
Global Bit27.l = $8000000    ;für OSXSAVE, RDTSCP
Global Bit28.l = $10000000   ;für AVX
Global Bit29.l = $20000000   ;für AMDLM
Global Bit30.l = $40000000   ;für Extended 3DNow!
Global Bit31.l = $80000000   ;für 3DNow!

Global AES$        = "AES"
Global AMDLM$      = "AMDLM"
Global AMDMISAL16$ = "AMDMISAL16"
Global AVX$        = "AVX"
Global CLFSH$      = "CLFSH"
Global CMOV$       = "(F)CMOV"
Global CX16$       = "CX16"
Global CX8$        = "CX8"
Global CVT16$      = "CVT16"
Global DNOW$       = "3DNow!"
Global EDNOW$      = "Ext3DNow!"
Global EMMX$       = "(E)MMX"
Global FMA$        = "FMA"
Global FMA4$       = "FMA4"
Global FXSR$       = "FXSR"
Global LZCNT$      = "LZCNT"
Global MMX$        = "MMX"
Global MONITOR$    = "MONITOR"
Global MOVBE$      = "MOVBE"
Global MSR$        = "MSR"
Global OSXSAVE$    = "OSXSAVE"
Global PCLMULQDQ$  = "PCLMULQDQ"
Global POPCNT$     = "POPCNT"
Global RDTSC$      = "RDTSC"
Global RDTSCP$     = "RDTSCP"
Global SEP$        = "SEP"
Global SMX$        = "SMX"
Global SSE$        = "SSE"
Global SSE2$       = "SSE2"
Global SSE3$       = "SSE3"
Global SSSE3$      = "SSSE3"
Global SSE41$      = "SSE4.1"
Global SSE42$      = "SSE4.2"
Global SSE4A$      = "SSE4A"
Global SVM$        = "SVM"
Global VMX$        = "VMX"
Global XOP$        = "XOP"
Global XSAVE$      = "XSAVE"

Global ProzessorString$ = Space(48)    ;der String kann max.48 Zeichen lang sein
Global CPUInfo.i
Global ProzStrAdr.l

Procedure CPUID_Info()
  ;Instruction/Group   CPUID (EAX)     Register    Bit    Intel    AMD   Remarks
  ;--------------------------------------------------------------------------------------------------------
  ;3DNOW!               80000001h         EDX      31       -       x
  ;AES                  00000001h         ECX      25       x       -
  ;AMDLM                80000001h         EDX      29       -       x    AMD Long Mode
  ;AMDMISAL16           80000001h         ECX       7       -       x    Misaligned 16-Byte Memory Access
  ;AVX                  00000001h         ECX      28       x       -
  ;CLFSH                00000001h         EDX      19       x       x    CLFLUSH
  ;(F)CMOV              00000001h         EDX      15       x       x    CMOVcc, FCMOVcc
  ;CMPXCHG8B            00000001h         EDX       8       x       x
  ;CMPXCHG16B           00000001h         ECX      13       x       x
  ;CVT16                80000001h         ECX      18       -       x    Floating-Point Fraction Extract and Half-Precision Conversion
  ;EMMX                 80000001h         EDX      22       -       x    AMD Extensions to MMX
  ;EXT3DNOW!            80000001h         EDX      30       -       x    Extensions to 3DNOW!
  ;FMA                  00000001h         ECX      12       x       -    Fused Multiply Add
  ;FMA4                 80000001h         ECX      16       -       x    Floating-Point Multiply Accumulate (4 Operands)
  ;FXSR                 00000001h         EDX      24       x       x    FXSAVE, FXRSTOR
  ;LZCNT                80000001h         ECX       5       -       x
  ;MMX                  00000001h         EDX      23       x       x
  ;MONITOR              00000001h         ECX       3       x       x    MONITOR, MWAIT
  ;MOVBE                00000001h         ECX      22       x       -
  ;MSR                  00000001h         EDX       5       x       x    RDMSR, WRMSR  
  ;OSXSAVE              00000001h         ECX      27       x       -
  ;PCLMULQDQ            00000001h         ECX       1       x       -    Carryless Multiplication
  ;POPCNT               00000001h         ECX      23       x       -
  ;RDTSC                00000001h         EDX       4       x       x  
  ;RDTSCP               80000001h         EDX      27       x       x
  ;SEP                  00000001h         EDX      11       x       x    SYSENTER, SYSEXIT
  ;SMX                  00000001h         ECX       6       x       -    Safer Mode Extensions
  ;SSE                  00000001h         EDX      25       x       x
  ;SSE2                 00000001h         EDX      26       x       x
  ;SSE3                 00000001h         ECX       0       x       x  
  ;SSSE3                00000001h         ECX       9       x       -  
  ;SSE4.1               00000001h         ECX      19       x       -  
  ;SSE4.2               00000001h         ECX      20       x       -  
  ;SSE4A                80000001h         ECX       6       -       x
  ;SVM                  80000001h         ECX       2       -       x    Secure Virtual Machine
  ;VMX                  00000001h         ECX       5       x       -    Virtual Machine Extensions
  ;XOP                  80000001h         ECX      11       -       x    Extended Operations
  ;XSAVE                00000001h         ECX      26       x       -
 
  ;No check for CPUID!  
    !mov eax,1h
    !cpuid
    !test edx,[v_Bit23]      ;MMX
    !jz ll_cpuid_info_nommx
    !mov [v_MMX],0D000h      ;Grün für vorhanden 
NOMMX:
    !test edx,[v_Bit25]      ;SSE  
    !jz ll_cpuid_info_nosse
    !mov [v_SSE],0D000h
NOSSE:
    !test edx,[v_Bit26]      ;SSE2  
    !jz ll_cpuid_info_nosse2
    !mov [v_SSE2],0D000h
NOSSE2:
    !test ecx,[v_Bit0]       ;SSE3
    !jz ll_cpuid_info_nosse3
    !mov [v_SSE3],0D000h    
NOSSE3:
    !test ecx,[v_Bit9]       ;SSSE3
    !jz ll_cpuid_info_nossse3
    !mov [v_SSSE3],0D000h 
NOSSSE3:
    !test ecx,[v_Bit19]      ;SSE4.1
    !jz ll_cpuid_info_nosse41
    !mov [v_SSE41],0D000h
NOSSE41:
    !test ecx,[v_Bit20]      ;SSE4.2
    !jz ll_cpuid_info_nosse42
    !mov [v_SSE42],0D000h
NOSSE42:
    !test ecx,[v_Bit23]      ;POPCNT
    !jz ll_cpuid_info_nopopcnt
    !mov [v_POPCNT],0D000h
NOPOPCNT:
    !test ecx,[v_Bit1]       ;PCLMULQDQ
    !jz ll_cpuid_info_nopclmulqdq
    !mov [v_PCLMULQDQ],0D000h
NOPCLMULQDQ:
    !test ecx,[v_Bit2]       ;MONITOR
    !jz ll_cpuid_info_nomonitor
    !mov [v_MONITOR],0D000h
NOMONITOR:
    !test ecx,[v_Bit5]       ;VMX
    !jz ll_cpuid_info_novmx
    !mov [v_VMX],0D000h
NOVMX:
    !test ecx,[v_Bit6]       ;SMX
    !jz ll_cpuid_info_nosmx
    !mov [v_SMX],0D000h
NOSMX:
    !test ecx,[v_Bit12]      ;FMA
    !jz ll_cpuid_info_nofma
    !mov [v_FMA],0D000h
NOFMA:
    !test edx,[v_Bit11]      ;SEP
    !jz ll_cpuid_info_nosep
    !mov [v_SEP],0D000h
NOSEP:
    !test edx,[v_Bit24]      ;FXSR
    !jz ll_cpuid_info_nofxsr
    !mov [v_FXSR],0D000h
NOFXSR:
    !test edx,[v_Bit8]       ;CMPXCHG8B
    !jz ll_cpuid_info_nocx8
    !mov [v_CX8],0D000h
NOCX8:
    !test ecx,[v_Bit13]      ;CMPXCHG16B
    !jz ll_cpuid_info_nocx16
    !mov [v_CX16],0D000h
NOCX16:
    !test ecx,[v_Bit25]      ;AES
    !jz ll_cpuid_info_noaes
    !mov [v_AES],0D000h
NOAES:
    !test ecx,[v_Bit26]      ;XSAVE
    !jz ll_cpuid_info_noxsave
    !mov [v_XSAVE],0D000h
NOXSAVE:
    !test ecx,[v_Bit27]      ;OSXSAVE
    !jz ll_cpuid_info_noosxsave
    !mov [v_OSXSAVE],0D000h
NOOSXSAVE:
    !test ecx,[v_Bit28]      ;AVX
    !jz ll_cpuid_info_noavx
    !mov [v_AVX],0D000h
NOAVX:
    !test ecx,[v_Bit22]      ;MOVBE
    !jz ll_cpuid_info_nomovbe
    !mov [v_MOVBE],0D000h
NOMOVBE:
    !test edx,[v_Bit15]      ;(F)CMOVcc
    !jz ll_cpuid_info_nocmov
    !mov [v_CMOV],0D000h
NOCMOV:       
    !test edx,[v_Bit19]      ;CLFSH
    !jz ll_cpuid_info_noclfsh
    !mov [v_CLFSH],0D000h
NOCLFSH:       
    !test edx,[v_Bit5]       ;MSR
    !jz ll_cpuid_info_nomsr
    !mov [v_MSR],0D000h
NOMSR:
    !test edx,[v_Bit4]       ;RDTSC
    !jz ll_cpuid_info_nordtsc
    !mov [v_RDTSC],0D000h
NORDTSC:

;-------- Anzahl der vorhandenen Extended Levels ermitteln als Vorstufe für 3DNow!-Test
;-------- Rückgabewert in EAX (-80000000h) gibt Anzahl der Extended Level an
    !mov eax,80000000h
    !cpuid
    !cmp eax,80000000h       ;hat nichts mit einem Bit zu tun!
    !jbe ll_cpuid_info_noexte            ;keine Extended Levels, Ende
    !mov eax,80000001h
    !cpuid                   ;Intel-Prozessoren liefern hier EAX=0 zurück
    !or eax,eax
    !je ll_cpuid_info_noamd              ;ist Intel-Prozessor
    !test edx,[v_Bit31]      ;AMD 3DNow! 
    !jz ll_cpuid_info_noext
    !mov [v_DNOW],0D000h
    !test edx,[v_Bit30]      ;AMD Extended 3DNow!  DSP: PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD
    !jz ll_cpuid_info_noext
    !mov [v_EDNOW],0D000h
NOEXT:
    !test ecx,[v_Bit6]       ;AMD SSE4A   EXTRQ, INSERTQ, MOVNTSD, MOVNTSS
    !jz ll_cpuid_info_nosse4a
    !mov [v_SSE4A],0D000h
NOSSE4A:     
    !test edx,[v_Bit29]      ;AMDLM   AMD Long Mode 
    !jz ll_cpuid_info_noamdlm
    !mov [v_AMDLM],0D000h
NOAMDLM:     
    !test ecx,[v_Bit7]       ;AMDMISAL16 
    !jz ll_cpuid_info_noamdmisal16
    !mov [v_AMDMISAL16],0D000h
NOAMDMISAL16:
    !test ecx,[v_Bit18]      ;CVT16 
    !jz ll_cpuid_info_nocvt16
    !mov [v_CVT16],0D000h
NOCVT16:
    !test edx,[v_Bit22]      ;EMMX
    !jz ll_cpuid_info_noemmx
    !mov [v_EMMX],0D000h
NOEMMX:
    !test ecx,[v_Bit16]      ;FMA4
    !jz ll_cpuid_info_nofma4
    !mov [v_FMA4],0D000h
NOFMA4:
    !test ecx,[v_Bit5]       ;LZCNT
    !jz ll_cpuid_info_nolzcnt
    !mov [v_LZCNT],0D000h
NOLZCNT:
    !test ecx,[v_Bit2]       ;SVM
    !jz ll_cpuid_info_nosvm
    !mov [v_SVM],0D000h
NOSVM:
    !test ecx,[v_Bit11]      ;XOP
    !jz ll_cpuid_info_noamd
    !mov [v_XOP],0D000h
NOAMD:
    !test edx,[v_Bit27]      ;RDTSCP
    !jz ll_cpuid_info_noexte
    !mov [v_RDTSCP],0D000h
NOEXTE: 

  TextGadget(80, 10, 15, 38, 13, DNOW$)  
  SetGadgetColor(80, #PB_Gadget_FrontColor, DNOW) 
  
  TextGadget(81, 58, 15, 53, 13, EDNOW$)  
  SetGadgetColor(81, #PB_Gadget_FrontColor, EDNOW)  
  
  TextGadget(82, 121, 15, 20, 13, AES$)  
  SetGadgetColor(82, #PB_Gadget_FrontColor, AES)  
  
  TextGadget(83, 151, 15, 40, 13, AMDLM$)  
  SetGadgetColor(83, #PB_Gadget_FrontColor, AMDLM) 
  
  TextGadget(84, 200, 15, 70, 13, AMDMISAL16$)  
  SetGadgetColor(84, #PB_Gadget_FrontColor, AMDMISAL16) 
  
  TextGadget(85, 279, 15, 23, 13, AVX$)  
  SetGadgetColor(85, #PB_Gadget_FrontColor, AVX)  
  
  TextGadget(86, 312, 15, 33, 13, CLFSH$)  
  SetGadgetColor(86, #PB_Gadget_FrontColor, CLFSH)  
  
  TextGadget(87, 355, 15, 43, 13, CMOV$)  
  SetGadgetColor(87, #PB_Gadget_FrontColor, CMOV)

  TextGadget(88, 408, 15, 33, 13, CVT16$)  
  SetGadgetColor(88, #PB_Gadget_FrontColor, CVT16)

  TextGadget(89, 451, 15, 20, 13, CX8$)  
  SetGadgetColor(89, #PB_Gadget_FrontColor, CX8)

  TextGadget(90, 481, 15, 26, 13, CX16$)  
  SetGadgetColor(90, #PB_Gadget_FrontColor, CX16)

  TextGadget(91, 517, 15, 22, 13, FMA$)  
  SetGadgetColor(91, #PB_Gadget_FrontColor, FMA)

  TextGadget(92, 549, 15, 28, 13, FMA4$)  
  SetGadgetColor(92, #PB_Gadget_FrontColor, FMA4)

  TextGadget(93, 587, 15, 27, 13, FXSR$)  
  SetGadgetColor(93, #PB_Gadget_FrontColor, FXSR)

  TextGadget(94, 624, 15, 35, 13, LZCNT$)  
  SetGadgetColor(94, #PB_Gadget_FrontColor, LZCNT)

  TextGadget(95, 669, 15, 25, 13, MMX$)  
  SetGadgetColor(95, #PB_Gadget_FrontColor, MMX)  

  TextGadget(96, 703, 15, 38, 13, EMMX$)  
  SetGadgetColor(96, #PB_Gadget_FrontColor, EMMX) 

  TextGadget(97, 750, 15, 50, 13, MONITOR$)  
  SetGadgetColor(97, #PB_Gadget_FrontColor, MONITOR)

  TextGadget(98, 809, 15, 38, 13, MOVBE$)  
  SetGadgetColor(98, #PB_Gadget_FrontColor, MOVBE)

  TextGadget(99, 857, 15, 23, 13, MSR$)  
  SetGadgetColor(99, #PB_Gadget_FrontColor, MSR)

  TextGadget(100, 10, 28, 50, 13, OSXSAVE$)  
  SetGadgetColor(100, #PB_Gadget_FrontColor, OSXSAVE)

  TextGadget(101, 70, 28, 67, 13, PCLMULQDQ$)  
  SetGadgetColor(101, #PB_Gadget_FrontColor, PCLMULQDQ)

  TextGadget(102, 147, 28, 43, 13, POPCNT$)  
  SetGadgetColor(102, #PB_Gadget_FrontColor, POPCNT)

  TextGadget(103, 200, 28, 37, 13, RDTSC$)  
  SetGadgetColor(103, #PB_Gadget_FrontColor, RDTSC)
 
  TextGadget(104, 247, 28, 45, 13, RDTSCP$)  
  SetGadgetColor(104, #PB_Gadget_FrontColor, RDTSCP)

  TextGadget(105, 302, 28, 22, 13, SEP$)  
  SetGadgetColor(105, #PB_Gadget_FrontColor, SEP)

  TextGadget(106, 334, 28, 23, 13, SMX$)  
  SetGadgetColor(106, #PB_Gadget_FrontColor, SMX)

  TextGadget(107, 367, 28, 20, 13, SSE$)  
  SetGadgetColor(107, #PB_Gadget_FrontColor, SSE)

  TextGadget(108, 397, 28, 27, 13, SSE2$)  
  SetGadgetColor(108, #PB_Gadget_FrontColor, SSE2)

  TextGadget(109, 434, 28, 27, 13, SSE3$)  
  SetGadgetColor(109, #PB_Gadget_FrontColor, SSE3)

  TextGadget(110, 471, 28, 35, 13, SSSE3$)  
  SetGadgetColor(110, #PB_Gadget_FrontColor, SSSE3)

  TextGadget(111, 516, 28, 35, 13, SSE41$)  
  SetGadgetColor(111, #PB_Gadget_FrontColor, SSE41)

  TextGadget(112, 561, 28, 36, 13, SSE42$)  
  SetGadgetColor(112, #PB_Gadget_FrontColor, SSE42)
  
  TextGadget(113, 607, 28, 35, 13, SSE4A$)  
  SetGadgetColor(113, #PB_Gadget_FrontColor, SSE4A)  

  TextGadget(114, 652, 28, 25, 13, SVM$)  
  SetGadgetColor(114, #PB_Gadget_FrontColor, SVM)

  TextGadget(115, 686, 28, 23, 13, VMX$)  
  SetGadgetColor(115, #PB_Gadget_FrontColor, VMX)

  TextGadget(116, 719, 28, 25, 13, XOP$)  
  SetGadgetColor(116, #PB_Gadget_FrontColor, XOP)

  TextGadget(117, 753, 28, 35, 13, XSAVE$)  
  SetGadgetColor(117, #PB_Gadget_FrontColor, XSAVE)
  
  ;Prozessor-String  
  ProzStrAdr = @ProzessorString$   
    !mov eax,80000000h       ;Test, ob CPU aktuell genug ist um den String zu liefern
    !cpuid
    !cmp eax,80000004h
    !jb ll_cpuid_info_nocpustr
    !mov esi,[v_ProzStrAdr]
    !xor edi,edi
!@@:    
    !mov eax,80000002h
    !add eax,edi
    !cpuid        
    !mov [esi],eax
    !mov [esi+4],ebx    
    !mov [esi+8],ecx
    !mov [esi+12],edx
    !inc edi
    !cmp edi,3
    !je ll_cpuid_info_nocpustr
    !add esi,16
    !jmp @b
NOCPUSTR:
  TextGadget(119, 10, 2, 400, 13, "Current CPU : " + ProzessorString$)
EndProcedure  

Procedure CPUInfo(Title$, Text$)
  CPUInfo = CreateWindowEx_(#WS_EX_TOPMOST, #TOOLTIPS_CLASS, #Null, #WS_POPUP | #TTS_ALWAYSTIP | #TTS_BALLOON, 0, 0, 0, 0, 0, 0, 0, 0)
  SendMessage_(CPUInfo, #TTM_SETTITLE, #TOOLTIP_INFO_ICON, @Title$)
  Balloon.TOOLINFO\cbSize = SizeOf(TOOLINFO)
  Balloon\lpszText = @Text$
  SendMessage_(CPUInfo, #TTM_ADDTOOL, 0, @Balloon)
  SendMessage_(CPUInfo, #TTM_TRACKACTIVATE, 1, @Balloon)
ProcedureReturn CPUInfo
EndProcedure

If OpenWindow(0, 0, 0, 900, 50, "CPU-Info           Grün = wird unterstützt,  Rot = wird nicht unterstützt         Linker Maus-Klick auf Erweiterung ergibt mehr Infos! ", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  CompilerSelect #PB_Compiler_Processor
    CompilerCase #PB_Processor_x86
      !pushfd                ;das EFlag-Register (32-Bit) auf den Stack
      !pop eax               ;rein in EAX
      !mov edx,eax           ;EAX unverändert lassen
      !xor edx,[v_Bit21]     ;Bit21 kippen 
      !push edx                          
      !popfd                 ;in EFlag schreiben
      !pushfd                ;wieder auf Stack
      !pop edx
      !push eax              ;der Ordnung halber alten Wert wieder herstellen
      !popfd   
      !cmp eax,edx
      !jne @f                ;sind nicht gleich -> CPUID ist möglich
    MessageRequester("Status", "Der getestete Prozessor unterstützt den CPUID-Befehl nicht!")
End  
!@@:
    CompilerCase #PB_Processor_x64
      !pushfq                ;das RFlag-Register (64-Bit) auf den Stack
      !pop rax               ;rein in RAX
      !mov rdx,rax           ;RAX unverändert lassen
      !xor rdx,[v_Bit21]     ;Bit21 kippen 
      !push rdx                          
      !popfq                 ;in RFlag schreiben
      !pushfq                ;wieder auf Stack
      !pop rdx
      !push rax              ;der Ordnung halber alten Wert wieder herstellen
      !popfq   
      !cmp rax,rdx
      !jne @f                ;sind nicht gleich -> CPUID ist möglich
    MessageRequester("Status", "Der getestete Prozessor unterstützt den CPUID-Befehl nicht!")
End  
!@@:
  CompilerEndSelect

  CPUID_Info()
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        Break 
      Case #WM_LBUTTONDOWN                  ;CPU-Info
        If CPUInfo
          DestroyWindow_(CPUInfo)
          Title$ = ""
        EndIf
        If WindowMouseY(0) >= 17 And WindowMouseY(0) <= 25 ;obere Zeile
          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 48
            Title$ = "3DNow!"
            Text$ = "AMD only"
           ElseIf WindowMouseX(0) >= 58 And WindowMouseX(0) <= 111
            Title$ = "Ext3DNow!"
            Text$ = "PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 121 And WindowMouseX(0) <= 141
            Title$ = "AES"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 151 And WindowMouseX(0) <= 191
            Title$ = "AMDLM"
            Text$ = "AMD Long Mode" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 200 And WindowMouseX(0) <= 270
            Title$ = "AMDMISAL16"
            Text$ = "Misaligned 16-Byte Memory Access" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 279 And WindowMouseX(0) <= 302
            Title$ = "AVX"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 312 And WindowMouseX(0) <= 345
            Title$ = "CLFSH"
            Text$ = "CLFLUSH" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 355 And WindowMouseX(0) <= 398
            Title$ = "(F)CMOVE"
            Text$ = "CMOVcc, FCMOVcc" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 408 And WindowMouseX(0) <= 441
            Title$ = "CVT16"
            Text$ = "Floating-Point Fraction Extract and Half-Precision Conversion" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 451 And WindowMouseX(0) <= 471
            Title$ = "CX8"
            Text$ = "CMPXCHG8B" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 481 And WindowMouseX(0) <= 507
            Title$ = "CX16"
            Text$ = "CMPXCHG16B" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 517 And WindowMouseX(0) <= 539
            Title$ = "FMA"
            Text$ = "Fused Multiply Add" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 549 And WindowMouseX(0) <= 577
            Title$ = "FMA4"
            Text$ = "Floating-Point Multiply Accumulate (4 Operands)" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 587 And WindowMouseX(0) <= 614
            Title$ = "FXSR"
            Text$ = "FXSAVE, FXRSTOR" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 624 And WindowMouseX(0) <= 659
            Title$ = "LZCNT"
            Text$ = "AMD only"
           ElseIf WindowMouseX(0) >= 669 And WindowMouseX(0) <= 694
            Title$ = "MMX"
            Text$ = "Multi Media Extension" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 703 And WindowMouseX(0) <= 741
            Title$ = "(E)MMX"
            Text$ = "AMD Extensions to MMX" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 750 And WindowMouseX(0) <= 800
            Title$ = "MONITOR"
            Text$ = "MONITOR, MWAIT" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 809 And WindowMouseX(0) <= 847
            Title$ = "MOVBE"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 857 And WindowMouseX(0) <= 880
            Title$ = "MSR"
            Text$ = "RDMSR, WRMSR" + #LFCR$ + "Intel and AMD"
          EndIf
         ElseIf WindowMouseY(0) >= 30 And WindowMouseY(0) <= 38 ;untere Zeile
          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 60
            Title$ = "OSXSAVE"
            Text$ = "OS Support for Processor extended State Management using XSAVE/XRSTOR" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 70 And WindowMouseX(0) <= 137
            Title$ = "PCLMULQDQ"
            Text$ = "Carryless Multiplication" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 147 And WindowMouseX(0) <= 190
            Title$ = "POPCNT"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 200 And WindowMouseX(0) <= 237
            Title$ = "RDTSC"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 247 And WindowMouseX(0) <= 292
            Title$ = "RDTSCP"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 302 And WindowMouseX(0) <= 324
            Title$ = "SEP"
            Text$ = "SYSENTER, SYSEXIT" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 334 And WindowMouseX(0) <= 357
            Title$ = "SMX"
            Text$ = "Safer Mode Extensions" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 367 And WindowMouseX(0) <= 387
            Title$ = "SSE"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 397 And WindowMouseX(0) <= 424
            Title$ = "SSE2"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 434 And WindowMouseX(0) <= 461
            Title$ = "SSE3"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 471 And WindowMouseX(0) <= 506
            Title$ = "SSSE3"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 516 And WindowMouseX(0) <= 551
            Title$ = "SSE4.1"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 561 And WindowMouseX(0) <= 596
            Title$ = "SSE4.2"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 607 And WindowMouseX(0) <= 642
            Title$ = "SSE4A"
            Text$ = "EXTRQ, INSERTQ, MOVNTSD, MOVNTSS" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 652 And WindowMouseX(0) <= 676
            Title$ = "SVM"
            Text$ = "Secure Virtual Machine" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 686 And WindowMouseX(0) <= 709
            Title$ = "VMX"
            Text$ = "Virtual Machine Extensions" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 719 And WindowMouseX(0) <= 744
            Title$ = "XOP"
            Text$ = "Extended Operations" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 753 And WindowMouseX(0) <= 788
            Title$ = "XSAVE"
            Text$ = "XRSTOR, XSAVE" + #LFCR$ + "Intel only"
          EndIf
        EndIf

        If Title$ <> ""
          CPUInfo(Title$, Text$)
        EndIf

    EndSelect
  ForEver

EndIf
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Was unterstützt mein Prozessor?

Beitrag von RSBasic »

Alternativ mit weniger Code mit WinAPI. Es sind zwar nicht alle Informationen, aber die wichtigsten:

Code: Alles auswählen

EnableExplicit

#PF_3DNOW_INSTRUCTIONS_AVAILABLE = 7
#PF_CHANNELS_ENABLED = 16
#PF_COMPARE_EXCHANGE_DOUBLE = 2
#PF_COMPARE_EXCHANGE128 = 14
#PF_COMPARE64_EXCHANGE128 = 15
#PF_FLOATING_POINT_EMULATED = 1
#PF_FLOATING_POINT_PRECISION_ERRATA = 0
#PF_MMX_INSTRUCTIONS_AVAILABLE = 3
#PF_NX_ENABLED = 12
#PF_PAE_ENABLED = 9
#PF_RDTSC_INSTRUCTION_AVAILABLE = 8
#PF_SSE3_INSTRUCTIONS_AVAILABLE = 13
#PF_XMMI_INSTRUCTIONS_AVAILABLE = 6
#PF_XMMI64_INSTRUCTIONS_AVAILABLE = 10
#PF_XSAVE_ENABLED = 17
#PF_ARM_64BIT_LOADSTORE_ATOMIC = 25
#PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE = 24
#PF_ARM_EXTERNAL_CACHE_AVAILABLE = 26
#PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE = 27
#PF_ARM_VFP_32_REGISTERS_AVAILABLE = 18
#PF_FASTFAIL_AVAILABLE = 23
#PF_RDWRFSGSBASE_AVAILABLE = 22
#PF_SECOND_LEVEL_ADDRESS_TRANSLATION = 20
#PF_VIRT_FIRMWARE_ENABLED = 21


Debug "3DNOW_INSTRUCTIONS_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_3DNOW_INSTRUCTIONS_AVAILABLE))
Debug "CHANNELS_ENABLED: " + Str(IsProcessorFeaturePresent_(#PF_CHANNELS_ENABLED))
Debug "COMPARE_EXCHANGE_DOUBLE: " + Str(IsProcessorFeaturePresent_(#PF_COMPARE_EXCHANGE_DOUBLE))
Debug "COMPARE_EXCHANGE128: " + Str(IsProcessorFeaturePresent_(#PF_COMPARE_EXCHANGE128))
Debug "COMPARE64_EXCHANGE128: " + Str(IsProcessorFeaturePresent_(#PF_COMPARE64_EXCHANGE128))
Debug "FLOATING_POINT_EMULATED: " + Str(IsProcessorFeaturePresent_(#PF_FLOATING_POINT_EMULATED))
Debug "FLOATING_POINT_PRECISION_ERRATA: " + Str(IsProcessorFeaturePresent_(#PF_FLOATING_POINT_PRECISION_ERRATA))
Debug "MMX_INSTRUCTIONS_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_MMX_INSTRUCTIONS_AVAILABLE))
Debug "NX_ENABLED: " + Str(IsProcessorFeaturePresent_(#PF_NX_ENABLED))
Debug "PAE_ENABLED: " + Str(IsProcessorFeaturePresent_(#PF_PAE_ENABLED))
Debug "RDTSC_INSTRUCTION_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_RDTSC_INSTRUCTION_AVAILABLE))
Debug "SSE3_INSTRUCTIONS_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_SSE3_INSTRUCTIONS_AVAILABLE))
Debug "XMMI_INSTRUCTIONS_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_XMMI_INSTRUCTIONS_AVAILABLE))
Debug "XMMI64_INSTRUCTIONS_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_XMMI64_INSTRUCTIONS_AVAILABLE))
Debug "XSAVE_ENABLED: " + Str(IsProcessorFeaturePresent_(#PF_XSAVE_ENABLED))
Debug "ARM_64BIT_LOADSTORE_ATOMIC: " + Str(IsProcessorFeaturePresent_(#PF_ARM_64BIT_LOADSTORE_ATOMIC))
Debug "ARM_DIVIDE_INSTRUCTION_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE))
Debug "ARM_EXTERNAL_CACHE_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_ARM_EXTERNAL_CACHE_AVAILABLE))
Debug "ARM_FMAC_INSTRUCTIONS_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE))
Debug "ARM_VFP_32_REGISTERS_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_ARM_VFP_32_REGISTERS_AVAILABLE))
Debug "FASTFAIL_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_FASTFAIL_AVAILABLE))
Debug "RDWRFSGSBASE_AVAILABLE: " + Str(IsProcessorFeaturePresent_(#PF_RDWRFSGSBASE_AVAILABLE))
Debug "SECOND_LEVEL_ADDRESS_TRANSLATION: " + Str(IsProcessorFeaturePresent_(#PF_SECOND_LEVEL_ADDRESS_TRANSLATION))
Debug "VIRT_FIRMWARE_ENABLED: " + Str(IsProcessorFeaturePresent_(#PF_VIRT_FIRMWARE_ENABLED))
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
dlldev
Beiträge: 23
Registriert: 28.07.2014 02:22

Re: Was unterstützt mein Prozessor?

Beitrag von dlldev »

Da ich die Info der CPU sehr interessant finde (Danke Helle), hier mal n Codeupdate für PB 5.30 ("local lables"):
In hinblick auf 5.40 müsste dann noch Unicode unterstützung aktualisiert werden (Prozessorstring)
Läuft prima unter PB 5.3, leider nicht unter 5.22 LTS. :cry: Trotzdem ein Danke für die Mühe! :allright:
Entwicklungsumgebung: Intel i7 Laptop mit 8GB RAM und Windows 8.1 drauf. PureBasic 5.24 LTS.
hyperG
Beiträge: 23
Registriert: 28.06.2014 10:43

Re: Was unterstützt mein Prozessor?

Beitrag von hyperG »

Danke Helle! Mir fehlte immer der Syntax für ASM. Da bei meiner PB 5.10 free nur Fehler kamen (vermutlich wie bei dlldev) habe ich das mal lauffähig gemacht.
Zugabe: Anzeige HYPERTH = Hyper-Threading Technology: logische Kernzahl = Kerne * 2:

ABER Achtung: beim AMD FX 8320 scheinen falsche Anzeigen: Hyper-Threading grün statt rot und 3DNow! rot statt grün!

Code: Alles auswählen

;- CPU-Info, PB 4.40 Beta5 (x86/x64) ;- "Helle" Klaus Helbing, 27.10.2009 -> hyperGerd: PB5.10 free 64Bit ohne Unicode + Hyper-Threading
#TTS_ALWAYSTIP = $01
#WM_LBUTTONDOWN = $0201
Enumeration
  #TOOLTIP_NO_ICON      = 0
  #TOOLTIP_INFO_ICON    = 1
  #TOOLTIP_WARNING_ICON = 2
  #TOOLTIP_ERROR_ICON   = 3
  #WS_EX_TOPMOST = $00000008
  #TTS_BALLOON = $40
  #WM_USER =$400
  #TTM_ADDTOOL	=(#WM_USER+4) ;TTM_ADDTOOLA
  #TTM_TRACKACTIVATE =(#WM_USER+17) 
  #TTM_SETTITLE = (#WM_USER + 32);
  #WS_POPUP = $80000000   ;TOOLTIPS_CLASS = 'tooltips_class32';
EndEnumeration
Structure TOOLINFO
     cbSize.i
     uFlags.i
     hwnd.i
     uId.i
     rect1.i; TRect;
     rect2.i
     rect3.i
     rect4.i
     hinst.i
     lpszText.i ;PWideChar; tInfo.lpszText      = VARPTR(zMessage)
     lParam.i
EndStructure ;
Global AES.l        = $0000D0     ;für CPUID   erstmal Rot für nicht vorhanden
Global AMDLM.l      = $0000D0
Global AMDMISAL16.l = $0000D0
Global AVX.l        = $0000D0
Global CLFSH.l      = $0000D0
Global CMOV.l       = $0000D0
Global CX16.l       = $0000D0
Global CX8.l        = $0000D0
Global CVT16.l      = $0000D0
Global DNOW.l       = $0000D0
Global EDNOW.l      = $0000D0
Global EMMX.l       = $0000D0
Global FMA.l        = $0000D0
Global FMA4.l       = $0000D0
Global FXSR.l       = $0000D0
Global LZCNT.l      = $0000D0
Global MMX.l        = $0000D0
Global MONITOR.l    = $0000D0
Global MOVBE.l      = $0000D0
Global MSR.l        = $0000D0
Global OSXSAVE.l    = $0000D0
Global PCLMULQDQ.l  = $0000D0
Global POPCNT.l     = $0000D0
Global RDTSC.l      = $0000D0
Global RDTSCP.l     = $0000D0
Global SEP.l        = $0000D0
Global SMX.l        = $0000D0
Global SSE.l        = $0000D0
Global SSE2.l       = $0000D0
Global SSE3.l       = $0000D0
Global SSSE3.l      = $0000D0
Global SSE41.l      = $0000D0
Global SSE42.l      = $0000D0
Global SSE4A.l      = $0000D0
Global VMX.l        = $0000D0
Global SVM.l        = $0000D0
Global XOP.l        = $0000D0
Global XSAVE.l      = $0000D0
Global HYPERTH.l    = $0000D0
Global Bit0.l  = $1          ;für SSE3
Global Bit1.l  = $2          ;für PCLMULQDQ
Global Bit2.l  = $4          ;für MONITOR, SVM
Global Bit4.l  = $10         ;für RDTSC
Global Bit5.l  = $20         ;für VMX, MSR, LZCNT
Global Bit6.l  = $40         ;für SMX, SSE4A
Global Bit7.l  = $80         ;für AMDMISAL16
Global Bit8.l  = $100        ;für CMPXCHG8B
Global Bit9.l  = $200        ;für SSSE3
Global Bit11.l = $800        ;für SEP, XOP
Global Bit12.l = $1000       ;für FMA
Global Bit13.l = $2000       ;für CMPXCHG16B
Global Bit15.l = $8000       ;für (F)CMOVcc
Global Bit16.l = $10000      ;für FMA4
Global Bit18.l = $40000      ;für CVT16
Global Bit19.l = $80000      ;für SSE4.1, CLFSH
Global Bit20.l = $100000     ;für SSE4.2
Global Bit21.i = $200000     ;für EFlag
Global Bit22.l = $400000     ;für MOVBE, EMMX
Global Bit23.l = $800000     ;für MMX, POPCNT
Global Bit24.l = $1000000    ;für FXSR
Global Bit25.l = $2000000    ;für SSE, AES
Global Bit26.l = $4000000    ;für SSE2, XSAVE
Global Bit27.l = $8000000    ;für OSXSAVE, RDTSCP
Global Bit28.l = $10000000   ;für AVX
Global Bit29.l = $20000000   ;für AMDLM
Global Bit30.l = $40000000   ;für Extended 3DNow!
Global Bit31.l = $80000000   ;für 3DNow!
Global AES$        = "AES"
Global AMDLM$      = "AMDLM"
Global AMDMISAL16$ = "AMDMISAL16"
Global AVX$        = "AVX"
Global CLFSH$      = "CLFSH"
Global CMOV$       = "(F)CMOV"
Global CX16$       = "CX16"
Global CX8$        = "CX8"
Global CVT16$      = "CVT16"
Global DNOW$       = "3DNow!"
Global EDNOW$      = "Ext3DNow!"
Global EMMX$       = "(E)MMX"
Global FMA$        = "FMA"
Global FMA4$       = "FMA4"
Global FXSR$       = "FXSR"
Global LZCNT$      = "LZCNT"
Global MMX$        = "MMX"
Global MONITOR$    = "MONITOR"
Global MOVBE$      = "MOVBE"
Global MSR$        = "MSR"
Global OSXSAVE$    = "OSXSAVE"
Global PCLMULQDQ$  = "PCLMULQDQ"
Global POPCNT$     = "POPCNT"
Global RDTSC$      = "RDTSC"
Global RDTSCP$     = "RDTSCP"
Global SEP$        = "SEP"
Global SMX$        = "SMX"
Global SSE$        = "SSE"
Global SSE2$       = "SSE2"
Global SSE3$       = "SSE3"
Global SSSE3$      = "SSSE3"
Global SSE41$      = "SSE4.1"
Global SSE42$      = "SSE4.2"
Global SSE4A$      = "SSE4A"
Global SVM$        = "SVM"
Global VMX$        = "VMX"
Global XOP$        = "XOP"
Global XSAVE$      = "XSAVE"
Global HYPERTH$      = "HYPERTH"
Global ProzessorString$ = Space(58)    ;der String kann max.48 Zeichen lang sein
Global CPUInfo.i
Global ProzStrAdr.l
Global g_l1=0
Global *SendMessageA
Global *CreateWindowExA
g_l1= OpenLibrary(#PB_Any, "USER32.DLL")
If g_l1 
   *MessageBox = GetFunction(g_l1, "MessageBoxA")
   *SendMessageA = GetFunction(g_l1, "SendMessageA")
   *CreateWindowExA = GetFunction(g_l1, "CreateWindowExA")
   *DestroyWindow = GetFunction(g_l1, "DestroyWindow")
EndIf
Procedure CPUID_Info()
   ;No check for CPUID!  
    !mov eax,1h
    !cpuid
    !test edx,[v_Bit23]      ;MMX
    !jz l_nommx
    !mov [v_MMX],0A000h      ;Grün für vorhanden 
!l_nommx:
    !test edx,[v_Bit25]      ;SSE  
    !jz l_nosse
    !mov [v_SSE],0A000h
!l_nosse:
    !test edx,[v_Bit26]      ;SSE2  
    !jz l_nosse2
    !mov [v_SSE2],0A000h
!l_nosse2:
    !test ecx,[v_Bit0]       ;SSE3
    !jz l_nosse3
    !mov [v_SSE3],0A000h    
!l_nosse3:
    !test ecx,[v_Bit9]       ;SSSE3
    !jz l_nossse3
    !mov [v_SSSE3],0A000h 
!l_nossse3:
    !test ecx,[v_Bit19]      ;SSE4.1
    !jz l_nosse41
    !mov [v_SSE41],0A000h
!l_nosse41:
    !test ecx,[v_Bit20]      ;SSE4.2
    !jz l_nosse42
    !mov [v_SSE42],0A000h
!l_nosse42:
    !test ecx,[v_Bit23]      ;POPCNT
    !jz l_nopopcnt
    !mov [v_POPCNT],0A000h
!l_nopopcnt:
    !test ecx,[v_Bit1]       ;PCLMULQDQ
    !jz l_nopclmulqdq
    !mov [v_PCLMULQDQ],0A000h
!l_nopclmulqdq:
    !test ecx,[v_Bit2]       ;MONITOR
    !jz l_nomonitor
    !mov [v_MONITOR],0A000h
!l_nomonitor:
    !test ecx,[v_Bit5]       ;VMX
    !jz l_novmx
    !mov [v_VMX],0A000h
!l_novmx:
    !test ecx,[v_Bit6]       ;SMX
    !jz l_nosmx
    !mov [v_SMX],0A000h
!l_nosmx:
    !test ecx,[v_Bit12]      ;FMA
    !jz l_nofma
    !mov [v_FMA],0A000h
!l_nofma:
    !test edx,[v_Bit11]      ;SEP
    !jz l_nosep
    !mov [v_SEP],0A000h
!l_nosep:
    !test edx,[v_Bit24]      ;FXSR
    !jz l_nofxsr
    !mov [v_FXSR],0A000h
!l_nofxsr:
    !test edx,[v_Bit8]       ;CMPXCHG8B
    !jz l_nocx8
    !mov [v_CX8],0A000h
!l_nocx8:
    !test ecx,[v_Bit13]      ;CMPXCHG16B
    !jz l_nocx16
    !mov [v_CX16],0A000h
!l_nocx16:
    !test ecx,[v_Bit25]      ;AES
    !jz l_noaes
    !mov [v_AES],0A000h
!l_noaes:
    !test ecx,[v_Bit26]      ;XSAVE
    !jz l_noxsave
    !mov [v_XSAVE],0A000h
!l_noxsave:
    !test ecx,[v_Bit27]      ;OSXSAVE
    !jz l_noosxsave
    !mov [v_OSXSAVE],0A000h
!l_noosxsave:
    !test ecx,[v_Bit28]      ;AVX
    !jz l_noavx
    !mov [v_AVX],0A000h
!l_noavx:
    !test ecx,[v_Bit22]      ;MOVBE
    !jz l_nomovbe
    !mov [v_MOVBE],0A000h
!l_nomovbe:
    !test edx,[v_Bit15]      ;(F)CMOVcc
    !jz l_nocmov
    !mov [v_CMOV],0A000h
!l_nocmov:       
    !test edx,[v_Bit19]      ;CLFSH
    !jz l_noclfsh
    !mov [v_CLFSH],0A000h
!l_noclfsh:       
    !test edx,[v_Bit5]       ;MSR
    !jz l_nomsr
    !mov [v_MSR],0A000h
!l_nomsr:
    !test edx,[v_Bit4]       ;RDTSC
    !jz l_nordtsc
    !mov [v_RDTSC],0A000h
!l_nordtsc:
    !test edx,[v_Bit28]       ;HYPERTH
    !jz l_hyperth
    !mov [v_HYPERTH],0A000h
!l_hyperth:
;--- Anzahl der vorhandenen Extended Levels ermitteln als Vorstufe für 3DNow!-Test; Rückgabewert in EAX (-80000000h) gibt Anzahl der Extended Level an
    !mov eax,80000000h
    !cpuid
    !cmp eax,80000000h       ;hat nichts mit einem Bit zu tun!
    !jbe l_noexte            ;keine Extended Levels, Ende
    !mov eax,80000001h
    !cpuid                   ;Intel-Prozessoren liefern hier EAX=0 zurück
    !or eax,eax
    !je l_noamd              ;ist Intel-Prozessor
    !test edx,[v_Bit31]      ;AMD 3DNow! 
    !jz l_noext
    !mov [v_DNOW],0A000h
    !test edx,[v_Bit30]      ;AMD Extended 3DNow!  DSP: PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD
    !jz l_noext
    !mov [v_EDNOW],0A000h
!l_noext:
    !test ecx,[v_Bit6]       ;AMD SSE4A   EXTRQ, INSERTQ, MOVNTSD, MOVNTSS
    !jz l_nosse4a
    !mov [v_SSE4A],0A000h
!l_nosse4a:     
    !test edx,[v_Bit29]      ;AMDLM   AMD Long Mode 
    !jz l_noamdlm
    !mov [v_AMDLM],0A000h
!l_noamdlm:     
    !test ecx,[v_Bit7]       ;AMDMISAL16 
    !jz l_noamdmisal16
    !mov [v_AMDMISAL16],0A000h
!l_noamdmisal16:
    !test ecx,[v_Bit18]      ;CVT16 
    !jz l_nocvt16
    !mov [v_CVT16],0A000h
!l_nocvt16:
    !test edx,[v_Bit22]      ;EMMX
    !jz l_noemmx
    !mov [v_EMMX],0A000h
!l_noemmx:
    !test ecx,[v_Bit16]      ;FMA4
    !jz l_nofma4
    !mov [v_FMA4],0A000h
!l_nofma4:
    !test ecx,[v_Bit5]       ;LZCNT
    !jz l_nolzcnt
    !mov [v_LZCNT],0A000h
!l_nolzcnt:
    !test ecx,[v_Bit2]       ;SVM
    !jz l_nosvm
    !mov [v_SVM],0A000h
!l_nosvm:
    !test ecx,[v_Bit11]      ;XOP
    !jz l_noamd
    !mov [v_XOP],0A000h
!l_noamd:
    !test edx,[v_Bit27]      ;RDTSCP
    !jz l_noexte
    !mov [v_RDTSCP],0A000h
!l_noexte: 
  TextGadget(80, 10, 15, 38, 13, DNOW$)  
  SetGadgetColor(80, #PB_Gadget_FrontColor, DNOW) 
  TextGadget(81, 58, 15, 53, 13, EDNOW$)  
  SetGadgetColor(81, #PB_Gadget_FrontColor, EDNOW)  
  TextGadget(82, 121, 15, 20, 13, AES$)  
  SetGadgetColor(82, #PB_Gadget_FrontColor, AES)  
  TextGadget(83, 151, 15, 40, 13, AMDLM$)  
  SetGadgetColor(83, #PB_Gadget_FrontColor, AMDLM) 
  TextGadget(84, 200, 15, 70, 13, AMDMISAL16$)  
  SetGadgetColor(84, #PB_Gadget_FrontColor, AMDMISAL16) 
  TextGadget(85, 279, 15, 23, 13, AVX$)  
  SetGadgetColor(85, #PB_Gadget_FrontColor, AVX)  
  TextGadget(86, 312, 15, 33, 13, CLFSH$)  
  SetGadgetColor(86, #PB_Gadget_FrontColor, CLFSH)  
  TextGadget(87, 355, 15, 43, 13, CMOV$)  
  SetGadgetColor(87, #PB_Gadget_FrontColor, CMOV)
  TextGadget(88, 408, 15, 33, 13, CVT16$)  
  SetGadgetColor(88, #PB_Gadget_FrontColor, CVT16)
  TextGadget(89, 451, 15, 20, 13, CX8$)  
  SetGadgetColor(89, #PB_Gadget_FrontColor, CX8)
  TextGadget(90, 481, 15, 26, 13, CX16$)  
  SetGadgetColor(90, #PB_Gadget_FrontColor, CX16)
  TextGadget(91, 517, 15, 22, 13, FMA$)  
  SetGadgetColor(91, #PB_Gadget_FrontColor, FMA)
  TextGadget(92, 549, 15, 28, 13, FMA4$)  
  SetGadgetColor(92, #PB_Gadget_FrontColor, FMA4)
  TextGadget(93, 587, 15, 27, 13, FXSR$)  
  SetGadgetColor(93, #PB_Gadget_FrontColor, FXSR)
  TextGadget(94, 624, 15, 35, 13, LZCNT$)  
  SetGadgetColor(94, #PB_Gadget_FrontColor, LZCNT)
  TextGadget(95, 669, 15, 25, 13, MMX$)  
  SetGadgetColor(95, #PB_Gadget_FrontColor, MMX)  
  TextGadget(96, 703, 15, 38, 13, EMMX$)  
  SetGadgetColor(96, #PB_Gadget_FrontColor, EMMX) 
  TextGadget(97, 750, 15, 50, 13, MONITOR$)  
  SetGadgetColor(97, #PB_Gadget_FrontColor, MONITOR)
  TextGadget(98, 809, 15, 38, 13, MOVBE$)  
  SetGadgetColor(98, #PB_Gadget_FrontColor, MOVBE)
  TextGadget(99, 857, 15, 23, 13, MSR$)  
  SetGadgetColor(99, #PB_Gadget_FrontColor, MSR)
  TextGadget(100, 10, 28, 50, 13, OSXSAVE$)  
  SetGadgetColor(100, #PB_Gadget_FrontColor, OSXSAVE)
  TextGadget(101, 70, 28, 67, 13, PCLMULQDQ$)  
  SetGadgetColor(101, #PB_Gadget_FrontColor, PCLMULQDQ)
  TextGadget(102, 147, 28, 43, 13, POPCNT$)  
  SetGadgetColor(102, #PB_Gadget_FrontColor, POPCNT)
  TextGadget(103, 200, 28, 37, 13, RDTSC$)  
  SetGadgetColor(103, #PB_Gadget_FrontColor, RDTSC)
  TextGadget(104, 247, 28, 45, 13, RDTSCP$)  
  SetGadgetColor(104, #PB_Gadget_FrontColor, RDTSCP)
  TextGadget(105, 302, 28, 22, 13, SEP$)  
  SetGadgetColor(105, #PB_Gadget_FrontColor, SEP)
  TextGadget(106, 334, 28, 23, 13, SMX$)  
  SetGadgetColor(106, #PB_Gadget_FrontColor, SMX)
  TextGadget(107, 367, 28, 20, 13, SSE$)  
  SetGadgetColor(107, #PB_Gadget_FrontColor, SSE)
  TextGadget(108, 397, 28, 27, 13, SSE2$)  
  SetGadgetColor(108, #PB_Gadget_FrontColor, SSE2)
  TextGadget(109, 434, 28, 27, 13, SSE3$)  
  SetGadgetColor(109, #PB_Gadget_FrontColor, SSE3)
  TextGadget(110, 471, 28, 35, 13, SSSE3$)  
  SetGadgetColor(110, #PB_Gadget_FrontColor, SSSE3)
  TextGadget(111, 516, 28, 35, 13, SSE41$)  
  SetGadgetColor(111, #PB_Gadget_FrontColor, SSE41)
  TextGadget(112, 561, 28, 36, 13, SSE42$) : SetGadgetColor(112, #PB_Gadget_FrontColor, SSE42)
  TextGadget(113, 607, 28, 35, 13, SSE4A$) : SetGadgetColor(113, #PB_Gadget_FrontColor, SSE4A)  
  TextGadget(114, 652, 28, 25, 13, SVM$) : SetGadgetColor(114, #PB_Gadget_FrontColor, SVM)
  TextGadget(115, 686, 28, 23, 13, VMX$) : SetGadgetColor(115, #PB_Gadget_FrontColor, VMX)
  TextGadget(116, 719, 28, 25, 13, XOP$) : SetGadgetColor(116, #PB_Gadget_FrontColor, XOP)
  TextGadget(117, 753, 28, 35, 13, XSAVE$) : SetGadgetColor(117, #PB_Gadget_FrontColor, XSAVE)
  TextGadget(118, 795, 28, 56, 13, HYPERTH$) : SetGadgetColor(118, #PB_Gadget_FrontColor, HYPERTH)
  ;Prozessor-String  
  ProzStrAdr = @ProzessorString$   
    !mov eax,80000000h       ;Test, ob CPU aktuell genug ist um den String zu liefern
    !cpuid
    !cmp eax,80000004h
    !jb l_nocpustr
    !mov esi,[v_ProzStrAdr]
    !xor edi,edi
!@@:    
    !mov eax,80000002h
    !add eax,edi
    !cpuid        
    !mov [esi],eax
    !mov [esi+4],ebx    
    !mov [esi+8],ecx
    !mov [esi+12],edx
    !inc edi
    !cmp edi,3
    !je l_nocpustr
    !add esi,16
    !jmp @b
!l_nocpustr:
  TextGadget(119, 10, 2, 400, 13, "Current CPU : " + ProzessorString$)
EndProcedure  
Procedure CPUInfo(Title$, Text$)
  ;CPUInfo = CreateWindowEx_(#WS_EX_TOPMOST, #TOOLTIPS_CLASS , #Null, #WS_POPUP | #TTS_ALWAYSTIP | #TTS_BALLOON, 0, 0, 0, 0, 0, 0, 0, 0)
  CPUInfo = CallFunctionFast(*CreateWindowExA,#WS_EX_TOPMOST,@"tooltips_class32" , #Null, #WS_POPUP | #TTS_ALWAYSTIP | #TTS_BALLOON, 0, 0, 0, 0, 0, 0, 0, 0)
  CallFunctionFast(*SendMessageA,CPUInfo, #TTM_SETTITLE, #TOOLTIP_INFO_ICON, @Title$) 
  Balloon.TOOLINFO\cbSize = SizeOf(TOOLINFO)
  Balloon.TOOLINFO\lpszText = @Text$ ; Balloon\lpszText = @Text$
  CallFunctionFast(*SendMessageA,CPUInfo,#TTM_ADDTOOL, 0, @Balloon)  ;SendMessage_(CPUInfo, #TTM_ADDTOOL, 0, @Balloon)
  CallFunctionFast(*SendMessageA,CPUInfo,#TTM_TRACKACTIVATE, 1, @Balloon) ;  SendMessage_(CPUInfo, #TTM_TRACKACTIVATE, 1, @Balloon)
ProcedureReturn CPUInfo
EndProcedure
If OpenWindow(0, 0, 0, 900, 50, "CPU-Info           Grün = wird unterstützt,  Rot = wird nicht unterstützt           Linker Maus-Klick auf Erweiterung ergibt mehr Infos!", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  CompilerSelect #PB_Compiler_Processor
    CompilerCase #PB_Processor_x86
      !pushfd                ;das EFlag-Register (32-Bit) auf den Stack
      !pop eax               ;rein in EAX
      !mov edx,eax           ;EAX unverändert lassen
      !xor edx,[v_Bit21]     ;Bit21 kippen 
      !push edx                          
      !popfd                 ;in EFlag schreiben
      !pushfd                ;wieder auf Stack
      !pop edx
      !push eax              ;der Ordnung halber alten Wert wieder herstellen
      !popfd   
      !cmp eax,edx
      !jne @f                ;sind nicht gleich -> CPUID ist möglich
    MessageRequester("Status", "Der getestete Prozessor unterstützt den CPUID-Befehl nicht!")
End  
!@@:
    CompilerCase #PB_Processor_x64
      !pushfq                ;das RFlag-Register (64-Bit) auf den Stack
      !pop rax               ;rein in RAX
      !mov rdx,rax           ;RAX unverändert lassen
      !xor rdx,[v_Bit21]     ;Bit21 kippen 
      !push rdx                          
      !popfq                 ;in RFlag schreiben
      !pushfq                ;wieder auf Stack
      !pop rdx
      !push rax              ;der Ordnung halber alten Wert wieder herstellen
      !popfq   
      !cmp rax,rdx
      !jne @f                ;sind nicht gleich -> CPUID ist möglich
    MessageRequester("Status", "Der getestete Prozessor unterstützt den CPUID-Befehl nicht!")
End  
!@@:
  CompilerEndSelect
  CPUID_Info()
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        Break 
      Case #WM_LBUTTONDOWN                  ;CPU-Info
        If CPUInfo
          CallFunctionFast(*DestroyWindow,CPUInfo); DestroyWindow_(CPUInfo)
          Title$ = ""
        EndIf
        strY.s="y="+Str(WindowMouseY(0))
        ;CallFunctionFast(*MessageBox, 0, @strY, @"Title", 0)
        If WindowMouseY(0) >= 5 And WindowMouseY(0) <= 25 ;obere Zeile
          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 48
            Title$ = "3DNow!"
            Text$ = "AMD only"
           ElseIf WindowMouseX(0) >= 58 And WindowMouseX(0) <= 111
            Title$ = "Ext3DNow!"
            Text$ = "PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 121 And WindowMouseX(0) <= 141
            Title$ = "AES"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 151 And WindowMouseX(0) <= 191
            Title$ = "AMDLM"
            Text$ = "AMD Long Mode" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 200 And WindowMouseX(0) <= 270
            Title$ = "AMDMISAL16"
            Text$ = "Misaligned 16-Byte Memory Access" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 279 And WindowMouseX(0) <= 302
            Title$ = "AVX"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 312 And WindowMouseX(0) <= 345
            Title$ = "CLFSH"
            Text$ = "CLFLUSH" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 355 And WindowMouseX(0) <= 398
            Title$ = "(F)CMOVE"
            Text$ = "CMOVcc, FCMOVcc" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 408 And WindowMouseX(0) <= 441
            Title$ = "CVT16"
            Text$ = "Floating-Point Fraction Extract and Half-Precision Conversion" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 451 And WindowMouseX(0) <= 471
            Title$ = "CX8"
            Text$ = "CMPXCHG8B" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 481 And WindowMouseX(0) <= 507
            Title$ = "CX16"
            Text$ = "CMPXCHG16B" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 517 And WindowMouseX(0) <= 539
            Title$ = "FMA"
            Text$ = "Fused Multiply Add" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 549 And WindowMouseX(0) <= 577
            Title$ = "FMA4"
            Text$ = "Floating-Point Multiply Accumulate (4 Operands)" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 587 And WindowMouseX(0) <= 614
            Title$ = "FXSR"
            Text$ = "FXSAVE, FXRSTOR" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 624 And WindowMouseX(0) <= 659
            Title$ = "LZCNT"
            Text$ = "AMD only"
           ElseIf WindowMouseX(0) >= 669 And WindowMouseX(0) <= 694
            Title$ = "MMX"
            Text$ = "Multi Media Extension" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 703 And WindowMouseX(0) <= 741
            Title$ = "(E)MMX"
            Text$ = "AMD Extensions to MMX" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 750 And WindowMouseX(0) <= 800
            Title$ = "MONITOR"
            Text$ = "MONITOR, MWAIT" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 809 And WindowMouseX(0) <= 847
            Title$ = "MOVBE"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 857 And WindowMouseX(0) <= 880
            Title$ = "MSR"
            Text$ = "RDMSR, WRMSR" + #LFCR$ + "Intel and AMD"
          EndIf
         ElseIf WindowMouseY(0) >= 30 And WindowMouseY(0) <= 38 ;untere Zeile
          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 60
            Title$ = "OSXSAVE"
            Text$ = "OS Support for Processor extended State Management using XSAVE/XRSTOR" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 70 And WindowMouseX(0) <= 137
            Title$ = "PCLMULQDQ"
            Text$ = "Carryless Multiplication" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 147 And WindowMouseX(0) <= 190
            Title$ = "POPCNT"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 200 And WindowMouseX(0) <= 237
            Title$ = "RDTSC"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 247 And WindowMouseX(0) <= 292
            Title$ = "RDTSCP"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 302 And WindowMouseX(0) <= 324
            Title$ = "SEP"
            Text$ = "SYSENTER, SYSEXIT" + #LFCR$ + "Intel and AMD"
           ElseIf WindowMouseX(0) >= 334 And WindowMouseX(0) <= 357
            Title$ = "SMX"
            Text$ = "Safer Mode Extensions" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 367 And WindowMouseX(0) <= 387
            Title$ = "SSE"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 397 And WindowMouseX(0) <= 424
            Title$ = "SSE2"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 434 And WindowMouseX(0) <= 461
            Title$ = "SSE3"
            Text$ = "Intel and AMD"
           ElseIf WindowMouseX(0) >= 471 And WindowMouseX(0) <= 506
            Title$ = "SSSE3"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 516 And WindowMouseX(0) <= 551
            Title$ = "SSE4.1"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 561 And WindowMouseX(0) <= 596
            Title$ = "SSE4.2"
            Text$ = "Intel only"
           ElseIf WindowMouseX(0) >= 607 And WindowMouseX(0) <= 642
            Title$ = "SSE4A"
            Text$ = "EXTRQ, INSERTQ, MOVNTSD, MOVNTSS" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 652 And WindowMouseX(0) <= 676
            Title$ = "SVM"
            Text$ = "Secure Virtual Machine" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 686 And WindowMouseX(0) <= 709
            Title$ = "VMX"
            Text$ = "Virtual Machine Extensions" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 719 And WindowMouseX(0) <= 744
            Title$ = "XOP"
            Text$ = "Extended Operations" + #LFCR$ + "AMD only"
           ElseIf WindowMouseX(0) >= 753 And WindowMouseX(0) <= 788
            Title$ = "XSAVE"
            Text$ = "XRSTOR, XSAVE" + #LFCR$ + "Intel only"
           ElseIf WindowMouseX(0) >= 789 And WindowMouseX(0) <= 840
            Title$ = "HYPERTH"
            Text$ = "Hyper-Threading Technology: logische Kernzahl = Kerne * 2"
          EndIf
        EndIf
        If Title$ <> ""
          CPUInfo(Title$, Text$)
          CallFunctionFast(*MessageBox, 0, @Text$, @"Info", 0);@strY
        EndIf
    EndSelect
  ForEver
 CloseLibrary(g_l1)
EndIf
Benutzeravatar
dlldev
Beiträge: 23
Registriert: 28.07.2014 02:22

Re: Was unterstützt mein Prozessor?

Beitrag von dlldev »

hyperG hat geschrieben:Danke Helle! Mir fehlte immer der Syntax für ASM. Da bei meiner PB 5.10 free nur Fehler kamen (vermutlich wie bei dlldev) habe ich das mal lauffähig gemacht.
Zugabe: Anzeige HYPERTH = Hyper-Threading Technology: logische Kernzahl = Kerne * 2:
Genau, unter PB 5.22 LTS gab es ASM Syntax Fehler. Vielen Dank für die Anpassung an PB 5.22 LTS! :allright:
Entwicklungsumgebung: Intel i7 Laptop mit 8GB RAM und Windows 8.1 drauf. PureBasic 5.24 LTS.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Was unterstützt mein Prozessor?

Beitrag von Helle »

Aus gegebenen Anlass mal wieder eine Aktualisierung (ausgekoppelt aus anderem Programm):

Code: Alles auswählen

;- PureBasic 5.31 (x64)
;- Kein Unicode!!!

Global PAE.q
Global PAEBits.l
Global S1.l                  ;für CPU-String, um x86/x64-Abfrage zu umgehen (Vorgänger-Version)
Global S2.l
Global S3.l
Global S4.l
Global Z.l
Global FZ1.l                 ;Feature-Zähler Zeile 1 (0...)
Global FZ2.l                 ;Feature-Zähler Zeile 1+2
Global FZ3.l                 ;Feature-Zähler Zeile 1+2+3
Global CPUInfo.l             ;CPU-Balloon-Tipp
Global SichEBX.l             ;für CPUID
Global SichECX.l
Global SichEDX.l
Global MaxID.l
Global MaxIDExt.l
Global IsAMD.l
Global IsIntel.l

Global Bit0.l  = $1          ;für SSE3, XSAVEOPT
Global Bit1.l  = $2          ;für PCLMULQDQ
Global Bit2.l  = $4          ;für SVM
Global Bit3.l  = $8          ;für BMI(1),MONITOR 
Global Bit4.l  = $10         ;für HLE, RDTSC
Global Bit5.l  = $20         ;für AVX2, LZCNT, MSR, VMX  
Global Bit6.l  = $40         ;für SMX, SSE4A
Global Bit7.l  = $80         ;für AMDMISAL16
Global Bit8.l  = $100        ;für 3DNOWPREFETCH, BMI2, CMPXCHG8B 
Global Bit9.l  = $200        ;für SSSE3
Global Bit10.l = $400        ;für INVPCID
Global Bit11.l = $800        ;für RTM, SEP, XOP
Global Bit12.l = $1000       ;für FMA
Global Bit13.l = $2000       ;für CMPXCHG16B
Global Bit15.l = $8000       ;für (F)CMOVcc, LWP
Global Bit16.l = $10000      ;für FMA4
Global Bit18.l = $40000      ;für RDSEED
Global Bit19.l = $80000      ;für SSE4.1, CLFSH, ADX
Global Bit20.l = $100000     ;für SSE4.2
Global Bit21.l = $200000     ;für TBM
Global Bit22.l = $400000     ;für EMMX, MOVBE
Global Bit23.l = $800000     ;für MMX, POPCNT
Global Bit24.l = $1000000    ;für FXSR
Global Bit25.l = $2000000    ;für AES, SSE 
Global Bit26.l = $4000000    ;für SSE2, XSAVE
Global Bit27.l = $8000000    ;für OSXSAVE, RDTSCP
Global Bit28.l = $10000000   ;für AVX
Global Bit29.l = $20000000   ;für ARCH64, F16C
Global Bit30.l = $40000000   ;für Extended 3DNow!, RDRAND
Global Bit31.l = $80000000   ;für 3DNow!

Global ProzessorString$ = Space(48)    ;der String kann max.48 Zeichen lang sein incl.Zero-Byte
Global ProzStrAdr.l

Enumeration CPU_Features
  #DNow            ;0
  #EXT3DNOW
  #DNOWPREF
  #ADX
  #AES
  #AMDMISAL16
  #ARCH64
  #AVX
  #AVX2
  #BMI1
  #BMI2            ;10
  #CLFSH
  #CMOV
  #CX8
  #CX16
  #F16C
  #FMA
  #FMA4
  #FXSR
  #HLE
  #INVPCID         ;20
  #LWP
  #LZCNT
  #MMX
  #EMMX
  #MONITOR
  #MOVBE
  #MSR
  #OSXSAVE
  #PAE
  #PCLMULQDQ       ;30
  #POPCNT
  #RDRAND
  #RDSEED
  #RDTSC
  #RDTSCP
  #RTM
  #SEP
  #SMX
  #SSE
  #SSE2            ;40
  #SSE3
  #SSSE3
  #SSE41
  #SSE42
  #SSE4A
  #SVM
  #TBM
  #VMX
  #XOP
  #XSAVE           ;50 
  #XSAVEOPT
EndEnumeration

Structure CPU
  Feature.s
  Info.s
  Pixel.l 
  Color.l
EndStructure
Global Dim CPU_Info.CPU(#PB_Compiler_EnumerationValue - 1)
 
CPU_Info(#DNow)\Feature = "3DNOW!" : CPU_Info(#DNow)\Info = "AMD only" : CPU_Info(#DNow)\Pixel = 48
CPU_Info(#EXT3DNOW)\Feature = "EXT3DNOW!" : CPU_Info(#EXT3DNOW)\Info = "PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD" + #CR$ + "AMD only" : CPU_Info(#EXT3DNOW)\Pixel = 70
CPU_Info(#DNOWPREF)\Feature = "3DNOWPREF" : CPU_Info(#DNOWPREF)\Info = "3DNOWPREFETCH" + #CR$ + "AMD only" : CPU_Info(#DNOWPREF)\Pixel = 71
CPU_Info(#ADX)\Feature = "ADX" : CPU_Info(#ADX)\Info = "ADCX, ADOX" + #CR$ + "Intel only" : CPU_Info(#ADX)\Pixel = 24
CPU_Info(#AES)\Feature = "AES" : CPU_Info(#AES)\Info = "Intel and AMD" : CPU_Info(#AES)\Pixel = 24
CPU_Info(#AMDMISAL16)\Feature = "AMDMISAL16" : CPU_Info(#AMDMISAL16)\Info = "Misaligned 16-Byte Memory Access" + #CR$ + "AMD only" : CPU_Info(#AMDMISAL16)\Pixel = 75
CPU_Info(#ARCH64)\Feature = "ARCH64" : CPU_Info(#ARCH64)\Info = "64-Bit-Architecture" + #CR$ + "AMD: Long Mode" + #CR$ + "Intel: Intel 64" : CPU_Info(#ARCH64)\Pixel = 45
CPU_Info(#AVX)\Feature = "AVX" : CPU_Info(#AVX)\Info = "Intel and AMD" : CPU_Info(#AVX)\Pixel = 24
CPU_Info(#AVX2)\Feature = "AVX2" : CPU_Info(#AVX2)\Info = "Intel and AMD" : CPU_Info(#AVX2)\Pixel = 31
CPU_Info(#BMI1)\Feature = "BMI(1)" : CPU_Info(#BMI1)\Info = "Bit Manipulation Instructions (1)                       " + #CR$ + "ANDN, BEXTR, BLSI, BLSMK, BLSR, TZCNT" + #CR$ + "Intel: BMI1" + #CR$ + "AMD: BMI" : CPU_Info(#BMI1)\Pixel = 37
CPU_Info(#BMI2)\Feature = "BMI2" : CPU_Info(#BMI2)\Info = "Bit Manipulation Instructions 2                                    " + #CR$ + "BZHI, MULX, PDEP, PEXT, RORX, SARX, SHLX, SHRX" + #CR$ + "Intel and AMD" : CPU_Info(#BMI2)\Pixel = 28
CPU_Info(#CLFSH)\Feature = "CLFSH" : CPU_Info(#CLFSH)\Info = "CLFLUSH" + #CR$ + "Intel and AMD" : CPU_Info(#CLFSH)\Pixel = 37
CPU_Info(#CMOV)\Feature = "(F)CMOV" : CPU_Info(#CMOV)\Info = "CMOVcc, FCMOVcc" + #CR$ + "Intel and AMD" : CPU_Info(#CMOV)\Pixel = 49
CPU_Info(#CX8)\Feature = "CX8" : CPU_Info(#CX8)\Info = "CMPXCHG8B" + #CR$ + "Intel and AMD" : CPU_Info(#CX8)\Pixel = 23
CPU_Info(#CX16)\Feature = "CX16" : CPU_Info(#CX16)\Info = "CMPXCHG16B" + #CR$ + "Intel and AMD" : CPU_Info(#CX16)\Pixel = 31
CPU_Info(#F16C)\Feature = "F16C" : CPU_Info(#F16C)\Info = "16-Bit Floating-Point Conversion" + #CR$ + "Intel and AMD" : CPU_Info(#F16C)\Pixel = 29
CPU_Info(#FMA)\Feature = "FMA" : CPU_Info(#FMA)\Info = "Fused Multiply Add" + #CR$ + "Intel and AMD" : CPU_Info(#FMA)\Pixel = 25
CPU_Info(#FMA4)\Feature = "FMA4" : CPU_Info(#FMA4)\Info = "Floating-Point Multiply Accumulate (4 Operands)" + #CR$ + "AMD only" : CPU_Info(#FMA4)\Pixel = 33
CPU_Info(#FXSR)\Feature = "FXSR" : CPU_Info(#FXSR)\Info = "FXSAVE, FXRSTOR" + #CR$ + "Intel and AMD" : CPU_Info(#FXSR)\Pixel = 29
CPU_Info(#HLE)\Feature = "HLE" : CPU_Info(#HLE)\Info = "Hardware Lock Elision                 " + #CR$ + "XACQUIRE, XRELEASE, XTEST" + #CR$ + "Intel only" : CPU_Info(#HLE)\Pixel = 23
CPU_Info(#INVPCID)\Feature = "INVPCID" : CPU_Info(#INVPCID)\Info = "Intel only" : CPU_Info(#INVPCID)\Pixel = 47
CPU_Info(#LWP)\Feature = "LWP" : CPU_Info(#LWP)\Info = "LightWeight Profiling" + #CR$ + "AMD only" : CPU_Info(#LWP)\Pixel = 25
CPU_Info(#LZCNT)\Feature = "LZCNT" : CPU_Info(#LZCNT)\Info = "Intel and AMD (ABM)" : CPU_Info(#LZCNT)\Pixel = 38
CPU_Info(#MMX)\Feature = "MMX" : CPU_Info(#MMX)\Info = "Multi Media Extension" + #CR$ + "Intel and AMD" : CPU_Info(#MMX)\Pixel = 28
CPU_Info(#EMMX)\Feature = "(E)MMX" : CPU_Info(#EMMX)\Info = "AMD Extensions to MMX" + #CR$ + "AMD only" : CPU_Info(#EMMX)\Pixel = 43
CPU_Info(#MONITOR)\Feature = "MONITOR" : CPU_Info(#MONITOR)\Info = "MONITOR, MWAIT" + #CR$ + "Intel and AMD" : CPU_Info(#MONITOR)\Pixel = 55
CPU_Info(#MOVBE)\Feature = "MOVBE" : CPU_Info(#MOVBE)\Info = "Intel and AMD" : CPU_Info(#MOVBE)\Pixel = 40
CPU_Info(#MSR)\Feature = "MSR" : CPU_Info(#MSR)\Info = "RDMSR, WRMSR" + #CR$ + "Intel and AMD" : CPU_Info(#MSR)\Pixel = 26
CPU_Info(#OSXSAVE)\Feature = "OSXSAVE" : CPU_Info(#OSXSAVE)\Info = "OS Support for Processor extended State Management using XSAVE/XRSTOR" + #CR$ + "Intel and AMD" : CPU_Info(#OSXSAVE)\Pixel = 52
CPU_Info(#PAE)\Feature = "PAE" : CPU_Info(#PAE)\Info = "Physical Address Extensions" + #CR$ + "Intel and AMD" + #CR$ + PAE$ : CPU_Info(#PAE)\Pixel = 23
CPU_Info(#PCLMULQDQ)\Feature = "PCLMULQDQ" : CPU_Info(#PCLMULQDQ)\Info = "Carryless Multiplication" + #CR$ + "Intel and AMD" : CPU_Info(#PCLMULQDQ)\Pixel = 75
CPU_Info(#POPCNT)\Feature = "POPCNT" : CPU_Info(#POPCNT)\Info = "Intel and AMD" : CPU_Info(#POPCNT)\Pixel = 47
CPU_Info(#RDRAND)\Feature = "RDRAND" : CPU_Info(#RDRAND)\Info = "Intel and AMD" : CPU_Info(#RDRAND)\Pixel = 49
CPU_Info(#RDSEED)\Feature = "RDSEED" : CPU_Info(#RDSEED)\Info = "Intel only" : CPU_Info(#RDSEED)\Pixel = 46
CPU_Info(#RDTSC)\Feature = "RDTSC" : CPU_Info(#RDTSC)\Info = "Intel and AMD" : CPU_Info(#RDTSC)\Pixel = 37
CPU_Info(#RDTSCP)\Feature = "RDTSCP" : CPU_Info(#RDTSCP)\Info = "Intel and AMD" : CPU_Info(#RDTSCP)\Pixel = 45
CPU_Info(#RTM)\Feature = "RTM" : CPU_Info(#RTM)\Info = "Restricted Transactional Memory  " + #CR$ + "XBEGIN, XEND, XABORT, XTEST" + #CR$ + "Intel only" : CPU_Info(#RTM)\Pixel = 25
CPU_Info(#SEP)\Feature = "SEP" : CPU_Info(#SEP)\Info = "SYSENTER, SYSEXIT" + #CR$ + "Intel and AMD" : CPU_Info(#SEP)\Pixel = 22
CPU_Info(#SMX)\Feature = "SMX" : CPU_Info(#SMX)\Info = "Safer Mode Extensions" + #CR$ + "Intel only" : CPU_Info(#SMX)\Pixel = 24
CPU_Info(#SSE)\Feature = "SSE" : CPU_Info(#SSE)\Info = "Intel and AMD" : CPU_Info(#SSE)\Pixel = 20
CPU_Info(#SSE2)\Feature = "SSE2" : CPU_Info(#SSE2)\Info = "Intel and AMD" : CPU_Info(#SSE2)\Pixel = 28
CPU_Info(#SSE3)\Feature = "SSE3" : CPU_Info(#SSE3)\Info = "Intel and AMD" : CPU_Info(#SSE3)\Pixel = 28
CPU_Info(#SSSE3)\Feature = "SSSE3" : CPU_Info(#SSSE3)\Info = "Intel and AMD" : CPU_Info(#SSSE3)\Pixel = 36
CPU_Info(#SSE41)\Feature = "SSE4.1" : CPU_Info(#SSE41)\Info = "Intel and AMD" : CPU_Info(#SSE41)\Pixel = 39
CPU_Info(#SSE42)\Feature = "SSE4.2" : CPU_Info(#SSE42)\Info = "Intel and AMD" : CPU_Info(#SSE42)\Pixel = 39
CPU_Info(#SSE4A)\Feature = "SSE4A" : CPU_Info(#SSE4A)\Info = "EXTRQ, INSERTQ, MOVNTSD, MOVNTSS" + #CR$ + "AMD only" : CPU_Info(#SSE4A)\Pixel = 36
CPU_Info(#SVM)\Feature = "SVM" : CPU_Info(#SVM)\Info = "Secure Virtual Machine" + #CR$ + "AMD only" : CPU_Info(#SVM)\Pixel = 24
CPU_Info(#TBM)\Feature = "TBM" : CPU_Info(#TBM)\Info = "Trailing Bit Manipulation" + #CR$ + "AMD only" : CPU_Info(#TBM)\Pixel = 24
CPU_Info(#VMX)\Feature = "VMX" : CPU_Info(#VMX)\Info = "Virtual Machine Extensions" + #CR$ + "Intel only" : CPU_Info(#VMX)\Pixel = 26
CPU_Info(#XOP)\Feature = "XOP" : CPU_Info(#XOP)\Info = "Extended Operations" + #CR$ + "AMD only" : CPU_Info(#XOP)\Pixel = 23
CPU_Info(#XSAVE)\Feature = "XSAVE" : CPU_Info(#XSAVE)\Info = "XGETBV, XRSTOR, XSAVE, XSETBV" + #CR$ + "Intel and AMD" : CPU_Info(#XSAVE)\Pixel = 36
CPU_Info(#XSAVEOPT)\Feature = "XSAVEOPT" : CPU_Info(#XSAVEOPT)\Info = "Intel and AMD" : CPU_Info(#XSAVEOPT)\Pixel = 61

For i = 0 To #PB_Compiler_EnumerationValue - 1
  CPU_Info(i)\Color = $0000D0          ;für CPUID   erstmal Rot für nicht vorhanden
Next

Procedure CPUInfo(Title$, Text$)
  CPUInfo = CreateWindowEx_(#WS_EX_TOPMOST, #TOOLTIPS_CLASS, #Null, #WS_POPUP | #TTS_ALWAYSTIP | #TTS_BALLOON, 0, 0, 0, 0, 0, 0, 0, 0)
  SendMessage_(CPUInfo, #TTM_SETTITLE, #TOOLTIP_INFO_ICON, @Title$)
  Balloon.TOOLINFO\cbSize = SizeOf(TOOLINFO)
  Balloon\lpszText = @Text$
  SendMessage_(CPUInfo, #TTM_ADDTOOL, 0, @Balloon)
  SendMessage_(CPUInfo, #TTM_TRACKACTIVATE, 1, @Balloon)
 ProcedureReturn CPUInfo
EndProcedure

Procedure CPUID_Info()
  ;Instruction/Group   CPUID (EAX)     Register    Bit    Intel    AMD   Remarks
  ;--------------------------------------------------------------------------------------------------------
  ;3DNOW!               80000001h         EDX      31       -       x
  ;3DNOWPREFETCH        80000001h         ECX       8       -       x   
  ;ADX                  00000007h         EBX      19       x       -    Input ECX=0, ADCX, ADOX
  ;AES                  00000001h         ECX      25       x       x
  ;ARCH64               80000001h         EDX      29       x       x    AMD: Long Mode, Intel: Intel 64 Architecture
  ;AMDMISAL16           80000001h         ECX       7       -       x    Misaligned 16-Byte Memory Access
  ;AVX                  00000001h         ECX      28       x       x
  ;AVX2                 00000007h         EBX       5       x       x    Input ECX=0
  ;BMI(1)               00000007h         EBX       3       x       x    Input ECX=0, Bit Manipulation Instructions BMI1=Intel, BMI=AMD
  ;BMI2                 00000007h         EBX       8       x       x    Input ECX=0, Bit Manipulation Instructions  
  ;CLFSH                00000001h         EDX      19       x       x    CLFLUSH
  ;(F)CMOV              00000001h         EDX      15       x       x    CMOVcc, FCMOVcc
  ;CMPXCHG8B            00000001h         EDX       8       x       x
  ;CMPXCHG16B           00000001h         ECX      13       x       x
  ;EMMX                 80000001h         EDX      22       -       x    AMD Extensions to MMX
  ;EXT3DNOW!            80000001h         EDX      30       -       x    Extensions to 3DNOW!
  ;F16C                 00000001h         ECX      29       x       x
  ;FMA                  00000001h         ECX      12       x       -    Fused Multiply Add
  ;FMA4                 80000001h         ECX      16       -       x    Floating-Point Multiply Accumulate (4 Operands)
  ;FXSR                 00000001h         EDX      24       x       x    FXSAVE, FXRSTOR
  ;HLE                  00000007h         EBX       4       x       -    Input ECX=0, Hardware Lock Elision
  ;INVPCID              00000007h         EBX      10       x       -    Input ECX=0 
  ;LWP                  80000001h         ECX      15       -       x    LightWeight Profiling
  ;LZCNT                80000001h         ECX       5       x       x
  ;MMX                  00000001h         EDX      23       x       x
  ;MONITOR              00000001h         ECX       3       x       x    MONITOR, MWAIT
  ;MOVBE                00000001h         ECX      22       x       x
  ;MSR                  00000001h         EDX       5       x       x    RDMSR, WRMSR  
  ;OSXSAVE              00000001h         ECX      27       x       -
  ;PAE                  00000001h         EDX       6       x       x    Physical Address Extensions
  ;PCLMULQDQ            00000001h         ECX       1       x       x    Carryless Multiplication
  ;POPCNT               00000001h         ECX      23       x       x
  ;RDRAND               00000001h         ECX      30       x       -
  ;RDSEED               00000007h         EBX      18       x       -    Input ECX=0
  ;RDTSC                00000001h         EDX       4       x       x  
  ;RDTSCP               80000001h         EDX      27       x       x
  ;RTM                  00000007h         EBX      11       x       -    Input ECX=0
  ;SEP                  00000001h         EDX      11       x       x    SYSENTER, SYSEXIT
  ;SMX                  00000001h         ECX       6       x       -    Safer Mode Extensions
  ;SSE                  00000001h         EDX      25       x       x
  ;SSE2                 00000001h         EDX      26       x       x
  ;SSE3                 00000001h         ECX       0       x       x  
  ;SSSE3                00000001h         ECX       9       x       x  
  ;SSE4.1               00000001h         ECX      19       x       x  
  ;SSE4.2               00000001h         ECX      20       x       x  
  ;SSE4A                80000001h         ECX       6       -       x
  ;SVM                  80000001h         ECX       2       -       x    Secure Virtual Machine
  ;TBM                  80000001h         ECX      21       -       x    Trailing Bit Manipulation
  ;VMX                  00000001h         ECX       5       x       -    Virtual Machine Extensions
  ;XOP                  80000001h         ECX      11       -       x    Extended Operations, war mal das reservierte Flag für AMDs SSE5 (bis ca.2009)  
  ;XSAVE                00000001h         ECX      26       x       x
  ;XSAVEOPT             0000000Dh         EAX       0       x       x    Input ECX=1

  ;Kein Test, ob CPUID zur Verfügung steht! Dies ist kein Programm für Museums-Stücke!  
  !xor eax,eax
  !cpuid
  !mov [v_MaxID],eax         ;max. ID
  !cmp ecx,6C65746Eh         ;"letn", Part of Intel-String
  !jne @f
  !mov [v_IsIntel],1
  !jmp CPUEnd
!@@:
  !cmp ecx,444D4163h         ;"DMAc", Part of AMD-String
  !jne CPUEnd
  !mov [v_IsAMD],1
!CPUEnd:

  If IsIntel = 0 And IsAMD = 0
    MessageRequester("Abbruch!", "Die CPU scheint weder von Intel noch von AMD zu sein. Programm wird beendet.") 
    End
  EndIf

    !mov eax,80000000h       ;max. Extended Level ermitteln
    !cpuid
    !mov [v_MaxIDExt],eax    ;max. ExtID

    !mov eax,1h              ;für 1 kein Test auf MaxID         
    !cpuid
    !mov [v_SichECX],ecx
    !mov [v_SichEDX],edx

    !and edx,[v_Bit6]        ;PAE
    !jz NOPAE
    CPU_Info(#PAE)\Color = $008800
    !mov eax,80000001h
    !cpuid
    !and edx,[v_Bit29]
    !jz NOPAE                ;keine weiteren Infos
    !cmp [v_MaxIDExt],80000008h   ;Test, ob CPU weitere Infos liefert, zur Sicherheit
    !jb NOPAE                ;keine weiteren Infos
    !mov eax,80000008h
    !cpuid
    !and eax,11111111b       ;Bits 07-00: #Physical Address Bits
    !mov [v_PAEBits],eax
    PAE = Int(Pow(2, PAEBits))
    PAE >> 30
    Einheit$ = " G"
    If PAE > 1024
      PAE >> 10
      Einheit$ = " T"
    EndIf 
    PAE$ = "Max. " + Str(PAE) + Einheit$ + "Byte"
    CPU_Info(#PAE)\Info = "Physical Address Extensions" + #CR$ + "Intel and AMD" + #CR$ + PAE$
!NOPAE:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit23]      ;MMX
    !jz NOMMX
    CPU_Info(#MMX)\Color = $008800     ;Grün für vorhanden
!NOMMX:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit25]      ;SSE  
    !jz NOSSE
    CPU_Info(#SSE)\Color = $008800
!NOSSE:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit26]      ;SSE2  
    !jz NOSSE2
    CPU_Info(#SSE2)\Color = $008800
!NOSSE2:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit0]       ;SSE3
    !jz NOSSE3
    CPU_Info(#SSE3)\Color = $008800
!NOSSE3:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit9]       ;SSSE3
    !jz NOSSSE3
    CPU_Info(#SSSE3)\Color = $008800
!NOSSSE3:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit19]      ;SSE4.1
    !jz NOSSE41
    CPU_Info(#SSE41)\Color = $008800
!NOSSE41:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit20]      ;SSE4.2
    !jz NOSSE42
    CPU_Info(#SSE42)\Color = $008800
!NOSSE42:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit23]      ;POPCNT
    !jz NOPOPCNT
    CPU_Info(#POPCNT)\Color = $008800
!NOPOPCNT:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit1]       ;PCLMULQDQ
    !jz NOPCLMULQDQ
    CPU_Info(#PCLMULQDQ)\Color = $008800
!NOPCLMULQDQ:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit3]       ;MONITOR
    !jz NOMONITOR
    CPU_Info(#MONITOR)\Color = $008800
!NOMONITOR:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit5]       ;VMX
    !jz NOVMX
    CPU_Info(#VMX)\Color = $008800
!NOVMX:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit6]       ;SMX
    !jz NOSMX
    CPU_Info(#SMX)\Color = $008800
!NOSMX:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit12]      ;FMA
    !jz NOFMA
    CPU_Info(#FMA)\Color = $008800
!NOFMA:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit11]      ;SEP
    !jz NOSEP
    CPU_Info(#SEP)\Color = $008800
!NOSEP:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit24]      ;FXSR
    !jz NOFXSR
    CPU_Info(#FXSR)\Color = $008800
!NOFXSR:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit8]       ;CMPXCHG8B
    !jz NOCX8
    CPU_Info(#CX8)\Color = $008800
!NOCX8:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit13]      ;CMPXCHG16B
    !jz NOCX16
    CPU_Info(#CX16)\Color = $008800
!NOCX16:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit25]      ;AES
    !jz NOAES
    CPU_Info(#AES)\Color = $008800
!NOAES:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit26]      ;XSAVE
    !jz NOXSAVE
    CPU_Info(#XSAVE)\Color = $008800
!NOXSAVE:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit27]      ;OSXSAVE
    !jz NOOSXSAVE
    CPU_Info(#OSXSAVE)\Color = $008800
!NOOSXSAVE:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit28]      ;AVX
    !jz NOAVX
    CPU_Info(#AVX)\Color = $008800
!NOAVX:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit29]      ;F16C
    !jz NOF16C
    CPU_Info(#F16C)\Color = $008800
!NOF16C:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit22]      ;MOVBE
    !jz NOMOVBE
    CPU_Info(#MOVBE)\Color = $008800
!NOMOVBE:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit15]      ;(F)CMOVcc
    !jz NOCMOV
    CPU_Info(#CMOV)\Color = $008800
!NOCMOV:       
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit19]      ;CLFSH
    !jz NOCLFSH
    CPU_Info(#CLFSH)\Color = $008800
!NOCLFSH:       
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit5]       ;MSR
    !jz NOMSR
    CPU_Info(#MSR)\Color = $008800
!NOMSR:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit30]      ;RDRAND
    !jz NORDRAND
    CPU_Info(#RDRAND)\Color = $008800
!NORDRAND:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit4]       ;RDTSC
    !jz NORDTSC
    CPU_Info(#RDTSC)\Color = $008800
!NORDTSC:
    !mov eax,0Dh
    !cmp [v_MaxID],eax       ;max. ID
    !jb NOXSAVEOPT
    !mov ecx,1
    !cpuid
    !test eax,[v_Bit0]       ;XSAVEOPT
    !jz NOXSAVEOPT
    CPU_Info(#XSAVEOPT)\Color = $008800
!NOXSAVEOPT:
    !mov eax,7
    !cmp [v_MaxID],eax       ;max. ID
    !jb NORTM
    !xor ecx,ecx
    !cpuid
    !mov [v_SichEBX],ebx
    !test ebx,[v_Bit19]      ;ADX
    !jz NOADX
    CPU_Info(#ADX)\Color = $008800
!NOADX:
    !mov ebx,[v_SichEBX]
    !test ebx,[v_Bit5]       ;AVX2
    !jz NOAVX2
    CPU_Info(#AVX2)\Color = $008800
!NOAVX2:    
    !mov ebx,[v_SichEBX]
    !test ebx,[v_Bit3]       ;BMI(1)
    !jz NOBMI1
    CPU_Info(#BMI1)\Color = $008800
!NOBMI1:
    !mov ebx,[v_SichEBX]
    !test ebx,[v_Bit8]       ;BMI2
    !jz NOBMI2
    CPU_Info(#BMI2)\Color = $008800
!NOBMI2:
    !mov ebx,[v_SichEBX]
    !test ebx,[v_Bit4]       ;HLE
    !jz NOHLE
    CPU_Info(#HLE)\Color = $008800
!NOHLE:
    !mov ebx,[v_SichEBX]
    !test ebx,[v_Bit10]      ;INVPCID
    !jz NOINVPCID
    CPU_Info(#INVPCID)\Color = $008800
!NOINVPCID:
    !mov ebx,[v_SichEBX]
    !test ebx,[v_Bit18]      ;RDSEED
    !jz NORDSEED
    CPU_Info(#RDSEED)\Color = $008800
!NORDSEED:
    !mov ebx,[v_SichEBX]
    !test ebx,[v_Bit11]      ;RTM
    !jz NORTM
    CPU_Info(#RTM)\Color = $008800
!NORTM:

    !cmp [v_MaxIDExt],80000001h
    !jb NOEXTE
 
    !cmp [v_MaxIDExt],80000004h   ;Test, ob CPU aktuell genug ist um den String zu liefern
    !jb NOCPUSTR

  ;Prozessor-String  
  ProzStrAdr = @ProzessorString$  
  While Z < 3
    !mov eax,80000002h
    !add eax,[v_Z]
    !cpuid        
    !mov [v_S1],eax
    !mov [v_S2],ebx  
    !mov [v_S3],ecx
    !mov [v_S4],edx
    PokeL(ProzStrAdr + (Z << 4), S1)
    PokeL(ProzStrAdr + (Z << 4) + 4, S2)
    PokeL(ProzStrAdr + (Z << 4) + 8, S3)
    PokeL(ProzStrAdr + (Z << 4) + 12, S4)
    Z + 1
  Wend

!NOCPUSTR:
    !mov eax,80000001h
    !cpuid
    !mov [v_SichECX],ecx
    !mov [v_SichEDX],edx

    !test edx,[v_Bit29]      ;AMD: Long Mode, Intel: Intel 64 Architecture
    !jz NOARCH64
    CPU_Info(#ARCH64)\Color = $008800
!NOARCH64:     
    ;Test auf Intel-Prozessor
    !cmp [v_IsIntel],1
    !je NOAMD                ;ist Intel-Prozessor
    ;ist AMD-Prozessor
    !test edx,[v_Bit31]      ;AMD 3DNow! 
    !jz NOEXT
    CPU_Info(#DNow)\Color = $008800
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit30]      ;AMD Extended 3DNow!  DSP: PF2IW, PFNACC, PFPNACC, PI2FW, PSWAPD
    !jz NOEXT
    CPU_Info(#EXT3DNOW)\Color = $008800
!NOEXT:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit8]       ;AMD 3DNOWPREFETCH
    !jz NODNOWPREF
    CPU_Info(#DNOWPREF)\Color = $008800
!NODNOWPREF:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit6]       ;AMD SSE4A   EXTRQ, INSERTQ, MOVNTSD, MOVNTSS
    !jz NOSSE4A
    CPU_Info(#SSE4A)\Color = $008800
!NOSSE4A:     
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit7]       ;AMDMISAL16 
    !jz NOAMDMISAL16
    CPU_Info(#AMDMISAL16)\Color = $008800
!NOAMDMISAL16:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit22]      ;EMMX
    !jz NOEMMX
    CPU_Info(#EMMX)\Color = $008800
!NOEMMX:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit16]      ;FMA4
    !jz NOFMA4
    CPU_Info(#FMA4)\Color = $008800
!NOFMA4:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit15]      ;LWP
    !jz NOLWP
    !xor ecx,ecx
    !xgetbv                  ;wer LWP kann, kann auch XGETBV ;-)
    !test edx,[v_Bit30]
    !jnz @f
    CPU_Info(#LWP)\Color = $FF0000     ;OS hat nicht freigeschaltet
    !jmp NOLWP
!@@:
    CPU_Info(#LWP)\Color = $008800     ;OS hat freigeschaltet
!NOLWP:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit2]       ;SVM
    !jz NOSVM
    CPU_Info(#SVM)\Color = $008800
!NOSVM:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit21]      ;TBM
    !jz NOTBM
    CPU_Info(#TBM)\Color = $008800
!NOTBM:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit11]      ;XOP
    !jz NOAMD
    CPU_Info(#XOP)\Color = $008800
!NOAMD:
    !mov ecx,[v_SichECX]
    !test ecx,[v_Bit5]       ;LZCNT
    !jz NOLZCNT
    CPU_Info(#LZCNT)\Color = $008800
!NOLZCNT:
    !mov edx,[v_SichEDX]
    !test edx,[v_Bit27]      ;RDTSCP
    !jz NOEXTE
    CPU_Info(#RDTSCP)\Color = $008800
!NOEXTE: 

  j = 0
  X = 10
  Y = 18                     ;1.Zeile
  For i = 0 To #PB_Compiler_EnumerationValue - 1
    TextGadget(i, X, Y, CPU_Info(j)\Pixel, 15, CPU_Info(j)\Feature)  
    SetGadgetColor(i, #PB_Gadget_FrontColor, CPU_Info(j)\Color) 
    SetGadgetFont(i, FontID(0))
    X + 7 + CPU_Info(j)\Pixel
    If X > 970 And Y = 18
      X = 10
      Y = 33                 ;2.Zeile
      FZ1 = i                ;Feature-Zähler Zeile 1
     ElseIf X > 970 And Y = 33
      X = 10
      Y = 48                 ;3.Zeile
      FZ2 = i                ;Feature-Zähler Zeile 1+2
    EndIf
    j + 1
  Next 
  FZ3 = i - 1                ;Feature-Zähler Zeile 1+2+3

  TextGadget(#PB_Compiler_EnumerationValue, 500, 2, 100, 15, "Red : CPU No")
  TextGadget(#PB_Compiler_EnumerationValue + 1, 620, 2, 150, 15, "Green : CPU Yes, OS Yes")
  TextGadget(#PB_Compiler_EnumerationValue + 2, 800, 2, 150, 15, "Blue : CPU Yes, OS No")    
  TextGadget(#PB_Compiler_EnumerationValue + 3, 10, 2, 400, 15, "Current CPU : " + LTrim(ProzessorString$))
  For i = #PB_Compiler_EnumerationValue To #PB_Compiler_EnumerationValue + 3
    SetGadgetFont(i, FontID(0))   
  Next    
  SetGadgetColor(#PB_Compiler_EnumerationValue, #PB_Gadget_FrontColor, $0000D0)
  SetGadgetColor(#PB_Compiler_EnumerationValue + 1, #PB_Gadget_FrontColor, $008800)
  SetGadgetColor(#PB_Compiler_EnumerationValue + 2, #PB_Gadget_FrontColor, $FF0000)
EndProcedure  

If OpenWindow(0, 0, 0, 1020, 95, "Helles CPU-Info, für mehr Infos Links-Klick auf das Feature", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  FontHigh = Int(9.0 / (GetDeviceCaps_(GetDC_(WindowID(0)), #LOGPIXELSY) / 96.0)) 
  LoadFont(0, "Trebuchet MS Fett", FontHigh)     ;Windows 7 hat es; testen!
  CPUID_Info()
  Repeat   
    Select WaitWindowEvent() 
      Case #WM_LBUTTONDOWN, #PB_Event_MoveWindow, #PB_Event_DeactivateWindow      
        If CPUInfo
          DestroyWindow_(CPUInfo)
          Title$ = ""
        EndIf
        If WindowMouseY(0) >= 21 And WindowMouseY(0) <= 30 And GetActiveWindow() = 0     ;1.Zeile   18 bis 33  oben und unten 3 Pixel weg
          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 1010
            X = WindowMouseX(0)
            XX = 10
            For i = 0 To FZ1
              XX + CPU_Info(i)\Pixel
              If X - 3 < XX
                Title$ = CPU_Info(i)\Feature
                Text$ = CPU_Info(i)\Info
                Break
              EndIf
              XX + 7              
            Next
          EndIf
         ElseIf WindowMouseY(0) >= 36 And WindowMouseY(0) <= 45 And GetActiveWindow() = 0     ;2.Zeile   33 bis 48  oben und unten 3 Pixel weg
          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 1010
            X = WindowMouseX(0)
            XX = 10
            For i = FZ1 + 1 To FZ2
              XX + CPU_Info(i)\Pixel
              If X - 3 < XX
                Title$ = CPU_Info(i)\Feature
                Text$ = CPU_Info(i)\Info
                Break
              EndIf
              XX + 7
            Next
          EndIf
         ElseIf WindowMouseY(0) >= 51 And WindowMouseY(0) <= 60 And GetActiveWindow() = 0     ;3.Zeile   48 bis 63  oben und unten 3 Pixel weg
          If WindowMouseX(0) >= 10 And WindowMouseX(0) <= 1010
            X = WindowMouseX(0)
            XX = 10
            For i = FZ2 + 1 To FZ3
              XX + CPU_Info(i)\Pixel
              If X - 3 < XX
                Title$ = CPU_Info(i)\Feature
                Text$ = CPU_Info(i)\Info
                Break
              EndIf
              XX + 7
            Next
          EndIf
        EndIf
        If Title$ <> ""
          CPUInfo(Title$, Text$)
        EndIf
      Case #PB_Event_CloseWindow 
        Break
    EndSelect
  ForEver
EndIf

Viel Spaß!
Helle

Edit 4.3.2015: PAE hinzugefügt + 64-Bit-Architektur vereinheitlicht
Edit 6.3.2015: Etwas Ordnung geschaffen, Erweiterungen vereinfacht
Zuletzt geändert von Helle am 06.03.2015 14:47, insgesamt 2-mal geändert.
Autonomus
Beiträge: 30
Registriert: 20.02.2015 18:21

Re: Was unterstützt mein Prozessor?

Beitrag von Autonomus »

Hey,

dieser Source Code ist richtig super! :allright:

Ich frage mich, wenn ich so eine Arbeit sehe, wie Du (@Helle) das gelernt hast?
Ich selber versuche mich auch schon mit dem Thema ASM, auseinander zu setzen, jedoch ohne Erfolg.
Habe mir mal das von Intel veröffentlichte "64-ia-32-architectures-software-developer-vol-2a-manual" angesehen und werde daraus nur teilwise schlau.

Naja, verwende deinen Source Code (sofern ok und mit Verweis auf den Author) teilweise in meinem Project Core File.

Viele Grüße
Autonomus


P.S
Wäre schön wenn Du noch PAE in deinen Source Code anzeigen könntest.
[Aktuelles Projekt: Core Project | Media Library (Core Project based)]
  • OS: Windows 7 Ultimate x64 | PB: PureBasic 5.40 x86/x64

    CPU: AMD Phenom(TM) II X4 965 BE (4x 3.4GHz @3.8GHz) | GPU: nVidia GeForce 8200 (512MB), nVidia GeForce GT 730 (4096MB)
    RAM: 8GB | HDD: 250GB Samsung, 1TB Samsung
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Was unterstützt mein Prozessor?

Beitrag von NicTheQuick »

Kann man den Windows-spezifischen Kram noch irgendwie entfernen, sodass das ganze auch crossplattform läuft? Oder gerne auch mit einem CompilerIf umschließen?
Bild
Antworten