home *** CD-ROM | disk | FTP | other *** search
- page 55, 132
-
- ; FUNCTION: cpu_check
- ;
- ; Attempt to discover the type of CPU. Use MASM 5.1 or greater.
- ; Returns 86 for 8088/8086, 286 for 80286, 386 for 80386/80486.
- ;
- ; Requires MASM 5.1 or later or equivalent
- ;
- ; Assemble with: MASM /Mx /z ...
- ; TASM /jMASM /mx /z ...
- ;
-
- % .MODEL memodel,C ;Add model support via
- ;command line macros, e.g.
- ;MASM /Dmemodel=LARGE
-
- .CODE
- ;
- ; int cpu_check(void) - returns 86, 186, 286, 386
- ;
-
- PUBLIC cpu_check
-
- cpu_check PROC USES BX
- pushf
- xor ax,ax ; zero ax
- push ax
- popf ; try to put 0 into flags
- pushf
- pop ax ; see what went in flags
- and ax,0f000h ; mask off high flag bits
- cmp ax,0f000h ; was high nibble ones
- je _86 ; is 8086 or 8088
- push sp ; see if sp is updated
- pop bx ; before or after it is
- cmp bx,sp ; pushed
- jne _186
- mov ax,0f000h ; try to set high bits
- push ax
- popf ; in the flags
- pushf
- pop ax ; look at actual flags
- and ax,0f000h ; any high bits set?
- je _286 ; is 80286
- _386:
- .386 ; enable 386 instructions
-
- pushfd ; save extended flags
- mov eax,040000h
- push eax ; push 40000h onto stack
- popfd ; pop extended flags
- pushfd ; push extended flags
- pop eax ; put in eax
- and eax,040000h ; is bit 18 set?
- jne _486 ; yes, it's a 486
- mov ax,386 ; no, it's a 386
- jmp _386x
- _486:
- mov ax,486
- _386x:
- popfd ; clean the stack
- jmp ccexit
- _286:
- mov ax,286 ; is an 80286
- jmp ccexit
- _186:
- mov ax,186 ; is an 80188/80186
- jmp ccexit
- _86:
- mov ax,86 ; is an 8088/8086
- ccexit:
- popf ; restore original flags
- ret ; return
-
- cpu_check ENDP
-
- end
-