windows-nt/Source/XPSP1/NT/base/mvdm/dos/v86/inc/chkcpu.inc
2020-09-26 16:20:57 +08:00

70 lines
1.5 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

chkcpu macro
jmp begn
msg db 13,10,"This copy of MS-DOS will run only on an 8086",13,10
db "or 8088 CPU based computer. This computer is not ",13,10
db "based on an 8086 or 8088 CPU. ",13,10
db 13,10,"Insert a copy of the appropriate MS-DOS system disk ",13,10
db "and press any key to re-boot.",13,10,0
begn:
;------GET_CPU_TYPE------------------------------------------------------------May, 88 by M.Williamson
; Returns: AX = 0 if 8086 or 8088
; = 1 if 80286
; = 2 if 80386
;
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 scpu_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 scpu_286 ; nay; it's an 80286
scpu_386: ; bx starts as zero
inc bx ; inc twice if 386
scpu_286: ; just inc once if 286
inc bx
scpu_8086: ; don't inc at all if 086
mov ax, bx ; put CPU type value in ax
pop bx ; restore original bx
popf
cmp ax, 0000
je cpu_ok
push cs
pop ds
mov si, offset msg
prnt: lodsb
or al, al
jz prnt_done
mov ah, 14
mov bx, 7
int 10h
jmp prnt
prnt_done:
xor ah, ah
int 16h
int 19h
cpu_ok:
endm