
; Listing3g.s	; BALK, DIE LINKS-EN RECHTS GAAT, MET MOVE & WAIT

	SECTION CIPenCOP,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)   ; OpenLibrary
	move.l	d0,GfxBase	; Adres in GfxBase
	move.l	d0,a6
	move.l	$26(a6),OldCop	
	move.l	#COPPERLIST,$dff080  ; COP1LC 
	move.w	d0,$dff088	     ; COPJMP1 
mouse:
	cmpi.b	#$ff,$dff006	; VHPOSR - Lijn 255?
	bne.s	mouse		

	bsr.w	CopperLinkRech	; Routine voor Links/Rechts Scroll

Wacht:
	cmpi.b	#$ff,$dff006 ; VHPOSR:
			     ; zijn we nog op $FF? 
	beq.s	Wacht

	btst	#6,$bfe001	; linker Muisknop gedrukt?
	bne.s	mouse	

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

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

; Deze routine werkt niet op het eerste Byte van de Wait (dus de Y-positie),
; maar op het tweede byte, dat de x positie voorstelt. Dit veroorzaakt de
; verschuiving van de grijze balk. Hiervoor gebruiken we twee Flags, nml:
; FlagLinks en FlagRechts, net als in de vorige Listings OpNeer. In deze 
; Labels staat het aantal cyclussen dat we hebben doorlopen, om zo bij te 
; houden wanneer we de beweging moeten omkeren. Iedere keer als we de 
; routine GaRechts uitvoeren word Flagrechts opgehoogd. Zijn we aan het 
; einde van het scherm (85 cyclussen) dan keren we het zaakje om. Dit 
; herhaalt zich tot we op de muisknop drukken.

CopperLinkRech:
	CMPI.W	#85,FlagRechts	; GaRechts 85 maal uitgevoerd?
	BNE.S	GaRechts	; Zo niet,herhaal
				; Zo ja,ga verder.

	CMPI.W	#85,FlagLinks	; GaLinks 85 maal uitgevoerd?
	BNE.S	GaLinks		; Zo niet,herhaal

	CLR.W	FlagRechts	; De Routine GaLinks is 85 maal uitgevoerd
	CLR.W	FlagLinks	; dus is de balk terug op de startplaats,
				; en de Rechts-links cyclus is klaar. We
				; wissen de twee flags, en springen eruit.
				; Bij het volgende FRAME wordt ga rechts 
				; uitgevoerd (85 maal), dan Galinks (85 
				; maal) enz.. enz..
	RTS			; Terug naar MOUSE-LOOP


GaRechts:		    ; Deze routine verschuift de balk naar rechts,
	addq.b	#2,CopBar    	; als we 2 toevoegen.
	addq.w	#1,FlagRechts 	; Hier houden we bij hoe vaak we GaRechts 
			      	; hebben uitgevoerd.
	RTS		   	; Terug naar Mouse-Loop
GaLinks:		    
	subq.b	#2,CopBar   	; Zie GaRechts
	addq.w	#1,FlagLinks
			    
			    
	RTS		    	;Terug naar Mouse-Loop


FlagRechts:		; In dit Word houden we bij hoe vaak we GaRechts 
	dc.w	0	; hebben uitgevoerd.

FlagLinks:		; Zie FlagRechts:
	dc.w	0	; 

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

GfxBase:	   
	dc.l	0  
OldCop:		   
	dc.l	0  

	SECTION GRAPHIC,DATA_C	
				

COPPERLIST:
	dc.w	$100,$200	; BPLCON0
	dc.w	$180,$000	; COLOR0 - Begin de Cop met Zwart


	dc.w	$9007,$fffe	; Wacht op lijn $90 
	dc.w	$180,$AAA	; Grijs

; Hier beneden hebben we het eerste Word dat WAIT $9031 was uit elkaar
; gehaald in 2 bytes, om een Label ertussen te kunnen voegen, dat het tweede
; byte markeert. (DUS $31)

	dc.b	$90		; POSITION YY van WAIT (eerste WAIT-Byte)
CopBar:
	dc.b	$31		; POSITION XX van WAIT 
				; (Dit gaan we veranderen!)
	dc.w	$fffe		; wait - (wordt $9033,$FFFE - $9035,$FFFE..)

	dc.w	$180,$700	; Rood.

	dc.w	$9107,$fffe ; wait die we niet veranderen (Lijn $91)
	dc.w	$180,$000   ; Wordt gebruikt om de rest weer zwart te maken
			    ; na een kleurwisseling.

; Zoals u ziet, moeten we voor lijn $90 2 waits gebruiken. 1 Om de lijn 
; ($90) af tw eachten, en 1 om de horizontale positie af te wachten ($31).
 
	dc.w	$FFFF,$FFFE	; Einde van COPPERLIST

	end

