
; Listing5b.s	SCROLLEN VAN EEN PLAATJE NAAR LINKS EN RECHTS OP 2 PLAATSEN

	Section	CIPenCOP,CODE
Begin:
	move.l	4.w,a6		; Execbase in a6
	jsr	-$78(a6)	; Disable - stop Multitasking
	lea	GfxName(PC),a1  
	jsr	-$198(a6)	
	move.l	d0,GfxBase	
	move.l	d0,a6
	move.l	$26(a6),OldCop	

;	POINTEN Naar onze BITPLANES
 
	MOVE.L	#PIC,d0		

	LEA	BPLPOINTERS,A1	
				
	MOVEQ	#2,D1		
				
POINTBP:
	move.w	d0,6(a1)	
	swap	d0		
	move.w	d0,2(a1)	
	swap	d0		
	ADD.L	#40*256,d0	
	addq.w	#8,a1		
				
	dbra	d1,POINTBP	

	move.l	#COPPERLIST,$dff080	; COP1LC - Pointer naar onze COP
	move.w	d0,$dff088		; COPJMP1 - Start 'm

	move.w	#0,$dff1fc		; FMODE - Deactiveert AGA
	move.w	#$c00,$dff106		; BPLCON3 - Deactiveert AGA

mouse:
	cmpi.b	#$ff,$dff006	
	bne.s	mouse		

	btst	#2,$dff016	
	beq.s	Wacht		
 
	bsr.w	BeweegCopper	; Scrollt beeld heen en weer

	bsr	BeweegCopper2
Wacht:
	cmpi.b	#$ff,$dff006
	beq.s	Wacht	

	btst	#6,$bfe001	
	bne.s	mouse		

	move.l	OldCop(PC),$dff080	; COP1LC - Pointer naar Originele 
					; Copperlist
	move.w	d0,$dff088		; COPJMP1 - start 'm

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

; DATA



GfxName:
	dc.b	"graphics.library",0,0	
GfxBase:	
	dc.l	0
OldCop:		
	dc.l	0

;*************************************************************************
;	Routine die het bovenste gedeelte van het scherm beweegt


BeweegCopper:
	TST.B	FLAG		; Moeten we terug?
	beq.w	Voren
	cmpi.b	#$00,MijnCon1	; Zijn we links aangekomen?
				
	beq.s	GaNaarVoren	; Zo ja, dan naar voren!
	sub.b	#$11,MijnCon1	; We trekken 1 van de even EN oneven planes
				; af.
	rts			
				
GaNaarVoren:
	clr.b	FLAG	; Flag op nul zetten.
	rts		
			

Voren:
	cmpi.b	#$ff,MijnCon1	; Zij we helemaal rechts?
				; 
	beq.s	GaNaarAchteren	; Zo ja, dan naar links
	add.b	#$11,MijnCon1	; Tel 1 bij de even EN oneven planes op.
				
	rts			

GaNaarAchteren:
	move.b	#$ff,FLAG	; Is flag = 0? -> Links
	rts			; Is flag <>0? -> Rechts

FLAG:
	dc.b	0,0

;************************************************************************

;Deze routine beweegt het onderste gedeelte van het scherm

BeweegCopper2:
	TST.B	FLAG2		; Moeten we terug?
	beq.w	Voren2
	cmpi.b	#$00,MijnCon2	; Zijn we links aangekomen?
				
	beq.s	GaNaarVoren2	; Zo ja, dan naar voren!
	sub.b	#$11,MijnCon2	; We trekken 1 van de Even EN oneven planes 
	rts			; af
GaNaarVoren2:
	clr.b	FLAG2	; Flag nulstellen
	rts		

Voren2:
	cmpi.b	#$ff,MijnCon2	; Zijn we helemaal rechts?
				
	beq.s	GaNaarAchteren2	; Zo ja, dan naar links
	add.b	#$11,MijnCon2	; Tel 1 bij de even EN oneven planes op
	rts			

GaNaarAchteren2:
	move.b	#$ff,FLAG2	; Is flag = 0? -> Links
	rts			; Is flag <>0? -> Rechts

Ende2:
	rts


;Een tweede flag.

