
; Listing11h4.s	Bar welche unter Verwendung des Wait Masking rauf und runter geht
; Dieses Listing ist mit einer Ausnahme mit Listing3d.s identisch
; Ein Trick, mit dem wir den gesamten Balken bewegen können
; mit nur einer Anweisung !!!! Der Trick ist in der Copperliste!

	SECTION	COPPERADVANCED,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:
	lea	$dff000,a5
	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"

Mouse:
	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

	btst	#2,$dff016			; rechte Maustaste gedrückt?
	beq.s	Mouse2				; wenn ja MoveCopper nicht ausführen 

	bsr.s	MoveCopper			; Routine die die WAIT-Maskierung nutzt

Mouse2:
	move.l	#$1ff00,d1			; Bit zur Auswahl durch UND
	move.l	#$13000,d2			; warte auf Zeile $130 (304)
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

	btst	#6,$bfe001			; Maus gedrückt?
	bne.s	Mouse
	rts

*****************************************************************************

MoveCopper:
	tst.b	UpDown				; Sollen wir rauf oder runter gehen?
								; (TST prüft auf BEQ) wenn UpDown 0 ist
								; dann springen wir zu NotBottom, wenn es stattdessen $ff ist
								; (falls diese TST nicht verifiziert ist)
								; steigen wir weiter auf (machen subqs)
	beq.w	NotBottom
	cmpi.b	#$34,Bar			; sind wir an der Zeile $34?
	beq.s	GoDown				; wenn ja, sind wir oben und müssen runter
	subq.b	#1,Bar
	rts

GoDown:
	clr.b	UpDown				; Zurücksetzen von UpDown für das tst.b UpDown
	rts							; es bedeutet, das wir runter müssen

NotBottom:
	cmpi.b	#$77,Bar			; sind wir an der Zeile $77?
	beq.s	GoUp				; Wenn ja, sind wir ganz unten und müssen zurück
	addq.b	#1,Bar
	rts

GoUp:
	move.b	#$ff,UpDown			; Wenn das UpDown-Label nicht Null ist,
	rts							; bedeutet es, das wir wieder aufsteigen müssen.

End:
	rts


; Dieses Byte, angegeben durch das UpDown-Label, ist ein Richtungs-FLAG 
UpDown:
	dc.b	0,0


*****************************************************************************

	SECTION	GRAPHIC,DATA_C

Copperlist:
	dc.w	$100,$200
	dc.w	$180,$000			; Starten Sie die Cop mit der Farbe schwarz

	dc.w	$2c07,$fffe			; ein kleiner grüner fester Balken
	dc.w	$180,$010
	dc.w	$2d07,$fffe
	dc.w	$180,$020
	dc.w	$2e07,$fffe
	dc.w	$180,$030
	dc.w	$2f07,$fffe
	dc.w	$180,$040
	dc.w	$3007,$fffe
	dc.w	$180,$030
	dc.w	$3107,$fffe
	dc.w	$180,$020
	dc.w	$3207,$fffe
	dc.w	$180,$010
	dc.w	$3307,$fffe
	dc.w	$180,$000

