Obligement - L'Amiga au maximum

Vendredi 24 mai 2019 - 04:54  

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 - RGB plasma
(Article écrit par Emmanuel Hocdet et extrait d'Amiga News Tech - mars 1992)


Eh oui, encore du plasma ! Vous compléterez ainsi votre collection avec ce source qui utilise pleinement les deux Hercule de l'Amiga : MM. Copper et Blitter. Alors au boulot...

Bien sûr, vous connaissez le plasma, si fréquemment employé dans les démos. Quelques-unes se différencient pourtant par l'utilisation de trois sources de couleurs, notamment le rouge, le vert et le bleu (d'où le terme RVB, d'ailleurs). Ce système permet d'obtenir, en effectuant des opérations logiques entre les sources comme l'opération "or", des dégradés de couleurs en mouvement. Il est même possible, grâce à un affichage sinusoïdal des différentes sources associées à une déformation verticale, d'afficher les 4096 couleurs de l'Amiga.

Le Copper

Pour réaliser ce plasma, il suffit d'utiliser un seul registre de couleur, mais il est alors nécessaire de changer cette couleur horizontalement. C'est là qu'intervient le Copper et donc l'initialisation de la fameuse liste Copper. Pour chaque ligne de raster, on doit réaliser un "wait" puis faire suivre cette instruction par une série de "move" copiant une valeur dans le registre de couleur précédemment choisi (généralement la couleur 0, mais on peut réaliser des effets sympathiques dans des logos, par exemple, en choisissant une autre couleur). Entre chacune de ces copies, l'électron aura parcouru huit pixels, ce qui donne la précision du plasma. De plus, en variant le masque de la position horizontale du "wait", c'est-à-dire les 8 bits de poids faible de l'instruction (habituellement $fe), on peut facilement réaliser une déformation améliorant le rendu final.

Le nombre de données à traiter dans la liste Copper, vous l'imaginez, est très important et est même triplé par l'utilisation des trois sources. Voici donc le moment de s'attaquer au second coprocesseur qui se fera une joie de libérer le 68000 d'une tâche aussi ardue.

Le Blitter

Le Blitter dispose de trois sources (A, B et C) et d'une destination (D) nous permettant, grâce aux Minterms du registre BLTCON0, de réaliser différentes opérations logiques entre les trois sources. Il suffit alors que la source A pointe, par exemple, sur un dégradé rouge, B sur un dégradé vert et C sur un dégradé bleu : chacun de ces dégradés utilisant 4 bits indépendants, il est alors possible, en réalisant l'opération "A or B or C", d'obtenir de superbes variations de couleurs dans l'éventail des 4096 disponibles. Il est nécessaire, pour cela, de recopier verticalement, selon une sinusoïde précalculée, les trois sources dans la liste Copper. Il y aura donc autant d'accès Blitter que de "move" par ligne dans la liste Copper. La rapidité de ce procédé peut être utilisée pour le changement du masque du "wait" : il suffit de créer une table de "wait" que le Blitter utilisera comme source.

Le déplacement des sources de couleurs selon une sinusoïde couplé à la déformation horizontale donnera au plasma une impression de vagues déferlentes. Que ceux sujet au mal de mer s'abstiennent !

Le Blitter permet, il est vrai, de déplacer très rapidement des zones de mémoire, mais il a ses limites. L'écran de travail sera donc restreint à 320 par 256, ce qui obligera quand même le Blitter à déplacer la bagatelle de plus d'une quarantaine de blocs de 600*3 mots. Il reste juste le temps pour une musique et l'affichage de quelques sprites. Il est alors conseillé d'utiliser deux listes Copper pour réaliser l'inévitable double tampon mémoire.

Une option sympathique a été ajoutée au source : elle permet, en appuyant sur le bouton droit de la souris, de modifier le Minterm du Blitter, et donc de varier les effets de couleurs.

Listing 1 : RGB_Plasmas.s

* RGB Plasma par Emmanuel Hocdet *

D_init=$8200
D_PriB=$400
D_Btpl=$100
D_Copp=$80
D_Blit=$40
D_Spts=$20
Dcon =D_init!D_Copp!D_Blit!D_PriB!D_Btpl

        SECTION datas,code_c

debut	bsr 	SaveAll
	lea	$dff000,a6
	move	#$7fff,$9a(a6)
        move	#$7fff,$96(a6)
	clr.l	$102(a6)
	clr	$180(a6)
	move	#0,$10a(a6)

	move.l	#ITcopper,$6c.w
	move	#$c030,$9a(a6)
        move	#Dcon,$96(a6)
	bra	Plasma
fPlasma	lea	$dff000,a6
	bsr	RestoreAll
        rts

;-------------------------------------
SaveAll	move.l	4.w,a6
	jsr	-132(a6)
	move.l	$6c.w,IrqVBL
	move.w	$dff01c,INTENA
	or.w	#$c000,INTENA
	move.w	$dff002,DMACON
	or.w	#$8100,DMACON
	rts

RestoreAll
	move.w	#$7fff,$dff09a
	move.l	IrqVBL,$6c.w
	move.w	INTENA(pc),$dff09a
	move.w	#$7fff,$dff096
	move.w	DMACON(pc),$dff096
	move.l	4.w,a6
	lea	GFXlib(pc),a1
	moveq	#0,d0
	jsr	-552(a6)
	move.l	d0,a0
	move.l	38(a0),$dff080
	clr.w	$dff088
	move.l	d0,a1
	jsr	-414(a6)
	jsr	-138(a6)
fin	moveq	#0,d0
	rts
INTENA:	dc.w	0
DMACON:	dc.w	0
GFXlib:	dc.b	"graphics.library",0
	even

;------------interuptions---------------
ITcopper		*	pour le double-buffering
	move.l	#Cop_List2,$80(a6)
	move.l	#Pt_cop2+2,ATrois
        btst	#0,ecr
        beq.s	Lance
	move.l	#Cop_List1,$80(a6)
	move.l	#Pt_cop1+2,ATrois
Lance	clr.w	$88(a6)		Copperlist à afficher
jmpVBL	jmp	0
IrqVBL=jmpVBL+2

;---------------------
ecr	dc.w	0
ATrois	dc.l	Pt_cop1+2

;************************************
NBmove=47
HAUT=200

Plasma	lea	$dff000,a6	initialisation
	move.l	#-1,$44(a6)	du blitter
	clr	$42(a6)
	clr.l	$60(a6)
	clr.w	$64(a6)		modulos :
	move.w	#190,$66(a6)	(NBmove+1)*4-2
	
	move.l	#plan,d0	Adresse plan1
	lea	plan_a,a0	Copper_List1
	lea	plan_b,a1	Copper_List2
	move	d0,2(a0)	mot de poind
	move	d0,2(a1)	faible
	swap	d0
	move	d0,6(a0)	mot de poind
	move	d0,6(a1)	fort

Loop
;	move	#$fff,$180(a6)
.vsync	tst.b	$06(a6)
	bne.s	.vsync
	move	#0,$180(a6)
	btst	#6,$bfe001	bouton gauche?
	beq	fPlasma		si oui bye!

	bchg	#0,ecr
	move.l	ATrois(pc),a3	a3=Cop_List1 ou 2

**  Change le masque des 'wait'  **
	moveq	#0,d6
	move	Z(pc),d6
	addq	#2,d6
	and	#MDecal,d6
	move	d6,Z
	add.l	#Decal,d6
	move	#$9f0,$40(a6)
	move.l	d6,$50(a6)
	move.l	a3,$54(a6)
	move.w	#200*64+1,$58(a6)

**  Change le Minterm  **
	lea	4(a3),a3
	btst	#10,$dff016	bouton droite
	bne.s	chgMin
	add.b	#1,Minterm
chgMin	move	Bltcon0(pc),d6

**  Variation des courbes sinussoïdales  **
	lea	T1(pc),a4
	move	Va(pc),d3
	addq	#2,d3
	and	#MT1,d3
	move	d3,Va
	move	Vb(pc),d4
	subq	#2,d4
	and	#MT1,d4
	move	d4,Vb
	move	d3,d5

**  Copie des sources de couleurs dans la 
**  Copperlist de travail
	move	d6,$40(a6)	BLTCON0
	moveq	#NBmove-1,d7
bcl	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	move	(a4,d3),d0
	addq.w	#4,d3
	and	#MT1,d3
	add.l	#FX_rouge,d0
	move	(a4,d4),d1
	addq.w	#8,d4
	and	#MT1,d4
	add.l	#FX_vert,d1
	move	(a4,d5),d2
	subq.w	#6,d5
	and	#MT1,d5
	add.l	#FX_bleu,d2

	move.l	d0,$48(a6)		BLTC
	move.l	d1,$4c(a6)		BLTB
	move.l	d2,$50(a6)		BLTA
	move.l	a3,$54(a6)		BLTD
	move.w	#HAUT*64+1,$58(a6)	BLTSIZE
	lea	4(a3),a3
	dbf	d7,bcl

	bra	Loop


;**********************************
Z	dc.w	0
Va	dc.w	0
Vb	dc.w	0
Bltcon0	dc.b	$0f
Minterm	dc.b	$fe
 even

MT1=256*2-1		Modulo de la table de sinus

T1	include sin.b

MDecal=64*2-1		Modulo de la table de 'wait'
Decal	include	wait.b
	include	wait.b  4 fois pour 
	include	wait.b  avoir + de 200
	include	wait.b  chiffres
	include	wait.b

**	CopperLists	**

Cop_List1
plan_a	dc.w	$e2,0,$e0,0	BPL1
	dc.w	$100,$1100	BPLCON0
	dc.w	$108,-40	BPL1MOD
	dc.w	$92,$38		DDFSTRT
	dc.w	$94,$d0		DDFSTOP
	dc.w	$8e,$3781	DIWSTRT
	dc.w	$90,$ffc1	DIWSTOP
Pt_cop1:
A set $373f
	rept	HAUT
	dc.w	A,$fffe		wait
	dcb.l	47,$01820000	move
A set A+$100
	endr
	dc.l	$01820000
	dc.l	$fffffffe

Cop_List2
plan_b	dc.w	$e2,0,$e0,0
	dc.w	$100,$1100,$108,-40
	dc.w	$92,$38,$94,$d0	
	dc.w	$8e,$3781,$90,$ffc1
Pt_cop2:
B set $373f
	rept	HAUT
	dc.w	B,$fffe		wait
	dcb.l	47,$01820000	move
B set B+$100
	endr
	dc.l	$01820000
	dc.l	$fffffffe
	
**	barres de couleurs	**

FX_rouge
	ds.w	100
R set 0
	rept	15
R set R+$100
	dcb.w	8,R
	endr
	rept	15
R set R-$100
	dcb.w	8,R
	endr

FX_vert
	ds.w	100
V set 0
	rept	15
V set V+$10
	dcb.w	8,V
	endr
	rept	15
V set V-$10
	dcb.w	8,V
	endr

FX_bleu
	ds.w	100
B set 0
	rept	15
B set B+$1
	dcb.w	8,B
	endr
	rept	15
B set B-$1
	dcb.w	8,B
	endr
	ds.w	100

**	1 plan en une seule ligne grace au
**	modulo Btpl1 :  BPL1MOD
plan	dcb.b	40,$ff

Listing 2 : MakeWait.bas

assembleur

Listing 3 : MakeSin.bas

assembleur


[Retour en haut] / [Retour aux articles]