Obligement - L'Amiga au maximum

Vendredi 24 mai 2019 - 05:24  

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 - Cycle de couleurs
(Article écrit par Jérôme Étienne et extrait d'Amiga News Tech - décembre 1991)


Vous vous souvenez du crétin qui pestait contre le manque d'originalité dans le monde des démos ? Eh bien ce même crétin va vous présenter l'exemple type de ce qu'il ne faut absolument pas faire car cela relève des bases de la programmation : un superbe cycle de couleurs.

Je fais cela pour une raison bien simple : moi aussi je manque d'imagination, donc moi aussi je clone bêtement ce que font les autres... La réalisation de cet effet, plus connu sous le nom de "Plasma", maintes et maintes fois répété dans les démos, et qui consiste à faire un dessin très coloré, ligne par ligne, tout en faisant cycler les couleurs, est des plus simples : tout se fait grâce à une fonction à deux variables du type z=F(x,y), où "x" et "y" sont les coordonnées du point considéré et "z", sa couleur.

Nous allons donc balader notre point sur tout l'écran et obtenir ainsi un beau dessin. La courbe du programme qui suit est quelconque et le jeu des demomakers est, d'après ce que j'en ai compris, de faire la plus belle courbe possible. Je vous laisse donc le soin de la modifier à loisir, jusqu'à ce que le résultat vous satisfasse pleinement.

Vous remarquerez aussi que le dessin se fait à une lenteur extrême. Ceci est dû à deux choses : d'une part, il y beaucoup de points (plus précisément, 640x256=163 840) et d'autre part, pour chaque point, on doit calculer sa couleur puis le tracer. Bien que l'opération soit relativement rapide si elle est utilisée ponctuellement, elle l'est bien moins si on la répète 163 840 fois. De plus, l'écran sur lequel on trace est en haute résolution 16 couleurs, ce qui signifie que l'Amiga prend environ 90% du temps-machine rien que pour envoyer les données des bitplans au moniteur. Donc, je me retrouve avec l'équivalent d'un 68000 à 0,716 MHz pour calculer mes 163 840 (je le replace une fois de plus car les gros chiffres, c'est toujours impressionnant) points.

	opt	c-
*********************************
Execbase	=	4
custom		=	$dff000
Forbid		=	-132
Permit		=	-138
Disable		=	-120
Enable		=	-126
openlibrary	=	-552
StartList	=	38
cop1lc		=	$80
copjmp1		=	$88
dmacon		=	$96
vposr		=	$04
KeyBoard        = $bfec01

*********************************
BPL_X		=	640
BPL_Y		=	256
BPL_DEPTH	=	4
BPL_WIDTH	=	BPL_X/8
BPL_SIZE	=	BPL_WIDTH*BPL_Y


NB_COLOR	=	16

**********************************
VSYNC:	macro		* la macro habituelle pour le vsync
.LOOP_VSYNC\@:
	move.l	vposr(a6),d0
	and.l	#$1ff00,d0
	cmp.l	#\1*$100,d0
	bne.s	.LOOP_VSYNC\@
	endm

**********************************
Debut:	bsr	CLR_SCREEN
	bsr	MAIN_INIT

	lea	$dff000,a6
	clr.w	COOR_Y		*\ init les parametres de
	clr.w	COOR_X		* > la fonction
	clr.l	CURRENT_ADR_Y	*/

	bsr	Cycle_Courbe_Couleur

Vbl_Sync:
	bsr	Cycle_Courbe_Couleur

	cmp.w	#BPL_Y,COOR_Y
	bge.s	SCREEN_FINISH
	bsr	CALCUL_FONCTION		* 1 Ligne a chaque fois.
	clr.w	TIME_BETWEEN_2_CYCLE
	bra	SCREEN_NOT_FINISH	*\ Ne fais pas le vsync si
SCREEN_FINISH				*/ l'écran n'est pas fini
	vsync	$10			
SCREEN_NOT_FINISH

	btst	#6,$bfe001	*\test le bouton de la souris
	bne.s	Vbl_Sync	*/ pour quitter le programme

	bsr	MAIN_END
	moveq	#0,d0
	rts
 
******************************************************************
CALCUL_FONCTION:
	move.l	#SCREEN,d3		*\d3= adr de la ligne a
	add.l	CURRENT_ADR_Y,d3	*/ tracer

	lea	Sin_Tab(pc),a1		* a1 = table sinus
	lea	$100(a1),a2		* a2 = table cos
	clr.w	COOR_X

	move.l	#BPL_WIDTH-1,d7		* d7 = nb d'octet

LOOP_CALCUL_FONCTION_EACH_BYTE
	moveq	#8-1,d6			* d6 = nb de bit

LOOP_CALCUL_FONCTION_EACH_BIT
	moveq	#0,d0
	moveq	#0,d1
	move.w	COOR_X(pc),d0
	move.w	COOR_Y(pc),d1

* calcul des differents parametres de la fonction
	move.w	d0,d2		* d2= angle du futur cosinus
	lsl.w	#2,d2		*\x2 pour obtenir le mot du cos
				*/et par 2 pour un beau dessin.
	and.w	#$3fe,d2	* l'angle doit etre entre 0 et 512 
	move.w	(a2,d2.w),d2	* d2= le cosinus
	muls	#40,d2		* on le multiplie par 40
	lsl.l	#1,d2		*\ savante manipulation pour avoir
	clr.w	d2		* >la veritable valeur de d2
	swap	d2		*/

* les calculs ci-dessous sont sur le meme principe que ci-dessus
	move.w	d2,d4		
	move.w	d1,d2
	sub.w	d4,d2
	lsl.w	#3,d2
	and.w	#$3fe,d2
	move.w	(a2,d2.w),d2
	muls	#32,d2
	lsl.l	#1,d2
	clr.w	d2
	swap	d2
	move.w	d2,d4
* les calculs ci-dessous sont sur le meme principe que ci-dessus

	move.w	d1,d2
	lsl.w	#2,d2
	and.w	#$3fe,d2
	move.w	(a1,d2.w),d2
	muls	#40,d2
	lsl.l	#1,d2
	clr.w	d2
	swap	d2

* les calculs ci-dessous sont sur le meme principe que ci-dessus
	sub.w	d2,d0
	move.w	d0,d2
	lsl.w	#3,d2
	and.w	#$3fe,d2
	move.w	(a1,d2.w),d2
	muls	#64,d2
	lsl.l	#1,d2
	clr.w	d2
	swap	d2
	add.w	d4,d2
	
* arrive ici on a la couleur dans d2.
* On ne racalcule pas a chaque fois l'adresse du point pour gagner
* du temps d'execution.
	move.w	COOR_X,d0	*\
	and.w	#$0007,d0	* >d0= du bit ou se trouve le point
	neg.w	d0		* /
	addq.w	#7,d0		*/
	and.w	#NB_COLOR-1,d2	*\ -1 pour que la couleur reste
	or.w	#1,d2		*/ entre 1 et NB_COLOR
	
	move.l	d3,a0		*\a0= adr de l'octet ou se trouve
			 	*/ le point actuel
* trace le point dont la couleur est dans d2	
	moveq	#BPL_DEPTH-1,d4
EACH_BPL:
	lsr.w	#1,d2
	bcc.s	CLR_BIT_IN_THIS_BPL
	bset	d0,(a0)
	add.l	#BPL_SIZE,a0
	dbf	d4,EACH_BPL
	bra.s	POINT_FINISH
CLR_BIT_IN_THIS_BPL
	bclr	d0,(a0)
	add.l	#BPL_SIZE,a0
	dbf	d4,EACH_BPL
POINT_FINISH

* continue de tracer des points dans l'octet courant
* et si ils sont tous faits on passe apres.
	addq.w	#1,COOR_X
	dbf	d6,LOOP_CALCUL_FONCTION_EACH_BIT

* continue de tracer dans les octets
* et si ils sont tous fait on s'en va.
	addq.l	#1,d3
	dbf	d7,LOOP_CALCUL_FONCTION_EACH_BYTE

* on incremente les parametres pour faire
* la ligne suivante la prochaine fois
	add.l	#BPL_WIDTH,CURRENT_ADR_Y
	addq.w	#1,COOR_Y
	rts

COOR_X:		ds.w	1
COOR_Y:		ds.w	1
CURRENT_ADR_Y:	ds.l	1

***********************************************************
* Cette routine s'occupe du cycle couleur
Cycle_Courbe_Couleur:
	subq.w	#1,TIME_BETWEEN_2_CYCLE
	tst.w	TIME_BETWEEN_2_CYCLE
	bgt	Fin_Cycle_Courbe_Couleur

	lea	ADR_CMAP_IN_CLIST,a0
	addq.l	#2,a0		* a0 --> registre couleur.

	lea	TAB_DEGRADE_COULEUR(pc),a1

	move.w	CURRENT_POS_TAB_DEGRADE_COULEUR,d0

	moveq	#NB_COLOR-1,d2

LOOP_Cycle_Courbe_Couleur:
	and.w	#NB_COLOR-1,d0
	move.w	d0,d1
	add.w	d1,d1
	move.w	(a1,d1.w),(a0)
	addq.l	#4,a0
	addq.w	#1,d0

	dbf	d2,LOOP_Cycle_Courbe_Couleur

	addq.w	#1,CURRENT_POS_TAB_DEGRADE_COULEUR
	move.w	#5,TIME_BETWEEN_2_CYCLE
Fin_Cycle_Courbe_Couleur:
	rts

TIME_BETWEEN_2_CYCLE:			ds.w	1
CURRENT_POS_TAB_DEGRADE_COULEUR:	ds.w	1
TAB_DEGRADE_COULEUR:
	dc.w	$0f00,$0d02,$0b04,$0906
	dc.w	$0708,$050a,$030c,$010e,$f
	dc.w	$010e,$030c,$050a,$0708
	dc.w	$0906,$0b04,$0d02

***************************************************************
* Cette routine efface les bitplans
CLR_SCREEN:
	move.w	#BPL_WIDTH*BPL_Y*BPL_DEPTH/4-1,d0

	lea	SCREEN,a0
LOOP_CLR_SCREEN:
	clr.l	(a0)+
	dbf	d0,LOOP_CLR_SCREEN
	rts	

***************************************************************
* Cette routine initialise les bitplans dans la copperlist
INIT_CLIST:
	lea	ADR_BPL_IN_CLIST,a0
	move.l	#SCREEN,d0

	moveq	#BPL_DEPTH-1,d1
.LOOP_INIT_BPL_IN_CLIST
	swap	d0
	move.w	d0,(a0)
	addq.l	#4,a0
	swap	d0
	move.w	d0,(a0)
	addq.l	#4,a0
	add.l	#BPL_SIZE,d0
	dbf	d1,.LOOP_INIT_BPL_IN_CLIST
	rts

******************************************************************
MAIN_INIT:
	move.l	(execbase).w,a6
	lea	custom,a5
	jsr	Forbid(a6)	
	jsr	Disable(a6)	
	move.w	#$03e0,dmacon(a5)
	bsr	INIT_CLIST
	move.l	#CLIST,cop1lc(a5)
	clr.w	copjmp1(a5)
	move.w	#$8380,dmacon(a5)
	lea	custom,a6
	rts	

*************************************************************
MAIN_END:
	move.l	(execbase).w,a6
	lea	custom,a5
	move.l	#GfxName,a1		*\
	moveq	#0,d0			* >-remet l'ancienne copper
	jsr	OpenLibrary(a6)		* > list
	move.l	d0,a4			* >
	move.l	StartList(a4),cop1lc(a5)
	move.w	d0,copjmp1(a5)		
	move.w	#$83e0,dmacon(a5)
	jsr	Enable(a6)	
	jsr	Permit(a6)	
	lea	custom,a6
	rts	
 
GfxName	dc.b	"graphics.library",0
	even

*************************************************************
* a remplacer par un include avec le programme
* pour init les sinus en gfa paru precedemment.
sin_tab	dc.w  $0000,$0192,$0324,$04B6,$0647,$07D9,$096A,$0AFB
	dc.w  $0C8B,$0E1B,$0FAB,$1139,$12C8,$1455,$15E2,$176D
	dc.w  $18F8,$1A82,$1C0B,$1D93,$1F19,$209F,$2223,$23A6
	dc.w  $2528,$26A8,$2826,$29A3,$2B1F,$2C98,$2E11,$2F87
	dc.w  $30FB,$326E,$33DE,$354D,$36BA,$3824,$398C,$3AF2
	dc.w  $3C56,$3DB8,$3F17,$4073,$41CE,$4325,$447A,$45CD
	dc.w  $471C,$4869,$49B4,$4AFB,$4C3F,$4D81,$4EBF,$4FFB
	dc.w  $5133,$5269,$539B,$54CA,$55F5,$571D,$5842,$5964
	dc.w  $5A82,$5B9D,$5CB4,$5DC7,$5ED7,$5FE3,$60EC,$61F1
	dc.w  $62F2,$63EF,$64E8,$65DD,$66CF,$67BD,$68A6,$698C
	dc.w  $6A6D,$6B4A,$6C24,$6CF9,$6DCA,$6E96,$6F5F,$7023
	dc.w  $70E2,$719E,$7255,$7307,$73B5,$745F,$7504,$75A5
	dc.w  $7641,$76D9,$776C,$77FA,$7884,$7909,$798A,$7A05
	dc.w  $7A7D,$7AEF,$7B5D,$7BC5,$7C29,$7C89,$7CE3,$7D39
	dc.w  $7D8A,$7DD6,$7E1D,$7E5F,$7E9D,$7ED5,$7F09,$7F38
	dc.w  $7F62,$7F87,$7FA7,$7FC2,$7FD8,$7FE9,$7FF6,$7FFD
	dc.w  $7fff,$7FFD,$7FF6,$7FE9,$7FD8,$7FC2,$7FA7,$7F87
	dc.w  $7F62,$7F38,$7F09,$7ED5,$7E9D,$7E5F,$7E1D,$7DD6
	dc.w  $7D8A,$7D39,$7CE3,$7C89,$7C29,$7BC5,$7B5D,$7AEF
	dc.w  $7A7D,$7A05,$798A,$7909,$7884,$77FA,$776C,$76D9
	dc.w  $7641,$75A5,$7504,$745F,$73B5,$7307,$7255,$719E
	dc.w  $70E2,$7023,$6F5F,$6E96,$6DCA,$6CF9,$6C24,$6B4A
	dc.w  $6A6D,$698C,$68A6,$67BD,$66CF,$65DD,$64E8,$63EF
	dc.w  $62F2,$61F1,$60EC,$5FE3,$5ED7,$5DC7,$5CB4,$5B9D
	dc.w  $5A82,$5964,$5842,$571D,$55F5,$54CA,$539B,$5269
	dc.w  $5133,$4FFB,$4EBF,$4D81,$4C3F,$4AFB,$49B4,$4869
	dc.w  $471C,$45CD,$447A,$4325,$41CE,$4073,$3F17,$3DB8
	dc.w  $3C56,$3AF2,$398C,$3824,$36BA,$354D,$33DE,$326E
	dc.w  $30FB,$2F87,$2E11,$2C98,$2B1F,$29A3,$2826,$26A8
	dc.w  $2528,$23A6,$2223,$209F,$1F19,$1D93,$1C0B,$1A82
	dc.w  $18F8,$176D,$15E2,$1455,$12C8,$1139,$0FAB,$0E1B
	dc.w  $0C8B,$0AFB,$096A,$07D9,$0647,$04B6,$0324,$0192
	dc.w  $0000,$FE6E,$FCDC,$FB4A,$F9B9,$F827,$F696,$F505
	dc.w  $F375,$F1E5,$F055,$EEC7,$ED38,$EBAB,$EA1E,$E893
	dc.w  $E708,$E57E,$E3F5,$E26D,$E0E7,$DF61,$DDDD,$DC5A
	dc.w  $DAD8,$D958,$D7DA,$D65D,$D4E1,$D368,$D1EF,$D079
	dc.w  $CF05,$CD92,$CC22,$CAB3,$C946,$C7DC,$C674,$C50E
	dc.w  $C3AA,$C248,$C0E9,$BF8D,$BE32,$BCDB,$BB86,$BA33
	dc.w  $B8E4,$B797,$B64C,$B505,$B3C1,$B27F,$B141,$B005
	dc.w  $AECD,$AD97,$AC65,$AB36,$AA0B,$A8E3,$A7BE,$A69C
	dc.w  $A57E,$A463,$A34C,$A239,$A129,$A01D,$9F14,$9E0F
	dc.w  $9D0E,$9C11,$9B18,$9A23,$9931,$9843,$975A,$9674
	dc.w  $9593,$94B6,$93DC,$9307,$9236,$916A,$90A1,$8FDD
	dc.w  $8F1E,$8E62,$8DAB,$8CF9,$8C4B,$8BA1,$8AFC,$8A5B
	dc.w  $89BF,$8927,$8894,$8806,$877C,$86F7,$8676,$85FB
	dc.w  $8583,$8511,$84A3,$843B,$83D7,$8377,$831D,$82C7
	dc.w  $8276,$822A,$81E3,$81A1,$8163,$812B,$80F7,$80C8
	dc.w  $809E,$8079,$8059,$803E,$8028,$8017,$800A,$8003
	dc.w  $8000,$8003,$800A,$8017,$8028,$803E,$8059,$8079
	dc.w  $809E,$80C8,$80F7,$812B,$8163,$81A1,$81E3,$822A
	dc.w  $8276,$82C7,$831D,$8377,$83D7,$843B,$84A3,$8511
	dc.w  $8583,$85FB,$8676,$86F7,$877C,$8806,$8894,$8927
	dc.w  $89BF,$8A5B,$8AFC,$8BA1,$8C4B,$8CF9,$8DAB,$8E62
	dc.w  $8F1E,$8FDD,$90A1,$916A,$9236,$9307,$93DC,$94B6
	dc.w  $9593,$9674,$975A,$9843,$9931,$9A23,$9B18,$9C11
	dc.w  $9D0E,$9E0F,$9F14,$A01D,$A129,$A239,$A34C,$A463
	dc.w  $A57E,$A69C,$A7BE,$A8E3,$AA0B,$AB36,$AC65,$AD97
	dc.w  $AECD,$B005,$B141,$B27F,$B3C1,$B505,$B64C,$B797
	dc.w  $B8E4,$BA33,$BB86,$BCDB,$BE32,$BF8D,$C0E9,$C248
	dc.w  $C3AA,$C50E,$C674,$C7DC,$C946,$CAB3,$CC22,$CD92
	dc.w  $CF05,$D079,$D1EF,$D368,$D4E1,$D65D,$D7DA,$D958
	dc.w  $DAD8,$DC5A,$DDDD,$DF61,$E0E7,$E26D,$E3F5,$E57E
	dc.w  $E708,$E893,$EA1E,$EBAB,$ED38,$EEC7,$F055,$F1E5
	dc.w  $F375,$F505,$F696,$F827,$F9B9,$FB4A,$FCDC,$FE6E
	dc.w  $0000,$0192,$0324,$04B6,$0647,$07D9,$096A,$0AFB
	dc.w  $0C8B,$0E1B,$0FAB,$1139,$12C8,$1455,$15E2,$176D
	dc.w  $18F8,$1A82,$1C0B,$1D93,$1F19,$209F,$2223,$23A6
	dc.w  $2528,$26A8,$2826,$29A3,$2B1F,$2C98,$2E11,$2F87
	dc.w  $30FB,$326E,$33DE,$354D,$36BA,$3824,$398C,$3AF2
	dc.w  $3C56,$3DB8,$3F17,$4073,$41CE,$4325,$447A,$45CD
	dc.w  $471C,$4869,$49B4,$4AFB,$4C3F,$4D81,$4EBF,$4FFB
	dc.w  $5133,$5269,$539B,$54CA,$55F5,$571D,$5842,$5964
	dc.w  $5A82,$5B9D,$5CB4,$5DC7,$5ED7,$5FE3,$60EC,$61F1
	dc.w  $62F2,$63EF,$64E8,$65DD,$66CF,$67BD,$68A6,$698C
	dc.w  $6A6D,$6B4A,$6C24,$6CF9,$6DCA,$6E96,$6F5F,$7023
	dc.w  $70E2,$719E,$7255,$7307,$73B5,$745F,$7504,$75A5
	dc.w  $7641,$76D9,$776C,$77FA,$7884,$7909,$798A,$7A05
	dc.w  $7A7D,$7AEF,$7B5D,$7BC5,$7C29,$7C89,$7CE3,$7D39
	dc.w  $7D8A,$7DD6,$7E1D,$7E5F,$7E9D,$7ED5,$7F09,$7F38
	dc.w  $7F62,$7F87,$7FA7,$7FC2,$7FD8,$7FE9,$7FF6,$7FFD

************************************************************************
* pour que la copper list et les bitplans soit en chip ram.
	section	copper_list,DATA_C 

CLIST:	dc.w	$008E,$2b81		*\
	dc.w	$0090,$2bc1		* >init un ecran de 640*256
	dc.w	$0092,$0038		* >
	dc.w	$0094,$00d0		*/
	dc.w	$0108,$0000,$010A,$0000
	dc.w	$0100,$0200,$0102,$0000,$0104,$0000

ADR_CMAP_IN_CLIST:
	dc.w	$0180,$0000,$0182,$0000,$0184,$0000,$0186,$0000
	dc.w	$0188,$0000,$018a,$0000,$018c,$0000,$018e,$0000
	dc.w	$0190,$0000,$0192,$0000,$0194,$0000,$0196,$0000
	dc.w	$0198,$0000,$019a,$0000,$019c,$0000,$019e,$0000

	dc.w	$0180,$0005
	dc.w	$1b0f,$fffe,$0100,(8+BPL_DEPTH)*$1000+$200
	dc.w	$00E0
ADR_BPL_IN_CLIST:
	dc.w	$0
	dc.w	$00E2,$0
	dc.w	$00E4
	dc.w	$0
	dc.w	$00E6,$0
	dc.w	$00E8
	dc.w	$0
	dc.w	$00EA,$0
	dc.w	$00EC
	dc.w	$0
	dc.w	$00EE,$0
	dc.w	$00F0
	dc.w	$0
	dc.w	$00F2,$0

	dc.l	$fffffffe	* montre la fin de la list

*************************************************************
	section screen,BSS_C

SCREEN:	ds.l	BPL_WIDTH*BPL_Y*BPL_DEPTH/4

Et voici la fin de cet article, d'un haut niveau technique. Si le manque d'inspiration continue, je crains le pi.re pour le mois prochain... Tout cela ne m'empêche absolument pas de vous donner la phrase du mois : "Lorsque notre fierté est en cause, notre mémoire préfère souvent céder".


[Retour en haut] / [Retour aux articles]