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

	SECTION	TWEEDECOP,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	

;
;	Deze kleine routine zorgt ervoor dat de Copper-wait steeds 1 wordt
;	opgehoogd, dus de balk zakt. (Logisch he? Dit komt omdat we van
;	boven beginnen te tellen.)
;
;	dc.w	$2007,$FFFE	; Wacht op lijn $20
;
;	Dit wordt dan veranderd in:
;
;	dc.w	$2107,$FFFE	; Wacht op lijn $21! (Dan $22,$23 etc.)
;
;	
;OPMERKING: Als de maximale waarde van een byte ($FF) is bereikt, dan wordt
;bij de volgende addq.b #1,BALK de waarde van de byte $0, dus de byte
;begint weer van voren af aan te tellen.

BeweegCopper:
	addq.b	#1,BALK	 ; WAIT 1 verandert, Balk zinkt 1 lijn.
	rts

; Probeer ADDQ eens door SUBQ te vervangen, en de balk stijgt!

; Probeer nu eens '#1' door '#2' of '#3' te vervangen. Wat blijkt? De
; Balk stijgt/daalt sneller! (Voor getallen groter dan 8 een ADD.b of SUB.b
; gebruiken i.p.v. ADDQ.b of SUBQ.b!)

;	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,$004	; COLOR0 

BALK:
	dc.w	$7907,$FFFE	; WAIT - Wacht op lijn $79
	dc.w	$180,$600	; COLOR0 - Hier begint de rode Zone:
				; ROOD auf 6
	dc.w	$FFFF,$FFFE	; EINDE VAN DE COPPERLIST

	end

Ahh! Ik ben de (PC) bij "lea GfxName,a1"  vergeten! Degene die dat is
opgevallen, krijgt een pluspunt!. 

Om de balk te laten zakken moeten we enkel de Copperlist veranderen. In dit
geval veranderen we de WAIT in de eerste byte, dus de verticale lijn:

BALK:

	dc.w	$7907,$FFFE	; WAIT - Wacht op lijn $79

	dc.w	$180,$600    ; COLOR0 - Hier begint de rode zone.

Door het zetten van een label voor deze byte, kan men op het byte zelf
toegrijpen, als men het label gebruikt (in dit geval BALK).

Veranderingen: Probeer eens de kleuren te veranderen i.p.v. de wait: u hoeft
alleen een label in de copperlist te zetten waar u wilt. Hier een voorbeeld:

COPPERLIST:
	dc.w	$100,$200	; BPLCON0  
	dc.w	$180,$004	; COLOR0 - Begin de COP met DONKERBLAUW

;;;;;BALK:
	dc.w	$7907,$FFFE	; WAIT - Wacht op lijn $79
	dc.w	$180		; COLOR0
BALK:			 ; *** NIEUW LABEL BIJ DE WAARDE VAN DE KLEUR
	dc.w	$600		; Begin de rode Zone : Rood op 6
	dc.w	$FFFF,$FFFE	; EINDE VAN DE COPPERLIST
		
We zien als resultaat hiervan rood veranderen,omdat we alleen het eerste
byte gebruiken (DUS ROOD).

Probeer nu op het hele word te werken: Verander de routine als volgt:

	addq.w  #1,BALK	; i.p.v. .B zetten we .W
	rts

Test het, en u zult merken dat de kleuren zich onregelmatig veranderen,
want het hele getal wordt veranderd: $601, $602...$631, $632..
Daardoor worden de kleuren niet op volgorde afgegaan.

Opmerking: Het bevel dc.b  stopt Bytes,Word of Longwords in het geheugen,
daardoor is dit:

	dc.w	$180,$600	; COLOR0

hetzelfde als:

	dc.w	$180	; Register COLOR0
	dc.w	$600	; Waarde van COLOR0