;TestProgramm für "tracker.library"

; Testet TRK_AllocMem und TRK_FreeMem

	NOLIST
	INCLUDE "exec/LVO.i"
	INCLUDE "exec/memory.i"
	INCLUDE "dos/LVO.i"
	INCLUDE "dos/dosextens.i"
	INCLUDE "tracker.i"
	LIST

_TrackerBase:	EQUR a5
_DosBase:	EQUR a4
Output: 	EQUR d7

; WB-Message ?
	sub.l	a1,a1		;a1=0->eigener Task
	CALLEXEC FindTask	;Wo darf man denn nachschauen ?
	move.l	d0,a0
	tst.l	pr_CLI(a0)      ;von CLI oder WB aus gestartet ?
	bne	fromCLI
;von WB aus:
	lea	pr_MsgPort(a0),a0
	move.l	a0,-(sp)
	CALLEXEC WaitPort	;auf Start-Message warten
	move.l	(sp)+,a0
	CALLEXEC GetMsg ;muß nachher beantwortet werden
	move.l	d0,WBenchMsg

fromCLI:
; Tracker-Library öffnen
	OPENLIB TrName
	tst.l	d0
	beq	ende_all
	move.l	d0,_TrackerBase
	TRK_OPENSTDLIB DOS,36
	tst.l	d0
	beq	ende_trk
	move.l	d0,_DosBase

	tst.l	WBenchMsg
	bne	fromWB
;von CLI aus -> Ausgaben ins CLI-Fenster
	CALLDOS Output
	move.l	d0,Output
	bra	main
;von WB aus gestartet -> eigenes Window nötig
fromWB: move.l	#WdName,d1
	move.l	#MODE_OLDFILE,d2
	CALLDOS Open
	move.l	d0,Output
;---------------------------------------------------------------------------
;Haupt-Testteil

ALLOC:	MACRO	;Bytes, Typ, sichern in
	move.l	#\1,d0
	move.l	#\2,d1
	bsr	Alloc
	move.l	d0,\3
	ENDM

FREE:	MACRO	;wo gesichert
	move.l	\1,a1
	bsr	Free
	ENDM

main:	ALLOC	1111,MEMF_CLEAR,d6
	ALLOC	55555,MEMF_PUBLIC,d5
	ALLOC	12345,MEMF_CHIP!MEMF_CLEAR,d4
	FREE	d5
	ALLOC	122,MEMF_ANY,d6 ;der alte Speicherzeiger wird absichtlich
				; überschrieben; d3 gäbe vielleicht Seiten-
				; Effekte mit der Ausgabe
	FREE	d4

;---------------------------------------------------------------------------

;ggf. Window schließen
	tst.l	WBenchMsg
	beq	ende_trk
	move.l	Output,d1
	move.l	#GoodBye,d2
	move.l	#GoodByeLen,d3	;jetzt sind die Speicher-Pointer uninteressant
	CALLDOS Write
	move.l	#150,d1
	CALL	Delay
	move.l	Output,d1
	CALL	Close
;Library schließen
ende_trk:
	CLOSELIB _TrackerBase
ende_all:
	tst.l	WBenchMsg	;war da was ?
	beq	toCLI		;na dann halt nicht
;Message zur WB zurück
	move.l	WBenchMsg,a1
	CALLEXEC ReplyMsg
toCLI:	moveq	#0,d0
	rts
;---------------------------------------------------------------------------
;Unterroutine: TRK_AllocMem testen
;Parameter: d0 = Größe des gewünschten Speicherbereichs
;	    d1 = Anforderungen an den gewünschten Speicherbereich
;Ergebnis: Adresse des allozierten Speichers / 0 bei Fehler

Alloc:	movem.l d2/d3,-(sp)     ;d2/d3 sichern
	movem.l d0-d2,-(sp)     ;Parameter für Ausgabe sichern;
				;d2 ist Platzhalter für das Ergebnis
	CALLTRK TRK_AllocMem
	move.l	d0,8(sp)
	move.l	Output,d1
	move.l	#AllocText,d2
	move.l	sp,d3
	CALLDOS VFPrintf
	add.w	#8,sp
	movem.l (sp)+,d0/d2/d3  ;Ergebnis und d2/d3 holen
	rts
;---------------------------------------------------------------------------
;Unterroutine: TRK_FreeMem testen
;Parameter: a1 = Adresse des Speicherbereichs
;Ergebnis: -

Free:	move.l	a1,d0
	bne	1$
	rts
1$:	movem.l d2/d3/a1,-(sp)  ;Register sichern
	CALLTRK TRK_FreeMem
	move.l	Output,d1
	move.l	#FreeText,d2
	moveq	#8,d3
	add.l	sp,d3
	CALLDOS VFPrintf
	movem.l (sp)+,a2/a3/a1  ;Register zurück
	rts
;---------------------------------------------------------------------------

WBenchMsg:	dc.l	0

TrName: TRACKERNAME

AllocText: dc.b "%ld Bytes of Memory Type $%lx allocated at $%06lx",10,0
FreeText: dc.b	"Memory at $%06lx freed",10,0
WdName: dc.b	"CON:////AllocMem-Test für tracker.library",0
GoodBye: dc.b	10,"Bye - closing soon !"
GoodByeLen: equ *-GoodBye

	END
