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

		;In deze listing zakt de balk van 10 wait's. What's new?
		;Hier gebruiken we nu slechts 1 Labels,en werken met
		;offsets!

	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:
	Lea	Balk,a0		;in a0 komt het adres van Balk
	cmpi.b	#$fc,BALK	;Zijn we bij lijn $Fc aangekomen?
	beq.s	Eind		;Zo ja,stoppen.
	addq.b	#1,(a0)	   ; Wait 1 veranderen (zonder offset)
	addq.b	#1,8(a0)   ; Nu veranderen we alle andere wait's: De offsets
	addq.b	#1,8*2(a0) ; tussen 1 wait en de andere bedraagt 
	addq.b	#1,8*3(a0) ; 8 Byte, want dc.w $xx07,$FFFE,$180,$xxxx
	addq.b	#1,8*4(a0) ; is een Long.Als we dan een offset gebruiken 
	addq.b	#1,8*5(a0) ; van 8 verandert de eerste wait. Daarna 
	addq.b	#1,8*6(a0) ; gebruiken we een stap van 8 om de volgende
	addq.b	#1,8*7(a0) ; lijn te vinden.
	addq.b	#1,8*8(a0) ; 
	addq.b	#1,8*9(a0) ; Laatste wait.


Eind:
	rts

;	OPMERKING: * staat voor vermenigvuldigen, / voor delen.

;	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	
	dc.w	$180,$300	
	dc.w	$7a07,$FFFE	
	dc.w	$180,$600	
	dc.w	$7b07,$FFFE
	dc.w	$180,$900	
	dc.w	$7c07,$FFFE
	dc.w	$180,$c00	
	dc.w	$7d07,$FFFE
	dc.w	$180,$f00	
	dc.w	$7e07,$FFFE
	dc.w	$180,$c00	
	dc.w	$7f07,$FFFE
	dc.w	$180,$900	
	dc.w	$8007,$FFFE
	dc.w	$180,$600	
	dc.w	$8107,$FFFE
	dc.w	$180,$300	
	dc.w	$8207,$FFFE
	dc.w	$180,$000	

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


	end

Om de balk te laten zakken moeten we de copper-list veranderen, in dit 
voorbeeld alle waits. Om alle 9 waits te veranderen zonder al die labels,
gebruiken we offsets. Dat gaat ook sneller. Als basisadres nemen we het 
adres van het enige label BALK, en stopen het in a0. De andere waits
staan even ver uit elkaar, en we kunnen ze daardoor ook simpel veranderen.
