;Addresses for bits
; edx cpuid(1)
FPU_FLAG equ 0001h    ;Floating-point unit on-Chip                                             
VME_FLAG equ 0002h    ;Virtual Mode Extension
DE_FLAG equ 0004h     ;Debugging Extension
PSE_FLAG equ 0008h    ;Page Size Extension
TSC_FLAG equ 0010h    ;Time-Stamp Counter
MSR_FLAG equ 0020h    ;Model Specific Registers
PAE_FLAG equ 0040h    ;Physical Address Extension
MCE_FLAG equ 0080h    ;Machine Check Exception
CX8_FLAG equ 0100h    ;CMPXCHG8 Instruction Supported
APIC_FLAG equ 0200h   ;On-chip APIC Hardware Supported
;10_FLAG equ 0400h   ;Reserved
SEP_FLAG equ 0800h	 ;Fast System Call
MTRR_FLAG equ 1000h	 ;Memory Type Range Registers
PGE_FLAG equ 2000h	 ;Page Global Enable
MCA_FLAG equ 4000h	 ;Machine Check Architecture
CMOV_FLAG equ 8000h	 ;Conditional Move Instruction Supported
PAT_FLAG equ 10000h	 ;Page Attribute Table
PSE36_FLAG equ 20000h	 ;36-bit Page Size Extension
PSNUM_FLAG equ 40000h	 ;Processor serial number present and enabled
CLFLUSH_FLAG equ 80000h  ;CLFLUSH Instruction supported
;20_FLAG equ 100000h  ;Reserved
DTS_FLAG equ 200000h	 ;Debug Store
ACPI_FLAG equ 400000h	 ;Thermal Monitor and Software Controlled Clock Facilities supported
MMX_FLAG equ 800000h	 ;Intel Architecture MMX technology supported
FXSR_FLAG equ 1000000h	 ;Fast floating point save and restore
SSE_FLAG equ 2000000h	 ;Streaming SIMD Extensions supported
SSE2_FLAG equ 4000000h	 ;Streaming SIMD Extensions 2
SS_FLAG equ 8000000h	 ;Self-Snoop
;HTT_FLAG equ 10000000h   ;Hyper-Threading Technology
TM_FLAG equ 20000000h	 ;Thermal Monitor supported
IA64_FLAG equ 40000000h  ; IA-64  
PBE_FLAG equ 80000000h	  ;Pending Break Enable

; ecx cpuid(1)
SSE3_FLAG equ 0001h	  ;SSE3 0
MON_FLAG equ 0008h	  ;MON -3
DS_CPL_FLAG equ 0010h	  ;DS-CPL -4
VMX_FLAG equ 0020h	  ;VMX -5    
SMX_FLAG equ 0040h	  ;SMX -6                  to  add
EST_FLAG equ 0080h	  ; EST-7
TM2_FLAG equ 0100h	  ; TM2-8
SSSE3_FLAG equ 0200h	  ;SSSE3 -9  
CNXT_ID_FLAG equ 0400h	  ;CID -10
CX16_FLAG equ 2000h	  ;CX16 - 13
ETPRD_FLAG equ 4000h	  ;xTPR - 14
PDCM_FLAG equ 8000h	  ;PDCM - 15                to  add
DCA_FLAG equ 40000h	  ;DCA - 18   Direct Cache Access
SSE41_FLAG equ 80000h	  ;SSE41 - 19               to  add
SSE42_FLAG equ 100000h	  ;SSE42 - 20               to  add
x2APIC_FLAG equ 200000h	  ;x2APIC - 21               to  add
PPCNT_FLAG equ 800000h	  ;PPCNT - 23              to  add

; edx cpuid(8000_0001h)
SYS_FLAG equ 0800h	;11       - may be we already detect it as SEP_FLAG
MP_FLAG equ 80000h	;19       ???? not found in recent guides from AMD and Intel
NX_FLAG equ 100000h	;20
MMXPi_FLAG equ 400000h	;22
MMXn_FLAG equ 800000h	;23
FXSRn_FLAG equ 1000000h ;24   it is ���+ for Cyrix
FFXSR_FLAG equ 2000000h ;25
PAGE_FLAG equ 4000000h  ;26 Page1Gb                to  add
TSCP_FLAG equ 8000000h	;27  
LM_FLAG equ 20000000h	;29  EM64T
DNo_FLAG equ 40000000h	;30   3dNow! Ext
DN_FLAG equ 80000000h	;31   3dNow!


