
; Listing14-10e.s	Verwendung der Routine player6.1a für ein unkomprimiertes Modul
; Routine P61_Music die vom interrupt VERTB ($6c) Level 3 aufgerufen wird
; Darüber hinaus ist die Master-Lautstärkeregelung aktiviert: Option fade=1

	SECTION	USEPLAY61A,CODE

;	include	"DaWorkBench.s"	; entferne das; vor dem Speichern mit "wo"

*****************************************************************************
	include	"/Sources/startup2.s" ; speichern Copperlist etc.
*****************************************************************************

			;5432109876543210
DMASET	equ	%1000001010000000	; nur Copper DMA

WaitDisk	equ	30	; 50-150 zur Rettung (je nach Fall)

Start:

;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
;­ Call P61_Init to initialize the playroutine	­
;­ d0 --> Timer detection (for CIA-version)	­
;­ A0 --> Address to the module			­
;­ a1 --> Address to Samples/0			­
;­ a2 --> Address to Sample buffer		­
;­ d0 <-- 0 if succeeded			­
;­ a6 <-- $DFF000				­
;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

	movem.l	d0-d7/a0-a6,-(sp)
	lea	P61_Data,a0				; Adresse des Moduls in a0
	lea	$dff000,a6				; wir merken uns $dff000 in a6!
	sub.l	a1,a1				; die Samples sind nicht getrennt, wir setzen Null
	sub.l	a2,a2				; keine Samples -> Modul unkomprimiert
	bsr.w	P61_Init
	movem.l	(sp)+,d0-d7/a0-a6

	lea	$dff000,a5
	move.w	#DMASET,$96(a5)		; DMACON - nur Copper aktivieren
								; + Bitplane und Sprites (%1000001111000000)

	move.l	BaseVBR(PC),a0
	move.l	#MyInt6c,$6c(a0)	; Ich setze meine Interrupt-Routine

	move.w	#$e020,$9a(a5)		; INTENA - aktivieren Master und lev6
								; und VERTB (lev3).

	move.l	#Copperlist,$80(a5)	; Zeiger Copperlist
	move.w	d0,$88(a5)			; Start Copperlist
	move.w	#0,$1fc(a5)			; AGA "deaktivieren"
	move.w	#$c00,$106(a5)		; AGA "deaktivieren"
	move.w	#$11,$10c(a5)		; AGA "deaktivieren"

	clr.w	P61_Master			; volume=0

Mouse:
	bsr.s	WarteBlank
	bsr.s	UpVolume
	btst	#6,$bfe001			; linke Maustaste gedrückt?
	bne.s	Mouse

Mouse2:
	bsr.s	WarteBlank
	bsr.s	DownVolume
	btst	#2,$dff016			; rechte Maustaste gedrückt?
	bne.s	Mouse2

;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
;­ Call P61_End to stop the music		­
;­   a6 --> Customchip baseaddress ($DFF000)	­
;­		Uses d0/d1/A0/a1/a3		­
;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

	lea	$dff000,a6				; wir merken uns $dff000 in a6!
	bsr.w	P61_End

	rts

*****************************************************************************
; Routine warten auf den Vblank
*****************************************************************************

WarteBlank:
	move.l	#$1ff00,d1			; Bit zur Auswahl durch UND
	move.l	#$10000,d2			; warte auf Zeile $100
WarteY1:
	move.l	4(a5),d0			; VPOSR und VHPOSR - $dff004/$dff006
	and.l   d1,d0				; wähle nur die Bits der vertikalen Pos.
	cmp.l   d2,d0				; warte auf Zeile $100
	bne.s	WarteY1
WarteY2:
	move.l	4(a5),d0			; VPOSR und VHPOSR - $dff004/$dff006
	and.l   d1,d0				; wähle nur die Bits der vertikalen Pos.
	cmp.l   d2,d0				; warte auf Zeile $12c
	beq.s	WarteY2
	rts

*****************************************************************************
; Einfache Routinen, die das P61_Master-Label steuern
*****************************************************************************

DownVolume:
	tst.w	P61_Master			; Minimale Lautstärke erreicht?
	beq.s	NotLower
	subq.w	#1,P61_Master
NotLower:
	rts

UpVolume:
	cmp.w	#64,P61_Master		; Maximale Lautstärke errreicht?
	beq.s	NotUper
	addq.w	#1,P61_Master
NotUper:
	rts

*****************************************************************************
*		Routine interrupt level 3 ($6c)										*
*****************************************************************************

MyInt6c:
	btst	#5,$dff01f			; INTREQR - int VERTB?
	beq.s	NoInt				; wenn nein, exit!

	movem.l	d0-d7/a0-a6,-(sp)
	lea	$dff000,a6				; wir merken uns $dff000 in a6!
	bsr.w	P61_Music
	movem.l	(sp)+,d0-d7/a0-a6

NoInt:	
	move.w	#$70,$dff09c		; INTENAR
	rte

*****************************************************************************
*		 The Player 6.1A for Asm-One 1.09 and later 						*
*****************************************************************************

fade  = 1	; 0 = Normal, NO master volume control possible
			; 1 = Use master volume (P61_Master)

jump = 0	; 0 = do NOT include position jump code (P61_SetPosition)
			; 1 = include

system = 0	;0 = killer
			;1 = friendly

CIA = 0		;0 = CIA disabled
			;1 = CIA enabled

exec = 1	;0 = ExecBase destroyed
			;1 = ExecBase valid

opt020 = 0	;0 = MC680x0 code
			;1 = MC68020+ or better

use = $2009559	; Usecode (Setze den von p61con angegebenen Wert zum Speichern
				; für jedes Modul unterschiedlich!)

*****************************************************************************
	include	"/Sources/play.s"	; die wahre Routine!
*****************************************************************************


*****************************************************************************
;	Copperlist
*****************************************************************************

	SECTION	GRAPHIC,DATA_C

Copperlist:
	dc.w	$100,$200			; BPLCON0 - keine Bitplanes
	dc.w	$180,$003			; COLOR00 schwarz
	dc.w	$ffff,$fffe			; Ende Copperlist

*****************************************************************************
;	Musikmodul in das P61-Format konvertiert, unkomprimiert
*****************************************************************************

	SECTION	MODUL,DATA_C

; Modul von DreamFish. Original 42684, konvertiert 31628 (nicht gepackt!)

P61_Data:
	incbin	"/Sources/P61.technochild"	; unkomprimiert, nur konvertiert.

	end

Die Nützlichkeit des Audio "Fade" ist offensichtlich ... am Ende eines Levels
von Ihrem Spiel oder wenn das Demo endet, etc.
Aktivieren Sie einfach das Equate "Fade" und handeln Sie auf das Label
"P61_Master". Nur um zu variieren, wird hier die Routine durch den
VERTB-Interrupt ($6c) ausgeführt.