
; Listing5a.s	SCROLLEN van een beeld naar links en rechts met $dff102

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

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

; Deze routine lijkt veel op die van listing3d.s. In dit geval veranderen
; we $dff102 BPLCON1, om het scherm heen en weer te bewegen.
; Omdat het mogelijk is om de even en oneven Bitplanes te verschuiven,
; moeten we ze gelijktijdig veranderen: $0011, $0022, $0033... en niet
; $0001, $0002, $0003... dat alleen de oneven planes zou verschuiven (1,3,5)
; Ook $0010,$0020,$0030... is dus niet goed. Dit werk alleen op de even
; Bitplanes (2,4,6).


BeweegCopper:
	TST.B	FLAG		; Moeten we terug? Als de FLAG 0 is, dan
				; Springen we naar 'Voren:'. Is de Flag $FF
				; dan gaan we verder met teruggaan.
	beq.w	Voren
	cmpi.b	#$00,MijnCon1	; Zijn we op de standaardpositie aangekomen,
				; dus helemaal Links?
	beq.s	GaNaarVoren	; Zo ja, dan moeten we naar voren.
	sub.b	#$11,MijnCon1	; We trekken 1 van de $dff102 af van de 
				; even EN oneven planes. ($ff,$ee,$dd,$cc,
	rts			; $bb,$aa,$99..). We gaan dus naar LINKS

GaNaarVoren:
	clr.b	FLAG		; Doordat we de FLAG op 0 zetten, wordt
				; bij TST.b FLAG de routine "Voren:" 
				; aangeroepen (naar rachts).
	rts			

Voren:
	cmpi.b	#$ff,MijnCon1	; Zijn we bij het maximum ($ff) aangekomen?
				; ($f voor even en $f voor oneven)
	beq.s	GaNaarAchteren	; Zo ja, dan terug
	add.b	#$11,MijnCon1	; Tel 1 bij even en oneven plane op, dus
				; ($11,$22,$33,$44 etc..)
	rts			; Ga naar Rechts

GaNaarAchteren:
	move.b	#$ff,FLAG	; Als het Label flag NIET 0 is, dan betekent
	rts			; dat dat we naar links teruggaan moeten.

;	Deze Byte is een Flag. Hieraan zien we of we terug moeten.

FLAG:
	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   (Register 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 aan!! (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	$FFFF,$FFFE	; Einde van de Copperlist

;	PLAATJE

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

	end

Een beeld 16 pixels naar voren of achteren schuiven is op de Amiga een
koud kunstje! Simpelweg $dff102 (BPLCON1) manipuleren, en dat was het.
Op andere systemen zoals de PC moet werkelijk het hele beeld opnieuw worden
berekent, wat dus alles afremt, en dus ook verklaart waarom 'ze' op de PC
nooit zo'n mooie gladde scrolls hebben.
Verder kunnen even en oneven Bitplanes onafhankelijk van elkaar 
gemanipuleerd worden, wat met enkele bevelen heel mooie Parallax-effecten
kan veroorzaken. Simpelweg de achtergrond iets langzamer laten bewegen
die b.v. uit de even planes bastaat, en de voorgrond iets sneller. Op de
PC daarentegen hebben 'ze' lange en gecompliceerde routines nodig, die
alles verlangzamen. En dan hoor je: "Pentium 75 is nog een tikkie langzaam,
maar op de nieuwe Pentium 100 moet het toch goed lopen,niet?"
Laten we eens bewijzen dat het mogelijk is de twee playfields separaat
aan te sturen. Maak de volgende aanpassingen: Om ALLEEN de EVEN planes te
bewegen vervangt u de volgende bevelen:

	sub.b	#$11,MijnCon1	

	cmpi.b	#$ff,MijnCon1	

	add.b	#$11,MijnCon1	
				

door deze:


	sub.b	#$10,MeinCon1	; Alleen de EVEN PLANES

	cmpi.b	#$f0,MeinCon1

	add.b	#$10,MeinCon1

U zult merken dat er maar 1 bitplane beweegt; het tweede. Het eerste en
derde blijven staan. Bij het bewegen verliest Bitplane 2 zijn overlapping,
en toont dus zijn ware gezicht. Het neemt de kleur van COLOR02 over ($FFF),
zoals in de copperlist te zien is ($FFF=Wit). Het neemt COLOR02 over omdat
bij het bewegen alleen met de achtergrond overlapt, dus $010. De planes
1 en 3 zijn 0, omdat ze niet gebruikt worden. Het getal %010 is 2, en dus
COLOR02 ($dff184). Verander de waarde in dit register en u zult zien
hoe Plane 2 als het alleen staat van kleur verandert.

	dc.w	$0184,$fff	;Color2

Zetten we $ff0 er voor in de plaats, dan word het geel. In de rest van het
beeld vallen gaten daar waar het bitplane verdwijnt. Dat is misschien beter
te zien als de beweging stopt als men op de rechter muisknop drukt.

Om nu alleen de Oneven planes te bewegen (1 en 3 in ons geval), dan verander
de vorige regels als volgt:

	subq.b  #$01,MijnCon1	; Alleen de Oneven Planes!

	cmpi.b  #$0f,MijnCon1

	addq.b  #$01,MijnCon1

In dat geval blijft Plane 2 staan, en Planes 1 en 3 bewegen zich. Met dit
voorbeelt heeft u misschien ook beter begrepen hoe de kleuren door 
overlapping ontstaan.