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 - 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 plan de bits
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
|
|