Computer / Programmazione / Z80 · 16 luglio 2019 2

LM80C: facciamo qualche suono

Dopo un breve periodo di assenza ho rimesso le mani sul mio LM80C. Ho collegato lo Yamaha YM2149F (quanto segue è valido anche per il GI AY-3-8910), il chip audio (“programmable sound generator”, PSG), che ho comprato tempo fa ed ho poi collegato l’uscita audio all’ingresso RCA mono del mio TV, ottenendo i primi vagiti dal mio computer auto-costruito.

Nel video qui sotto potete sentire che c’è un audio complesso. Infatti, in questo primo test ho attivato tutti e 3 i canali analogici: il canale A sta riproducendo un tono fisso; il canale B sta riproducendo una nota fissa miscelata con del rumore bianco; il canale C sta riproducendo un tono usando una modalità di inviluppo (dente di sega). Per ottenere il suono ho semplicemente connesso l’input audio mono della porta RCA del mio televisore.

Per ottenere questo risultato ho dovuto aggiungere un altro decoder di indirizzi al mio circuito, dato che in origine l’AY-3-8910 di General Instrument (ma anche il clone YM2149F di Yamaha, ovviamente) era stato sviluppato per lavorare in congiunzione con il vecchio microprocessore CP1600 sempre di GI, che usava 3 linee per impostare le modalità operative del PSG. Dato che le impostazioni del PSG erano ridondanti (ci sono diverse impostazioni che ottengono lo stesso effetto), fu lo stesso produttore a suggerire di fissare ad un livello alto una delle linee di settaggio ed usare solo le altre due. Grazie a questa soluzione possiamo usare 3 segnali soltanto: uno per la selezione del chip, uno per scegliere fra le modalità registro e dato, e l’ultima per scegliere fra le operazioni di lettura/scrittura sul PSG.

Il PSG è un processore sonoro basato su registri: questo significa che la CPU deve solo spedire i dati al PSG, che memorizza queste informazioni nei suoi registri e le usa successivamente per generare i suoni, così che la CPU non deve prendere più parte nel processo una volta che il PSG inizia il suo lavoro. Ho però scoperto un problema riguardante il modo in cui si devono scegliere i registri: nel datasheet i registri vanno da 0 a 7 e poi da 10 a 17 ma in realtà essi vanno da 0 a 15. Non ho indagato molto sul perché per scegliere il registro 10 devo spedire il valore 8, e così via.** Nel video potete vedere il listato del programma che ho usato per generare i suoni che sentite. Come si nota, ci sono un sacco di OUT: mandando un valore sulla porta 64 si seleziona la modalità di scrittura nel registro identificato dal valore passato, seguito da un valore spedito alla porta 65 per impostare il valore da scrivere in quel registro.

Una volta che sono riuscito ad ottenere dei suoni dal PSG ho aggiunto un paio di istruzioni al NASCOM BASIC per leggere/scrivere dai registri del PSG. Il firmware in versione R2.0 adesso contiene il comando SREG (da “Sound REGister”) e la funzione SSTAT (da “Sound STATus”). Il primo è usato per scrivere un byte in uno specifico registro mentre il secondo è usato per leggere da uno dei registri.

Il nuovo firmware e gli schemi aggiornati sono disponibili sul mio repository Github.

**AGGIORNAMENTO: ho capito il mistero. Sul datasheet il produttore indicava i registri con il sistema di numerazione OTTALE senza però né indicarlo esplicitamente né usando il prefisso che in informatica introduce i numeri ottali, ossia lo “0” (zero). Ad esempio se scriviamo 7 questo è sempre sette sia in ottale che in decimale. Se però scriviamo 10 siamo portati a pensare in decimale e leggerlo come dieci. Se vogliamo rappresentarli in ottale dobbiamo anteporre uno zero, per cui dobbiamo scrivere 010. Sul datasheet invece ciò non è stato fatto! Scrivevano 10 ma intendevano 010, ossia 8 in decimale! E così via. Ci ho perso alcuni giorni, prima di capire questa cosa…