Obligement - L'Amiga au maximum

Dimanche 24 février 2019 - 02:11  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : Assembleur - Rouleaux de lumière
(Article écrit par François Brion et extrait d'Amiga News Tech - octobre 1991)


La routine que nous vous proposons aujourd'hui nous a été envoyée par François Brion, de la banlieue dijonnaise. Il s'agit de rouleaux de couleurs animés, à ne pas confondre avec les rasters, dont ils sont pourtant dérivés.

Le Copper, ça roule !

La routine que je vous propose permet de réaliser très simplement un effet impressionnant : des rasters multicolores qui donnent l'impression de s'enrouler sur eux-mêmes d'où le terme "rouleaux" que j'utilise.

Le principe de la routine est très simple mais l'effet est très joli. En effet, il suffit de mettre à la suite dans la liste Copper une série d'instructions MOVE avec le registre de couleur voulu (on prendra en général COLOR00) et le dégradé recherché (j'ai utilisé dans le programme un dégradé bleu et rouge). Il suffira ensuite de décaler toutes les couleurs dans la liste Copper pour donner l'impression que les barres s'enroulent.

Le Copper a besoin de deux cycles pour exécuter une instruction MOVE. Comme le DMA bitplan affiche deux pixels basse résolution (LowRes) par cycle, la couleur ne sera modifiée que tous les quatre pixels. De plus, le Copper ne peut exécuter que 56 instructions MOVE par ligne, mais comme le dégradé a besoin de 60 couleurs pour être complet, il faut le répéter 13 fois sinon la dernière ligne s'arrêtera en plein milieu de l'écran (le rouleau complet fait alors 14 lignes de raster de haut).

Pour réaliser l'animation des couleurs du rouleau, le 68000 ou le Blitter peuvent être utilisés au choix. Dans ce programme, j'ai choisi le Blitter. Il faut sauvegarder dans un registre la valeur de la première couleur, réaliser un décalage de toute la partie de la liste Copper qui concerne le rouleau, et remettre la couleur sauvegardée à la fin.

;
; François BRION pour ANT
;

	opt	c+,o+,ow-

AllocMem=-198
FreeMem=-210
FindTask=-294
CloseLibrary=-414
OpenLibrary=-552

SysCop1=$26
SysCop2=$32

Custom=$DFF000
DMACONR=$002
VPOSR=$004
VHPOSR=$006
POTGOR=$016
INTENAR=$01C
INTREQR=$01E
COP1LCH=$080
COP1LCL=$082
COP2LCH=$084
COP2LCL=$086
COPJMP1=$088
COPJMP2=$08A
DIWSTRT=$08E
DIWSTOP=$090
DDFSTRT=$092
DDFSTOP=$094
DMACON=$096
INTENA=$09A
INTREQ=$09C
BPL1PTH=$0E0
BPL1PTL=$0E2
BPL2PTH=$0E4
BPL2PTL=$0E6
BPL3PTH=$0E8
BPL3PTL=$0EA
BPL4PTH=$0EC
BPL4PTL=$0EE
BPL5PTH=$0F0
BPL5PTL=$0F2
BPL6PTH=$0F4
BPL6PTL=$0F6
BPLCON0=$100
BPLCON1=$102
BPLCON2=$104
BPL1MOD=$108
BPL2MOD=$10A
COLOR00=$180
COLOR01=$182
COLOR02=$184
COLOR03=$186
COLOR04=$188
COLOR05=$18A
COLOR06=$18C
COLOR07=$18E
COLOR08=$190
COLOR09=$192
COLOR10=$194
COLOR11=$196
COLOR12=$198
COLOR13=$19A
COLOR14=$19C
COLOR15=$19E
COLOR16=$1A0
COLOR17=$1A2
COLOR18=$1A4
COLOR19=$1A6
COLOR20=$1A8
COLOR21=$1AA
COLOR22=$1AC
COLOR23=$1AE
COLOR24=$1B0
COLOR25=$1B2
COLOR26=$1B4
COLOR27=$1B6
COLOR28=$1B8
COLOR29=$1BA
COLOR30=$1BC
COLOR31=$1BE

CIAAPRA=$BFE001

DEGRADE=60	; nb couleurs dans le dégradé
NB_DEGR=13	; nb répétitions du dégradé dans 1 rouleau
ROLSIZE=DEGRADE*NB_DEGR*2	; taille du rouleau en octets

; **********************
; * DEBUT DU PROGRAMME *
; **********************
Start	movea.l	$4.w,a6

	lea	gfxname,a1
	moveq	#0,d0
	jsr	OpenLibrary(a6)
	move.l	d0,a1
	move.l	SysCop1(a1),oldcop1
	move.l	SysCop2(a1),oldcop2
	jsr	CloseLibrary(a6)

	lea	$dff000,a6

	move.w	DMACONR(a6),d0
	ori.w	#$8200,d0
	move.w	d0,olddma

	move.w	INTENAR(a6),d0
	ori.w	#$c000,d0
	move.w	d0,oldint

	move.w	#$7fff,DMACON(a6)
	move.w	#$7fff,INTENA(a6)
	move.w	#$7fff,INTREQ(a6)

	lea	Roller1,a0	; crée le 1er rouleau
	bsr	MakeRoller
	lea	Roller2,a0	; crée le 2eme rouleau
	bsr	MakeRoller

	lea	NewCop,a0
	move.l	a0,COP1LCH(a6)
	move.w	a0,COPJMP1(a6)

	move.w	#$8280,DMACON(a6)	; dma copper seulement

; *********************
; * BOUCLE PRINCIPALE *
; *********************
Vloop	btst	#5,INTREQR+1(a6)	; attend le vbl
	beq.s	Vloop
	move.w	#$20,INTREQ(a6)

	bsr	MoveRollers

	btst	#6,CIAAPRA
	bne.s	Vloop

Ciao	move.w	#$7fff,DMACON(a6)
	move.w	#$7fff,INTENA(a6)
	move.w	#$7fff,INTREQ(a6)
	move.l	oldcop1(pc),COP1LCH(a6)
	move.l	oldcop2(pc),COP2LCH(a6)
	move.w	d0,COPJMP1(a6)
	move.w	olddma(pc),DMACON(a6)
	move.w	oldint(pc),INTENA(a6)

	moveq	#0,d0
	rts

; **********************************
; * CREE LE MOUVEMENT DES ROULEAUX *
; **********************************
MoveRollers:
	lea	Roller1+(ROLSIZE*2),a0	; 1er rouleau
	lea	-4(a0),a1
	move.w	-2(a0),d0
	move.w	#(ROLSIZE/2)-2,d1
Avant	move.l	-(a1),-(a0)
	dbra	d1,Avant
	move.w	d0,2(a0)

	lea	Roller2,a0		; 2eme rouleau
	lea	4(a0),a1
	move.w	2(a0),d0
	move.w	#(ROLSIZE/2)-2,d1
Arriere	move.l	(a1)+,(a0)+
	dbra	d1,Arriere
	move.w	d0,-2(a1)
	rts

; ****************************************
; * CREE LES ROULEAUX DANS LA COPPERLIST *
; ****************************************
MakeRoller:
	moveq	#NB_DEGR-1,d0
.make	moveq	#0,d1

	moveq	#14,d2
.roll1	move.w	#$0180,(a0)+	; rouge 0 -> rouge 15
	move.w	d1,(a0)+
	addi.w	#$0100,d1
	dbra	d2,.roll1
	move.w	#$0180,(a0)+
	move.w	d1,(a0)+

	moveq	#14,d2
.roll2	move.w	#$0180,(a0)+	; rouge 14 -> rouge 0
	subi.w	#$0100,d1
	move.w	d1,(a0)+
	dbra	d2,.roll2

	moveq	#14,d2
.roll3	move.w	#$0180,(a0)+	; bleu 1 -> bleu 15
	addq.w	#$0001,d1
	move.w	d1,(a0)+
	dbra	d2,.roll3

	moveq	#13,d2
.roll4	move.w	#$0180,(a0)+	; bleu 14 -> bleu 0
	subq.w	#$0001,d1
	move.w	d1,(a0)+
	dbra	d2,.roll4

	dbra	d0,.make
	rts

; **********************
; * DONNES EN FAST-RAM *
; **********************
gfxname	dc.b	"graphics.library",0
	even

oldcop1	ds.l	1
oldcop2	ds.l	1
olddma	ds.w	1
oldint	ds.w	1

; ***********************
; * DONNEES EN CHIP-RAM *
; ***********************
	section	CHIP,DATA_C

NewCop	dc.w	DIWSTRT,$2c81,DIWSTOP,$2cc1
	dc.w	DDFSTRT,$0038,DDFSTOP,$00d0
	dc.w	BPLCON0,$0000
	dc.w	COLOR00,$0000

	dc.w	$2c31,$fffe
Roller1	ds.w	ROLSIZE
	dc.w	COLOR00,$0000

	dc.w	$d931,$fffe
Roller2	ds.w	ROLSIZE
	dc.w	COLOR00,$0000

	dc.l	-2

	END


[Retour en haut] / [Retour aux articles]