
; Listing6m.s	"Stuiter-effect" d.m.v. een tabel.


	SECTION	CIPenCOP,CODE

Begin:
	move.l	4.w,a6		; Execbase
	jsr	-$78(a6)	; Disable
	lea	GfxName(PC),a1	; Naam van de Lib
	jsr	-$198(a6)	; OpenLibrary
	move.l	d0,GfxBase	;
	move.l	d0,a6
	move.l	$26(a6),OldCop	; Opslaan oude cop.

;	POINTEN Naar onze bitplanes.

	MOVE.L	#PIC,d0		; waarheen pointen
	LEA	BPLPOINTERS,A1	; COP - Pointers
	MOVEQ	#2,D1		; Aantal Bitplanes -1 (hier 3)
				; voor de DBRA-cyclus
POINTBP:
	move.w	d0,6(a1)
	swap	d0		
	move.w	d0,2(a1)	
	swap	d0		;
	ADD.L	#40*256,d0	; + Lengte Bitplane

	addq.w	#8,a1
	dbra	d1,POINTBP

	move.l	#COPPERLIST,$dff080	; COP1LC - onze COP
	move.w	d0,$dff088		; COPJMP1 - Start onze COP
	move.w	#0,$dff1fc		; FMODE - Deactiveert AGA
	move.w	#$c00,$dff106		; BPLCON3 - Deactiveert AGA

mouse:
	cmpi.b	#$ff,$dff006	
	bne.s	mouse
	
	bsr.w	BOING		; Laat het beeld 'springen'. Hiervoor
				; gebruiken we een tabel.

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

	btst	#6,$bfe001	
	bne.s	mouse

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

	move.l	4.w,a6
	jsr	-$7e(a6)	; Enable
	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 keer gebruiken we een tabel, die de waarden bevat die van de 
; bitplane-pointers afgetrokken worden. Daardoor simuleren we de 'stuiter'-
; beweging v.h. beeld, en niet een 'lelijke' op en neer beweging met
; add.l #40 en/of sub.l #40.
; We hebben dus een tabel nodig die deze waarden bevat. Dit moeten dan ook
; veelvouden van 40 zijn, waarbij 2*40 een sprong van 2 lijnen betekent,
; 3*40 3 lijnen enz...:
;
;	dc.l	40,40,2*40,2*40 ; Voorbeeld...
;
; Om in de beginpositie terug te komen,als we eenmal beneden zijn, moeten
; we evenveel optellen als we afgetrokken hebben. Maar omdat in de routine
; een aftrekking staat:
;
;	sub.l	d1,d0	; Trek de waarde uit de tabel (d1) van het adres
;			; waard de bplpointer momenteel naar wijst.
;
; Hoe trekken we dan in iets op om weer boven te komen? Simpel!! Gewoon
; negatieve getallen aftrekken. ('-' plus '-' wordt '+'!!).
; V.B.: Hoeveel is 10-(-1)? Jep, 11!. Dus staan er in de tabel negatieve
; waarden, nadat we het 'einde' bereikt hebben.
;
;	dc.l	-8*40,-6*40,-5*40		; ga weer omhoog
;
; een sub.l #-8*40 is hetzelfde als add.l #8*40.
; Denk er wel aan dat negatieve getallen het teken (positief of negatief)
; met het hoogste bit opslaan! Een -40 is dus een $ffffffd8, en daarom zijn
; de waarden in de tabel ook Longword, en niet Word. Gewoon omdat we 
; negatieve getallen nodig hebben. Word is alleen maar positief.
;
; Een
;
; dc.w -40
;
; wordt niet geassembleerd. Dit geeft een foutmelding. U moet een LONG 
; gebruiken als u negatieve getallen nodig heeft.
;
; Omdat we .L-waarden gebruiken, moeten we ook de routine een tikkie
; aanpassen:
;
; ADDQ.L #4,BOINGTABPOINT
; EindeBOINGTAB-4
; dc.l BOINGTAB-4
;
; en niet:
;
; ADDQ.L #2,BOINGTABPOINT
; EindeBOINGTAB-2
; dc.l BOINGTAB-2
;
; Wat het verschuiven van het beeld betreft zijn er geen nieuwtjes: We halen
; het adres van de bitplane-pointers, doen onze SUB met de uit de tabel
; gelezen waarde, en schrijven het nieuwe berekende adres terug.


BOING:
	LEA	BPLPOINTERS,A1	; Met deze 4 instructies halen we uit de
	move.w	2(a1),d0	; Copperlist het Adres, waarnaar $dff0e0
	swap	d0		; momenteel point, en geven die waarde
	move.w	6(a1),d0	; in d0

	ADDQ.L	#4,BOINGTABPOINT	; Point naar het volgende Longword
	MOVE.L	BOINGTABPOINT(PC),A0	; Adres,dat in het .L BOINGTABPOINT
					; staat wordt in a0 gekopieërd
	CMP.L	#EindeBOINGTAB-4,A0	; Zijn we bij de laatste waarde?
	BNE.S	NOBSTART2		; Zo niet, ga verder
	MOVE.L	#BOINGTAB-4,BOINGTABPOINT ; Start weer bij het eerste Long
