
; Listing8e.s	Eine Fade-Routine (dh Ein-und Ausblenden) mit einer Änderung in
; Bezug auf die Mischung. Tatsächlich ist es möglich, einen RGB-Farbverlauf
; anzugeben, der angestrebt wird.
; Drücken Sie die linke und rechte Taste mehrmals, um zu sehen und zu beenden.

	SECTION	FADE,CODE

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

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

			;5432109876543210
DMASET	equ	%1000001110000000	; nur Copper und Bitplane 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.l	#Logo,d0			; Adresse der Bitplane
	lea	Bplpointers,a1			; Bitplanepointer in der Copperlist
	moveq	#4-1,d1				; Anzahl der Bitplanes (hier sind es 4)
PointBp:
	move.w	d0,6(a1)
	swap	d0
	move.w	d0,2(a1)
	swap	d0
	add.l	#40*84,d0			; + Länge einer Bitplane (84 Zeilen hoch hier)
	addq.w	#8,a1
	dbra	d1,PointBp

	move.w	#DMASET,$96(a5)		; DMACON - Aktivieren Bitplane, 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"
	
Mouse1:
	btst	#6,$bfe001			; linke Maustaste gedrückt?
	bne.s	Mouse1

;	****************+ Teil 1 mit einer Tendenz zu rot *****************

	clr.w	PhaseOfFade			; Fade zurücksetzen
	move.w	#$b12,Tendency		; setzt die Tendenz auf rot ******

Mouse2:
	cmp.b	#$ff,$dff006		; Zeile 255
	bne.s	Mouse2
WarteY1:
	cmp.b	#$ff,$dff006		; Zeile 255
	beq.s	WarteY1

	bsr.w	FadeIn				; Fade!!!

	btst	#2,$dff016			; rechte Maustste gedrückt?
	bne.s	Mouse2

	move.w	#16,PhaseOfFade		; Fade von 16 beginnen

Mouse3:
	cmp.b	#$ff,$dff006		; Zeile 255
	bne.s	Mouse3
WarteY2:
	cmp.b	#$ff,$dff006		; Zeile 255
	beq.s	WarteY2

	bsr.w	FadeOut				; Fade!!!

	btst	#6,$bfe001			; linke Maustaste gedrückt?
	bne.s	Mouse3

;	****************+Teil 2 mit einer Tendenz zu grün *****************

	clr.w	PhaseOfFade			; Fade zurücksetzen
	move.w	#$373,Tendency		; setzt die Tendenz auf grün ******

Mouse2x:
	cmp.b	#$ff,$dff006		; Zeile 255
	bne.s	Mouse2x
WarteY1x:
	cmp.b	#$ff,$dff006		; Zeile 255
	beq.s	WarteY1x

	bsr.w	FadeIn				; Fade!!!

	btst	#2,$dff016			; rechte Maustste gedrückt?
	bne.s	Mouse2x

	move.w	#16,PhaseOfFade		; Fade von 16 beginnen

Mouse3x:
	cmp.b	#$ff,$dff006		; Zeile 255
	bne.s	Mouse3x
WarteY2x:
	cmp.b	#$ff,$dff006		; Zeile 255
	beq.s	WarteY2x

	bsr.w	FadeOut				; Fade!!!

	btst	#6,$bfe001			; linke Maustaste gedrückt?
	bne.s	Mouse3x


;	****************+ Teil 3 mit einer Tendenz zu blau*****************

	clr.w	PhaseOfFade			; Fade zurücksetzen
	move.w	#$33c,Tendency		; setzt die Tendenz auf blau ******

Mouse2y:
	cmp.b	#$ff,$dff006		; Zeile 255
	bne.s	Mouse2y
WarteY1y:
	cmp.b	#$ff,$dff006		; Zeile 255
	beq.s	WarteY1y

	bsr.w	FadeIn				; Fade!!!

	btst	#2,$dff016			; rechte Maustste gedrückt?
	bne.s	Mouse2y

	move.w	#16,PhaseOfFade		; Fade von 16 beginnen

Mouse3y:
	cmp.b	#$ff,$dff006		; Zeile 255
	bne.s	Mouse3y
WarteY2y:
	cmp.b	#$ff,$dff006		; Zeile 255
	beq.s	WarteY2y

	bsr.w	FadeOut				; Fade!!!

	btst	#6,$bfe001			; linke Maustaste gedrückt?
	bne.s	Mouse3y

	rts


*****************************************************************************
;	Routinen,  warten und Fade zur richtigen Zeit aufrufen
*****************************************************************************

FadeIn:
	cmp.w	#17,PhaseOfFade
	beq.s	EndFadeIn
	;moveq	#0,d0
	move.w	PhaseOfFade(pc),d0
	moveq	#15-1,d7			; d7 = Anzahl der Farben
	lea	TabColorPic(pc),a0		; a0 = Adresse Farbtabelle 
								; der Figur "aufbauen"
	lea	CopColors+6,a1			; a1 = Farbadresse in Copperliste
								; zu beachten ist, dass es von COLOR01 und 
								; nicht von COLOR00 beginnt,
								; COLOR00 ist = $000 und bleibt so.
	bsr.s	Fade
	addq.w	#1,PhaseOfFade		; den nächsten Schritt vorbereiten
