
Il Plasma		(Lezione by The Dark Coder)

In questo testo parleremo dell'effetto "plasma". In particolare vedremo come
realizzare degli effetti plasma utilizzando tecniche impiegabili su tutti gli
amiga. Al giorno d'oggi, infatti, grazie al chipset AGA e a processori 68020
e superiori si realizzano anche dei plasmi differenti, basati su tecniche 
"chunky pixel". Gli effetti di cui parleremo in questo testo, invece, sono
impiegabili anche sul buon vecchio Amiga 500.
La tecnica di base per realizzare un plasma e` costituita dall'utilizzo di
una copperlist che cambia continuamente alcuni registri colore, mediante delle
"copper moves" consecutive. Abbiamo gia` visto come costruire e utilizzare
molte copperlists di questo tipo nella lezione 11. In particolare negli esempi
lezione11g1.s, lezione11g2.s e lezione11g3.s abbiamo realizzato sfumatore di
colori mediante copperlists che cambiavano il contenuto di COLOR00. Si tratta,
pero`, di copperlists statiche. La differenza principale tra quegli esempi e un
plasma e` proprio questa: in un effetto plasma si usa una copperlist
strutturata in quel modo, ma dinamica, in modo che in ogni frame cambino i
colori scritti nel registro COLOR00. Ogni "copper move" e` composta da 2 words:

	dc.w	$180,COLORE	; struttura di una "copper move"

La prima word contiene l'indirizzo di COLOR00 e la seconda il valore da
scrivere in tale registro. Per ottenere l'effetto plasma dobbiamo far variare
questo valore ad ogni frame, ovvero dobbiamo scrivere ogni volta un valore
diverso nella seconda word che costituisce la "copper move".
Il problema e` che dobbiamo ripetere questa operazione per tutte le "copper
moves" che fanno parte della copperlist. Si tratta quindi di una gran quantita`
di dati da modificare. Poiche` la copperlist si trova in CHIP-RAM possiamo
usare il blitter per effettuare le modifiche. In conclusione, dunque l'effetto
plasma e` realizzato mediante una routine che (usando il blitter) legge da una
tabella i colori e li copia nella copperlist. Facendo variare ad ogni frame i
colori copiati, il plasma e` fatto. Notate che questo effetto non richiede
l'uso di bitplane, visto che si fa tutto modificando il colore di sfondo.
Per questo lo si indica come plasma "a 0 bitplanes", in contrasto con altre
varianti che vedremo successivamente. Un esempio di plasma 0-bitplanes e`
plasm1.s.
Un significativo miglioramento dell'effetto e` costituito dal plasma RGB.
Esso si differenzia dal plasma normale, perche` i colori non vengono
semplicemente copiati da una tabella, ma "calcolati" nel seguente modo:
vengono lette separatamente (da 3 sorgenti diverse) le componenti R, G e B
di un colore, e vengono poi unite insieme con un OR. In questo modo poiche`
le componenti R,G B variano continuamente tra una "copper move" e l'altra si
produrra` un maggior numero di colori. In pratica, invece di un'operazione
di copia si utilizza una blittata che esegue un OR tra 3 sorgenti che
contengono rispettivamente le componenti R, G e B. Un primo esempio di plasma
RGB e` plasm2.s
Per migliorare ulteriormente l'effetto, si cerca di rendere piu` vario il 
plasma. Un modo semplice per farlo e` rendere variabile la posizione di
partenza di ogni riga del plasma. Cio` puo` essere fatto molto facilmente
dato che la posizione di partenza e` determinata dall'istruzione WAIT che
compare all'inizio di ogni riga della copperlist. Una variante del genere
e` illustrata in plasm3.s. Purtroppo, pero` le posizioni orizzontali delle
WAIT hanno una risoluzione di 4 pixel, il che vuol dire che e` possibile 
variare la posizione di partenza del plasma a "scatti" di 4 pixel. Variando
opportunamente i parametri dell'esempio plasm3.s si puo` evidenziare tale
fenomeno. per ottenere delle oscillazioni meno scattose useremo una tecnica
diversa, che fa uso di un bitplane, e pertanto si chiama plasma "1-bitplane".
La tecnica e` la seguente: si usa un bitplane "a strisce" verticali larghe 8
pixel. In questo modo l'immagine avra` 8 pixel colorati con COLOR00, poi 8
colorati con COLOR01, poi di nuovo 8 con COLOR00 e cosi` via. In corrispondenza
usiamo una copperlist simile a quelle viste negli esempi precedenti, ma che
alterna una "copper move" in COLOR00 con una in COLOR01. La situazione e`
rappresentata dalla figura seguente:

destinazione
della 
"copper move":	| COL.0 | COL.1 | COL.0 | COL.1 | COL.0 | COL.1  - - -


linea del
bitplane:	000000001111111100000000111111110000000011111111 - - -

