;	TopazTest
;	by Preben Nielsen
;	Assemble it as case-sensitive.
;	OPT O+
;	OPT O1+		;Tells when a branch could be optimised to short
;	OPT i+		;Tells when '#' is probably missing

TIMES		=2500

	incdir	"INCLUDE:"
	include "exec/execbase.i"
	include "exec/exec_lib.i"
	include "graphics/graphics_lib.i"
	include "intuition/intuition.i"
	include "intuition/intuition_lib.i"
	include "libraries/dos_lib.i"
	include "libraries/dosextens.i"

LoadBase	MACRO
		IFNC		'\1','ExecBase'
		movea.l		\1(PC),A6
		ENDC
		IFC		'\1','ExecBase'
		movea.l		4.W,A6
		ENDC
		ENDM
CallLib		MACRO
		jsr		_LVO\1(A6)
		ENDM
Call		MACRO
		bsr		\1
		ENDM
Push		MACRO
		movem.l		\1,-(SP)
		ENDM
Pop		MACRO
		movem.l		(SP)+,\1
		ENDM

		LoadBase	ExecBase
		suba.l		A1,A1
		CallLib		FindTask		;Find us
		movea.l		D0,A2
		tst.l		pr_CLI(A2)
		bne.S		CLIAndWBStartup
WBenchStartup	lea		pr_MsgPort(A2),A0
		CallLib		WaitPort		;Wait for a message
		lea		pr_MsgPort(A2),A0
		CallLib		GetMsg			;Get the message
		move.l		D0,WBenchMsg		;Save it for later reply
CLIAndWBStartup	lea		DosName(PC),A1
		CallLib		OldOpenLibrary
		move.l		D0,DosBase
		lea		GfxName(PC),A1
		CallLib		OldOpenLibrary
		move.l		D0,GfxBase
		lea		IntName(PC),A1
		CallLib		OldOpenLibrary
		move.l		D0,IntBase
		LoadBase	IntBase
		lea		NW(PC),A0
		CallLib		OpenWindow
		move.l		D0,PWindow
		movea.l		D0,A0
		move.l		wd_RPort(A0),Rp
		LoadBase	GfxBase
		lea		TopazAttr(PC),A0
		CallLib		OpenFont
		tst.l		D0
		beq.S		Exit
		movea.l		D0,A0
		movea.l		Rp,A1
		CallLib		SetFont			;Make sure to use topaz in the right size
		bra.S		Main

Exit		LoadBase	IntBase
FreeWindow	move.l		PWindow(PC),D0
		beq.S		FreeInt
		movea.l		D0,A0
		CallLib		CloseWindow		;Close window if it is open
FreeInt		LoadBase	ExecBase
		move.l		IntBase(PC),D0
		beq.S		FreeGfx
		movea.l		D0,A1
		CallLib		CloseLibrary		;Close intuition if it is open
FreeGfx		move.l		GfxBase(PC),D0
		beq.S		FreeDos
		movea.l		D0,A1
		CallLib		CloseLibrary		;Close graphics if it is open
FreeDos		move.l		DosBase(PC),D0
		beq.S		ReplyWB
		movea.l		D0,A1
		CallLib		CloseLibrary		;Close dos if it is open
ReplyWB		move.l		WBenchMsg(PC),D0
		beq.S		AllDone
		CallLib		Forbid
		movea.l		D0,A1
		CallLib		ReplyMsg		;Reply WBenchMessage if we are started from WB
AllDone		rts

Main		LoadBase	ExecBase
		CallLib		Forbid
		CallLib		Disable
		LoadBase	GfxBase
		moveq		#1,D0
		move.l		Rp(PC),A1
		CallLib		SetAPen
		move.w		#250,D0
		moveq		#30,D1
		moveq		#11,D2
		lea		WaitTxt(PC),A0
		Call		Txt
		Call		StartTimer
		move.l		#TIMES,D5
		moveq		#1,D6			;Color
		bra.S		ContLoop
Loop		not.b		D6
		move.w		D6,D0
		move.l		Rp(PC),A1
		CallLib		SetAPen
		moveq		#8,D0
		moveq		#19,D1
		move.l		Rp(PC),A1
		CallLib		Move
		moveq		#71,D0
		lea		TestTxt(PC),A0
		movea.l		Rp(PC),A1
		CallLib		Text
