home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti_darkcoder / plasma / plasm1.s < prev    next >
Encoding:
Text File  |  1995-12-06  |  10.4 KB  |  304 lines

  1.  
  2. ; Plasma1.s    Plasma 0-bitplanes
  3. ;        tasto sinistro per uscire
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup2.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  15.  
  16. Waitdisk    EQU    10
  17.  
  18. Largh_plasm    equ    30        ; larghezza del plasma espressa
  19.                     ; come numero di gruppi di 8 pixel
  20.  
  21. BytesPerRiga    equ    (Largh_plasm+2)*4    ; numero di bytes occupati
  22.                         ; nella copperlist da ogni riga
  23.                         ; del plasma: ogni istruzione
  24.                         ; copper occupa 4 bytes
  25.  
  26. Alt_plasm    equ    100        ; altezza del plasma espressa
  27.                     ; come numero di linee
  28.  
  29. NuovaRiga    equ    4        ; valore sommato all'indice nella
  30.                     ; SinTab tra una riga e l'altra
  31.                     ; Puo` essere variato ottenendo plasmi
  32.                     ; diversi, ma DEVE ESSERE SEMPRE PARI!!
  33.  
  34. NuovoFrame    equ    6        ; valore sottratto all'indice nella
  35.                     ; SinTab tra un frame e l'altro
  36.                     ; Puo` essere variato ottenendo plasmi
  37.                     ; diversi, ma DEVE ESSERE SEMPRE PARI!!
  38.  
  39. START:
  40.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  41.  
  42.     bsr.s    InitPlasma        ; inizializza la copperlist
  43.  
  44. ; Inizializza i registri del blitter
  45.  
  46.     Btst    #6,2(a5)
  47. WaitBlit_init:
  48.     Btst    #6,2(a5)        ; aspetta il blitter
  49.     bne.s    WaitBlit_init
  50.  
  51.     move.l    #$09f00000,$40(a5)    ; BLTCON0/1 - copia normale
  52.     moveq    #-1,d0            ; D0 = $FFFFFFFF
  53.     move.l    d0,$44(a5)        ; BLTAFWM/BLTALWM
  54.  
  55. mod_A    set    0            ; modulo canale A
  56. mod_D    set    BytesPerRiga-2        ; modulo canale D: va a riga seguente
  57.     move.l    #mod_A<<16+mod_D,$64(a5)    ; carica i registri modulo
  58.  
  59.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  60.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  61.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  62.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  63.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  64.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  65.  
  66. ; Inizializza altri registri hardware
  67.  
  68.     move.w    #$000,$180(a5)        ; COLOR00 - nero
  69.     move.w    #$0200,$100(a5)        ; BPLCON0 - no bitplanes attivi
  70.  
  71. mouse:
  72.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  73.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  74. Waity1:
  75.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  76.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  77.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  78.     BNE.S    Waity1
  79.  
  80.     bsr    DoPlasma
  81.  
  82.     btst    #6,$bfe001    ; mouse premuto?
  83.     bne.w    mouse
  84.  
  85.     rts
  86.  
  87. ;****************************************************************************
  88. ; Questa routine inizializza la copperlist che genera il plasma. Sistema le
  89. ; istruzioni WAIT e le prima meta` delle COPPERMOVE. Alla fine della riga
  90. ; del plasma viene inserita un ultima COPPERMOVE che carica il colore
  91. ; nero in COLOR00.
  92. ;****************************************************************************
  93.  
  94. InitPlasma:
  95.     lea    Plasma,a0    ; indirizzo plasma
  96.     move.l    #$6051FFFE,d0    ; carica la prima istruzione wait in D0.
  97.                 ; aspetta la riga $60 e la posizione
  98.                 ; orizzontale $51
  99.     move.w    #$180,d1    ; mette in D1 la prima meta` di un istruzione 
  100.                 ; "copper move" in COLOR00 (=$dff180)
  101.  
  102.     moveq    #Alt_plasm-1,d3        ; loop per ogni riga
  103. InitLoop1:
  104.     move.l    d0,(a0)+        ; scrive la WAIT
  105.     add.l    #$01000000,d0        ; modifica la WAIT per aspettare
  106.                     ; la riga seguente
  107.  
  108.     moveq    #Largh_plasm,d2        ; loop per tutta la larghezza
  109.                     ; del plasma + una volta per
  110.                     ; l'ultima "copper move" che rimette
  111.                     ; il nero come sfondo
  112.  
  113. InitLoop2:
  114.     move.w    d1,(a0)+        ; scrive la prima parte della
  115.                     ; "copper move"
  116.     addq.l    #2,a0            ; spazio per la seconda parte
  117.                     ; della "copper move"
  118.                     ; (riempito poi dalla routine DoPlasma)
  119.  
  120.     dbra    d2,InitLoop2
  121.  
  122.     dbra    d3,InitLoop1
  123.     
  124.     rts
  125.  
  126.  
  127. ;****************************************************************************
  128. ; Questa routine realizza il plasma. Effettua un loop di blittate, ciascuna
  129. ; delle quali scrive una "colonna" del plasma, cioe` scrive i colori nelle
  130. ; COPPERMOVES messe in colonna.
  131. ; I colori scritti in ogni colonna sono letti da una tabella, a partire da
  132. ; un indirizzo che varia tra una colonna e l'altra in base a degli offset
  133. ; letti da un'altra tabella. Inoltre tra un frame e l'altro gli offset
  134. ; variano, realizzando l'effetto di movimento.
  135. ;****************************************************************************
  136.  
  137. DoPlasma:
  138.     lea    Color,a0        ; indirizzo colori
  139.     lea    SinTab,a3        ; indirizzo tabella offsets
  140.     lea    Plasma+6,a1        ; indirizzo prima word della prima
  141.                     ; colonna del plasma
  142.  
  143.     move.w    Indice(pc),d0        ; legge l'indice di partenza del
  144.                     ; frame precedente
  145.     sub.w    #NuovoFrame,d0        ; modifica l'indice nella tabella
  146.                     ; dal frame precedente
  147.     and.w    #$00FF,d0        ; tiene l'indice nell'intervallo
  148.                     ; 0 - 255 (offset in una tabella di
  149.                     ; 128 words)
  150.     move.w    d0,Indice        ; memorizza l'indice di partenza per
  151.                     ; il prossimo frame
  152.  
  153.     move.w    #Alt_plasm<<6+1,d3    ; dimensione blittata
  154.                     ; largh. 1 word, alta tutto il plasma
  155.  
  156.     moveq    #Largh_plasm-1,d2    ; loop per tutta la larghezza
  157. PlasmaLoop:                ; inizio loop blittate
  158.  
  159.     move.w    (a3,d0.w),d1        ; legge offset dalla tabella
  160.  
  161.     lea    (a0,d1.w),a2        ; indirizzo di partenza = ind. colori
  162.                     ; piu` offset
  163.  
  164.     Btst    #6,2(a5)
  165. WaitBlit:
  166.     Btst    #6,2(a5)        ; aspetta il blitter
  167.     bne.s    WaitBlit
  168.  
  169.     move.l    a2,$50(a5)        ; BLTAPT - indirizzo sorgente
  170.     move.l    a1,$54(a5)        ; BLTDPT - indirizzo destinazione
  171.     move.w    d3,$58(a5)        ; BLTSIZE
  172.  
  173.     addq.w    #4,a1            ; punta a prossima colonna di 
  174.                     ; "copper moves" nella copper list
  175.  
  176.     add.w    #NuovaRiga,d0        ; modifica l'indice nella tabella
  177.                     ; per la prossima riga
  178.  
  179.     and.w    #$00FF,d0        ; tiene l'indice nell'intervallo
  180.                     ; 0 - 255 (offset in una tabella di
  181.                     ; 128 words)
  182.  
  183.     dbra    d2,PlasmaLoop
  184.     rts
  185.  
  186.  
  187. ; Questa variabile contiene il valore dell'indice per la prima colonna
  188.  
  189. Indice:    dc.w    0
  190.  
  191. ; Questa tabella contiene gli offset per l'indirizzo di partenza nella
  192. ; tabella dei colori
  193. SinTab:
  194.     DC.W    $0034,$0036,$0038,$003A,$003C,$0040,$0042,$0044,$0046,$0048
  195.     DC.W    $004A,$004C,$004E,$0050,$0052,$0054,$0056,$0058,$005A,$005A
  196.     DC.W    $005C,$005E,$005E,$0060,$0060,$0062,$0062,$0062,$0064,$0064
  197.     DC.W    $0064,$0064,$0064,$0064,$0064,$0064,$0062,$0062,$0062,$0060
  198.     DC.W    $0060,$005E,$005E,$005C,$005A,$005A,$0058,$0056,$0054,$0052
  199.     DC.W    $0050,$004E,$004C,$004A,$0048,$0046,$0044,$0042,$0040,$003C
  200.     DC.W    $003A,$0038,$0036,$0034,$0030,$002E,$002C,$002A,$0028,$0024
  201.     DC.W    $0022,$0020,$001E,$001C,$001A,$0018,$0016,$0014,$0012,$0010
  202.     DC.W    $000E,$000C,$000A,$000A,$0008,$0006,$0006,$0004,$0004,$0002
  203.     DC.W    $0002,$0002,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
  204.     DC.W    $0002,$0002,$0002,$0004,$0004,$0006,$0006,$0008,$000A,$000A
  205.     DC.W    $000C,$000E,$0010,$0012,$0014,$0016,$0018,$001A,$001C,$001E
  206.     DC.W    $0020,$0022,$0024,$0028,$002A,$002C,$002E,$0030
  207. EndSinTab:
  208.  
  209. ;****************************************************************************
  210.  
  211.     SECTION    GRAPHIC,DATA_C
  212.  
  213. COPPERLIST:
  214.  
  215.     dc.w    $4007,$fffe    ; wait linea $40
  216.     dc.w    $0180,$c00    ; color0
  217.     dc.w    $4407,$fffe    ; wait linea $44
  218.     dc.w    $0180,$000    ; color0
  219.  
  220. ; Qui viene lasciato dello spazio vuoto per il pezzo di copperlist che genera
  221. ; il plasma. Questo spazio viene riempito dalle routine dell'effetto.
  222.  
  223. PLASMA:
  224.     dcb.b    alt_plasm*BytesPerRiga,0
  225.  
  226.     dc.w    $e007,$fffe    ; wait linea $e0
  227.     dc.w    $0180,$c00    ; color0
  228.     dc.w    $e407,$fffe    ; wait linea $e4
  229.     dc.w    $0180,$000    ; color0
  230.  
  231.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  232.  
  233.  
  234. ;****************************************************************************
  235. ; Qui c'e` la tabella di colori che viene scritta nel plasma.
  236. ; Devono esserci abbastanza colori da essere letti qualunque sia l'indirizzo
  237. ; di partenza. In questo esempio l'indirizzo di partenza puo` variare da
  238. ; "Color" (primo colore) fino a "Color+100" (50-esimo colore), perche`
  239. ; 100 e` il massimo offset sontenuto nella "SinTab".
  240. ; Se Alt_plasm=100 vuol dire che ogni blittata legge 100 colori.
  241. ; Quindi in totale devono esserci 150 colori.
  242. ;****************************************************************************
  243.  
  244. Color:
  245.     dc.w    $100,$200,$300,$400,$500,$600,$700
  246.     dc.w    $800,$900,$A00,$B00,$C00,$D00,$E00,$F00
  247.  
  248.     dc.w    $F00,$E00,$D00,$C00,$B00,$A00,$900,$800
  249.     dc.w    $700,$600,$500,$400,$300,$200
  250.  
  251.     dc.w    $002,$003,$004,$005,$006,$007
  252.     dc.w    $008,$009,$00A,$00B,$00C,$00D,$00E,$00F
  253.  
  254.  dc.w $00e,$01d,$02d,$03d,$04d,$05d,$06d,$07d,$08d,$09d    ; blu-verde
  255.  dc.w $0Ad,$0Bd,$0Cd,$0Dd,$0Ed,$0Fd,$0Fd,$0Ed,$0Dd,$0Cd
  256.  dc.w $0Bd,$0Ad,$09d,$08d,$07d,$06d,$05d,$04d,$03d,$02d
  257.  dc.w $01d,$00e
  258.  
  259.  dc.w $00e,$01d,$02c,$03b,$04a,$059,$068,$077,$086,$095    ; blu-verde
  260.  dc.w $0A4,$0B3,$0C2,$0D1,$0E0
  261.  
  262.  
  263.     dc.w    $0F0,$0E0,$0D0,$0C0,$0B0,$0A0,$090,$080
  264.     dc.w    $070,$060,$050,$040,$030,$020,$010
  265.  
  266.     dc.w    $010,$020,$030,$040,$050,$060,$070
  267.     dc.w    $080,$090,$0A0,$0B0,$0C0,$0D0,$0E0,$0F0
  268.  
  269.     dc.w    $1F0,$2F0,$3F0,$4F0,$5F0,$6F0,$7F0,$8F0
  270.     dc.w    $9F0,$AF0,$BF0,$CF0,$DF0,$EF0,$FF0
  271.  
  272.     dc.w    $FF0,$EE0,$DD0,$CC0,$BB0,$AA0,$990,$880
  273.     dc.w    $770,$660,$550,$440,$330,$220,$110
  274.  
  275.     end
  276.  
  277. ;****************************************************************************
  278.  
  279. In questo esempio abbiamo un plasma 0 bitplanes.
  280. L'effetto e` basato su un pezzo di copperlist che viene costruito dalla routine
  281. "InitPlasma". Tale pezzo funziona in questo modo: per ogni riga dello
  282. schermo effettua una serie di "copper moves" che cambiano il valore di COLOR00.
  283. L'ultima "copper move" rimette il valore $000 (nero) in COLOR00. Si forma in
  284. questo modo una tabella rettangolare di "copper moves". Il numero di "copper
  285. moves" presenti in ogni riga (esclusa quella finale che setta lo sfondo al
  286. nero) e` pari al valore del parametro "Largh_plasm". Il numero di righe che
  287. formano il plasma e` pari al parametro "Alt_plasm". In totale abbiamo dunque
  288. un numero di "copper moves" (sempre escluse quelle che rimettono il nero)
  289. pari a Largh_plasm*Alt_plasm. La routine "InitPlasma" non scrive i colori
  290. caricati da queste "copper moves" (cioe` non scrive le seconde word).
  291. Questo compito e` lasciato alla routine "DoPlasma", che viene eseguita ad
  292. ogni frame, e che ogni volta scrive dei valori diversi nelle seconde words
  293. delle "copper moves". La scrittura avviene mediante un loop di blittate.
  294. Ogni blittata riempie una "colonna" di "copper moves". Per esempio, la
  295. prima blittata scrive la seconda word della prima "copper move" di ciascuna
  296. riga. I valori dei colori vengono letti da una tabella. Ad ogni iterazione
  297. si leggono i colori a partire da una diversa posizione nella tabella. Anche tra
  298. un frame e l'altro la posizione di partenza viene variata. Tutte le variazioni
  299. della posizione avvengono in base a tabelle e possono essere variate agendo sui
  300. 2 parametri "NuovaRiga" e "NuovoFrame".
  301. Notate che la routine e` stata ottimizzata inizializzando tutti i registri del
  302. blitter all'inizio del programma.
  303.  
  304.