
loop()
La funzione loop() viene continuamente eseguita dal microcontrollore in un ciclo infinito.
Dopo l’esecuzione iniziale della funzione setup(), la funzione loop() viene continuamente
eseguita e il suo codice controlla tutte le operazioni che devono essere eseguite in conseguenza
di un interrupt legato alla richiesta di lettura o scrittura da parte dello Z80. La loop() si accorge
di tale eventualità grazie ai due flag isIRQCSRD e isIRQCSWR che indicano l’avvenuta
esecuzione della rispettiva routine di interrupt.
La maggior parte del codice della loop() è quindi costituita da due if che controllano sempre se
i due flag sono attivi, per eseguire le operazioni richieste tramite appositi switch…case e
funzioni relative al servizio da completare. Alla fine, i flag sono riportati a false in attesa del
prossimo interrupt.
Il perché questa fase non avvenga completamente all’interno delle routine di interrupt è
determinato dal fatto che tali routine devono essere le più brevi e impiegare meno tempo
possibile; inoltre nelle funzioni di interrupt non sono consentiti ritardi e, ad esempio, operazioni
“lente”, come l’accesso al WiFi, cosa che creerebbe problemi.
Il codice riguardante la gestione della conclusione del servizio legato all’interrupt in lettura è
switch (cpuAddr) {
case PORT_PRINTERIO:
LPRD_Printer(); // Gestione Printer
break;
case PORT_FDDSTATUSCMD ... PORT_FDDSECTOR:
case PORT_FDDDRVSEL ... PORT_FDDDATA:
LPRD_FDD(); // Gestione FD1771 floppy disk controller
break;
case PORT_FDDEXTSTATUSCMD ... PORT_FDDEXTDATA:
LPRD_FDDEXT(); // Gestione comandi estesi
break;
case PORT_LIVEVRS:
LPRD_LIVEVRS(); // gestione interrogazione versione
break;
case PORT_HDDATA ... PORT_HDSEL:
LPRD_HDISK(); // gestione Hard Disk (non implementato)
break;
case PORT_CMSTATUSCMD ... PORT_CMDATA:
LPRD_CMATH(); // gestione coprocessore matematico (non implementato)
break;
case PORT_TAPEDATA ... PORT_TAPECTRL:
LPRD_TAPE(); // gestione CDP1854 interfaccia Tape
break;