; ecx cpuid(8000_0001h)
LAHF_FLAG equ 0001h  ; LAHF   0
CMPL_FLAG equ 0002h    ; core multi-processing legacy mode 1
SVM_FLAG equ 0004h     ; secure virtual machine 2
EAS_FLAG equ 0008h     ; ExtApicSpace  3         to  add
MOVCR8_FLAG equ 0010h  ; AltMovCr8  4
ABM_FLAG equ 0020h     ; ABM -5                  to  add
SSE4A_FLAG equ 0040h   ; SSE4A -6                to  add
MIS_FLAG equ 0080h     ; MissAlignSSE -7         to  add
3DNP_FLAG equ 0100h    ; 3DNowPrefetch-8         to  add
OSVW_FLAG equ 0200h    ; OS visible workaround -9    to  add
SSE5_FLAG equ 0800h     ;SSE5 - 11               to  add
SKINIT_FLAG equ 1000h  ;SKINIT- 12               to  add
WDT_FLAG equ 2000h     ;Watchdog timer - 13      to  add


;decoding standard features

decode_standard_features:

 xor eax,eax
 inc eax
 cpuid


Test0:
test edx, FPU_FLAG
jnz Test0e

mov dword  [FPU+6], $6F6E
jmp Test1

Test0e:
mov  dword [FPU+6], $736579

;;;;;;
Test1:
test edx, VME_FLAG
jnz Test1e

mov   dword [VME+ 7], $6F6E
jmp Test2

Test1e:
mov   dword [VME+ 7], $736579

;;;;;;
Test2:
test edx, DE_FLAG
jnz Test2e

mov   dword [DE+ 7], $6F6E
jmp Test3

Test2e:
mov   dword [DE+ 7], $736579
;;;;;;

Test3:
test edx, PSE_FLAG
jnz Test3e

mov   dword [PSE+ 8], $6F6E
jmp Test4

Test3e:
mov   dword [PSE+ 8], $736579

;;;;
Test4:
test edx, TSC_FLAG
jnz Test4e

mov   dword [TSC+ 6], $6F6E
jmp Test5

Test4e:
mov   dword [TSC+ 6], $736579

;;;;
Test5:
test edx, MSR_FLAG
jnz Test5e

mov   dword [MSR+ 7], $6F6E
jmp Test6

Test5e:
mov   dword [MSR+ 7], $736579

;;;;
Test6:
test edx, PAE_FLAG
jnz Test6e

mov   dword [PAE+ 7], $6F6E
jmp Test7

Test6e:
mov   dword [PAE+ 7], $736579

;;;;
Test7:
test edx, MCE_FLAG
jnz Test7e

mov   dword [MCE+ 8], $6F6E
jmp Test8

Test7e:
mov   dword [MCE+ 8], $736579

;;;;
Test8:
test edx, CX8_FLAG
jnz Test8e

mov   dword [CX8+ 6], $6F6E
jmp Test9

Test8e:
mov   dword [CX8+ 6], $736579
;;;;

Test9:
test edx, APIC_FLAG
jnz Test9e

mov   dword [APIC+ 7], $6F6E
jmp Test11

Test9e:
mov   dword [APIC+ 7], $736579
;;;;;

Test11:
test edx, SEP_FLAG
jnz Test11e

mov   dword [SEP+ 8], $6F6E
jmp Test12

Test11e:
mov   dword [SEP+ 8], $736579
;;;;

Test12:
test edx, MTRR_FLAG
jnz Test12e

mov   dword [MTRR+ 6], $6F6E
jmp Test13

Test12e:
mov   dword [MTRR+ 6], $736579
;;;;

Test13:
test edx, PGE_FLAG
jnz Test13e

mov   dword [PGE+ 7], $6F6E
jmp Test14

Test13e:
mov   dword [PGE+ 7], $736579
;;;;;

Test14:
test edx, MCA_FLAG
jnz Test14e

mov   dword [MCA+ 7], $6F6E
jmp Test15

Test14e:
mov   dword [MCA+ 7], $736579
;;;;

Test15:
test edx, CMOV_FLAG
jnz Test15e

mov   dword [CMOV+ 8], $6F6E
jmp Test16

Test15e:
mov   dword [CMOV+ 8], $736579
;;;;

Test16:
test edx, PAT_FLAG
jnz Test16e

mov   dword [PAT+ 6], $6F6E
jmp Test17

Test16e:
mov   dword [PAT+ 6], $736579
;;;;

Test17:
test edx, PSE36_FLAG
jnz Test17e

mov   dword [PSE36+ 7], $6F6E
jmp Test18

Test17e:
mov   dword [PSE36+ 7], $736579
;;;;

Test18:
test edx, PSNUM_FLAG
jnz Test18e

mov   dword [PSNUM+ 7], $6F6E
jmp Test19

