
; Listing10c5.s		Reflektoreffekt auf interleaved Bildschirm
; linke Taste zum Beenden.

	SECTION	BLIT,CODE

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

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

			;5432109876543210
DMASET	equ	%1000001111000000	; Bitplane, Copper, Blitter DMA


Start:
	move.l	#Bitplane1,d0		; Zeiger auf die "leere" Bitplane
	lea	Bplpointers,a1			; Bitplanepointer
	moveq	#5-1,d1				; Anzahl der Bitplanes
PointBp:
	move.w	d0,6(a1)
	swap	d0
	move.w	d0,2(a1)
	swap	d0
	add.l	#40,d0				; INTERLEAVED! Höhe 1 Zeile 
	addq.w	#8,a1
	dbra	d1,PointBp

	lea	$dff000,a5				; Custom Register Base in a5
	move.w	#DMASET,$96(a5)		; DMACON - einschalten Bitplane, Copper, Blitter
	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"

Mouse:

WarteY1:
	cmp.b	#$ff,$6(a5)			; VHPOSR - Warte auf Zeile $ff
	bne.s	WarteY1
WarteY2:
	cmp.b	#$ff,$6(a5)			; noch Zeile $ff?
	beq.s	WarteY2

	bsr.s	ClearScreen			; sauberer Bildschirm
	bsr.w	MoveMask			; Reflektorposition verschieben
	bsr.s	Reflector			; Routine Reflektor
	
	btst	#6,$bfe001			; linke Maustaste gedrückt?
	bne.s	Mouse				; Wenn nicht, gehe zurück zu Mouse:

	rts

;***************************************************************************
; Diese Routine löscht den Teil des Bildschirms, der vom Blitt betroffen ist
;***************************************************************************

ClearScreen:
	lea	Bitplane1+100*40*5,a1	; Adresse Bereich der gelöscht werden soll

	btst	#6,2(a5)			; DMACONR
WaitBlit1:
	btst	#6,2(a5)			; DMACONR - warte auf das Ende des Blitters
	bne.s	WaitBlit1

	move.l	#$01000000,$40(a5)	; BLTCON0 + BLTCON1 Löschung
	move.w	#0,$66(a5)			; BLTDMOD
	move.l	a1,$54(a5)			; BLTDPT Zeiger Ziel
	move.w	#(64*39*5)+20,$58(a5)	; BLTSIZE (Blitter starten !)
	rts

;*****************************************************************************
; Diese Routine realisiert den Reflektoreffekt. Die Operation wird
; durch ein UND zwischen der Figur und einer Maske ausgeführt.
;*****************************************************************************

;	      ___________
;	     /           \
;	    /\            \
;	   / /\____________)____
;	   \/:/\___   ___/\     \
;	    \/ ___ \_/ ___ \     \
;	    ( /  o)   (  o\ )____/
;	     \\__/ /Y\ \__//
;	     (___/(_n_)\___)
;	   __//\ _ _ _ _ /\\__
;	  /==\\_Y Y Y Y Y_//==\
;	 /    `-| | | | |-'    \
;	/       `-^-^-^-'       \

Reflector:
	lea	Figur+40*5,a0			; Adresse Figur
	lea	Bitplane1+100*40*5,a1	; Adresse Ziel

	move.w	MaskeX(pc),d0		; Reflektorposition
	move.w	d0,d2				; Kopie
	and.w	#$000f,d0			; wir wählen die ersten 4 Bits, weil sie 
								; in den Shifter von Kanal A eingefügt werden
	lsl.w	#8,d0				; Die 4 Bits werden zum High-Nibble 
	lsl.w	#4,d0				; des Wortes bewegt ...
	or.w	#$0dc0,d0			; ... rechts in das BLTCON0-Register einzugeben
								; LF = $c0 (dh UND zwischen A und B)
	lsr.w	#3,d2				; (entspricht einer Division durch 8)
								; Runden auf ein Vielfaches von 8 für den Zeiger
								; auf den Bildschirm, also auch auf ungerade Adressen
								; (also zu Bytes)
								; zB: eine 16 als Koordinate wird zu Byte 2
	and.w	#$fffe,d2			; Ich schließe Bit 0 aus
	add.w	d2,a0				; addieren zur Adresse der Bitebene, 
								; um die richtige Zieladresse zu finden
	add.w	d2,a1				; addieren zur Adresse der Bitebene, 
								; um die richtige Zieladresse zu finden

	btst	#6,2(a5)			; DMACONR
WaitBlit2:
	btst	#6,2(a5)			; DMACONR - warte auf das Ende des Blitters
	bne.s	WaitBlit2

	move.l	#$ffffffff,$44(a5)	; Maske
	move.w	d0,$40(a5)			; BLTCON0
	move.w	#$0000,$42(a5)		; BLTCON1 Mode ascending
	move.w	#0,$64(a5)			; BLTAMOD (=0)
	move.w	#32,$62(a5)			; BLTBMOD (40-8=32)
	move.w	#32,$66(a5)			; BLTDMOD (40-8=32)

	move.l	#Maske,$50(a5)		; BLTAPT Zeiger Maske
	move.l	a0,$4c(a5)			; BLTBPT Zeiger Figur
	move.l	a1,$54(a5)			; BLTDPT Zeiger Ziel
	move.w	#(64*39*5)+4,$58(a5)	; BLTSIZE (Blitter starten!)
								; Breite 4 Word, Höhe 39 Zeilen, 5 planes
	rts						