ContLoop	dbf		D5,Loop
		Call		EndTimer
		lea		TimeTxt+13(PC),A0
		Call		DecStr
		move.l		#TIMES,D0
		lea		TimeTxt+52(PC),A0
		Call		DecStr
		moveq		#1,D0
		move.l		Rp(PC),A1
		CallLib		SetAPen
		moveq		#62,D0
		moveq		#30,D1
		moveq		#58,D2
		lea		TimeTxt(PC),A0
		Call		Txt
		LoadBase	ExecBase
		CallLib		Enable
		CallLib		Permit

GetNextMsg	LoadBase	ExecBase
		movea.l		PWindow(PC),A0
		movea.l		wd_UserPort(A0),A0
		CallLib		WaitPort
		movea.l		PWindow(PC),A0
		movea.l		wd_UserPort(A0),A0
		CallLib		GetMsg
		tst.l		D0
		beq.S		GetNextMsg
		movea.l		D0,A1			;Message address to A1
		move.l		im_Class(A1),D2		;Save the event class in D2
		CallLib		ReplyMsg		;Reply the message
CheckWinClose	cmpi.w		#CLOSEWINDOW,D2
		beq		Exit			;Terminate ?
		bra.S		GetNextMsg

StartTimer	Push		D1-D7/A0-A6
		lea		Stamp(PC),A0
		Call		GetTime
		Pop		D1-D7/A0-A6
		rts

EndTimer	Push		D1-D7/A0-A6
		lea		Stamp2(PC),A0
		Call		GetTime
		LoadBase	ExecBase
		moveq		#0,D1
		move.b		PowerSupplyFrequency(A6),D1
		move.l		Minutes2(PC),D0
		sub.l		Minutes(PC),D0
		mulu		#60,D1
		mulu		D1,D0
		add.l		Ticks2(PC),D0
		sub.l		Ticks(PC),D0
		Pop		D1-D7/A0-A6
		rts

GetTime		LoadBase	DosBase
		move.l		A0,D1
		CallLib		DateStamp		;Get current time
		rts

DecStr		move.b		#'0',-1(A0)		;This has to be done If D0=0 
ConvertLoop	tst.l		D0			;A0=end of Txtbuffer
		beq.S		EndDecStr
		divu		#10,D0
		swap		D0
		addi.b		#'0',D0
		move.b		D0,-(A0)
		clr.w		D0
		swap		D0
		bra.S		ConvertLoop
EndDecStr	rts

Txt		LoadBase	GfxBase
		movea.l		Rp(PC),A1
		CallLib		Move
		move.w		D2,D0
		movea.l		Rp(PC),A1
		CallLib		Text
		rts

WaitTxt		dc.b	'Please Wait'
TestTxt		dc.b	'This is a test to see how fast the Text-routine can write with Topaz-80'
TimeTxt		dc.b	'It took       system ticks to write the string       times'
		EVEN

TopazAttr	dc.l	TopazName
		dc.w	8
		dc.b	0,0

WBenchMsg	dc.l	0
DosBase		dc.l	0
GfxBase		dc.l	0
IntBase		dc.l	0
PWindow		dc.l	0
Rp		dc.l	0

Stamp				;\
Days		dc.l	0	; \struct DateStamp Stamp;
Minutes		dc.l	0	; /
Ticks		dc.l	0	;/

Stamp2				;\
Days2		dc.l	0	; \struct DateStamp Stamp;
Minutes2	dc.l	0	; /
Ticks2		dc.l	0	;/



NW		dc.w	25,40,588,35
		dc.b	0,1
		dc.l	CLOSEWINDOW
		dc.l	WINDOWDEPTH+WINDOWDRAG+WINDOWCLOSE+ACTIVATE,0,0,NWName,0,0
		dc.w	150,50,320,200,WBENCHSCREEN

TopazName	dc.b	'topaz.font',0
DosName		dc.b	'dos.library',0
GfxName		dc.b	'graphics.library',0
IntName		dc.b	'intuition.library',0
NWName		dc.b	' Measuring Topaz-80 Speed ',0
		END