come vedete c'e` una corrispondenza esatta tra il colore visualizzato e
il registro modificato dalla copperlist. Un registro colore mantiene costante
il suo valore per uno spazio di 16 pixel, ma quel colore viene visualizzato per
i soli 8 pixel del bitplane che lo selezionano (cioe` per i soli 8 pixel a 0
nel caso di COLOR00 e i soli pixel a 1 nel caso di COLOR01). Fin qui abbiamo
utilizzato il nostro bitplane per fare esattamente la stessa cosa che prima
facevamo senza. Ora pero` viene la novita`. Possiamo utilizzare lo scroll
hardware per spostare il bitplane orizzontalmente. Notate che se il valore
di scroll varia da 0 a 7, ogni gruppo di 8 pixel mantiene sempre lo stesso
colore. Infatti il valore contenuto in un registro varia ogni 16 pixel. Con
valori dello scroll da 0 a 7 noi spostiamo il gruppo di 8 pixel sempre
all'interno di questa "fascia" di 16 pixel. Se invece usiamo valori maggiori,
alcuni dei pixel del gruppo usciranno fuori dalla fascia, assumendo pertanto
un nuovo colore.
Guardiamo in dettaglio il fenomeno con l'ausilio di alcune figure. Potete
notare come i registri colore mantengano costante il loro valore per fascie
di 16 pixel. Le fasce dei 2 registri si sovrappongono: le fasce di COLOR01
iniziano e finiscono a meta` di quelle di COLOR00, e viceversa.
Quando usiamo un valore di scroll pari a 0 si ha la seguente situazione:

valore in
COLOR01		        |    valore 1  |    valore 2  |    valore 3  |   - - 
			V	       V	      V	       
scroll=0:	000000001111111100000000111111110000000011111111 - - -
		^	       ^	      ^		     ^
valore in	|	       |	      |		     |
COLOR00		|    valore 1  |    valore 2  |    valore 3  |   - - 

come vedete ogni gruppo di 8 pixel di valore 0 si trova in corrispondenza dei
primi 8 pixel (cioe` quelli piu` a sinistra) di ogni fascia di 16 per i quali
COLOR00 assume valore costante. Lo stesso discorso vale per i gruppi di 8 pixel
settati a 1 in relazione con le fascie di 16 pixel per i quali COLOR01 rimane
costante. All' aumentare del valore di scroll, i gruppi di 8 pixel si spostano
verso i bordi destri delle fascie. Per es. ecco cosa accade quando lo scroll
e` di 4 pixel:

valore in
COLOR01		        |    valore 1  |    valore 2  |    valore 3  |   - - 
			V	       V	      V	       
scroll=4:	1111000000001111111100000000111111110000000011111111 - - -
		^	       ^	      ^		     ^
valore in	|	       |	      |		     |
COLOR00		|    valore 1  |    valore 2  |    valore 3  |   - - 

Quando lo scroll e` di 7 pixel, i gruppi di 8 pixel sono allineati con i bordi
destri delle fascie (rispettivamente i pixel a 0 con le fascie di COLOR00 e i
pixel a 1 con le fascie di COLOR01): 


valore in
COLOR01		        |    valore 1  |    valore 2  |    valore 3  |   - - 
			V	       V	      V	       
scroll=7:	1111111000000001111111100000000111111110000000011111111 - - -
		^	       ^	      ^		     ^
valore in	|	       |	      |		     |
COLOR00		|    valore 1  |    valore 2  |    valore 3  |   - - 


Non appena lo scroll supera il valore 8, i gruppi di 8 pixel superano i bordi
delle fasce. Questo significa che gli 8 pixel del gruppo non avranno piu` lo
stesso valore. La figura seguente rappresenta la situazione per uno scroll di
8 pixel.

valore in
COLOR01		        |    valore 1  |    valore 2  |    valore 3  |   - - 
			V	       V	      V	       
scroll=8:	11111111000000001111111100000000111111110000000011111111 - - -
		^	       ^	      ^		     ^
valore in	|	       |	      |		     |
COLOR00		|    valore 1  |    valore 2  |    valore 3  |   - - 

In questa situazione i primi 7 pixel di ogni gruppo di 8 rientrano in una
fascia e pertanto appaiono con il colore contenuto nel registro colore in
questa fascia, mentre l'ultimo rientra nella fascia seguente e appare del
colore assunto dal registro colore nella nuova fascia. Questo fenomeno crea
dei bruschi cambi di colore che rendono poco gradevole il plasma, dato che 
questo effetto si basa sull'impressione di "mescolamento" dei colori.
Nell'esempio plasm4.s viene applicata questa tecnica.
L'utilizzo dei bitplane ci permette anche di usare delle maschere da
sovrapporre al plasma. Un esempio e` in plasm5.s.
La tecnica vista negli ultimi 2 esempi ha il limite che le oscillazioni
orizzontali sono limitate ad un'ampiezza di 8 pixel. Cio` e` dovuto al fatto
che ogni registro colore rimane costante in una fascia di 16 pixel, e che ogni
gruppo di pixel e` largo 8 pixel: per questo motivo, il gruppo puo` spostarsi
all'interno della fascia di 16-8=8 pixel. Per aumentare l'ampiezza delle
oscillazioni e` necessario allargare le fascie, e per far questo e` necessario
utilizzare piu` registri colore, dato che e` sempre necessario cambiare un
registro ogni 8 pixel. In conclusione, quindi e` necessario usare un maggior
numero di bitplanes. Notate che negli esempi precedenti abbiamo realizzato le
oscillazioni con lo scroll hardware, che ci consente movimenti di massimo 16
pixel. Questa ulteriore limitazione e` superabile facendo oscillare i bitplanes
con il blitter. Naturalmente in questo caso l'oscillzione richiede una routine
molto piu` lenta, e si usano trucchi particolari per realizzarla.
Nell'esempio plasm6.s, che conclude questa "monografia" sul plasma vedremo
come realizzare un plasma con oscillazione orizzontale di 56 pixel.
Tutti i plasmi che abbiamo visto possono essere resi piu` interessanti variando
durante l'esecuzione i parametri che li contraddistinguono e le tabelle che
contengono i colori (o le loro componenti).

