!	getprocessor() - determine processor type	Author: Kees J. Bot
!								26 Jan 1994

.sect .text; .sect .rom; .sect .data; .sect .bss
.sect .text

! int getprocessor(void);
!	Return 386, 486, 586, ...

.define	_getprocessor

_getprocessor:
	push	ebp
	mov	ebp, esp
	and	esp, 0xFFFFFFFC	! Align stack to avoid AC fault
	mov	ecx, 0x00040000	! Try to flip the AC bit introduced on the 486
	call	flip
	mov	eax, 386	! 386 if it didn't react to "flipping"
	jz	gotprocessor
	mov	ecx, 0x00200000	! Try to flip the ID bit introduced on the 586
	call	flip
	mov	eax, 486	! 486 if it didn't react
	jz	gotprocessor
	pushf
	pusha			! Save the world
	mov	eax, 1
	.data1	0x0F, 0xA2	! CPUID instruction tells the processor type
	andb	ah, 0x0F	! Extract the family (5, 6, ...)
	movzxb	eax, ah
	cmp	eax, 15		! 15: extended family
	jne	direct
	mov	eax, 6		! Make it 686
direct:
	imul	eax, 100	! 500, 600, ...
	add	eax, 86		! 586, 686, ...
	mov	7*4(esp), eax	! Pass eax through
	popa
	popf
gotprocessor:
	leave
	ret

flip:
	pushf			! Push eflags
	pop	eax		! eax = eflags
	mov	edx, eax	! Save original eflags
	xor	eax, ecx	! Flip the bit to test
	push	eax		! Push modified eflags value
	popf			! Load modified eflags register
	pushf
	pop	eax		! Get it again
	push	edx
	popf			! Restore original eflags register
	xor	eax, edx	! See if the bit changed
	test	eax, ecx
	ret
