Computer / Programmazione / Z80 · 28 febbraio 2019 0

LM80C: pilotiamo lo Z80 PIO da BASIC

Appurato che l’LM80C adesso è pienamente funzionante, possiamo provare ad usarlo come un vero computer. Il NASCOM BASIC usato come ambiente di programmazione ha un sacco di funzionalità interessanti: una di queste è la possibilità di pilotare una porta di input/output usando specifiche istruzioni quali OUT e IN, che operano come le corrispondenti istruzioni assembly. Esse permettono infatti di inviare/ricevere dati da/verso qualunque porta I/O connessa alla CPU. In questo breve esempio proveremo a pilotare lo Z80 PIO dell’LM80C usando dei comandi BASIC.

Utilizzeremo l’hardware attuale delll’LM80C: al momento, c’è lo Z80 PIO con un ULN2803 connesso alla sua porta B; l’ULN2803 pilota 8 LED. Accendiamo l’LM80C, selezioniamo un avvio a freddo, impostiamo il valore alto della memoria al massimo valore disponibile (premendo Enter), e poi inseriamo il seguente programma:

10 OUT 3,&B11001111:OUT 3,&B00000000
20 FOR A = 0 TO 255
30 OUT 1,A : FOR B = 0 TO 50 : NEXT B
40 NEXT A
50 OUT 1,0

Esaminiamo il listato (sono così felice di usare questo termine: mi riporta indietro di qualche decade alla mia giovinezza quando passavo un sacco di pomeriggi a digitare sul mio C16 i “listati” dei programmi BASIC che trovavo nelle riviste specializzate). Alla linea 10 stiamo usando il comando OUT per impostare il PIO. Il formato del comando è:

OUT portavalore

Porta è la porta di I/O così com’è impostata nell’hardware, mentre valore è qualsiasi valore nell’intervallo 0..255 (un byte). Come potete vedere dal codice, stiamo spedendo dei comandi alla porta di I/O n° 3: come abbiamo trovato questo indirizzo? Dobbiamo tornare indietro sui nostri passi e recuperare un precedente articolo dove ho collegato lo Z80 PIO alla CPU Z80. Ho impostato le connessioni in modo che le linee di controllo siano attaccate ai pin A1 e A0 del bus degli indirizzi: in questo modo possiamo impostare la modalità ed il canale su cui vogliamo dialogare semplicemente indirizzando 2 linee. Dando un’occhiata al codice assembly potete vedere che la linea di controllo della porta B può essere selezionata impostando A0 e A1 a 11b (formato binario), che è appunto 3 in formato decimale. Il significato dei byte che spedisco al PIO possono essere recuperati dalla scheda tecnica del PIO: qui faccio giusto un sunto riportando che il primo byte imposta la porta B per operare in modalità 3, la cosiddetta “bit control” dove ogni singola linea può essere impostata individualmente; il secondo byte imposta le linee come output.

Dalla linea 20 alla 40 ho creato un piccolo loop che incrementa una variabile e la spedisce al PIO. Per inviare il valore al PIO dobbiamo impostare i pin di indirizzo A1 e A0 a 01b, che corrisponde a 1 in formato decimale: infatti, alla riga 30 potete vedere che stiamo spedendo la variabile “A” alla porta 1. Questo è fatto dando il comando OUT 1. Dopodiché ho introdotto un piccolo ritardo così che possiamo vedere il cambiamento dei LED mentre il PIO riceve i diversi valori di “A”. Alla fine, alla riga 50, spegniamo i LED dopo che il loop è terminato.

Il seguente video mostra il programma in azione:

Il codice è disponibile sul mio repository GitHub.