# Agnus

L'Agnus è una famiglia di microchip prodotta dalla Commodore Semiconductor Group. Un esemplare di Agnus è sempre presente nell'Original Chip Set e nell'Enhanced Chip Set.

## Origine del nome

Il nome del componente Agnus deriva da 'Address GeNerator UnitS', in quanto contiene tutti i registri di indirizzamento e controlla gli accessi in memoria dei chip custom.

## Funzioni

Il chip Agnus coordina il funzionamento dell'intero chipset. Tutte le operazioni sono sincronizzate con il pennello video, compreso l'accesso alla RAM dedicata al chipset, detta per questo chip RAM. Il microprocessore centrale 68000 e gli altri membri del chipset si contendono l'accesso alla RAM tramite Agnus. In termini di architettura degli elaboratori, si parla di accesso diretto in memoria (in inglese: Direct Memory Address, DMA), e Agnus è il DMA Controller (DMAC).
Agnus gestisce 25 canali DMA per il chipset con una complessa politica basata su priorità. Poiché il processore 68000 normalmente accede alla memoria ogni due cicli di clock della RAM, Agnus di preferenza effettua gli accessi per il chipset solo durante i cicli dispari, lasciando quelli pari alla CPU, che in questo modo non viene rallentata. Questa pacifica coesistenza viene però messa in crisi quando si scelgono modalità video con più di 4 bitplane in bassa risoluzione (o 2 bitplane in alta risoluzione): in questi casi Agnus comincia ad accedere alla RAM anche nei cicli pari, rallentando la CPU. Anche il blitter, se attivato, può sottrarre cicli alla CPU, specie se si imposta il bit "Blitter Nasty": in questo caso Agnus può negare alla CPU ogni ciclo pari, se richiesto dal blitter.
Le temporizzazioni di Agnus si misurano in "colour clock" di 280 ns, equivalenti a due pixel in bassa risoluzione (140ns) e a quattro pixel in alta risoluzione (70ns). Come per Denise, queste temporizzazioni erano progettate per gli schermi delle TV domestiche, e possono essere sincronizzate ad una sorgente esterna di clock.

## Componenti
### Blitter

Il blitter è un sub-componente di Agnus. "Blit" è l'abbreviazione di "block image transfer" (trasferimento di immagini a blocchi) o bit blit. Il blitter è una unità ad alto parallelismo in grado di effettuare trasferimento di blocchi di memoria e operazioni logiche. Ha tre modi di funzionamento: copia di blocchi di memoria, riempimento di poligoni e tracciamento di linee.
Il blitter consente la copia rapida di memoria video, lasciando libera la CPU per altre operazioni. Il blitter era usato principalmente per disegnare sullo schermo immagini grafiche dette "bob", abbreviazione di "blitter object".
In modalità di copia il blitter prende da zero a tre sorgenti in memoria, dette A, B e C, ed esegue su di esse una funzione booleana programmabile. Il risultato viene (eventualmente) scritto in un'area di destinazione, D. Queste aree possono sovrapporsi, e tutti i blocchi devono essere allineati a 16 bit. Il blitter può operare sui blocchi sia dall'inizio alla fine, in modalità detta "ascendente", sia al contrario, in modalità discendente.
I blocchi sono "rettangolari"; hanno una larghezza in multipli di 16 bit, un'altezza misurata in linee, e un passo, ovvero lo scostamento fra la fine di una linea e la successiva. Questo consente al blitter di operare in qualsivoglia risoluzione video. Durante la copia viene eseguita automaticamente un'operazione logica sui singoli pixel, descritta tramite mintermini. Operazioni tipiche sono la copia (D = A), o l'applicazione di una maschera di pixel attorno agli oggetti blittati (D = A AND C). La copia può anche far scorrere ogni linea di fino a 15 pixel, la qual cosa consente al blitter di disegnare a coordinate orizzontali che non siano necessariamente multiple di 16 pixel.
In modalità di tracciamento linee, il blitter disegna linee spesse un pixel usando l'algoritmo di Bresenham. Può anche applicare alla linea un pattern di 16 bit. Nella modalità di riempimento il blitter opera per linee orizzontali, riempiendo intervalli orizzontali compresi fra due pixel accesi. Per ogni linea, legge ogni a turno ogni pixel da sinistra a destra; quando legge un pixel a uno, inizia a riempire tutti i bit che seguono fino al successivo bit a uno o alla fine della linea. Insieme, questi modi consentono al blitter di disegnare poligoni singoli monocolore, anche se molto lentamente al confronto con i moderni chipset grafici 3D o anche con la stessa CPU di un Amiga accelerato.

### Copper

