
; Listing3c3.s	; BALK, DIE ZAKT, GEDAAN MET EEN MOVE&WAIT VAN DE COPPER
		; (OM TE ZAKKEN,RECHTER MUISKNOP! Linker om te stoppen!).

		;De balk bestaat nu uit een kleurverloop.
		;

	SECTION	VerloopCOP,CODE	; Fast is OK

Begin:
	move.l	4.w,a6	    ; Execbase in a6
	jsr	-$78(a6)    ; Disable - stopt Multitasking
	lea	GfxName,a1  
	jsr	-$198(a6)   
	move.l	d0,GfxBase
	move.l	d0,a6
	move.l	$26(a6),OldCop
	move.l	#COPPERLIST,$dff080
	move.w	d0,$dff088	
mouse:	 
	cmpi.b	#$ff,$dff006	; VHPOSR - Zijn we bij lijn 255 aangekomen?
	bne.s	mouse		; Zo niet,ga niet verder

	btst	#2,$dff016	; POTINP - Rechter Muisknop gedrukt?
	bne.s	Wacht		; Zo niet,terug naar wacht

	bsr.s	BeweegCopper	; De eerste beweging op het scherm!
				; Deze subroutine laat de WAIT zakken!
				; Ze wordt 1 keer per Frame uitgevoerd,
				; want de bsr.s BeweegCopper wordt maar
				; 50 keer per seconde opgeroepen.

Wacht:			; Zitten we nog op lijn $FF? 

	cmpi.b	#$ff,$dff006 ; Zitten we nog op lijn $FF? Zo ja,wacht dan op
	beq.s	Wacht	     ; het volgende Frame (lijn 00). Anders wordt
			     ; BeweegCopper weer uitgevoerd. Dit probleem
			     ; bestaat alleen bij zeer korte & snelle
			     ; programma's.

	btst	#6,$bfe001	; linker Muisknop gedrukt?
	bne.s	mouse		; zo niet, terug naar mouse.

	move.l	OldCop(PC),$dff080  
	move.w	d0,$dff088	    

	move.l	4.w,a6
	jsr	-$7e(a6)	; Enable 
	move.l	GfxBase(PC),a1	
				
	jsr	-$19e(a6)	; Closelibrary 
	rts	

;	Met deze routine bewegen we een balk van 10 Wait's naar beneden:

BeweegCopper:
	cmpi.b	#$fc,BALK	;Zijn we bij lijn $Fc aangekomen?
	beq.s	Eind		;Zo ja,stoppen.
	addq.b	#1,BALK		; WAIT 1 verandert
	addq.b	#1,BALK2	; WAIT 2 verandert
	addq.b	#1,BALK3	; WAIT 3 verandert
	addq.b	#1,BALK4	; WAIT 4 verandert
	addq.b	#1,BALK5	; WAIT 5 verandert
	addq.b	#1,BALK6	; WAIT 6 verandert
	addq.b	#1,BALK7	; WAIT 7 verandert
	addq.b	#1,BALK8	; WAIT 8 verandert
	addq.b	#1,BALK9	; WAIT 9 verandert
	addq.b	#1,BALK10	; WAIT 10 verandert

Eind:
	rts

;	Als de balk $fc heeft bereikt, wordt de addq instructie overgeslagen
;
;	P.S. Zoals het er nu voor staat kunnen we nog niet de bodem van het
;	beeld bereiken (na $ff). Ik verklaar later waarom.

;	DATA...


GfxName:
	dc.b	"graphics.library",0,0	

GfxBase:	   
	dc.l	0  

OldCop:		 
	dc.l	0	

	SECTION GRAPHIC,DATA_C	; COPPERLIST MOET IN CHIP RAM!

COPPERLIST:
	dc.w	$100,$200	; BPLCON0 
	dc.w	$180,$000	; COLOR0 

BALK:
	dc.w	$7907,$FFFE	; WAIT - Wacht op lijn $79
	dc.w	$180,$300	; COLOR0 - Begin de rode balk
BALK2:
	dc.w	$7a07,$FFFE	
	dc.w	$180,$600	; COLOR0 - Rood op 6
BALK3:
	dc.w	$7b07,$FFFE
	dc.w	$180,$900	; Rood op 9
BALK4:
	dc.w	$7c07,$FFFE
	dc.w	$180,$c00	; Rood op 12
BALK5:
	dc.w	$7d07,$FFFE
	dc.w	$180,$f00	; Rood op 15 (al massimo)
BALK6:
	dc.w	$7e07,$FFFE
	dc.w	$180,$c00	; Rood op 12
BALK7:
	dc.w	$7f07,$FFFE
	dc.w	$180,$900	; Rood op  9
BALK8:
	dc.w	$8007,$FFFE
	dc.w	$180,$600	; Rood op  6
BALK9:
	dc.w	$8107,$FFFE
	dc.w	$180,$300	; Rood op  3
BALK10:
	dc.w	$8207,$FFFE
	dc.w	$180,$000	; Kleur Zwart

	dc.w	$FFFF,$FFFE	; EINDE VAN DE COPPERLIST

	end

Om de balk te laten zakken,moeten we de copperlist veranderen. In dit geval
zijn dat alle waitsmdie de balk samenstellen. We veranderen alleen weer de
eerste byte, wat dus de vertikale positie bepaalt.

Als men ervoor zorgt dat er elke keer een label voor het eerste byte staat,
is het veranderen hiervan niet zo moeilijk.

Ik raad u aan veel met de copper te 'spelen' om er zo vertrouwd mee te raken
en zijn werking beter te leren begrijpen.

Verandering 1: Probeer eens een ';' voor de eerste 5 ADDQ.b's te zetten:

;	addq.b	#1,BALK		; WAIT 1 verandert
;	addq.b	#1,BALK2	; WAIT 2 verandert
;	addq.b	#1,BALK3	; WAIT 3 verandert
;	addq.b	#1,BALK4	; WAIT 4 verandert
;	addq.b	#1,BALK5	; WAIT 5 verandert
	addq.b	#1,BALK6	; WAIT 6 verandert
	addq.b	#1,BALK7	; WAIT 7 verandert
	...
	...
Geinig effectje toch? Verwijder nu deze 10 regels, en probeer eens het 
volgende:

	addq.b	#1,BALK
	addq.b	#2,BALK2
	addq.b	#3,BALK3
	addq.b	#4,BALK4
	addq.b	#5,BALK5
	addq.b	#6,BALK6
	addq.b	#7,BALK7
	addq.b	#8,BALK8
	addq.b	#8,BALK9
	addq.b	#8,BALK10

Begrijpt u waarom de balk zo uitdijdt? Dat komt, omdat de lijnen allemaal
met een verschillende snelheid zakken.

Verandering 3:
Deze keer laten we de balk niet naar beneden uitdijen,maar vanuit het 
midden:

	subq.b	#5,BALK
	subq.b	#4,BALK2
	subq.b	#3,BALK3
	subq.b	#2,BALK4
	subq.b	#1,BALK5
	addq.b	#1,BALK6
	addq.b	#2,BALK7
	addq.b	#3,BALK8
	addq.b	#4,BALK9
	addq.b	#5,BALK10

We hebben de eerste 5 addq's veranderd in subq's, daarom stijgt het bovenste
gedeelte van de balk, en zakt het onderste. Dit geeft een soort 'ZOOM' 
effect.	