EndFadeIn:
	rts


FadeOut:
	tst.w	PhaseOfFade			; Haben wir die letzte Phase erreicht? (16)?
	beq.s	EndOut
	subq.w	#1,PhaseOfFade		; den nächsten Schritt vorbereiten
	;moveq	#0,d0
	move.w	PhaseOfFade(pc),d0
	moveq	#15-1,d7			; d7 = Anzahl der Farben
	lea	TabColorPic(pc),a0		; a0 = Adresse Farbtabelle 
								; der Figur "auflösen"
	lea	CopColors+6,a1			; a1 = Farbadresse in Copperliste
								; zu beachten ist, dass es von COLOR01 und 
								; nicht von COLOR00 beginnt,
								; COLOR00 ist = $000 und bleibt so.
	bsr.s	Fade
EndOut:
	rts

PhaseOfFade:					; aktuelle Phase der Überblendung (0-16)
	dc.w	0

*****************************************************************************
*		Routine zum Ein- und Ausblenden von und zu WEISS					*
* Eingang:																    *
*																			*
* d7 = Anzahl der Farben-1													*
* a0 = Adresse Tabelle mit den Farben des Bildes							*
* a1 = Adresse der ersten Farbe in Copperliste							    *
* d0 = Moment der Überblendung, Multiplikator -								*
* zum Beispiel mit d0 = 0 ist der Bildschirm völlig schwarz,				*
* mit d0 = 8 sind wir bei halber Helligkeit und mit d0 = 16					*
* sind wir in der vollen Farbe. Es gibt also 17 Phasen von 0 bis 16.		*
* Um ein Einblenden von schwarz zur Farbe zu machen, müssen wir mit jedem	*
* Aufruf der Routine den Wert von d0 erhöhen, der von 0 auf 16 ansteigt     *
* Für ein Ausblenden müssen wir von d0 = 16 bis d0 = 0 gehen				*
* d6 = Farbe, die der Überblendung hinzugefügt werden soll, um bestimmte	*
* Farbtöne zu erzielen													    *
*																		    *
* Die FADE Prozedur besteht darin, jede Farb-Komponente R, G, B				*
* mit einem Multiplikator von 0 für SCHWARZ (x * 0 = 0) bis 16 für          *
* normale Farben zu multiplizieren. Darum wird die Farbe durch 16 geteilt.  *
* Eine Farbe mit 16 zu multiplizieren und zu dividieren bedeutet nichts		*
* anderes, als sie gleich zu lassen.										*
* Die Modifikation besteht einfach darin die Farbwerte in d6 zu addieren    *
* und das Ergebnis durch 2 zu dividieren, um insgesamt $f * nicht zu		*
* überschreiten.															*
*****************************************************************************