Test18e:
mov   dword [PSNUM+ 7], $736579
;;;;

Test19:
test edx, CLFLUSH_FLAG
jnz Test19e

mov   dword [CLFLUSHn + 8], $6F6E
jmp Test21

Test19e:
mov   dword [CLFLUSHn + 8], $736579
;;;;

Test21:
test edx, DTS_FLAG
jnz Test21e

mov   dword [DTS+ 7], $6F6E
jmp Test22

Test21e:
mov   dword [DTS+ 7], $736579
;;;;

Test22:
test edx, ACPI_FLAG
jnz Test22e

mov   dword [ACPI+ 7], $6F6E
jmp Test23

Test22e:
mov   dword [ACPI+ 7], $736579
;;;;;

Test23:
test edx, MMX_FLAG
jnz Test23e

mov   dword [MMX+ 8], $6F6E
mov   dword [MMXs+ 7], $6F6E
jmp Test24

Test23e:
mov   dword [MMX+ 8], $736579
mov   dword [MMXs+ 7], $736579
;;;;;

Test24:
test edx, FXSR_FLAG
jnz Test24e

mov   dword [FXSR+ 6], $6F6E
jmp Test25

Test24e:
mov   dword [FXSR+ 6], $736579
;;;;;

Test25:
test edx, SSE_FLAG
jnz Test25e

mov   dword [SSE+ 7], $6F6E
jmp Test26

Test25e:
mov   dword [SSE+ 7], $736579

;;;;
Test26:
test edx, SSE2_FLAG
jnz Test26e

mov   dword [SSE2+ 7], $6F6E
jmp Test27

Test26e:
mov   dword [SSE2+ 7], $736579

;;;;

Test27:
test edx, SS_FLAG
jnz Test27e

mov   dword [SSn+ 8], $6F6E
jmp Test29;28

Test27e:
mov   dword [SSn+ 8], $736579

;;;;

;Test28:
;test edx, HTT_FLAG
;jnz Test28e
;
;mov   dword [HTT+ 8], $6F6E
;jmp Test29
;
;Test28e:
;mov   dword [HTT+ 8], $736579

;;;;

Test29:
test edx, TM_FLAG
jnz Test29e

mov   dword [TM+ 7], $6F6E
jmp Test30

Test29e:
mov   dword [TM+ 7], $736579

;;;;

Test30:
test edx, IA64_FLAG
jnz Test30e

mov   dword [IA64+ 7], $6F6E
jmp Test31

Test30e:
mov   dword [IA64+ 7], $736579

;;;;
Test31:
test edx, PBE_FLAG
jnz Test31e

mov   dword [PBE+ 8], $6F6E
jmp Standart_out

Test31e:
mov   dword [PBE+ 8], $736579

Standart_out:

ret
;//////////////////////////////////////////////
decode_sse3_5:   ; is SS3-5 supported
      xor eax,eax
      inc eax
      cpuid
  test	ecx, $1 ; Test bit 1
  jnz	.EX; SSE3 technology is  supported
  jz .EXN

.EX:
   mov dword  [sse3+ 6],  $736579
   mov [sse3sup], 1
   jmp exitter
.EXN:
    mov dword [sse3+ 6], $6F6E
    mov [sse3sup],0

exitter:


  test	ecx, $80000 ; Test bit 19
  jnz	.EX1; SSE41 technology is  supported
  jz .EXN1

.EX1:
   mov dword  [SSE41+ 11],  $736579
   mov [sse41sup], 1
   jmp exitter1
.EXN1:
    mov dword [SSE41+ 11], $6F6E
    mov [sse41sup],0

exitter1:


  test	ecx, $100000 ; Test bit 20
  jnz	.EX2; SSE42 technology is  supported
  jz .EXN2

.EX2:
   mov dword  [SSE42+ 10],  $736579
   mov dword  [SS42+ 11],  $736579
   mov [sse42sup], 1
   jmp exitter2
.EXN2:
   mov dword [SSE42+ 10], $6F6E
   mov dword [SS42+ 11], $6F6E
   mov [sse42sup],0

exitter2:


      xor eax,eax
      mov eax, 80000001h
      cpuid
  test	ecx, $800 ; Test bit 11
  jnz	.EX3; SS5 technology is  supported
  jz .EXN3

.EX3:
   mov dword  [SSE5+ 12],  $736579
   mov [sse5sup], 1
   jmp exitter3
.EXN3:
    mov dword [SSE5+ 12], $6F6E
    mov [sse5sup],0

exitter3: 

ret


decode_extended_features:
      xor eax,eax
      inc eax
      cpuid
