
; Listing4b.s	Tonen van een beeld in 320*256 met 3 Planes (8 kleuren)



 SECTION CIPenCOP,CODE	; Fast is OK

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

;******************************************************************************
;Hier laten we onze BPLPOINTERS in de copperlist onze Bitplanes aanwijzen
;******************************************************************************

	MOVE.L	#PIC,d0		; In d0 komt het adres van onze PIC.
				; d.w.z. waar het eerste bitplane staat.

	LEA	BPLPOINTERS,A1	; in a1 komt het adres van de Bitplane
				; pointer van de Copperlist
	MOVEQ	#2,D1		; Aantal Bitplanes -1 (hier zij het er 3)
				; voor de DBRA - Cyclus
POINTBP:
	move.w	d0,6(a1)   ; kopieërt het Laagwaardige Word van het Adres
			   ; van de Plane in het correcte Word van de
			   ; Copperlist
	swap	d0	   ; Verwisselt het 2e Word van d0 (B.v.:1234 >3412)
			   ; Het hoogwaardige Word komt op de plaats van het 
			   ; Laagwaardige Word, daardoor kunnen we Move.W
			   ; gebruiken!
	move.w  d0,2(a1)   ; kopieërt het hoogwaardige Word van het Adres
			   ; van de Plane in het correcte Word van de
			   ; Copperlist
	swap	d0	   ; verwisselt het 2e Word van d0 (B.v.:3412 >1234)
			   ; Dit herstelt dus het adres.
	ADD.L	#40*256,d0 ; We tellen 10240 bij D0 op, zodat we het tweede
			   ; Bitplane 'aan wijzen' (Dit bevindt zich na het
			   ; eerste). We tellen dus de lengte van 1 Bitplane
			   ; erbij op. In de volgende doorgangen wijzen we 
			   ; naar het derde, vierde enz..

	addq.w  #8,a1		; a1 bevat nu het adres van de volgende
				; Bplpointers in de Copperlist, die we
				; moeten hebben.
	dbra	d1,POINTBP	; Herhaal D1 Maal POINTBP
				; (D1=Num. of Bitplanes)

	move.l	#COPPERLIST,$dff080	; COP1LC - Pointer naar onze COP
	move.w	d0,$dff088		; COPJMP1 - Starten van onze COP

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

mouse:	
	btst	#6,$bfe001	; linker Muisknop gedruckt?
	bne.s	mouse		; Zo niet,terug naar Mouse:

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

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

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

	SECTION GRAPHIC,DATA_C

COPPERLIST:

	; De Sprites laten we op 0 zetten, om ze te elimineren. Anders
	; vliegen ze ons om de oren...

	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

; BPLCON0 ($dff100) voor een beeld met 3 Planes (8 kleuren) instellen:

		    ; 5432109876543210
	dc.w	$100,%0011001000000000	; bits 13 en 12 an!! (3 = %011)

;	We laten de Bitplanes direct aanwijzen, als we de registers $dff0e0
;	en volgenden hier in de copperlist zetten. De adressen van de 
;	bitplanes worden dan door de routine POINTBP hierin gezet.

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

;	Hier definieëren we de 8 kleuren van het plaatje...

	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 eventuele WAIT-effecten in

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

PIC:
	incbin	"amiga.320*256*3"	; Hier laden we het beeld in RAW in.

	end



Zoals u gezien heeft komen in deze Listing geen gesynchroniseerde routines
voor, alleen routines die de Bitplanes en hun copperlist aanwijzen.
Probeer als eerste eens de Sprite-Pointers met een ';' voor aan de regel
te voorzien:

;	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

Nu kan het zijn dat er (als u een niet al te snelle Amiga heeft) af en toe
snelle strepen voorbij schieten. Dat zijn de Sprites die nog geen vorm
hebben toegekend gekregen, en die als een wilde rondvliegen. We zullen in
Les 7 leren hoe we ze temmen.

Probeer nu eens voor het einde van de copperlist enkele waits in te voegen,
en u zult merken hoe gemakkelijk "Wait+Color"'s zijn om de Horizontale
kleurverlopen te maken, zonder van kleur te wisselen. En dat alles is GRATIS
d.w.z. een plaatje van 8 kleuren kan er makkelijk als een plaatje van 300
uitzien.