;*****************************************************************************
; Diese Routine liest die horizontale Koordinate aus einer Tabelle
; und speichert sie in der Variable MaskeX
;*****************************************************************************

MoveMask:
	addq.l	#2,TabXpoint		; Zeiger auf das nächste Wort
	move.l	TabXpoint(pc),a0	; Adresse die in TabXpoint enthalten ist
								; nach a0 kopieren
	cmp.l	#EndeTabX-2,a0  	; sind wir beim letzten Wort der Tabelle?
	bne.s	NobStartX			; noch nicht? dann weiter
	move.l	#TabX-2,TabXpoint 	; erneut mit dem ersten Wort-2 beginnen
NobStartX:
	move.w	(a0),MaskeX			; den Wert in die Variable kopieren
	rts

MaskeX:
		dc.w	0				; aktuelle Maskenpositition
TabXpoint:
		dc.l	TabX			; Zeiger auf die Tabelle
		
;  Tabelle Maskenpositionen

TabX:
	dc.w	$12,$16,$19,$1d,$21,$25,$28,$2c,$30,$34
	dc.w	$37,$3b,$3f,$43,$46,$4a,$4e,$51,$55,$58
	dc.w	$5c,$60,$63,$67,$6a,$6e,$71,$74,$78,$7b
	dc.w	$7f,$82,$85,$89,$8c,$8f,$92,$95,$98,$9c
	dc.w	$9f,$a2,$a5,$a8,$aa,$ad,$b0,$b3,$b6,$b8
	dc.w	$bb,$be,$c0,$c3,$c5,$c8,$ca,$cc,$cf,$d1
	dc.w	$d3,$d5,$d8,$da,$dc,$de,$e0,$e1,$e3,$e5
	dc.w	$e7,$e8,$ea,$ec,$ed,$ee,$f0,$f1,$f2,$f4
	dc.w	$f5,$f6,$f7,$f8,$f9,$fa,$fb,$fb,$fc,$fd
	dc.w	$fd,$fe,$fe,$ff,$ff,$ff,$100,$100,$100,$100
	dc.w	$100,$100,$100,$100,$ff,$ff,$ff,$fe,$fe,$fd
	dc.w	$fd,$fc,$fb,$fb,$fa,$f9,$f8,$f7,$f6,$f5
	dc.w	$f4,$f2,$f1,$f0,$ee,$ed,$ec,$ea,$e8,$e7
	dc.w	$e5,$e3,$e1,$e0,$de,$dc,$da,$d8,$d5,$d3
	dc.w	$d1,$cf,$cc,$ca,$c8,$c5,$c3,$c0,$be,$bb
	dc.w	$b8,$b6,$b3,$b0,$ad,$aa,$a8,$a5,$a2,$9f
	dc.w	$9c,$98,$95,$92,$8f,$8c,$89,$85,$82,$7f
	dc.w	$7b,$78,$74,$71,$6e,$6a,$67,$63,$60,$5c
	dc.w	$58,$55,$51,$4e,$4a,$46,$43,$3f,$3b,$37
EndeTabX:

;*****************************************************************************

	SECTION	GRAPHIC,DATA_C

Copperlist:
	dc.w	$8e,$2c81			; DIWSTRT
	dc.w	$90,$2cc1			; DIWSTOP
	dc.w	$92,$38				; DDFSTRT
	dc.w	$94,$d0				; DDFSTOP
	dc.w	$102,0				; BPLCON1
	dc.w	$104,0				; BPLCON2
	dc.w	$108,160			; WERT MODULO = 2*20*(5-1)= 160
	dc.w	$10a,160

	dc.w	$100,$5200			; BPLCON0

Bplpointers:
	dc.w	$e0,$0000,$e2,$0000	; erste Bitplane
	dc.w	$e4,$0000,$e6,$0000
	dc.w	$e8,$0000,$ea,$0000
	dc.w	$ec,$0000,$ee,$0000
	dc.w	$f0,$0000,$f2,$0000

Colors:
	dc.w	$180,$000,$182,$f10,$184,$f21,$186,$f42
	dc.w	$188,$f53,$18a,$f63,$18c,$f74,$18e,$f85
	dc.w	$190,$f96,$192,$fa6,$194,$fb7,$196,$fb8
	dc.w	$198,$fc9,$19a,$f21,$19c,$f10,$19e,$f00
	dc.w	$1a0,$eff,$1a2,$eff,$1a4,$dff,$1a6,$dff
	dc.w	$1a8,$cff,$1aa,$bef,$1ac,$bef,$1ae,$adf
	dc.w	$1b0,$9df,$1b2,$9cf,$1b4,$8bf,$1b6,$7bf
	dc.w	$1b8,$7af,$1ba,$69f,$1bc,$68f,$1be,$57f

	dc.w	$ffff,$fffe			; Ende Copperlist