Tes1:
test ecx, SSE3_FLAG
jnz Tes1e

mov   dword [SS3+ 8], $6F6E
jmp Tes2

Tes1e:
mov   dword [SS3+ 8], $736579


Tes2:
test ecx, MON_FLAG
jnz Tes2e

mov   dword [MON+ 8], $6F6E
jmp Tes3

Tes2e:
mov   dword [MON+ 8], $736579


Tes3:
test ecx, DS_CPL_FLAG
jnz Tes3e

mov   dword [DS_CPL+ 8], $6F6E
jmp Tes4

Tes3e:
mov   dword [DS_CPL+ 8], $736579

Tes4:
test ecx, EST_FLAG
jnz Tes4e

mov   dword [EST+ 8], $6F6E
jmp Tes5

Tes4e:
mov   dword [EST+ 8], $736579


Tes5:
test ecx, TM2_FLAG
jnz Tes5e

mov   dword [TM2+ 8], $6F6E
jmp Tes6

Tes5e:
mov   dword [TM2+ 8], $736579


Tes6:
test ecx, CNXT_ID_FLAG
jnz Tes6e

mov   dword [CNXT_ID+ 12], $6F6E
jmp Tes7

Tes6e:
mov   dword [CNXT_ID+ 12], $736579


Tes7:
test ecx, CX16_FLAG
jnz Tes7e

mov   dword [CX16+ 12], $6F6E
jmp Tes8

Tes7e:
mov   dword [CX16+ 12], $736579


Tes8:
test ecx, ETPRD_FLAG
jnz Tes8e

mov   dword [ETPRD+ 12], $6F6E
jmp Tes9

Tes8e:
mov   dword [ETPRD+ 12], $736579

Tes9:
test ecx, VMX_FLAG
jnz Tes9e

mov   dword [VMX+ 8], $6F6E
jmp Tes10

Tes9e:
mov   dword [VMX+ 8], $736579

Tes10:
test ecx, SSSE3_FLAG
jnz Tes10e

mov   dword [SSSE3+ 12], $6F6E
jmp Tes11

Tes10e:
mov   dword [SSSE3+ 12], $736579

Tes11:
test ecx, DCA_FLAG
jnz Tes11e

mov   dword [DCA+ 8], $6F6E
jmp Tes12

Tes11e:
mov   dword [DCA+ 8], $736579

Tes12:
test ecx, SMX_FLAG
jnz Tes12e

mov   dword [SMX+ 8], $6F6E
jmp Tes13

Tes12e:
mov   dword [SMX+ 8], $736579

Tes13:
test ecx, PDCM_FLAG
jnz Tes13e

mov   dword [newLabel+ 8], $6F6E
jmp Tes14

Tes13e:
mov   dword [newLabel+ 8], $736579

Tes14:
test ecx, x2APIC_FLAG
jnz Tes14e

mov   dword [x2APIC+ 8], $6F6E
jmp Tes15

Tes14e:
mov   dword [x2APIC+ 8], $736579

Tes15:
test ecx, PPCNT_FLAG
jnz Tes15e

mov   dword [PPCNT+ 12], $6F6E
jmp Tes16

Tes15e:
mov   dword [PPCNT+ 12], $736579

Tes16:

ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
decode_extended:
    xor   eax, eax
    mov   eax,$80000000
    cpuid

test eax, 80000000h
jnz gooodd

jmp baaad

baaad:

jmp Tez13

gooodd:
  xor eax, eax
  mov	eax, $80000001 ;// Setup extended function 8000_0001h
  cpuid

Tez1:
test edx, MP_FLAG
jnz Tez1e

mov   dword [MP+8], $6F6E
jmp Tez2

Tez1e:
mov   dword [MP+ 8], $736579

Tez2:
test edx, NX_FLAG
jnz Tez2e

mov   dword [NX+ 8], $6F6E
jmp Tez4
;jmp Tez3 we do detection in another place, because of Cyrix specific MMX+ detection 

Tez2e:
mov   dword [NX+ 8], $736579

;Tez3:
;test edx, MMXPi_FLAG
;jnz Tez3e

;mov   dword [MMXPi+ 8], $6F6E
;jmp Tez4


;Tez3e:
;mov   dword [MMXPi+ 8], $736579

Tez4:
test edx, MMXn_FLAG
jnz Tez4e

mov   dword [MMXn+ 8], $6F6E
jmp Tez5

Tez4e:
mov   dword [MMXn+ 8], $736579

Tez5:
test edx, FXSRn_FLAG
jnz Tez5e

mov   dword [FXSRn+ 8], $6F6E
jmp Tez6

