Coherent4.2.10/tboot/cpu_type.s

	.globl	get_cpu_type_
get_cpu_type_:

/ Test for 80286/386 -- these CPUs execute PUSH SP by first storing SP on stack,
/ then decrementing it.  Earlier CPUs first decrement then store.

	push	sp		/ Only 286 pushes pre-push SP
	pop	ax		/ Get it back

	cmp	ax,sp		/ Check for same
	jne	NOT_286or386

/  Distinguish A 286 From 386
/
DIST_286or386:
/ The test for 286 vs. 386 is done by attempting to set flag bits in
/ the high-order nibble of the flag word.  If that's successful, it's a
/ 386/ otherwise it's a 286.


	pushf			/ Save flags for a moment

	mov	 ax,$0xF000	/ Try to set high bits in flag register

	push	 ax		/ Move into flag register
	popf

	pushf			/ Get flags back into AX
	pop	 ax

	popf			/ Restore original flags

	test	 ax,$0xF000	/ Any bits set?
	jz	 ITSA286	/ No, so it's a 286

	mov	 ax, $2		/ It's a 38x
	jmp	 get_cpu_exit / Join common exit code
ITSA286:
	mov	ax, $1		/ It's a 28x
	jmp	get_cpu_exit

NOT_286or386:	/ Return 0 for non-286 or 386
	mov	ax, $0

get_cpu_exit:
	ret