
; Listing8i2.s - Einfacher zeitgesteuerter Equalizer mit der Musik Routine
; rechte Taste um die Geschwindigkeit der Balken zu ändern

	SECTION	MAINPROGRAM,CODE

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

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

			;5432109876543210
DMASET	equ	%1000001010000000	; nur Copper DMA
;			 -----a-bcdefghij

;	a: Blitter Nasty
;	b: Bitplane DMA	   (Wenn es nicht gesetzt ist, verschwinden auch die Sprites)
;	c: Copper DMA
;	d: Blitter DMA
;	e: Sprite DMA
;	f: Disk DMA
;	g-j: Audio 3-0 DMA

Start:
	move.w	#DMASET,$96(a5)		; DMACON - aktivieren Copper
	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"

	bsr.w	mt_init				; Initialisieren der Musik Routine

MainLoop:
	move.l	#$1ff00,d1			; Bit zur Auswahl durch UND
	move.l	#$13000,d2			; Warte auf Zeile = $130 (304)
WarteY1:
	move.l	4(a5),d0			; VPOSR und VHPOSR - $dff004/$dff006
	and.l   d1,d0				; Wählen Sie nur die Bits der vertikalen Pos.
	cmp.l   d2,d0				; Warte auf Zeile = $130 (304)
	bne.s	WarteY1
WarteY2:
	move.l	4(a5),d0			; VPOSR und VHPOSR - $dff004/$dff006
	and.l   d1,d0				; Wählen Sie nur die Bits der vertikalen Pos.
	cmp.l   d2,d0				; Warte auf Zeile = $130 (304)
	beq.s	WarteY2

	bsr.w	mt_music			; spielt die Musik

	btst	#2,$dff016			; rechte Maustaste gedrückt?
	beq.s	Exit				; Wenn ja, beenden

	bsr.s	Equalizer			; einfache Equalizer-Routine

	btst	#6,$bfe001			; linke Maustaste gedrückt?
	bne.s	MainLoop			; Wenn "NEIN" wird erneut geStartet,
								; ansonsten ändert sich die Musik

	lea	Music(pc),a0			; tauscht die Musik aus
	move.l	(a0),d0
	move.l	4(a0),d1
	move.l	4*2(a0),d2
	move.l	4*3(a0),d3
	move.l	d0,4(a0)
	move.l	d1,4*2(a0)
	move.l	d2,4*3(a0)
	move.l	d3,(a0)

	move.l	Music(pc),mt_data	; Zeiger aktuelle Musik
	bsr.w	mt_init				; Setzen Sie die Musik zurück
Mouse:
	btst	#6,$bfe001			; linke Maustaste gedrückt?
	beq.s	Mouse				; warte bis es übrig ist
	bra.s	MainLoop

Exit:
	bsr.w	mt_end				; stoppt die Musik Routine
	rts

; Tabelle mit Musik ... durch drehen der Adressen und kopieren
; können wir sie ändern ...

Music:
	dc.l	mt_data1,mt_data2,mt_data3,mt_data4


; Hier ist die Equalizer-Routine, der Audio-Analysator. Als erstes ist
; zu wissen, wo man Informationen über die Verwendung der 4 Stimmen durch die 
; Musik Routine findet. Normalerweise wird sie verwendet, um die Variable der 
; Wiederholungsroutine zu überprüfen, die uns sagen kann, ob eine Stimme 
; zum Abspielen aktiviert ist, ein Instrument, normalerweise "mt_chanXtemp",
; wobei X 1,2,3 oder 4 sein kann.
; In dieser Version wird auch der Wert, den mt_chanXtemp hat für 
; zusätzliche Analyse verwendet.