Tez5e:
mov   dword [FXSRn+ 8], $736579

Tez6:
test edx, FFXSR_FLAG
jnz Tez6e

mov   dword [FFXSR+ 12], $6F6E
jmp Tez7

Tez6e:
mov   dword [FFXSR+ 12], $736579

Tez7:
test edx, TSCP_FLAG
jnz Tez7e

mov   dword [TSCP+ 12], $6F6E
jmp Tez8

Tez7e:
mov   dword [TSCP+ 12], $736579


Tez8:
test edx, LM_FLAG
jnz Tez8e

mov   dword [LM+ 12], $6F6E
jmp Tez9

Tez8e:
mov   dword [LM+ 12], $736579

Tez9:
test edx, DNo_FLAG
jnz Tez9e

mov   dword [DNo+ 12], $6F6E
jmp Tez10

Tez9e:
mov   dword [DNo+ 12], $736579


Tez10:
test edx, DN_FLAG
jnz Tez10e

mov   dword [DN+ 12], $6F6E
jmp Tez11

Tez10e:
mov   dword [DN+ 12], $736579

;Intel

Tez11:
test edx, SYS_FLAG
jnz Tez11e

mov   dword [SYS+ 12], $6F6E
jmp Tez12

Tez11e:
mov   dword [SYS+ 12], $736579


Tez12:
test ecx, LAHF_FLAG
jnz Tez12e

mov   dword [LAF+ 12], $6F6E
jmp Tez13

Tez12e:
mov   dword [LAF+ 12], $736579

Tez13:
test ecx, CMPL_FLAG
jnz Tez13e

mov   dword [CMPL+ 8], $6F6E
jmp Tez14

Tez13e:
mov   dword [CMPL+ 8], $736579

Tez14:
test ecx, SVM_FLAG
jnz Tez14e

mov   dword [SVM+ 8], $6F6E
jmp Tez15

Tez14e:
mov   dword [SVM+ 8], $736579

Tez15:
test ecx, MOVCR8_FLAG
jnz Tez15e

mov   dword [MCR8+ 12], $6F6E
jmp Tez16

Tez15e:
mov   dword [MCR8+ 12], $736579

Tez16:
test edx, PAGE_FLAG
jnz Tez16e

mov   dword [PAGE+ 8], $6F6E
jmp Tez17

Tez16e:
mov   dword [PAGE+ 8], $736579

Tez17:
test ecx, EAS_FLAG
jnz Tez17e

mov   dword [EAS+ 12], $6F6E
jmp Tez18

Tez17e:
mov   dword [EAS+ 12], $736579

Tez18:
test ecx, ABM_FLAG
jnz Tez18e

mov   dword [ABM+ 8], $6F6E
jmp Tez19

Tez18e:
mov   dword [ABM+ 8], $736579

Tez19:
test ecx, SSE4A_FLAG
jnz Tez19e

mov   dword [SSE4A+ 8], $6F6E
jmp Tez20

Tez19e:
mov   dword [SSE4A+ 8], $736579

Tez20:
test ecx, MIS_FLAG
jnz Tez20e

mov   dword [MIS+ 8], $6F6E
jmp Tez21

Tez20e:
mov   dword [MIS+ 8], $736579

Tez21:
test ecx, 3DNP_FLAG
jnz Tez21e

;mov   dword [DNP+ 8], $6F6E
;jmp Tez22

Tez21e:
;mov   dword [DNP+ 8], $736579

Tez22:
test ecx, OSVW_FLAG
jnz Tez22e

mov   dword [OSVW+ 8], $6F6E
jmp Tez23

Tez22e:
mov   dword [OSVW+ 8], $736579

Tez23:
test ecx, SKINIT_FLAG
jnz Tez23e

mov   dword [SKINIT_+ 12], $6F6E
jmp Tez24

Tez23e:
mov   dword [SKINIT_+ 12], $736579

Tez24:
test ecx, WDT_FLAG
jnz Tez24e

mov   dword [WDT+ 12], $6F6E
jmp Tez25

Tez24e:
mov   dword [WDT+ 12], $736579

Tez25:

ret

;//////////////////////////////////////////////
decode_sse3:   ; is SS3 supported
        xor     eax, eax
        inc     eax
        cpuid
        test    ecx, 1
        setnz   [sse3sup]
        mov     eax, sse3+6

write_yes_no:
        mov     dword [eax], 'no'
        jz      @f
        mov     dword [eax], 'yes'
@@:
        ret

show_next_bit:
        shr     edx, 1
write_yes_no_cf:
        mov     dword [eax], 'no'
        jnc     @f
        mov     dword [eax], 'yes'
@@:
        ret