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


syntax highlighted by Code2HTML, v. 0.9.1