;*****************************************************************************

; Hier ist die Zeichnung, 320 Pixel breit, 56 Zeilen hoch und 5 Bitebenen

Figur:
	incbin	"/Sources/lava320x56x5.rawblit"

;*****************************************************************************

; Dies ist die Maske. Im interleaved Format bestehend aus 5 Bitebenen
; 39 Zeilen hoch und 4 Wörter breit

Maske:
	dc.l	$7fc0,0
	dc.l	$7fc0,0
	dc.l	$7fc0,0
	dc.l	$7fc0,0
	dc.l	$7fc0,0
	dc.l	$3fff8,0
	dc.l	$3fff8,0
	dc.l	$3fff8,0
	dc.l	$3fff8,0
	dc.l	$3fff8,0
	dc.l	$ffffe,0
	dc.l	$ffffe,0
	dc.l	$ffffe,0
	dc.l	$ffffe,0
	dc.l	$ffffe,0
	dc.l	$1fffff,0
	dc.l	$1fffff,0
	dc.l	$1fffff,0
	dc.l	$1fffff,0
	dc.l	$1fffff,0
	dc.l	$7fffff,$c0000000
	dc.l	$7fffff,$c0000000
	dc.l	$7fffff,$c0000000
	dc.l	$7fffff,$c0000000
	dc.l	$7fffff,$c0000000
	dc.l	$ffffff,$e0000000
	dc.l	$ffffff,$e0000000
	dc.l	$ffffff,$e0000000
	dc.l	$ffffff,$e0000000
	dc.l	$ffffff,$e0000000
	dc.l	$1ffffff,$f0000000
	dc.l	$1ffffff,$f0000000
	dc.l	$1ffffff,$f0000000
	dc.l	$1ffffff,$f0000000
	dc.l	$1ffffff,$f0000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$7ffffff,$fc000000
	dc.l	$7ffffff,$fc000000
	dc.l	$7ffffff,$fc000000
	dc.l	$7ffffff,$fc000000
	dc.l	$7ffffff,$fc000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$3fffffff,$ff800000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$1fffffff,$ff000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$fffffff,$fe000000
	dc.l	$7ffffff,$fc000000
	dc.l	$7ffffff,$fc000000
	dc.l	$7ffffff,$fc000000
	dc.l	$7ffffff,$fc000000
	dc.l	$7ffffff,$fc000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$3ffffff,$f8000000
	dc.l	$1ffffff,$f0000000
	dc.l	$1ffffff,$f0000000
	dc.l	$1ffffff,$f0000000
	dc.l	$1ffffff,$f0000000
	dc.l	$1ffffff,$f0000000
	dc.l	$ffffff,$e0000000
	dc.l	$ffffff,$e0000000
	dc.l	$ffffff,$e0000000
	dc.l	$ffffff,$e0000000
	dc.l	$ffffff,$e0000000
	dc.l	$7fffff,$c0000000
	dc.l	$7fffff,$c0000000
	dc.l	$7fffff,$c0000000
	dc.l	$7fffff,$c0000000
	dc.l	$7fffff,$c0000000
	dc.l	$1fffff,0
	dc.l	$1fffff,0
	dc.l	$1fffff,0
	dc.l	$1fffff,0
	dc.l	$1fffff,0
	dc.l	$ffffe,0
	dc.l	$ffffe,0
	dc.l	$ffffe,0
	dc.l	$ffffe,0
	dc.l	$ffffe,0
	dc.l	$3fff8,0
	dc.l	$3fff8,0
	dc.l	$3fff8,0
	dc.l	$3fff8,0
	dc.l	$3fff8,0
	dc.l	$7fc0,0
	dc.l	$7fc0,0
	dc.l	$7fc0,0
	dc.l	$7fc0,0
	dc.l	$7fc0,0
	
;*****************************************************************************

	SECTION	LEEREPLANE,BSS_C

Bitplane1:
	ds.b	40*256
Bitplane2:
	ds.b	40*256
Bitplane3:
	ds.b	40*256
Bitplane4:
	ds.b	40*256
Bitplane5:
	ds.b	40*256

	end

In diesem Beispiel realisieren wir den "Reflektor"-Effekt mit einem interleaved
Bildschirm. Die Technik ist die gleiche wie im Listing10c4.s. Der einzige
Unterschied ist dieses Mal, das wir einen interleaved Bildschirm verwenden.
Daher können wir die Ebene zusammen blitten. Diese Tatsache (die wie wir
wissen, die Geschwindigkeit erhöht) schafft uns aber Probleme mit der Maske. In
der Tat, wenn wir alle Ebenen in einem abarbeiten, brauchen wir eine Maske für
jede Ebene. In diesem Fall besteht unsere Maske aus 5 Bitebenen die alle gleich
sind. Da es interleaved ist, würde man die Maske einer Bitebene nehmen und jede
Reihe 5 mal wiederholen. In diesem Fall zwingt uns also das interleaved Format
eine Maske aus 5 Ebenen zu verwenden, die mehr Speicherplatz beansprucht als
eine Maske aus einer einzigen Bitebene. 