;	               .-~~~-.
;	             /        }
;	            /      .-~
;	  \        |        }
;	___\.~~-.-~|     .-~_
;	   { O  |  `  -~      ~-._
;	    ~--~/-|_\         .-~
;	       /  |  \~ - - ~
;	      /   |   \

Fade:
	move.w	Tendency(pc),d6		; RGB-Trendmaske
Fade1:
	move.w	d6,d1				; Kopie Farbtendenz in d1
	move.w	d6,d2				; in d2
	move.w	d6,d3				; in d3
	andi.w	#$00f,d1			; nur blau auswählen
	andi.w	#$0f0,d2			; nur grün auswählen
	andi.w	#$f00,d3			; nur rot auswählen

;	Berechnen der blauen Komponente

	move.w	(a0),d4				; die Farbe aus der Farbtabelle in d4 einsetzen
	and.w	#$00f,d4			; nur die blaue Komponente ($RGB -> $00B) auswählen			
	add.w	d1,d4				; die blaue Trend-Komponente hinzufügen
	lsr.w	#1,d4				; und dividiere durch 2 durch eine Verschiebung von 1 Bit
								; Ende der Änderung
	mulu.w	d0,d4				; mit der Fade-Phase multiplizieren (0-16)
	asr.w	#4,d4				; 4 Bit nach rechts verschieben, dh dividieren durch 16
	and.w	#$00f,d4			; nur die blaue Komponente ($RGB->$00B) auswählen
	move.w	d4,d5				; die blaue Komponente in d5 speichern
	
;	Berechnen der grünen Komponente

	move.w	(a0),d4				; die Farbe aus der Farbtabelle in d4 einsetzen
	and.w	#$0f0,d4			; nur die grüne Komponente ($RGB->$0G0)	auswählen	
	add.w	d2,d4				; die grüne Trend-Komponente hinzufügen
	lsr.w	#1,d4				; und dividiere durch 2 durch eine Verschiebung von 1 Bit
								; Ende der Änderung
	mulu.w	d0,d4				; mit der Fade-Phase multiplizieren (0-16)
	asr.w	#4,d4				; 4 Bit nach rechts verschieben, dh dividieren durch 16
	and.w	#$0f0,d4			; nur die grüne Komponente ($RGB->$0G0)auswählen 
	or.w	d4,d5				; die grüne Komponente zusammen mit der blauen speichern
	
;	Berechnen der roten Komponente

	move.w	(a0)+,d4			; die Farbe aus der Tabelle kopieren
								; und auf die nächste Spalte zeigen
	and.w	#$f00,d4			; nur die rote Komponente ($RGB -> $R00) auswählen
	add.w	d3,d4				; die rote Trend-Komponente hinzufügen
	lsr.w	#1,d4				; und dividiere durch 2 durch eine Verschiebung von 1 Bit
								; Ende der Änderung
	mulu.w	d0,d4				; mit der Fade-Phase multiplizieren (0-16)
	asr.w	#4,d4				; 4 Bit nach rechts verschieben, dh dividieren durch 16
	and.w	#$f00,d4			; nur die rote Komponente ($RGB->$R00) auswählen
	or.w	d4,d5				; die Farbe rot zusammen mit blau und grün speichern

	move.w	d5,(a1)				; Und die endgültige Farbe $0RGB in die Copperliste setzen
	addq.w	#4,a1				; nächste Farbe in Copperliste
	dbra	d7,Fade1			; Mach alle Farben
	rts


Tendency:
	dc.w	0

; die $180, COLOR00, sind $000, also nicht ändern! Die Tabelle beginnt mit COLOR01

TabColorPic:
	dc.w $fff,$200,$310,$410,$620,$841,$a73
	dc.w $b95,$db6,$dc7,$111,$222,$334,$99b,$446


*****************************************************************************
;			Copperlist
*****************************************************************************
	
	SECTION	COPPER,DATA_C		; Chip data

Copperlist:
	dc.w	$8e,$2c81			; DIWSTRT - window Start
	dc.w	$90,$2cc1			; DIWSTOP - window Stop
	dc.w	$92,$38				; DDFSTRT - data fetch Start
	dc.w	$94,$d0				; DDFSTOP - data fetch Stop
	dc.w	$102,0				; BPLCON1 - scroll register
	dc.w	$104,0				; BPLCON2 - priority register
	dc.w	$108,0				; BPL1MOD - modulo pl. ungerade
	dc.w	$10a,0				; BPL2MOD - modulo pl. gerade

				; 5432109876543210
	dc.w	$100,%0100001000000000	; BPLCON0 - 4 planes lowres (16 color)

; Bitplane pointers

Bplpointers:
	dc.w	$e0,$0000,$e2,$0000	; erste Bitplane
	dc.w	$e4,$0000,$e6,$0000	; zweite Bitplane
	dc.w	$e8,$0000,$ea,$0000	; dritte Bitplane
	dc.w	$ec,$0000,$ee,$0000	; vierte Bitplane

; Die ersten 16 Farben sind für das LOGO

CopColors:
	dc.w	$180,0,$182,0,$184,0,$186,0
	dc.w	$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0
	dc.w	$198,0,$19a,0,$19c,0,$19e,0

;	dc.w	$180,$000,$182,$fff,$184,$200,$186,$310
;	dc.w	$188,$410,$18a,$620,$18c,$841,$18e,$a73
;	dc.w	$190,$b95,$192,$db6,$194,$dc7,$196,$111
;	dc.w	$198,$222,$19a,$334,$19c,$99b,$19e,$446

;	Lassen Sie uns ein paar Nuancen für die Szenerie setzen...

	dc.w	$8007,$fffe			; Wait - $2c+84=$80
	dc.w	$100,$200			; bplcon0 - no Bitplanes
	dc.w	$180,$003			; COLOR00
	dc.w	$8207,$fffe			; wait
	dc.w	$180,$005			; COLOR00
	dc.w	$8507,$fffe			; wait
	dc.w	$180,$007			; COLOR00
	dc.w	$8a07,$fffe			; wait
	dc.w	$180,$009			; COLOR00
	dc.w	$9207,$fffe			; wait
	dc.w	$180,$00b			; COLOR00
	dc.w	$9e07,$fffe			; wait
	dc.w	$180,$999			; COLOR00
	dc.w	$a007,$fffe			; wait
	dc.w	$180,$666			; COLOR00
	dc.w	$a207,$fffe			; wait
	dc.w	$180,$222			; COLOR00
	dc.w	$a407,$fffe			; wait
	dc.w	$180,$001			; COLOR00
	dc.l	$ffff,$fffe			; Ende Copperlist


*****************************************************************************
;				DESIGN
*****************************************************************************

	SECTION	GRAPHIC,DATA_C

; Zeichnung 320 Pixel breit, 84 hoch 4 Bitebenen (16 Farben).

Logo:
	incbin	"/Sources/logo320x84x16c.raw"

	end

Dies ist eine einfache Modifikation der vorherigen Routine.
                                                                                                                                                                                                                                                                                                                                                                                                                                                 .w	$180,$004			; color0
	