Mooi? Dit effect gebruikt men meestal om een Equalizer effect te bereiken in
demo's e.d. Het verschuiven in horizontale richting heeft wel een beperking:
We kunnen alleen ONEVEN waarden gebruiken, Daarom wachtten we in de vorige
delen ook altijd op lijn $yy07. Een gevolg hiervan is dat men altijd EVEN
stappen moet nemen om de verschuiving te bewerkstelligen. 
(Oneven+Even=Oneven, Oneven+Oneven=EVEN en dat mag niet!). We moeten dus 
ALTIJD stappen van $2,$4 of b.v. $8 nemen. Hoofdzaak is dat de uitkomst
altijd ONEVEN is.
Opmerking: De maxiname x waarde is $e1.

Als veranderingen kan ik u deze keer eigenlijk alleen maar voorstellen de
stap-grootte te veranderen in 2 of 4 of iets dergelijks (EVEN!)
Vergeet dan ook niet het aantal cyclussen te veranderen!

	CMPI.W	#85/2,FlagRechts	; 85 / 2, dus "gedeeld door 2"
	BNE.S	GaRechts
	CMPI.W	#85/2,FlagLinks	; 85/2, dus 42 Maal
	BNE.S	GaLinks		; Zo niet, dan nog eens.
	....

	addq.b	#4,(a0)		; 4 erbij...
	....

of voer een addq.b #8,a0 in:

	CMPI.W	#85/4,FlagRechts	; 85  / 4, dus 21


Als u een Sadist bent, kunt u ook een addq.b #1,(a0) toevoegen, waardoor we
op Even x-posities wachten. In het beste geval verdwijnt het scherm, en 
moet u in het 'donker' werken tot de eerstvolgende reset. Als we een beetje
'geluk' hebben krijgen we een 'GURU MEDITATION' of een 'Software Failure'.
Ben dus voorzichtig. Ik heb echter een paar Speciale coördinaten die niet
alleen het scherm laten verdwijnen, maar ook de copper naar de hemel sturen.
(Tot de volgende reset dan...) Deze zijn alleen uitgeprobeerd op een A1200,
en daardoor kan ik u niet garanderen dat ze op een andere computer ook 
werken, of dat ze uw monitor aan diggelen helpen...

	dc.w	$79DC,$FFFE	; $dc = 220! EVEN en behoorlijk DODELIJK.
				; Deze helpt de Copper om zeep, maar 
				; blokkeert het systeem niet. U kunt 
				; verder werken in het donker, zonder iets
				; te zien. (Reset lost dit weer op!)

	dc.w	$0100,$FFFE	; Blokkeert alles. Een Reset is de enige 
				; remedie.

	dc.w	$0300,$FFFE	; Nog meer Crashes... (RESET lost dit op!)


Deze 'fouten' kunnen een voordeel zijn als u uw programma's wilt beschermen
tegen slechte kopieën of een verkeerd paswoord. Simpelweg een wait-je 
toevoegen, en de computer blokkeert erger dan een 680x0 GURU, en elke
Action Replay of andere cartridge is nutteloos.

Opmerking: U kunt dit effect ook met Listing3c.s bereiken, als u het zo
aanpast:

BeweegCopper:
	cmpi.b	#$fc,Balk	; Zijn we al op lijn $fc?
	beq.s	Einde		; Zo ja,dan zijn we beneden, en stoppen we.
	addq.b	#1,Balk	; WAIT 1 veranderd,de balk zinkt nog 1 lijn.
Einde:
	rts

Op deze manier, als u dus Positie XX i.p.v. positie YY (Balk+1) geeft, en
hem 2 i.p.v. 1 verderdraait (oneven getal!),zonder te vergeten dat $e1
de maximale waarde is (Verwisselen met $fc!)

BeweegCopper:
	cmpi.b	#$e1,Balk+1	; Zijn we al op lijn $e1?
	beq.s	Einde		; Zo ja, zijn we beneden en stoppen we.
	addq.b	#2,Balk+1	; WAIT 2 veranderd.
Einde:
	rts


zult u de eerste lijn naar rechts zien lopen,i.p.v. naar beneden.

In listing3g.s zullen de moeilijkheden vooral in de Routine liggen, die
de balk Heen en Weer laat bewegen. Veel meer dan dat we de XX postie 
veranderen i.p.v. de YY positie. Als u hiervan niet veel begrepen heeft,
ga dan rustig verder met Les 4, en kom hier later nog eens op terug als u
al wat meer met de 680x0 vertrouwd bent.

Listing3h.s is een Opgedirkte versie van Listing3g.s
