; ; GRDB ; ; Copyright(c) LADsoft ; ; David Lindauer, gclind01@starbase.spd.louisville.edu ; ; ; cpuid.asm ; ; Function: Generic CPU identification ; .model small .586 public checkcpu, cpumodel, cpufeatures .data cpufeatures dd 0 cpumodel db 0 .code checkcpu PROC ; ; 8086 has bits 12-15 of flags stuck on ; pushf pop bx mov ax,0fffh and ax,bx push ax popf pushf pop ax and ax,0f000h cmp ax,0f000h jz failed ; ; 80286 has bits 12-15 of flags stuck off ; mov [cpumodel],2 mov ax,0f000h or ax,bx push ax popf pushf pop ax and ax,0f000h jz failed ; ; Now we have a 386 or better. On a 386 the AC bit (bit 18) ; may not be toggled ; mov [cpumodel],3 pushfd pop eax mov ebx,eax btc eax,18 push eax popfd pushfd pop eax xor eax,ebx bt eax,18 jnc gotid ; ; Now see if a is a pentium or better. CPUID flag (bit 21) may not ; be toggled on a 486 mov [cpumodel],4 mov eax,ebx btc eax,21 push eax popfd pushfd pop eax xor eax,ebx bt eax,21 jnc gotid ; ; It is a pentium or better ; ; so issue a CPUID instruction (level 1) to get the model # and features dword ; push ebx mov eax,1 cpuid mov [cpufeatures],edx and ah,15 mov [cpumodel],ah pop ebx gotid: push ebx popfd clc ret failed: push bx popf stc ret checkcpu ENDP END