
; Listing5c.s	SCROLLEN VAN EEN BEELD NAAR BOVEN EN BENEDEN DOOR VERANDEREN
;		VAN DE BITPLANEPOINTERS IN DE COPPERLIST

	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

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 beweegt het beeld naar boven en beneden, als men
;	de bitplane-pointers in de copperlist verandert (met het Label
;	BPLPOINTERS)
;	De structuur is ongeveer hetzelfde als in Listing3d.s
;	Als eerste geven we het adres waar de BPLPOINTERS nu wijzen in d0,
;	dan trekken we 40 van d0 af of tellen 40 bij d0 op, en zetten de
;	nieuwe waarde terug in de copperlist. Daarvoor gebruiken we
;	weer dezelfde routine POINTBP.


BeweegCopper:
	LEA	BPLPOINTERS,A1	; Met deze 4 aanwijzingen halen we de 
	move.w	2(a1),d0	; uit de Copperlist de Adressen,waarheen
	swap	d0		; $dff0e0 nu wijst, en geven deze waarde in
				; d0.
	move.w	6(a1),d0	; Het tegenovergestelde van de routine die
				; de bitplanes aanwijst. Hier wordt het
				; adres 'gehaald' i.p.v. weggeschreven!!

	TST.B	OpNeer ; Moeten we naar boven of beneden?

	beq.w	GaBeneden
	cmp.l	#PIC-(40*30),d0 ; Zijn we boven?
	beq.s	zetBeneden	; Zo ja, dan naar beneden.
	sub.l	#40,d0		; Trek 40 af, dus 1 lijn. Het beeld gaat
				; naar Beneden.
	bra.s	Einde

zetBeneden:
	clr.b	OpNeer	; Clear OpNeer.
	bra.s	Einde		

GaBeneden:
	cmpi.l	#PIC+(40*30),d0 ; Zijn we beneden?
	beq.s	zetOmhoog	; Zo ja, dan naar boven.
	add.l	#40,d0		; Tel 40 op, dus het beeld gaat nar Bovem

	bra.s	Einde

zetOmhoog:
	move.b	#$ff,OpNeer ; Verander de FLAG.
	rts		

Einde:				; POINT DE BITPLANEPOINTER AAN
	LEA	BPLPOINTERS,A1	; POINTER in de COPPERLIST
	MOVEQ	#2,D1		; Aantal Bitplanes -1 (Hier 3!)
POINTBP2:
	move.w	d0,6(a1)	; Kopieërt het laagw. word van de Planes
	swap	d0		; Verwisselt de twee words in d0 (1234>3412)
	move.w	d0,2(a1)	; Kopieërt het hoogw. word van de Planes
	swap	d0		; Verwisselt de twee words in d0 (3412>1234)
	ADD.L	#40*256,d0	; + Lengte Bitplane -> Volgend Bitplane
	addq.w	#8,a1		; naar de volgende bplpointers in de Cop
	dbra	d1,POINTBP2	; Herhaal D1 Maal POINTBP (D1=n-1. bitplanes)
	rts


;	FLAG byte.

OpNeer:
	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,0		; BplCon1
	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

; Voeg hier het stuk copperlist in...

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

;	Plaatje...

	dcb.b	40*30,0 ; Dit stuk Nullen is noodzakelijk, omdat we
			; bij het aanwijzen  verder over en onder PIC
			; zelf gaan, en dit stuk aanwijzen. Waren hier
			; geen nullen, dan werden de Bytes aangewezen die
			; zich momenteel in dit stuk geheugen bevinden. Het
			; resultaat zou dus een Chaos op het scherm zijn.
			; Maar door $0000 wordt altijd Color00 getoont, dus
			; de achtergrond.

PIC:
	incbin  "amiga.320*256*3"	; hier laden we het plaatje in RAW
					; Formaat in
	dcb.b	40*30,0 ; Zie boven.

	end

Deze routine trekt 40 of telt 40 bij de bitplane pointers af/op. Daarvoor
wordt eerst het adres in d0 geladen, wat gebeurt met een routine die precies
het tegenovergestelde is van de routine die bitplanes aanwijst.
Met deze methode kunnen we ook beelden tonen die groter zijn dan het scherm
zelf. Als voorbeeld kent u wel de flipperspellen als PinBall Dreams e.d.
Deze hebben een speelveld dat groter is dan het scherm zelf. Er wordt
altijd het gedeelte getoont waar de bal zich momenteel bevindt. Gewoon
de pointers veranderen.
In dit voorbeeld wijzen we ook lijnen aan die niet bij het plaatje horen,
omdat we naar boven en beneden bewegen. Het beeld zelf is 256 lijnen lang,
maar we bewegen het plaatje 30 lijnen naar boven en beneden. Daarom zetten 
we een hoop nullen in het geheugen voor en achter het plaatje. Daarvoor
hebben we een dcb.b ingevoegd, die elk 30 lijnen 'simuleren'. Ze zetten 
enkel een aantal nullen in het geheugen die overeenkomen met de achtergrond
kleur. Daardoor is de zone boven en onder ons RAW-plaatje 'zuiver' en
presenteerbaar. Probeer de dcb.b's  bijvoorbeeld eens als volgt te
veranderen:

	dcb.b	40*30,%11001100

