Contributor: SWAG SUPPORT TEAM { Here is the code I use, adapted from the Intel Pentium Processor User's Manual, Chapter 5. It sets the Test8086 global variable, making the values of Test8086: 0 = 8086 1 = 80186/80286 2 =わ 80386 3 =わ 80386 (new) 4 = 80486 (new) 5 = Pentium (new) 6 = ?? Note that for Pentium and higher CPUs, the new CPUID instruction is used to retrieve the processor family number. This code should work on post-Pentium (80686-class) CPUs and Pentium compatibles, and could return numbers> 5. } program CPUTest; {$IFDEF WINDOWS} uses wincrt; {$ELSE} uses crt; {$ENDIF} begin if (Test8086 = 2) then { RTL check stops at 2 = 386} asm inc Test8086 { 3 = 386, for consistency } { Do we have a 386 or a 486? } { Does pushf/popf preserve the Alignment Check bit? (386=no, 486=yes) } mov bx, sp { save current stack pointer } and sp, not 3 { align stack to avoid AC fault } db 66ドル; pushf db 66ドル; pop ax db 66ドル; mov cx, ax db 66,ドル 35ドル; dd 40000ドル { xor AC bit in EFLAGS } db 66ドル; push ax db 66ドル; popf db 66ドル; pushf db 66ドル; pop ax db 66ドル; xor ax, cx { Is AC bit toggled? } je @@1 { if not, we have a 386 } and sp, not 3 { align stack to avoid AC fault } db 66ドル; push cx db 66ドル; popf { restore original AC bit } mov sp, bx { restore original stack pointer } mov Test8086, 4 { we know we have at least a 486 } { Do we have a 486 or a Pentium? } { Does pushf/popf preserve the CPUID bit? (486=no, P5=yes) } db 66ドル; mov ax, cx { get original EFLAGS} db 66,ドル 35ドル; dd 200000ドル { XOR id bit in flags} db 66ドル; push ax db 66ドル; popf db 66ドル; pushf db 66ドル; pop ax db 66ドル; xor ax, cx { Is CPUID bit toggled? } je @@1 { if not, we have a 486 } db 66ドル; xor ax, ax db $f,$a2 { CPUID, AX = 0 (get CPUID caps) } db 66ドル; cmp ax, 1 jl @@1 { if < 1, then exit } db 66ドル; xor ax, ax db 66ドル; inc ax db $f,$a2 { CPUID, AX = 1 (get CPU info) } and ax, $f00 { mask out all but family id } shr ax, 8 mov Test8086, al { Pentium family = 5 } @@1: end; writeln('Test8086: ',Test8086); end.