;
;	Microsoft Confidential
;	Copyright (C) Microsoft Corporation 1991
;	All Rights Reserved.
;

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

	 

