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 >
Text File  |  1993-03-21  |  7KB  |  317 lines

  1.     ; ##########################
  2.     ; # PLASMA  T.Landspurg 91 #
  3.     ; ##########################
  4.     ; A assembler sous devpac
  5.     opt c+,o+,ow-
  6.  
  7. NB_COL_COP = 53        ; Nombre de changements de couleur par ligne
  8. NB_LIG_COP = 200        ; Nombre de lignes de la plasma
  9.  
  10. NB_BYTE_PLASMA = (NB_COL_COP+1+1)*4      ; Taille d'un ligne de la copperlist
  11. taillecop = 20+(NB_COL_COP+2)*4*NB_LIG_COP; Taille de la copperlist
  12. NB_DEG = 15*3        ; Utilise pour la creation de degrade
  13. NB_REP = 10        ; idem
  14. CUSTOM = $dff000    ; Registres hardware
  15.  
  16.     incdir    "include:"
  17.     include    exec/exec_lib.i
  18.     include    exec/types.i
  19.     include    graphics/graphics_lib.i
  20.     include    intuition/intuition_lib.i
  21.     include    graphics/gfxbase.i
  22.     include    hardware/custom.i
  23.     include libraries/dos.i
  24.  
  25.     XDEF.L    _dark
  26.     XREF    _duree
  27.  
  28. ;    section    plasma,CODE_C
  29.     ; DEBUT DU PROGRAMME
  30. _dark:
  31.     movem.l    d0-d7/a0-a6,-(a7)
  32.  
  33.  
  34.     lea    b(pc),a4    ; a4 POINTERA TOUJOURS SUR LA BASE!
  35.     lea    graphname(pc),a1; Ouverture de la graphics
  36.     clr.l    d0
  37.     CALLEXEC    OpenLibrary
  38.     move.l    d0,_GfxBase-b(a4)
  39.     lea    intuiname(pc),a1
  40.     clr.l    d0
  41.     CALLEXEC    OpenLibrary
  42.     move.l    d0,_IntuitionBase-b(a4)
  43.  
  44.     bsr    initcop        ; initialisation de la copper  list
  45.     bsr    init_col    ; initialisation des couleurs de
  46.                 ; la plasma
  47.     lea    CUSTOM,a5    ; Base des coprocesseurs
  48. ;    move.w    intenar(a5),save_intena-b(a4)
  49. ;    or.w    #$c000,save_intena-b(a4)
  50. ;    move.w    #$7fff,intena(a5)
  51. ;    move.w    #$0020,dmacon(a5); controle DMA
  52. ;    move.w    #$8400,dmacon(a5) ; Bltpri
  53. ;    move.b    #%10000111,$bfd100 ; ARRET DU DRIVE (BEURK!)
  54. waitbout:            ; BOUCLE PRINCIPALE
  55.     sub.w    #1,tempo
  56.     tst.w    tempo
  57.     bne.s    pas_end_temp
  58.     bsr    initcop
  59. pas_end_temp:
  60.  
  61. sync:
  62.     btst    #0,vposr+1(a5)
  63.     bne.s    sync
  64. sync1:
  65.     cmp.b    #30,vhposr(a5)    ; Syncronisation
  66.     bne.s    sync1
  67.     CALLGRAF    OwnBlitter
  68.     movem.l    p_coplist(pc),d0/d1
  69.     exg    d0,d1
  70.     movem.l    d0/d1,p_coplist-b(a4)
  71.     move.l    d0,cop1lc(a5)
  72.     clr.w    copjmp1(a5)
  73.     CALLGRAF    WaitBlit
  74.     bsr    move_plasma
  75.     CALLGRAF    DisownBlitter
  76.     btst    #6,$bfe001    ; Test le bouton de la souris
  77.     beq.s    out
  78.  
  79.     moveq    #0,d0
  80.     moveq    #0,d1
  81.     movem.l    d1-d7/a0-a6,-(a7)
  82.     CALLEXEC    SetSignal
  83.     and.l    #SIGBREAKF_CTRL_C,d0
  84.     movem.l    (a7)+,d1-d7/a0-a6
  85.     tst.l    d0
  86.     beq    waitbout
  87. out:
  88.     lea    CUSTOM,a5    ; a5 pointera sur les registres hardware
  89. ;    move.w    save_intena-b(a4),intena(a5)    ; interuption
  90.     move.l    _GfxBase(pc),a0 ; On restore l'ancienne copperlist
  91.     move.l    $32(a0),d0
  92.     move.l    $26(a0),cop1lc(a5)
  93.  
  94. ;    CALLINT    RethinkDisplay
  95.  
  96.     move.l    _GfxBase(pc),a1 ; On referme la libraire
  97.     CALLEXEC CloseLibrary
  98.     move.l    _IntuitionBase(pc),a1 ; On referme la libraire
  99.     CALLEXEC CloseLibrary
  100. ;    move.w    #$0400,dmaconr(a5)
  101. ;    move.w    #$8020,dmaconr(a5)
  102.     movem.l    (a7)+,d0-d7/a0-a6
  103.     moveq    #0,d0
  104.     rts
  105. save_intena:dc.w    0
  106. waitblit:macro
  107. waitblit\@:
  108.     btst    #14,dmaconr(a5)
  109.     bne    waitblit\@
  110.     endm
  111. graphname:
  112.     GRAFNAME
  113. intuiname:
  114.     INTNAME
  115.     even
  116. _IntuitionBase:dc.l    0
  117. _GfxBase:
  118.     dc.l    0
  119.  
  120.  
  121.     ; INITIALISATION DE LA COPPER LIST
  122. initcop:
  123. ;    move.l    _duree,d0
  124. ;    lsl.w    #3,d0
  125. ;    move.w    d0,tempo
  126.  
  127. ;    move.w    #5,d0
  128. ;    bsr    random
  129. ;    sub.w    #2,d0
  130. ;    tst.w    d0
  131. ;    move.w    d0,step_sinusx1
  132. ;    move.w    #10,d0
  133.  
  134. ;    move.w    #5,d0
  135. ;    bsr    random
  136. ;    sub.w    #2,d0
  137. ;    tst.w    d0
  138. ;    move.w    d0,speed_sinusx1
  139.  
  140. ;    move.w    #5,d0
  141. ;    bsr    random
  142. ;    sub.w    #2,d0
  143. ;    tst.w    d0
  144. ;    move.w    d0,step_sinusy1
  145. ;    move.w    #10,d0
  146.  
  147. ;    move.w    #5,d0
  148. ;    bsr    random
  149. ;    sub.w    #2,d0
  150. ;    tst.w    d0
  151. ;    move.w    d0,speed_sinusy1
  152.  
  153.     lea    coplist,a0
  154.     move.w    #NB_LIG_COP-1,d7
  155.     move.l    #$01000000,(a0)+    ; 0 bitplane
  156.     move.w    #$4031,d0    ; Premiere ligne de l'ecran
  157. next_lig_plasma:        ; pour une ligne de plasma
  158.     move.w    d0,(a0)+    ; le wait
  159.     move.w    #$fffe,(a0)+
  160.     move.l    #$01020000,(a0)+ ; decalage horizontal
  161.     add.w    #$0100,d0    ; prochaine ligne
  162.     moveq.w    #NB_COL_COP-1,d6; on met le changmenents
  163.     move.w    d7,d1        ; de couleur pour une ligne
  164. next_col_plasma:        ; donnee
  165.     move.l    #$1800000,(a0)+
  166.     dbf    d6,next_col_plasma
  167.     dbf    d7,next_lig_plasma
  168.     move.l    #$01000000,(a0)+    ; 0 bitplane
  169.     move.l    #$fffffffe,(a0)+    ; fin de la copperlist
  170.  
  171.     lea    coplist,a0
  172.     lea    coplist+taillecop,a1
  173.     move.w    #taillecop/4-1,d7
  174. next_recopie:
  175.     move.l    (a0)+,(a1)+
  176.     dbf    d7,next_recopie
  177.  
  178.     rts
  179.     ; MOVEMENT DES PLASMAS
  180. move_plasma:    ; C'est le coeur du programme
  181.     move.l    p_coplist(pc),a0; Pointeur sur la copperlist
  182.     lea    4(a0),a0
  183.     lea    tabsin(pc),a2    ; Tableau de sinus
  184.     move.w    #$ff,d5        ; masque=taille de la table de sinus
  185.         ; D'abord on va creer les decalages sur y
  186.     move.w    p_sinusy1(pc),d1    ; premiere wave sur y
  187.     add.w    speed_sinusy1(pc),d1
  188.     move.w    d1,p_sinusy1-b(a4)
  189.  
  190.     move.w    p_sinusy2(pc),d2 ; premiere wave sur y
  191.     add.w    speed_sinusy2(pc),d2
  192.     move.w    d2,p_sinusy2-b(a4)
  193.  
  194.     move.w    #NB_LIG_COP-1,d7 ; Nombre de lignes
  195. next_lig_plasma2
  196.     and.w    d5,d1
  197.     and.w    d5,d2
  198.     move.b    (a2,d1.w),d3    ; decalage sinus
  199.     ext.w    d3
  200.     move.b    (a2,d2.w),d4    ; decalage sinus
  201.     ext.w    d4
  202.     add.w    d4,d3        ; On ajoute les deux sinus
  203.  
  204.     asr.w    #4,d3        ; Le decalage sur y de faible amplitude
  205.     add.w    #$20,d3
  206.     bset    #0,d3
  207.     move.b    d3,1(a0)    ; on le met dans la copperlist
  208.     add.w    step_sinusy1(pc),d1
  209.     add.w    step_sinusy2(pc),d2
  210.     lea    NB_BYTE_PLASMA(a0),a0
  211.     dbf    d7,next_lig_plasma2
  212.         ; Maintenant les decalages sur X
  213.     waitblit    ; attent que le blitter soit libre
  214.     move.w    #$09f0,bltcon0(a5) ; Mode=recopie
  215.     clr.w    bltcon1(a5)    ; mode suite
  216.     move.l    #-1,bltafwm(a5)    ; Masque a -1
  217.     move.w    #NB_BYTE_PLASMA-2,bltdmod(a5) ; Modulo
  218.     clr.w    bltamod(a5)    ; En source pas de modulo
  219.     move.w    #((NB_LIG_COP)<<6+1),d6 ; Taille=une colonne
  220.  
  221.     move.l    p_coplist(pc),a0
  222.     lea    4(a0),a0
  223.     lea    tab_col_plasma+128,a1
  224.  
  225.     move.w    p_sinusx1(pc),d1; premiere wave sur x
  226.     add.w    speed_sinusx1(pc),d1
  227.     move.w    d1,p_sinusx1-b(a4)
  228.     move.w    p_sinusx2(pc),d2; deuxieme wave sur x
  229.     add.w    speed_sinusx2(pc),d2
  230.     move.w    d2,p_sinusx2-b(a4)
  231.  
  232.     lea    6+4(a0),a0    ; a0 pointe sur le debut de couleurs
  233.     moveq.w    #NB_COL_COP-2,d7
  234.     move.w    step_sinusx1(pc),d0
  235. next_col_plasma2
  236.     add.w    d0,d1
  237.     add.w    step_sinusx2(pc),d2
  238.     and.w    d5,d2
  239.     and.w    d5,d1
  240.  
  241.     move.b    (a2,d1.w),d3    ; decalage sinus
  242.     ext.w    d3
  243.     move.b    (a2,d2.w),d4    ; decalage sinus
  244.     ext.w    d4
  245.     add.w    d4,d3        ; On ajoute les deux sinus
  246.  
  247.     asr.w    #1,d3        ; d3 contient l'offset dans la table de couleur
  248.     lea    (a1,d3.w),a3
  249.     waitblit
  250.     move.l    a3,bltapt(a5)    ; Source=table de couleur
  251.     move.l    a0,bltdpt(a5)    ; Destination=copperlist
  252.     move.w    d6,bltsize(a5) ; Taille=une colonne
  253.     lea    4(a0),a0
  254.     dbf    d7,next_col_plasma2
  255.     rts
  256.     ; Variables qui contiennent les donnees pour
  257.     ; la plasma
  258. p_sinusx1:dc.w    0
  259. p_sinusx2:dc.w    0
  260. p_sinusy1:dc.w    0
  261. p_sinusy2:dc.w    0
  262. step_sinusx1:dc.w    -3
  263. speed_sinusx1:dc.w    2
  264. step_sinusx2:dc.w    -4
  265. speed_sinusx2:dc.w    -1
  266. step_sinusy1:dc.w    2
  267. speed_sinusy1:dc.w    1
  268. step_sinusy2:dc.w    -3
  269. speed_sinusy2:dc.w    -5
  270.  
  271.     ; Cree le degrade de couleur pour la plasma
  272. init_col:
  273.     lea    tab_col_plasma,a0    ; Table du degrade de couleurs
  274.     move.w    #$fff,d0
  275.     move.w    #-$110,d1        ; on modifie la composante vert
  276.     bsr    cree_one_deg        ; On cree trois degrades
  277.     move.w    #$100,d1        ; idem avec la composante rouge
  278.     bsr    cree_one_deg
  279.     move.w    #-$1,d1            ; et la composante jaune
  280.     bsr    cree_one_deg
  281.     rts
  282. cree_one_deg:    ; Cree un degradee en modifiant une composante de la couleur
  283.     move.w    #NB_DEG/3-1,d7    ; Nombre d'iterations
  284. l2:    move.w    #NB_REP-1,d6    ; Nombdre de fois ou l'on garde
  285. l1:    move.w    d0,(a0)+    ; la meme couleur
  286.     dbf    d6,l1        ;
  287.     add.w    d1,d0        ; Prochaine couleur
  288.     dbf    d7,l2        ; Tant qu'il y a des couleurs
  289.     rts
  290. random:
  291.     move.w    seed(pc),d1
  292.     mulu    #25173,d1
  293.     add.w    #13849,d1
  294.     move.w    d1,seed-b(a4)
  295.     divu    d1,d0
  296.     swap    d1
  297.     move.w    d1,d0
  298.     rts
  299.  
  300. b:
  301. p_coplist:    dc.l    coplist
  302. p_coplist_old:    dc.l     coplist+taillecop
  303. dir:        dc.w    -1
  304. seed:        dc.w    $DEAD
  305. tempo:        dc.w    0
  306.  ; Le fichier datasin est cree avec le petit  programme GFA donne en annexe
  307.  
  308. tabsin:
  309.     incbin    datasin
  310.  
  311.     ; Section qui contient les donnees
  312.     section    plasma,BSS_C
  313. tab_col_plasma:
  314.     dcb.w    NB_DEG*NB_REP
  315. coplist:dcb.b    taillecop*2
  316.  
  317.