;	  /\  __ __ ______ __ __  /\ Mo!
;	_// \/  ____ _  _ ____  \/ \\_
;	\(_  \  \(O/      \O)/  /  _)/
;	 \/     _)/  _/\   \(_     \/
;	 /_ __        ··\    ______ \
;	(    (_____/\  _____/ | | |\ \
;	 \__________ \/   \_|_|_|_|_) )
;	            \ _______________/
;	             \/

Bar:
	dc.w	$3407,$fffe			; wir warten auf Zeile $34 (WAIT NORMAL!)
								; Dieses Warten ist der "CHEF" des Wartens
								; Die maskierten waits folgen ihm
								; wie die Schergen: wenn das wait
								; um 1 sinkt, werden alle maskierten waits 
								; um 1 fallen usw.

	dc.w	$180,$300			; starte den roten Balken: rot mit 3

	dc.w	$00e1,$80fe			; Dieses Paar Copperanweisungen, anstatt
	dc.w	$0007,$80fe			; mit $fffe zu enden, enden sie mit $80fe
								; in der Praxis können sie übersetzt werden mit:
								; "WAIT FOR THE NEXT LINE", in diesem Fall
								; Bei der Zeile nach dem Bar warten:.
								; Tatsächlich wartet der $00e180fe auf das Ende der
								; Zeile (zum rechten Rand des Bildschirms),
								; was das Copper zur nächsten Zeile auslöst
								; in die waagerechte Position 0001 (der
								; linke Bildschirmrand). Dazu zeigen Sie
								; auf "ausrichten", wir warten auf die Position
								; 0007 wie die anderen waits.

	dc.w	$180,$600			; rot mit 6

	dc.w	$00e1,$80fe			; auf die nächste Zeile warten
	dc.w	$0007,$80fe			; mit dem "maskierten" Y-wait

	dc.w	$180,$900			; rot mit 9

	dc.w	$00e1,$80fe			; auf die nächste Zeile warten
	dc.w	$0007,$80fe			; mit dem "maskierten" Y-wait

	dc.w	$180,$c00			; rot mit 12

	dc.w	$00e1,$80fe			; auf die nächste Zeile warten
	dc.w	$0007,$80fe			; mit dem "maskierten" Y-wait

	dc.w	$180,$f00			; rot mit 15 (maximal)

	dc.w	$00e1,$80fe			; auf die nächste Zeile warten
	dc.w	$0007,$80fe			; mit dem "maskierten" Y-wait

	dc.w	$180,$c00			; rot mit 12

	dc.w	$00e1,$80fe			; auf die nächste Zeile warten
	dc.w	$0007,$80fe			; mit dem "maskierten" Y-wait

	dc.w	$180,$900			; rot mit 9

	dc.w	$00e1,$80fe			; auf die nächste Zeile warten
	dc.w	$0007,$80fe			; mit dem "maskierten" Y-wait

	dc.w	$180,$600			; rot mit 6

	dc.w	$00e1,$80fe			; auf die nächste Zeile warten
	dc.w	$0007,$80fe			; mit dem "maskierten" Y-wait

	dc.w	$180,$300			; rot mit 3

	dc.w	$00e1,$80fe			; auf die nächste Zeile warten
	dc.w	$0007,$80fe			; mit dem "maskierten" Y-wait

	dc.w	$180,$000			; color schwarz


	dc.w	$fd07,$fffe			; warten auf Zeile $fd
	dc.w	$180,$00a			; blau Intensität 10
	dc.w	$fe07,$fffe			; nächste Zeile
	dc.w	$180,$00f			; blau Intensität maximal (15)
	dc.w	$ffff,$fffe			; Ende Copperlist


	end

In diesem Beispiel haben wir einige MOVEs gespart: Wir ändern nur 1 Byte
pro Frame und scrollen eine ganze Bar! Dies dank der "Wait und Maske".
In der Praxis liegt der Grund in der Tatsache, das wir diese 2 Wait-Masken
eingesetzt haben:

	dc.w	$00e1,$80fe			; auf die nächste Zeile warten
	dc.w	$0007,$80fe			; mit dem "maskierten" Y-wait

Gehen wir zu der Zeile, die dem zuletzt definierten Wait von $fffe folgt,
und fügen die anderen Paare von $80fe hinzu dann können wir bei der ersten
Wartezeit viele Zeilen "erhalten". Trotz allem ist es ein wenig
gewöhnungsbedürftig, weil es einige Einschränkungen gibt, zum Beispiel
funktioniert es nicht für Zeilen nach 127 ($7f). Versuchen sie die maximal
erreichbare Zeile zu ändern:

NotBottom:
	cmpi.b	#$77,Bar			; sind wir an der Zeile $77?

Wenn Sie ein nettes $f0 setzen, werden Sie bemerken, das wenn der Balken die 
$80-Grenze überschritten hat flacht es ab und wird zu einer Linie.
Die Y-Koordinate muss von $00 bis $7f reichen, da wir nur 6 Bit maskieren
können. Besser als nichts !!!

Man kann also sagen, dass die Maskierung im oberen Teil des Bildschirms
von etwa $00 bis $7f und unterhalb der NTSC-Zone, dh nach dem $ffdf,$fffe
arbeitet.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       perlist:
