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 - 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
Listing 3 : MakeSin.bas
|