Suivez-nous sur X

|
|
|
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,
ALL
|
|
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
|
|
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
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
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 plans de bits 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 plans de bits
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 plans de bits dans la liste Copper
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 plans de bits soit en memoire Chip.
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".
|