; FPU austesten

; Nach Atari Dokumentation ist  die Belegung des _FPU Cookie‘s
; wie folgt:
; _FPU Cookie ist immer da!!
; Belegung im High Word
; 0 keine FPU
; 1 Atari Register FPU
; 2 LineF FPU
; 3 Atari Register FPU + LineF FPU
; 4 mit Sicherheit 68881 LineF FPU
; 5 Atari Register FPU + mit Sicherheit 68881 LineF FPU
; 6 mit Sicherheit 68882 LineF FPU
; 7 Atari Register FPU + mit Sicherheit 68882 LineF FPU
; 8 68040 internal LineF FPU
; 9 Atari Register FPU + 68040 internal LineF FPU
; Low-vord derzeit immer 0

; frame ist die adresse eines 60 Bytes großen Puffers
; in d0 findet sich hinterher ein Langwort, das der Cookie-
; Dokumentation entspricht

	moveq.l	#0, d0	; d0 Initialisieren
	movea.l	#frame, a0	; Adresse von 60 Byte Framebuffer
; Test Auf (Atari) FPU
	move.l	$8, a1	; Bus Error nach a1 retten
	move.l	#_noafpu, $8	; neuen Bus Error eintragen
	move.l	d0, $fffa46	; Atari FPU initialisieren
	addq.w	#1, do	; FPU eintragen
_noafpu:
	move.l	a1, $8	; alten Bus Error restaurieren
; Test auf ( Line F) FPU
	move.l	$2c, a1	; LineF Trap retten
	move.l	#_nolfpu, $2c	; bei LineF Trap gehts dahin
	fnop		; 68881/2 FNOP -> wenn keine da LineF Trap
	fsave	(a0)	; durch fnop immer idle state frame
	move.w	(a0), d1	; Version Bytes ($18=881,$38=882,$40=68040)
	cmp.b	#$18, d1	; 68881?
	bne.b	_no881
	addq.w	#4, d0	; ist 68881
	bra.b	_lfpuex	; und raus

_no881:
	cmp.b	#$38, d1	; 68882?
	bne.b	_no882
	addq.w	#6, d0	; ist 68882
	bra.b	_lfpuex	; und raus
_no882:
	cmp.b	#$40, d1	; 68040 internal fpu?
	bne.b	_no040
	addq.w	#8, d0	; ist 68040 internal fpu
	bra.b	_lfpuex	; und raus
_no040:		; keine bekannte LineF FPU Version ->
	addq.w	#2, d0	; also nur LineF FPU eintragen

_lfpuex:
_nolfpu:		; keine LineF FPU
	swap	d0	; Wert in High-Word bringen
	move.l	a1, $2c	; alten LineF restaurieren
	rts
	