; Testbeispiel 1 für B2-Midi-Playerroutinen
; (Nachladen eines Songs)
;    (c) 8/1991 by
;   Jörg Schließer
;  Rotenwaldstr. 20
; D-7000 Stuttgart 1



; Amiga-Os-Library-Offsets

	; Exec-Library
Forbid		=	-132
FindTask	=	-294
GetMsg		=	-372
ReplyMsg	=	-378
WaitPort	=	-384
CloseLibrary	=	-414
OpenLibrary	=	-552

	; Dos-Library
Lock		=	-84
UnLock		=	-90



; Einsprungadressen, die von den B2-Midi-Playerroutinen übernommen werden

	xref _loadb2score,_freeb2score,_playb2score,_stopb2score
	xref _initb2score,_freeb2insts



; Nachfolgendes Programm ist ein Beispiel zur Nutzung der Playerroutinen
; von B2-Midi unter Verwendung der Optionen zum Laden eines Songs.
;
; Es wird ein Song mit dem Namen 'The_Song' von ram: geladen, die
; Instrumente (wenn es sich nicht um einen Full-Inst-Score handelt)
; ebenfalls von dort.
; Das Programm soll nur den Aufruf der Playerroutinen demonstieren,
; das Laden und Abspielen beliebiger Songs und das Einfügen der Routinen 
; in andere Programme kann analog zum unten aufgeführten Beispiel oder
; aber auch anders (z.Bsp. in C) erfolgen.
;
; Die exakten Aufrufparameter mit Erklärungen und die möglichen
; Rückgabeparameter können Sie dem Source der Playerroutinen selbst
; entnehmen oder der Beschreibung 'Routines.doc'
;
; Wenn ein Song mittels 'incbin' direkt in den Programm-Code eingebunden
; wäre, würde die Aufrufe der Playerroutinen 'initb2score' anstelle von
; 'loadb2score' und 'freeb2insts' anstelle von 'freeb2score' sein.


	section testprog1,code


beginn:
	move.l	sp,startsp
	move.l	4,a6
	suba.l	a1,a1
	jsr	FindTask(a6)	;Ermitteln, ob Programm vom CLI
	move.l	d0,a4
	tst.l	$ac(a4)		;oder von der Workbench gestartet wurde
	bne	clistart
	lea	$5c(a4),a0
	jsr	Waitport(a6)
	lea	$5c(a4),a0
	jsr	GetMsg(a6)
	move.l	d0,startmessage
clistart:
	lea	dosname,a1
	moveq	#0,d0
	jsr	OpenLibrary(a6)	;dos.library öffnen
	move.l	d0,dosbase
	beq	droptest

	move.l	d0,a6
	move.l	#songdir,d1	;Lock des Song-Directories ermitteln
	moveq	#-2,d2
	jsr	Lock(a6)
	move.l	d0,songdirlock
	beq	droptest

	move.l	#instdir,d1	;Lock des Inst-Directories ermitteln
	moveq	#-2,d2
	jsr	Lock(a6)
	move.l	d0,instdirlock
	beq	droptest

	lea	songname,a0
	move.l	songdirlock,d0	;B2-Midi-Score laden
	move.l	instdirlock,d1
	jsr	_loadb2score

	tst.l	d0
	bne	droptest
	move.l	d1,länge	;Länge des Scores und
	beq	droptest
	move.l	a0,score	;Zeiger auf Scoredata sichern

	move.l	d1,d0
	jsr	_playb2score	;Abspiel des Scores starten


waiting:
	cmp.b	#$39,$bfec01	;Auf Druck der CTRL-Taste warten
	bne	waiting		;(Ist auf diese Art, nach den Richtlinien
				;für die Amigaprogrammierung TOTAL illegal!)

	jsr	_stopb2score	;Abspiel des Scores stoppen

	move.l	länge,d0	;Speicher für Score und
	move.l	score,a0	;Instrumente freigeben
	jsr	_freeb2score

droptest:
	move.l	dosbase,a6
	move.l	songdirlock,d1
	beq	noulosdir
	jsr	UnLock(a6)
noulosdir:
	move.l	instdirlock,d1
	beq	nouloidir
	jsr	UnLock(a6)
nouloidir:
	move.l	4,a6
	tst.l	dosbase
	beq	nodropdos
	move.l	dosbase,a1
	jsr	CloseLibrary(a6)	
nodropdos:
	tst.l	startmessage
	beq	endeplayer
	move.l	startmessage,a1
	jsr	ReplyMsg(a6)
	jsr	Forbid(a6)
endeplayer:
	moveq	#0,d0
	move.l	startsp,sp
	rts


; Variablen, Zwischenspeicher, Handles

startsp:	dc.l	0
startmessage:	dc.l	0
thistask:	dc.l	0
dosbase:	dc.l	0
songdirlock:	dc.l	0
instdirlock:	dc.l	0
länge:		dc.l	0
score:		dc.l	0

dosname:	dc.b	"dos.library",0
		even
instdir:	dc.b	"ram:",0
		even
songdir:	dc.b	"ram:",0
		even
songname:	dc.b	"The_Song",0
		even

 END