NOBSTART2:
	MOVE.l	(A0),d1		; kopieër het Long uit de Tabel in d1

	sub.l	d1,d0		; Trek de waarde uit de tabel af, waardoor
				; scrollt het Beeld op of neer

	LEA	BPLPOINTERS,A1	; Pointer in de COPPERLIST
	MOVEQ	#2,D1		; Aantal Bitplanes -1 (hier 3)


POINTBP2:
	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,POINTBP2 
	rts


BOINGTABPOINT:		   
	dc.l	BOINGTAB-4 

;	De Tabel met 'voorberekende' waarden.

BOINGTAB:
	dc.l	0,0,0,0,0,0,40,40,40,40,40,40,40,40,40	  ; Zakken
	dc.l	40,40,2*40,2*40
	dc.l	2*40,2*40,2*40,2*40,2*40
	dc.l	3*40,3*40,3*40,3*40,3*40,4*40,4*40,4*40,5*40,5*40
	dc.l	6*40,8*40					; Helemaal
								; Beneden
								
	dc.l	-8*40,-6*40,-5*40				; stijgen
	dc.l	-5*40,-4*40,-4*40,-4*40,-3*40,-3*40,-3*40,-3*40,-3*40
	dc.l	-2*40,-2*40,-2*40,-2*40,-2*40
	dc.l	-2*40,-2*40,-40,-40
	dc.l	-40,-40,-40,-40,-40,-40,-40,-40,-40,0,0,0,0,0	; Helemaal
EindeBOINGTAB:							; Boven



	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 Normaalwaarden)
	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
	dc.w	$100,%0011001000000000  ; Bits 12 +13 aan! (3 = %011)

BPLPOINTERS:
	dc.w $e0,$0000,$e2,$0000	;1e Bitplane
	dc.w $e4,$0000,$e6,$0000	;2e Bitplane
	dc.w $e8,$0000,$ea,$0000	;3e Bitplane

	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

	dcb.b	80*40,0 ; OP 0 gezet geheugen voor het bitplane.

PIC:
	incbin	"amiga.320*256*3"	; Plaatje in RAW



	end

Een spel of demo programmeren betekent ook een HELE HOOP tabellen maken. De
Tabel in deze listing zou u ook kunnen gebruiken om een mannetje  in een
platform-spel te laten springen. De slecht geprogrammeerde spellen/demo's
kunt u meestal herkennen aan de onnatuurlijke beweging van de figuren.
Stelt u zich voor: uw 'held' springt eerst door een rij Sub's omhoog in een
rechte lijn, en zakt daarna weer in een rechte lijn met add's. Bah. Ook de
golf-bewegingen van de buitenaardse wezens in een shoot-em-up zijn het
resultaat van een tabel. De nog betere programmeurs compliceren het dan nog
een stukje extra: Ze maken een aparte tabel afhankelijk voor waar het 
mannetje staat, en b.v. hoe lang de vuurknop wordt ingedrukt.  Dan tellen
ze b.v. nog de berekende waarden erbij op (afhankelijk van de snelheid van
het poppetje e.d.) en dan zijn de bewegingen bijna perfect! In extreme
gevallen zoals flipperspellen, moet de bal berekend worden aan de hand van
de hoek van inval,snelheid, zwaartekracht en terug-werkende kracht enz..
Maar ook hier worden vaak tabellen gebruikt. B.v. om het beeld op en neer
te scrollen. Bekijk dus goed de afgelopen routines om straks zelf ook een
mooi resultaat te krijgen met b.v. de Copper om deze op een grappige manier
te bewegen.

Verwissel de tabel eens met deze om het verschil te zien:

BOINGTAB:
	dc.l	0,0,40,40,40,40,40,40,40,40,40		; Boven
	dc.l	40,40,2*40,2*40
	dc.l	2*40,2*40,2*40,2*40,2*40		; Optrekken
	dc.l	3*40,3*40,3*40,3*40,3*40
	dc.l	3*40,3*40,3*40,3*40,3*40
	dc.l	2*40,2*40,2*40,2*40,2*40		; Remmen
	dc.l	2*40,2*40,40,40
	dc.l	40,40,40,40,40,40,40,40,40,0,0,0,0,0,0,0 ; Onder
	dc.l	-40,-40,-40,-40,-40,-40,-40,-40,-40
	dc.l	-40,-40,-2*40,-2*40
	dc.l	-2*40,-2*40,-2*40,-2*40,-2*40
	dc.l	-3*40,-3*40,-3*40,-3*40,-3*40		; Optrekken
	dc.l	-3*40,-3*40,-3*40,-3*40,-3*40
	dc.l	-2*40,-2*40,-2*40,-2*40,-2*40		; Remmen
	dc.l	-2*40,-2*40,-40,-40
	dc.l	-40,-40,-40,-40,-40,-40,-40,-40,-40,0,0,0,0,0 ; Weer 
EindeBOINGTAB:						      ; boven


