home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CDPD Public Domain Collection for CDTV 3
/
CDPDIII.bin
/
pd
/
commodities
/
superdark
/
blankers
/
plasma.s
< prev
next >
Wrap
Text File
|
1993-03-21
|
7KB
|
317 lines
; ##########################
; # PLASMA T.Landspurg 91 #
; ##########################
; A assembler sous devpac
opt c+,o+,ow-
NB_COL_COP = 53 ; Nombre de changements de couleur par ligne
NB_LIG_COP = 200 ; Nombre de lignes de la plasma
NB_BYTE_PLASMA = (NB_COL_COP+1+1)*4 ; Taille d'un ligne de la copperlist
taillecop = 20+(NB_COL_COP+2)*4*NB_LIG_COP; Taille de la copperlist
NB_DEG = 15*3 ; Utilise pour la creation de degrade
NB_REP = 10 ; idem
CUSTOM = $dff000 ; Registres hardware
incdir "include:"
include exec/exec_lib.i
include exec/types.i
include graphics/graphics_lib.i
include intuition/intuition_lib.i
include graphics/gfxbase.i
include hardware/custom.i
include libraries/dos.i
XDEF.L _dark
XREF _duree
; section plasma,CODE_C
; DEBUT DU PROGRAMME
_dark:
movem.l d0-d7/a0-a6,-(a7)
lea b(pc),a4 ; a4 POINTERA TOUJOURS SUR LA BASE!
lea graphname(pc),a1; Ouverture de la graphics
clr.l d0
CALLEXEC OpenLibrary
move.l d0,_GfxBase-b(a4)
lea intuiname(pc),a1
clr.l d0
CALLEXEC OpenLibrary
move.l d0,_IntuitionBase-b(a4)
bsr initcop ; initialisation de la copper list
bsr init_col ; initialisation des couleurs de
; la plasma
lea CUSTOM,a5 ; Base des coprocesseurs
; move.w intenar(a5),save_intena-b(a4)
; or.w #$c000,save_intena-b(a4)
; move.w #$7fff,intena(a5)
; move.w #$0020,dmacon(a5); controle DMA
; move.w #$8400,dmacon(a5) ; Bltpri
; move.b #%10000111,$bfd100 ; ARRET DU DRIVE (BEURK!)
waitbout: ; BOUCLE PRINCIPALE
sub.w #1,tempo
tst.w tempo
bne.s pas_end_temp
bsr initcop
pas_end_temp:
sync:
btst #0,vposr+1(a5)
bne.s sync
sync1:
cmp.b #30,vhposr(a5) ; Syncronisation
bne.s sync1
CALLGRAF OwnBlitter
movem.l p_coplist(pc),d0/d1
exg d0,d1
movem.l d0/d1,p_coplist-b(a4)
move.l d0,cop1lc(a5)
clr.w copjmp1(a5)
CALLGRAF WaitBlit
bsr move_plasma
CALLGRAF DisownBlitter
btst #6,$bfe001 ; Test le bouton de la souris
beq.s out
moveq #0,d0
moveq #0,d1
movem.l d1-d7/a0-a6,-(a7)
CALLEXEC SetSignal
and.l #SIGBREAKF_CTRL_C,d0
movem.l (a7)+,d1-d7/a0-a6
tst.l d0
beq waitbout
out:
lea CUSTOM,a5 ; a5 pointera sur les registres hardware
; move.w save_intena-b(a4),intena(a5) ; interuption
move.l _GfxBase(pc),a0 ; On restore l'ancienne copperlist
move.l $32(a0),d0
move.l $26(a0),cop1lc(a5)
; CALLINT RethinkDisplay
move.l _GfxBase(pc),a1 ; On referme la libraire
CALLEXEC CloseLibrary
move.l _IntuitionBase(pc),a1 ; On referme la libraire
CALLEXEC CloseLibrary
; move.w #$0400,dmaconr(a5)
; move.w #$8020,dmaconr(a5)
movem.l (a7)+,d0-d7/a0-a6
moveq #0,d0
rts
save_intena:dc.w 0
waitblit:macro
waitblit\@:
btst #14,dmaconr(a5)
bne waitblit\@
endm
graphname:
GRAFNAME
intuiname:
INTNAME
even
_IntuitionBase:dc.l 0
_GfxBase:
dc.l 0
; INITIALISATION DE LA COPPER LIST
initcop:
; move.l _duree,d0
; lsl.w #3,d0
; move.w d0,tempo
; move.w #5,d0
; bsr random
; sub.w #2,d0
; tst.w d0
; move.w d0,step_sinusx1
; move.w #10,d0
; move.w #5,d0
; bsr random
; sub.w #2,d0
; tst.w d0
; move.w d0,speed_sinusx1
; move.w #5,d0
; bsr random
; sub.w #2,d0
; tst.w d0
; move.w d0,step_sinusy1
; move.w #10,d0
; move.w #5,d0
; bsr random
; sub.w #2,d0
; tst.w d0
; move.w d0,speed_sinusy1
lea coplist,a0
move.w #NB_LIG_COP-1,d7
move.l #$01000000,(a0)+ ; 0 bitplane
move.w #$4031,d0 ; Premiere ligne de l'ecran
next_lig_plasma: ; pour une ligne de plasma
move.w d0,(a0)+ ; le wait
move.w #$fffe,(a0)+
move.l #$01020000,(a0)+ ; decalage horizontal
add.w #$0100,d0 ; prochaine ligne
moveq.w #NB_COL_COP-1,d6; on met le changmenents
move.w d7,d1 ; de couleur pour une ligne
next_col_plasma: ; donnee
move.l #$1800000,(a0)+
dbf d6,next_col_plasma
dbf d7,next_lig_plasma
move.l #$01000000,(a0)+ ; 0 bitplane
move.l #$fffffffe,(a0)+ ; fin de la copperlist
lea coplist,a0
lea coplist+taillecop,a1
move.w #taillecop/4-1,d7
next_recopie:
move.l (a0)+,(a1)+
dbf d7,next_recopie
rts
; MOVEMENT DES PLASMAS
move_plasma: ; C'est le coeur du programme
move.l p_coplist(pc),a0; Pointeur sur la copperlist
lea 4(a0),a0
lea tabsin(pc),a2 ; Tableau de sinus
move.w #$ff,d5 ; masque=taille de la table de sinus
; D'abord on va creer les decalages sur y
move.w p_sinusy1(pc),d1 ; premiere wave sur y
add.w speed_sinusy1(pc),d1
move.w d1,p_sinusy1-b(a4)
move.w p_sinusy2(pc),d2 ; premiere wave sur y
add.w speed_sinusy2(pc),d2
move.w d2,p_sinusy2-b(a4)
move.w #NB_LIG_COP-1,d7 ; Nombre de lignes
next_lig_plasma2
and.w d5,d1
and.w d5,d2
move.b (a2,d1.w),d3 ; decalage sinus
ext.w d3
move.b (a2,d2.w),d4 ; decalage sinus
ext.w d4
add.w d4,d3 ; On ajoute les deux sinus
asr.w #4,d3 ; Le decalage sur y de faible amplitude
add.w #$20,d3
bset #0,d3
move.b d3,1(a0) ; on le met dans la copperlist
add.w step_sinusy1(pc),d1
add.w step_sinusy2(pc),d2
lea NB_BYTE_PLASMA(a0),a0
dbf d7,next_lig_plasma2
; Maintenant les decalages sur X
waitblit ; attent que le blitter soit libre
move.w #$09f0,bltcon0(a5) ; Mode=recopie
clr.w bltcon1(a5) ; mode suite
move.l #-1,bltafwm(a5) ; Masque a -1
move.w #NB_BYTE_PLASMA-2,bltdmod(a5) ; Modulo
clr.w bltamod(a5) ; En source pas de modulo
move.w #((NB_LIG_COP)<<6+1),d6 ; Taille=une colonne
move.l p_coplist(pc),a0
lea 4(a0),a0
lea tab_col_plasma+128,a1
move.w p_sinusx1(pc),d1; premiere wave sur x
add.w speed_sinusx1(pc),d1
move.w d1,p_sinusx1-b(a4)
move.w p_sinusx2(pc),d2; deuxieme wave sur x
add.w speed_sinusx2(pc),d2
move.w d2,p_sinusx2-b(a4)
lea 6+4(a0),a0 ; a0 pointe sur le debut de couleurs
moveq.w #NB_COL_COP-2,d7
move.w step_sinusx1(pc),d0
next_col_plasma2
add.w d0,d1
add.w step_sinusx2(pc),d2
and.w d5,d2
and.w d5,d1
move.b (a2,d1.w),d3 ; decalage sinus
ext.w d3
move.b (a2,d2.w),d4 ; decalage sinus
ext.w d4
add.w d4,d3 ; On ajoute les deux sinus
asr.w #1,d3 ; d3 contient l'offset dans la table de couleur
lea (a1,d3.w),a3
waitblit
move.l a3,bltapt(a5) ; Source=table de couleur
move.l a0,bltdpt(a5) ; Destination=copperlist
move.w d6,bltsize(a5) ; Taille=une colonne
lea 4(a0),a0
dbf d7,next_col_plasma2
rts
; Variables qui contiennent les donnees pour
; la plasma
p_sinusx1:dc.w 0
p_sinusx2:dc.w 0
p_sinusy1:dc.w 0
p_sinusy2:dc.w 0
step_sinusx1:dc.w -3
speed_sinusx1:dc.w 2
step_sinusx2:dc.w -4
speed_sinusx2:dc.w -1
step_sinusy1:dc.w 2
speed_sinusy1:dc.w 1
step_sinusy2:dc.w -3
speed_sinusy2:dc.w -5
; Cree le degrade de couleur pour la plasma
init_col:
lea tab_col_plasma,a0 ; Table du degrade de couleurs
move.w #$fff,d0
move.w #-$110,d1 ; on modifie la composante vert
bsr cree_one_deg ; On cree trois degrades
move.w #$100,d1 ; idem avec la composante rouge
bsr cree_one_deg
move.w #-$1,d1 ; et la composante jaune
bsr cree_one_deg
rts
cree_one_deg: ; Cree un degradee en modifiant une composante de la couleur
move.w #NB_DEG/3-1,d7 ; Nombre d'iterations
l2: move.w #NB_REP-1,d6 ; Nombdre de fois ou l'on garde
l1: move.w d0,(a0)+ ; la meme couleur
dbf d6,l1 ;
add.w d1,d0 ; Prochaine couleur
dbf d7,l2 ; Tant qu'il y a des couleurs
rts
random:
move.w seed(pc),d1
mulu #25173,d1
add.w #13849,d1
move.w d1,seed-b(a4)
divu d1,d0
swap d1
move.w d1,d0
rts
b:
p_coplist: dc.l coplist
p_coplist_old: dc.l coplist+taillecop
dir: dc.w -1
seed: dc.w $DEAD
tempo: dc.w 0
; Le fichier datasin est cree avec le petit programme GFA donne en annexe
tabsin:
incbin datasin
; Section qui contient les donnees
section plasma,BSS_C
tab_col_plasma:
dcb.w NB_DEG*NB_REP
coplist:dcb.b taillecop*2