Bij het uitvoeren hiervan zult u merken dat de delen buiten het plaatje
uit streepjes bestaan. Dat klopt ook, want we hebben het geheugen gevuld
met:
	110011001100110011001100110011
	110011001100110011001100110011
	110011001100110011001100110011

Een bit-strepen-patroon...  U kunt ook de 3 bitplanes apart laten scrollen:
om dat te doen moet u enkel 1 Bitplane aanzetten:

        	    ; 5432109876543210
	dc.w	$100,%0001001000000000  ; 1 Bitplane


Dan nog de maximaal bereikbare scrollpositie veranderen:

GaBeneden:
	cmpi.l	#PIC+(40*530),d0 ; Zijn we ver genoeg beneden?
	beq.s	zetOmhoog	 ; Zo ja, dan weer omhoog...
	...			 

Daarmee ziet u alle 3 bitplanes apart scrollen, omdat ze achter elkaar
zijn geordend.

* Hier een kleine verfijning voor de Copperlist. Wat gebeurt er als we
alle 8 kleuren elke 2 lijnen veranderen? Voeg het volgende stuk eens in:

;Door 52 maal een ander palet van 8 kleuren te maken krijgen we 8*52=416
;kleuren. Maar we veranderen alleen de laatste 7 kleuren, dus de achter-
;grond niet. Deze blijft zwart. De volgorde waarin we de kleuren veranderen
;doet er niet toe. Men kan b.v. eerst Color02 veranderen, dan Color05 enz..
;Door 52 maal het veranderen van 7 kleuren te programmeren krijgen we dus
;364 effectieve kleuren tegelijkertijd op het scherm, en dat is niet slecht
;als men bedenkt dat er offiecieël maar 8 kleuren worden getoond. (7*52=364)

;2
	dc.w $18a,$102,$18e,$212,$182,$223	; color5,color7,color2
	dc.w $18c,$323,$188,$323,$186,$334,$184,$434 ; col6,col4,col3,col2
	dc.w $8007,$fffe
;3
	dc.w $18a,$104,$18e,$214,$182,$225
	dc.w $18c,$324,$188,$324,$186,$335,$184,$435
	dc.w $8207,$fffe
;4
	dc.w $18a,$203,$18e,$313,$182,$324
	dc.w $18c,$423,$188,$423,$186,$434,$184,$534
	dc.w $8407,$fffe
;5
	dc.w $18a,$213,$18e,$313,$182,$324
	dc.w $18c,$433,$188,$433,$186,$434,$184,$534
	dc.w $8607,$fffe
;6
	dc.w $18a,$114,$18e,$214,$182,$224
	dc.w $18c,$323,$188,$323,$186,$334,$184,$434
	dc.w $8807,$fffe
;7
	dc.w $18a,$101,$18e,$211,$182,$222
	dc.w $18c,$312,$188,$322,$186,$333,$184,$433
	dc.w $8a07,$fffe
;8
	dc.w $18a,$101,$18e,$211,$182,$222
	dc.w $18c,$312,$188,$312,$186,$323,$184,$423
	dc.w $8c07,$fffe
;9
	dc.w $18a,$101,$18e,$211,$182,$222
	dc.w $18c,$312,$188,$312,$186,$323,$184,$423
	dc.w $8e07,$fffe
;10
	dc.w $18a,$101,$18e,$211,$182,$222
	dc.w $18c,$322,$188,$312,$186,$323,$184,$433
	dc.w $9007,$fffe
;11
	dc.w $18a,$110,$18e,$210,$182,$221
	dc.w $18c,$321,$188,$311,$186,$322,$184,$432
	dc.w $9207,$fffe
;12
	dc.w $18a,$210,$18e,$310,$182,$321
	dc.w $18c,$421,$188,$411,$186,$422,$184,$532
	dc.w $9407,$fffe
;13
	dc.w $18a,$210,$18e,$320,$182,$331
	dc.w $18c,$431,$188,$421,$186,$432,$184,$542
	dc.w $9607,$fffe
;14
	dc.w $18a,$220,$18e,$330,$182,$431
	dc.w $18c,$441,$188,$431,$186,$442,$184,$552
	dc.w $9807,$fffe
;15
	dc.w $18a,$220,$18e,$330,$182,$431
	dc.w $18c,$440,$188,$430,$186,$441,$184,$551
	dc.w $9a07,$fffe
;16
	dc.w $18a,$220,$18e,$330,$182,$431
	dc.w $18c,$441,$188,$431,$186,$442,$184,$552
	dc.w $9c07,$fffe
;17
	dc.w $18a,$120,$18e,$230,$182,$331
	dc.w $18c,$341,$188,$331,$186,$342,$184,$452
	dc.w $9e07,$fffe
;18
	... etc.