FLAG2:
	dc.b	0,0



	SECTION GRAPHIC,DATA_C

COPPERLIST:
	; Sprites uit...
	
	dc.w	$120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 
	dc.w	$12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
	dc.w	$134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
	dc.w	$13e,$0000

	dc.w	$8e,$2c81	; DiwStrt   (Registers met Standaardwaarden)
	dc.w	$90,$2cc1	; DiwStop
	dc.w	$92,$0038	; DdfStart
	dc.w	$94,$00d0	; DdfStop


	dc.w	$102		; BplCon1 - HET REGISTER
	dc.b	$00		; BplCon1 - DE NIET GEBRUIKTE BYTE!!!
MijnCon1:
	dc.b	$00		; BplCon1 - DE WEL GEBRUIKTE BYTE!!!


	dc.w	$104,0		; BplCon2
	dc.w	$108,0		; Bpl1Mod
	dc.w	$10a,0		; Bpl2Mod

		    ; 5432109876543210  ; BPLCON0:
	dc.w	$100,%0011001000000000  ; Bits 13 en 12 an!! (3 = %011)
					; 3 Bitplanes Lowres,geen Lace
BPLPOINTERS:
	dc.w $e0,$0000,$e2,$0000	;eerste Bitplane - BPL0PT
	dc.w $e4,$0000,$e6,$0000	;tweede Bitplane - BPL1PT
	dc.w $e8,$0000,$ea,$0000	;derde  Bitplane - BPL2PT

	dc.w	$0180,$000	; Color0
	dc.w	$0182,$475	; Color1
	dc.w	$0184,$fff	; Color2
	dc.w	$0186,$ccc	; Color3
	dc.w	$0188,$999	; Color4
	dc.w	$018a,$232	; Color5
	dc.w	$018c,$777	; Color6
	dc.w	$018e,$444	; Color7

	dc.w	$b707,$fffe	; Wachten op lijn $b7 (Onderkant Amiga)

	dc.w	$102		; BplCon1 - HET REGISTER
	dc.b	$00		; BplCon1 - DE NIET GEBRUIKTE BYTE!!!
MijnCon2:
	dc.b	$ff		; BplCon1 - DE WEL GEBRUIKTE BYTE!!!

	dc.w	$FFFF,$FFFE	; Einde van de Copperlist

;	PLAATJE...

PIC:
	incbin	"amiga.320*256*3"	; hier laden we het plaatje in RAW
					; Formaat in.

	end

Dit voorbeeld krijgen we als we de routine Beweegcopper kopieëren, en de 
namen veranderen (of simpelweg er een 2 achter plakken). Vaak wordt deze
methode gebruikt om niet een heel programmastuk opnieuw te hoeven schrijven.
Wat de copperlist betreft; ik heb alleen een extra $dff102 toegevoegd,
die ik MijnCon2 heb genoemd. Alles na de wait $7607 (dus de bovenkant van
het Amiga gedeelte) wordt 'door midden gescheurd...'. Om de twee gedeelten
'faseverschoven' heen en weer te laten bewegen, hoeven we alleen maar 1 van
de twee loops i.p.v met $00 met $ff te beginnen, en BeweegCopper en
Beweegcopper2 lopen in tegengestelde richting.

	dc.w	$102		; BplCon1 - HE REGISTER
	dc.b	$00		; BplCon1 - HET NIET GEBRUIKTE BYTE!!
MijnCon1:
	dc.b	$00		; BplCon1 - HET GEBRUIKTE BYTE!!!
	
	...

	dc.w	$102		; BplCon1 - HET REGISTER
	dc.b	$00		; BplCon1 - HET NIET GEBRUIKTE BYTE!!
MijnCon2:
	dc.b	$ff		; BplCon1 - HET GEBRUIKTE BYTE!!

Verander de byte MijnCon2: van $ff in $55 bijvoorbeeld, zodat alles iets 
duidelijker wodt misschien. Met de rechter muisknop blokkert men de
beweging. Probeer eens de Wait te veranderen, zodat het plaatje op een
andere plaats door tweeën wordt gescheurd. B.v.:

	dc.w	$a007,$fffe