Als eerste 'verbetering', voegt u eens het volgende gedeelte met 
kleurverlopen in voor het einde van de copperlist ($ffff,$fffe):

	dc.w	$a907,$FFFE	; wacht op lijn $a9
	dc.w	$180,$001	; Donker blauw
	dc.w	$aa07,$FFFE	; Lijn $aa
	dc.w	$180,$002	; Een beetje lichter Blauw
	dc.w	$ab07,$FFFE	; Lijn $ab
	dc.w	$180,$003	; Een beetje lichter Blauw
	dc.w	$ac07,$FFFE	; Volgende Lijn
	dc.w	$180,$004	; Een beetje lichter Blauw
	dc.w	$ad07,$FFFE	; Volgende Lijn
	dc.w	$180,$005	; Een beetje lichter Blauw
	dc.w	$ae07,$FFFE	; Volgende Lijn
	dc.w	$180,$006	; Blauw op 6
	dc.w	$b007,$FFFE	; Sla 2 Lijnen over
	dc.w	$180,$007	; Blauw op 7
	dc.w	$b207,$FFFE	; Sla 2 Lijnen over
	dc.w	$180,$008	; Blauw op 8
	dc.w	$b507,$FFFE	; Sla 3 Lijnen over
	dc.w	$180,$009	; Blauw op 9
	dc.w	$b807,$FFFE	; Sla 3 Lijnen over
	dc.w	$180,$00a	; Blauw op 10
	dc.w	$bb07,$FFFE	; Sla 3 Lijnen over
	dc.w	$180,$00b	; Blauw op 11
	dc.w	$be07,$FFFE	; Sla 3 Lijnen over
	dc.w	$180,$00c	; Blauw op 12
	dc.w	$c207,$FFFE	; Sla 4 Lijnen over
	dc.w	$180,$00d	; Blauw op 13
	dc.w	$c707,$FFFE	; Sla 7 Lijnen over
	dc.w	$180,$00e	; Blauw op 14
	dc.w	$ce07,$FFFE	; Sla 6 Lijnen over
	dc.w	$180,$00f	; Blauw op 15
	dc.w	$d807,$FFFE	; Sla 10 Lijnen overn
	dc.w	$180,$11F	; Helderder...
	dc.w	$e807,$FFFE	; Sla 16 Lijnen over
	dc.w	$180,$22F	; Helderder...
	dc.w	$ffdf,$FFFE	; EINDE VAN DE NTSC-ZONE (Lijn $FF)
	dc.w	$180,$33F	; Helderder...
	dc.w	$2007,$FFFE	; Lijn $20+$FF = Lijn $1ff (287)
	dc.w	$180,$44F	; Helderder...


We hebben zo uit het niets, zonder vreemde effecten, een kleurverloop 
gemaakt die het totaal aantal kleuren op het scherm van 8 op 27 brengt...
We voegen nog 7 kleuren toe, maar deze keer alleen de achtergrond ($dff180):

	dc.w	$0180,$000	; color0
	dc.w	$0182,$550	; color1	; We veranderen de kleur van
	dc.w	$0184,$ff0	; color2	; 'AMIGA' in GEEL!
	dc.w	$0186,$cc0	; color3
	dc.w	$0188,$990	; color4
	dc.w	$018a,$220	; color5
	dc.w	$018c,$770	; color6
	dc.w	$018e,$440	; color7

	dc.w	$7007,$fffe	; We wachten het einde van 'AMIGA' af...

Met 45 "dc.w"'s hebben we een onschuldig 8 kleuren plaatje tot 34 kleuren
opgekrikt, en daarmee dus ook de 32-kleuren-limiet van 5 bitplanes
overschreden!

Alleen door het rechtstreeks programmeren van de Copper in Assembler kan men
de grafische mogelijkheden van de Amiga benutten: Nu kunt u een plaatje in
320 kleuren maken, simpelweg door tientallen keren de waarde van een van de
32 kleurregisters te veranderen. Nu begrijpt u mischien waarom sommige
spellen het voor elkaar krijgen zoveel kleuren op het scherm te krijgen.

Breng een paar veranderingen aan, da's altijd goed om van te leren.
Probeer b.v. eens de Balken van les 3 in de achtergrond te krijgen. 
Simpelweg in een andere textbuffer laden, routine 'uitknippen' en invoegen
in deze listing. Als u dat voor elkaar krijgt, zit u goed.