Il copper è un altro subcomponente di Agnus. Il nome è un'abbreviazione di "co-processor". Il copper è una macchina a stati finiti programmabile che esegue un flusso di istruzioni sincronizzato con l'hardware video.
Quando è in funzione, il copper ha tre stati: lettura di un'istruzione, esecuzione, o attesa che il pennello video raggiunga una specifica posizione dello schermo. Il copper esegue un programma (detto copper list) in parallelo con la CPU principale, sincronizzato al pennello video e può essere usato per effettuare varie operazioni che richiedono sincronizzazione con il video. Più comunemente viene usato per controllare l'uscita video, ma può scrivere in qualsiasi registro del chipset e pertanto può controllare anche l'audio o mandare un'interruzione alla CPU.
La copper list ha tre tipi di istruzione, ognuna delle quali è composta da una coppia di parole di 16 bit, per un totale di quattro byte.
* L'istruzione MOVE scrive una parola di 16-bit in uno dei registri del chipset.
* L'istruzione WAIT blocca il copper fino al raggiungimento di una data posizione video, rendendo così possibile la sincronizzazione di altre istruzioni al tracciamento dello schermo. Può anche attendere che il blitter finisca un'operazione.
* L'istruzione SKIP farà sì che il copper salti l'istruzione successiva se è già stata raggiunta una data posizione del pennello video. Può essere usata per creare cicli nelle copper list.
La lunghezza di una copper list è limitata dal tempo d'esecuzione. Il copper riavvia l'esecuzione della copper list all'inizio di ogni quadro video. Non esiste una istruzione "end" esplicita, al suo posto viene usata l'istruzione WAIT per attendere una posizione video irraggiungibile.

#### Usi del copper

* Il copper viene comunemente usato per (ri)inizializzare i registri dell'hardware video all'inizio di ogni quadro video. Può essere usato anche per modificare le impostazioni video durante il tracciamento di un quadro. Questo consente all'Amiga di cambiare la configurazione video, compresa la risoluzione, da una linea all'altra. L'Amiga può visualizzare diverse risoluzioni orizzontali e diverse profondità di colore nello stesso schermo. L'interfaccia grafica dell'AmigaOS consente a due programmi di funzionare con due risoluzioni video distinte, pur essendo entrambi visibili contemporaneamente sullo schermo. Un programma di disegno può ad esempio usare questa caratteristica per consentire agli utenti di disegnare direttamente su uno schermo Hold And Modify a bassa risoluzione, offrendo contemporaneamente una barra degli strumenti in alta risoluzione in cima o in fondo allo schermo.
* Il copper può anche cambiare i registri dei colori ad ogni linea di scansione, creando gli effetti "raster bar" tanto comuni nei giochi dell'Amiga. Il copper può fare anche di più, come cambiare il colore di sfondo abbastanza spesso da visualizzare una grafica a blocchi senza usare del tutto i bitplane.
* Il copper consente di riusare gli sprite: dopo che uno sprite è stato visualizzato una prima volta, il copper può muoverlo immediatamente ad una nuova locazione, facendolo disegnare nuovamente anche sulla stessa linea di scansione.
* Il copper può anche essere usato per programmare ed attivare il blitter. Ciò è utile per fare più operazioni in sequenza col blitter, in quanto il copper può aspettare che il blitter termini un'operazione e subito dopo riprogrammare quest'ultimo per l'operazione seguente.
* Il copper può essere usato per produrre il modo video "sliced HAM", o S-HAM, che consiste nel costruire una copper list che modifichi la tavolozza dei colori ad ogni linea di scansione, migliorando la scelta dei colori di base nel modo grafico Hold And Modify.

## Package

Per l'Agnus sono stati utilizzati soltanto due tipologie di package:
* DIP a 48 piedini;
* PLCC a 84 contatti.
Il package DIP è stato utilizzato soltanto per i primissimi modelli di Agnus. In seguito è sempre stato utilizzato il package PLCC. L'Agnus in package DIP ha una forma più stretta e allungata rispetto all'Agnus in package PLCC. Per tale motivo l'Agnus in package DIP è chiamato "Thin Agnus" (ovvero "Agnus magro") mentre l'Agnus in package PLCC è chiamato "Fat Agnus" (ovvero " Agnus grasso").

## Modelli

Nel corso degli anni l'Agnus è stato costantemente migliorato. Al primo modello commercializzato con la versione di Amiga 1000 dotata di modi video NTSC, il MOS 8361, sono seguiti molti altri modelli. Si possono distinguere due principali sottofamiglie di Agnus: la sottofamiglia di Agnus utilizzata nel chipset OCS e la sottofamiglia di Agnus utilizzata nel chipset ECS. La tabella seguente riporta i modelli di Agnus commercializzati e la sottofamiglia a cui appartengono. In particolare per ogni modello di Agnus viene riportata (rispettivamente) la denominazione del modello di Agnus, il part number del modello di Agnus, il chipset in cui è utilizzato il modello di Agnus, la quantità massima di Chip RAM che il modello di Agnus è in grado di gestire, il package del modello di Agnus. Alcuni modelli di Agnus sono stati ridenominati. Per tale motivo il part number rimane lo stesso.
| denominazione | part number | chipset | Chip RAM | package |
| MOS 8361 | 252125-01 | OCS | 500 kB | DIP |
| MOS 8367R0 MOS 8367 | 252362-01 | OCS | 500 kB | DIP |
| MOS 8370 | 318070-01 | OCS | 500 kB | PLCC |
| MOS 8371 | 318071-01 | OCS | 500 kB | PLCC |
| MOS 8372 | 318069-01 | ECS | 1 MB | PLCC |
| MOS 8372R3 MOS 8372A | 318069-02 | ECS | 1 MB | PLCC |
| MOS 8372AB | 318069-03 | ECS | 2 MB | PLCC |
| MOS 8372B | | ECS | 2 MB | PLCC |