blob: da6f102d2ef020c80c17bf86cf33816456535f2e (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
; Note: this must be a macro, and not a subroutine in the BIOS since
; it is called from both CODE and SYSINITSEG.
;
;------GET_CPU_TYPE------------------------------------------------------------May, 88 by MW
; Returns: AX = 0 if 8086 or 8088
; = 1 if 80286
; = 2 if 80386
;
Get_CPU_Type macro
pushf
push bx ; preserve bx
xor bx, bx ; init bx to zero
xor ax,ax ; 0000 into AX
push ax ; put it on the stack...
popf ; ...then shove it into the flags
pushf ; get it back out of the flags...
pop ax ; ...and into ax
and ax,0F000h ; mask off high four bits
cmp ax,0F000h ; was it all 1's?
je cpu_8086 ; aye; it's an 8086 or 8088
mov ax,0F000h ; now try to set the high four bits..
push ax
popf
pushf
pop ax ; ...and see what happens
and ax,0F000h ; any high bits set ?
jz cpu_286 ; nay; it's an 80286
cpu_386: ; bx starts as zero
inc bx ; inc twice if 386
cpu_286: ; just inc once if 286
inc bx
cpu_8086: ; don't inc at all if 086
mov ax, bx ; put CPU type value in ax
pop bx ; restore original bx
popf
endm
|