;	       ...._____
;	     .:::··____ \_______
;	    .:·:  /   ¬\ \      \
;	   .:::  /      \________\
;	  .:::  /    (O  \`-o---'/
;	  ::\_  \     ¯  /_,   _/
;	   ·/    \      /  \   \
;	   / _____\____/    \  /
;	  / / T   \      (,_/ /
;	 / /\_l___/\         /
;	/ /_________\     __/
;	\ ¯  -----  ¯     /
;	 \_______________/ xCz
;	     T        T
;	     `--------'

Equalizer:
	move.b	EqualSpeed(pc),d0	; Geschwindigkeit der "fallenden" Balken in d0
	cmp.b	#$07,WaitEqu1+1		; ist der erste Balken auf Null gesunken?
	bls.s	NotDown1			; wenn ja, nicht weiter senken!
								; * bls bedeutet weniger oder gleich, es ist besser
								; es anstelle von beq zu verwenden, weil die Subtraktion
								; mit d0 eine zu große Zahl ergeben kann
								; es kann zufällig auf $05 oder $03 steigen!
	sub.b	d0,WaitEqu1+1		; ansonsten den Balken senken, bestehend aus
	sub.b	d0,WaitEqu1b+1		; zwei farbigen und einer schwarzen Linie
	sub.b	d0,WaitEqu1c+1
NotDown1:
	tst.w	mt_chan1temp		; Stimme 1 nicht "gespielt"?
	beq.s	Anal2				; Wenn nicht, springe zu Anal2
	move.w	mt_chan1temp,Color1
	move.w	mt_chan1temp,Color1b
	and.w	#$f0,Color1			; Nur blaue Komponente auswählen
	ori.w	#$330,Color1		; mindestens $30!
	and.w	#$0f,Color1b		; Nur grüne Komponente auswählen
	ori.w	#$303,Color1b		; mindestens $03!
	clr.w	mt_chan1temp		; Zurücksetzen, um auf den nächsten Eintrag zu warten
	move.b	#$a7,WaitEqu1+1		; BAR BIS ZUM MAXIMUM!
	move.b	#$a7,WaitEqu1b+1
	move.b	#$a7,WaitEqu1c+1
Anal2:
	cmp.b	#$07,WaitEqu2+1		; Ist der zweite Balken auf Null gesunken?
	bls.s	NotDown2			; wenn ja, nicht weiter absenken!
	sub.b	d0,WaitEqu2+1		; Ansonsten den Balken senken
	sub.b	d0,WaitEqu2b+1
	sub.b	d0,WaitEqu2c+1
NotDown2:
	tst.w	mt_chan2temp		; Stimme 2 nicht "gespielt"?
	beq.s	Anal3				; Wenn nicht, springe zu Anal3
	move.w	mt_chan2temp,Color2
	move.w	mt_chan2temp,Color2b
	and.w	#$f0,Color2			; Nur blaue Komponente auswählen
	ori.w	#$330,Color2		; mindestens $30!
	and.w	#$0f,Color2b		; Nur grüne Komponente auswählen
	ori.w	#$303,Color2b		; mindestens $03!
	clr.w	mt_chan2temp		; Zurücksetzen, um auf den nächsten Eintrag zu warten
	move.b	#$a7,WaitEqu2+1		; BAR BIS ZUM MAXIMUM!
	move.b	#$a7,WaitEqu2b+1
	move.b	#$a7,WaitEqu2c+1
Anal3:
	cmp.b	#$07,WaitEqu3+1		; Ist der dritte Balken auf Null gesunken?
	bls.s	NotDown3			; wenn ja, nicht weiter absenken!
	sub.b	d0,WaitEqu3+1		; Ansonsten den Balken senken
	sub.b	d0,WaitEqu3b+1
	sub.b	d0,WaitEqu3c+1
NotDown3:
	tst.w	mt_chan3temp		; Stimme 3 nicht "gespielt"?
	beq.s	Anal4				; Wenn nicht, springe zu Anal4
	move.w	mt_chan3temp,Color3
	move.w	mt_chan3temp,Color3b
	and.w	#$f0,Color3			; Nur blaue Komponente auswählen
	ori.w	#$330,Color3		; mindestens $30!
	and.w	#$0f,Color3b		; Nur grüne Komponente auswählen
	ori.w	#$303,Color3b		; mindestens $03!
	clr.w	mt_chan3temp		; Zurücksetzen, um auf den nächsten Eintrag zu warten
	move.b	#$a7,WaitEqu3+1		; BAR BIS ZUM MAXIMUM!
	move.b	#$a7,WaitEqu3b+1
	move.b	#$a7,WaitEqu3c+1
Anal4:
	cmp.b	#$07,WaitEqu4+1		; ist der vierte Balken auf Null gesunken?
	bls.s	NotDown4			; wenn ja, nicht weiter absenken!
	sub.b	d0,WaitEqu4+1		; Ansonsten den Balken senken
	sub.b	d0,WaitEqu4b+1
	sub.b	d0,WaitEqu4c+1
NotDown4:
	tst.w	mt_chan4temp		; Stimme 4 nicht "gespielt"?
	beq.s	Analizerend			; wenn nicht, raus!
	move.w	mt_chan4temp,Color4
	move.w	mt_chan4temp,Color4b
	and.w	#$f0,Color4			; Nur blaue Komponente auswählen
	ori.w	#$330,Color4		; mindestens $30!
	and.w	#$0f,Color4b		; Nur grüne Komponente auswählen
	ori.w	#$303,Color4b		; mindestens $03!
	clr.w 	mt_chan4temp		; Zurücksetzen, um auf den nächsten Eintrag zu warten
	move.b	#$a7,WaitEqu4+1		; BAR BIS ZUM MAXIMUM!
	move.b	#$a7,WaitEqu4b+1
	move.b	#$a7,WaitEqu4c+1
Analizerend:
	rts

EqualSpeed:
	dc.b	4
	even

*******************************************************************************
;	MUSIK ROUTINE 

	include	"/Sources/music.s"
*******************************************************************************

	SECTION	COPPER,DATA_C

Copperlist:
	dc.w	$100,$200			; Bplcon0 - keine Bitplanes
	dc.w	$180,$00e			; COLOR00 blau

	dc.w	$4807,$fffe
	dc.w	$180,$ddd
	dc.w	$4a07,$fffe
	dc.w	$180,$777

	dc.w	$5007,$fffe			; Warten Sie auf die Zeile
	dc.w	$180
Color1:
	dc.w	$060
	dc.w	$5507,$fffe			; Warten Sie auf die Zeile
	dc.w	$180
Color2:
	dc.w	$060
	dc.w	$5a07,$fffe			; Warten Sie auf die Zeile
	dc.w	$180
Color3:
	dc.w	$060
	dc.w	$5f07,$fffe			; Warten Sie auf die Zeile
	dc.w	$180
Color4:
	dc.w	$060
	dc.w	$6407,$fffe			; Warten Sie auf die Zeile
	dc.w	$180
Color1b:
	dc.w	$00e
	dc.w	$6907,$fffe			; Warten Sie auf die Zeile
	dc.w	$180
Color2b:
	dc.w	$00e
	dc.w	$6e07,$fffe			; Warten Sie auf die Zeile
	dc.w	$180
Color3b:
	dc.w	$00e
	dc.w	$7307,$fffe			; Warten Sie auf die Zeile
	dc.w	$180
Color4b:
	dc.w	$00e
	dc.w	$7807,$fffe			; Warten Sie auf die Zeile
	dc.w	$180,$777
	dc.w	$7e07,$fffe
	dc.w	$180,$333
	dc.w	$8007,$fffe
	dc.w	$180,$00e

	dc.w	$ffdf,$fffe			; Warten Sie auf die Zeile $ff

; wait & mode der Analyseroutine - Verwendung der horizontalen Position
; wartet darauf, dass die Balken "vorwärts" und "rückwärts" gehen

	dc.w	$1507,$fffe			; Warte auf den Beginn der Zeile
	dc.w	$180,$00e			; COLOR00 blau

	dc.w	$1607,$fffe			; Warte auf den Beginn der Zeile
	dc.w	$180,$f55			; COLOR00 rot - Farbe der ersten BAR
WaitEqu1:
	dc.w	$1617,$fffe			; wait (wird dann zum Zeilenende geändert
								; es wird um 4 sinken, bis es wieder bei $07 zurückkehrt)
	dc.w	$180,$00e			; COLOR00 blau
	dc.w	$1707,$fffe			; Warten auf den Beginn der Zeile
	dc.w	$180,$f55			; COLOR00 rot erste Bar (2 Zeilen hoch!)
WaitEqu1b:
	dc.w	$1717,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau
	dc.w	$1807,$fffe			; Warten auf den Beginn der Zeile
	dc.w	$180,$002			; COLOR00 schwarz ("Schatten" unter dem ersten Balken)
WaitEqu1c:
	dc.w	$1817,$fffe			; wait (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau

; zweite Bar

	dc.w	$1b07,$fffe			; Warte auf den Beginn der Zeile
	dc.w	$180,$a5f			; COLOR00 lila (zweite Bar)
WaitEqu2:
	dc.w	$1b17,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau
	dc.w	$1c07,$fffe			; Warten auf den Beginn der Zeile
	dc.w	$180,$a5f			; COLOR00 zweite Bar (2 Zeilen hoch!)
WaitEqu2b:
	dc.w	$1c17,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau
	dc.w	$1d07,$fffe			; Warten auf den Beginn der Zeile
	dc.w	$180,$002			; COLOR00 schwarz ("Schatten")
WaitEqu2c:
	dc.w	$1d17,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau

; dritte Bar

	dc.w	$2007,$fffe			; Warte auf den Beginn der Zeile
	dc.w	$180,$ff0			; COLOR00 (dritte Bar)
WaitEqu3:
	dc.w	$2017,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau
	dc.w	$2107,$fffe			; Warten auf den Beginn der Zeile
	dc.w	$180,$ff0			; COLOR00 dritte Bar (2 Zeilen hoch!)
WaitEqu3b:
	dc.w	$2117,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau
	dc.w	$2207,$fffe			; Warten auf den Beginn der Zeile
	dc.w	$180,$002			; COLOR00 schwarz ("Schatten")
WaitEqu3c:
	dc.w	$2217,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau

; vierte Bar

	dc.w	$2507,$fffe			; Warte auf den Beginn der Zeile
	dc.w	$180,$5F0			; COLOR00 (vierte Bar)
WaitEqu4:
	dc.w 	$2517,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau
	dc.w	$2607,$fffe			; Warten auf den Beginn der Zeile
	dc.w	$180,$5F0			; COLOR00 vierte Bar (2 Zeilen hoch!)
WaitEqu4b:
	dc.w 	$2617,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau
	dc.w	$2707,$fffe			; Warten auf den Beginn der Zeile
	dc.w	$180,$002			; COLOR00 schwarz ("Schatten")
WaitEqu4c:
	dc.w 	$2717,$fffe			; Warten (geändert für Taktlänge)
	dc.w	$180,$00e			; COLOR00 blau

	dc.w	$ffff,$fffe			; Ende Copperlist


; Musik - Sie können einen der 4 Musiktitel von der Diskette auswählen.
; hier "verstehen" sie die Nützlichkeit von mt_data als Zeiger.

mt_data:
	dc.l	mt_data1
	
mt_data1:
	incbin	"/Sources/mod.fuck the bass"	; by m.c.m/remedy 91
mt_data2:
	incbin	"/Sources/mod.yellowcandy"		; by sire/supplex
mt_data3:
	incbin	"/Sources/mod.fairlight"		; by d-zire/silents 92 (lungo solo 2k!)
mt_data4:
	incbin	"/Sources/mod.JamInexcess"		; by raiser/ram jam

	end
