| "Descrizione" by RS232 (1989 pt) | 2026-Jan-29 16:33 |
Zilog Z8410APS: Z80 DMA
Definizione
Lo Zilog Z8410APS DMA è un controller direct memory access per sistemi basati su Z80 che consente di trasferire blocchi di dati senza coinvolgere la CPU per ogni byte. L’idea è semplice: la CPU configura il DMA (sorgente, destinazione, lunghezza, modalità), poi il DMA prende temporaneamente il controllo del bus e sposta i dati tra memoria ↔ memoria, I/O ↔ memoria o I/O ↔ I/O (a seconda della configurazione e della logica di sistema), riducendo drasticamente overhead e jitter rispetto a cicli di polling o loop di copia in software.

Cosa fa “in più” rispetto a un loop di copia della CPU
Libera cicli CPU: la CPU non deve eseguire istruzioni ripetitive di IN/OUT/LD per ogni byte.
Trasferimenti deterministici: per molti carichi, il DMA offre throughput più regolare e prevedibile.
Gestione del bus: il DMA si sincronizza con periferiche lente tramite segnali di READY/WAIT e può lavorare in modalità che minimizzano l’impatto sul resto del sistema.
Fine blocco e interrupt: a fine trasferimento può segnalare evento (interrupt o flag), utile per driver “a blocchi”.
Architettura funzionale (come ragionare sul chip)
Un modo pratico di vederlo è come un “motore” con:
Contatore di byte (byte counter) che definisce la dimensione del blocco.
Puntatore sorgente e puntatore destinazione (address counters) che vengono incrementati/decrementati automaticamente secondo modalità.
Unità di arbitraggio bus che richiede il bus, attende il momento opportuno e poi esegue cicli di lettura/scrittura.
Logica di handshake con periferiche (ready, wait, request/ack se usate su scheda).
Logica interrupt e daisy chain in stile Zilog per integrazione pulita con altre periferiche Z80.
Nota importante: lo Z80 DMA è tipicamente un controller a canale singolo (un “flusso” DMA alla volta). Se servono più canali, storicamente si usavano più chip o logiche di multiplexing/arbiter esterne.
Modalità operative tipiche
In un sistema Z80 reale, lo Z8410 viene usato soprattutto in queste modalità:
Burst mode: il DMA “tiene” il bus e trasferisce il blocco (o una parte consistente) il più velocemente possibile. Massimo throughput, ma la CPU resta ferma più a lungo.
Cycle stealing (interleaving): il DMA ruba singoli cicli (o piccoli gruppi) tra i cicli CPU. Riduce l’impatto sulla reattività, a costo di throughput leggermente inferiore.
Transfer con handshake: quando la periferica non può accettare dati a piena velocità, si usano segnali di sincronizzazione (ready/wait/req-ack dipendenti dal design di scheda) così il DMA non “corre” più veloce del dispositivo collegato.
Auto-initialize / restart: in alcune configurazioni si può predisporre un riavvio automatico dei parametri (utile per stream ripetitivi o buffer circolari, se previsto nella logica di controllo scelta).
Casi d’uso tipici su sistemi Z80
Caricamento veloce di blocchi in RAM (es. da una periferica parallela o da una FIFO esterna).
Aggiornamento display: copia di buffer grafici o aree di memoria video (quando l’architettura lo consente).
I/O ad alta frequenza: acquisizione dati da ADC paralleli, strumenti, interfacce custom con handshake.
Movimentazione blocchi per protocolli: gestione di frame o pacchetti su interfacce non troppo “intelligenti”, lasciando alla CPU solo l’header e il controllo.
Interfaccia con la CPU Z80 (bus e segnali principali)
Dal punto di vista hardware, lo Z80 DMA si collega al bus con segnali tipici Z80:
D[7..0]: bus dati per programmazione e per alcuni cicli di trasferimento in I/O.
/IORQ, /RD, /WR: cicli di I/O per accedere ai registri di controllo (e per le operazioni di DMA verso periferiche I/O).
/MREQ (in molti sistemi): usato durante trasferimenti verso memoria.
/BUSREQ /BUSACK: richiesta e concessione del bus (fondamentale: è così che il DMA “si inserisce” senza conflitti).
/INT, IEI/IEO: interrupt e daisy chain come le altre periferiche Zilog.
/RESET, CLK: reset e clock di sistema.
Schizzo dei collegamenti più importanti
┌───────────────────────────┐ │ CPU Z80 │ │ D[7..0] /IORQ /RD /WR │ │ /MREQ /BUSREQ /BUSACK │ │ /INT IEI/IEO CLK RESET │ └──────────────┬────────────┘ │ bus di sistema ▼ ┌──────────────────┐ │ Z80 DMA │ (Z8410) │ addr src/dst │ │ byte counter │ │ bus arbiter │ │ handshake/IRQ │ └───┬───────────┬──┘ │ │ cicli memoria│ │cicli I/O + handshake ▼ ▼ ┌────────────────┐ ┌─────────────────────┐ │ RAM / ROM │ │ Periferica I/O │ │ (sorgente/dest)│ │ (UART, PIO, FIFO, │ └────────────────┘ │ ADC, interfaccia…) │ └─────────────────────┘
Programmazione (visione “driver”)
A livello driver, i passi concettuali sono sempre questi:
Definire la direzione (mem→mem, I/O→mem, mem→I/O, ecc.).
Impostare indirizzo sorgente e indirizzo destinazione (e se incrementare/decrementare).
Caricare il conteggio byte del blocco.
Se necessario, configurare handshake/wait e la modalità (burst o cycle stealing).
Abilitare l’eventuale interrupt di fine blocco.
Avviare il trasferimento e lasciare che il DMA completi, controllando stato o ricevendo IRQ.
Tabella 1 – Caratteristiche operative
| Caratteristica | Significato pratico |
|---|---|
| Ruolo | Trasferimento dati a blocchi senza loop CPU |
| Tipo | Controller DMA “classico” per bus Z80 (tipicamente canale singolo) |
| Trasferimenti | Memoria↔memoria e memoria↔I/O (dipende dall’architettura della scheda) |
| Modalità | Burst e cycle stealing (impatto diverso su CPU) |
| Sincronizzazione | Supporto a segnali di wait/handshake per periferiche lente |
| Notifica | Fine blocco via flag/interrupt, integrabile in catena IEI/IEO |
Tabella 2 – Segnali e integrazione
| Segnale / gruppo | Uso nel sistema |
|---|---|
| /BUSREQ, /BUSACK | Arbitraggio: il DMA chiede e ottiene il controllo del bus |
| /IORQ, /RD, /WR | Accesso ai registri di programmazione e cicli I/O durante DMA |
| /MREQ | Cicli verso memoria durante DMA (quando usato nell’architettura) |
| /INT, IEI/IEO | Interrupt e priorità deterministica in daisy chain Z80 |
| CLK, /RESET | Sincronizzazione e inizializzazione |
| Evaluate |